返回顶部
首页 > 资讯 > 精选 >Spring Boot怎么自定义监控指标
  • 197
分享到

Spring Boot怎么自定义监控指标

2023-07-05 08:07:32 197人浏览 独家记忆
摘要

今天小编给大家分享一下spring Boot怎么自定义监控指标的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.创

今天小编给大家分享一下spring Boot怎么自定义监控指标的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    1.创建项目

    pom.xml引入相关依赖

    <project xmlns="Http://Maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.olive</groupId><artifactId>prometheus-meter-demo</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath /></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-WEB</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micrometer Prometheus reGIStry  --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

    2.自定义指标

    方式一

    直接使用micrometer核心包的类进行指标定义和注册

    package com.olive.monitor; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component; import io.micrometer.core.instrument.Counter;import io.micrometer.core.instrument.DistributionSummary;import io.micrometer.core.instrument.MeterRegistry; @Componentpublic class NativeMetricsMontior { private Counter payCount; private DistributionSummary payAmountSum; @Autowiredprivate MeterRegistry registry; @PostConstructprivate void init() {payCount = registry.counter("pay_request_count", "payCount", "pay-count");payAmountSum = registry.summary("pay_amount_sum", "payAmountSum", "pay-amount-sum");} public Counter getPayCount() {return payCount;} public DistributionSummary getPayAmountSum() {return payAmountSum;} }

    方式二

    通过引入micrometer-registry-prometheus包,该包结合prometheus,对micrometer进行了封装

    <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency>

    同样定义两个metrics

    package com.olive.monitor; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component; import io.prometheus.client.CollectorRegistry;import io.prometheus.client.Counter; @Componentpublic class PrometheusMetricsMonitor { private Counter orderCount; private Counter orderAmountSum;@Autowiredprivate CollectorRegistry registry;@PostConstructprivate void init() {orderCount = Counter.build().name("order_request_count").help("order request count.").labelNames("orderCount").register();orderAmountSum = Counter.build().name("order_amount_sum").help("order amount sum.").labelNames("orderAmountSum").register();registry.register(orderCount);registry.register(orderAmountSum);} public Counter getOrderCount() {return orderCount;} public Counter getOrderAmountSum() {return orderAmountSum;} }

    prometheus 4种常用Metrics

    Counter

    连续增加不会减少的计数器,可以用于记录只增不减的类型,例如:网站访问人数,系统运行时间等。

    对于Counter类型的指标,只包含一个inc()的方法,就是用于计数器+1.

    一般而言,Counter类型的metric指标在冥冥中我们使用_total结束,如http_requests_total.

    Gauge

    可增可减的仪表盘,曲线图

    对于这类可增可减的指标,用于反应应用的当前状态。

    例如在监控主机时,主机当前空闲的内存大小,可用内存大小等等。

    对于Gauge指标的对象则包含两个主要的方法inc()和dec(),用于增加和减少计数。

    Histogram

    主要用来统计数据的分布情况,这是一种特殊的metrics数据类型,代表的是一种近似的百分比估算数值,统计所有离散的指标数据在各个取值区段内的次数。例如:我们想统计一段时间内http请求响应小于0.005秒、小于0.01秒、小于0.025秒的数据分布情况。那么使用Histogram采集每一次http请求的时间,同时设置bucket。

    Summary

    Summary和Histogram非常相似,都可以统计事件发生的次数或者大小,以及其分布情况,他们都提供了对时间的计数_count以及值的汇总_sum,也都提供了可以计算统计样本分布情况的功能,不同之处在于Histogram可以通过histogram_quantile函数在服务器计算分位数。而Sumamry的分位数则是直接在客户端进行定义的。因此对于分位数的计算,Summary在通过ProMQL进行查询的时候有更好的性能表现,而Histogram则会消耗更多的资源,但是相对于客户端而言Histogram消耗的资源就更少。用哪个都行,根据实际场景自由调整即可。

    3. 测试

    定义两个controller分别使用NativeMetricsMontiorPrometheusMetricsMonitor

    package com.olive.controller; import java.util.Random; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController; import com.olive.monitor.NativeMetricsMontior; @RestControllerpublic class PayController { @Resourceprivate NativeMetricsMontior monitor; @RequestMapping("/pay")public String pay(@RequestParam("amount") Double amount) throws Exception {// 统计支付次数monitor.getPayCount().increment(); Random random = new Random();//int amount = random.nextInt(100);if(amount==null) {amount = 0.0;}// 统计支付总金额monitor.getPayAmountSum().record(amount);return "支付成功, 支付金额: " + amount;} }package com.olive.controller; import java.util.Random; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController; import com.olive.monitor.PrometheusMetricsMonitor; @RestControllerpublic class OrderController { @Resourceprivate PrometheusMetricsMonitor monitor; @RequestMapping("/order")public String order(@RequestParam("amount") Double amount) throws Exception {// 订单总数monitor.getOrderCount().labels("orderCount").inc(); Random random = new Random();//int amount = random.nextInt(100);if(amount==null) {amount = 0.0;}// 统计订单总金额monitor.getOrderAmountSum().labels("orderAmountSum").inc(amount);return "下单成功, 订单金额: " + amount;} }

    启动服务

    访问http://127.0.0.1:9595/actuator/prometheus;正常看到监测数据

    Spring Boot怎么自定义监控指标

    改变amount多次方式http://127.0.0.1:8080/order?amount=100http://127.0.0.1:8080/pay?amount=10后;再访问http://127.0.0.1:9595/actuator/prometheus。查看监控数据

    Spring Boot怎么自定义监控指标

    4.项目中的应用

    项目中按照上面说的方式进行数据埋点监控不太现实;在spring项目中基本通过AOP进行埋点监测。比如写一个切面Aspect;这样的方式就非常友好。能在入口就做了数据埋点监测,无须在controller里进行代码编写。

    package com.olive.aspect; import java.time.LocalDate;import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes; import io.micrometer.core.instrument.Metrics; @Aspect@Componentpublic class PrometheusMetricsAspect {     // 切入所有controller包下的请求方法    @Pointcut("execution(* com.olive.controller..*.*(..))")    public void controllerPointcut() {    }     @Around("controllerPointcut()")    public Object MetricsCollector(ProceedingJoinPoint joinPoint) throws Throwable {         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();        String userId = StringUtils.hasText(request.getParameter("userId")) ?         request.getParameter("userId") : "no userId";                // 获取api url        String api = request.getServletPath();        // 获取请求方法        String method = request.getMethod();        long startTs = System.currentTimeMillis();        LocalDate now = LocalDate.now();        String[] tags = new String[10];        tags[0] = "api";        tags[1] = api;        tags[2] = "method";        tags[3] = method;        tags[4] = "day";        tags[5] = now.toString();        tags[6] = "userId";        tags[7] = userId;                String amount = StringUtils.hasText(request.getParameter("amount")) ?         request.getParameter("amount") : "0.0";                tags[8] = "amount";        tags[9] = amount;        // 请求次数加1        //自定义的指标名称:custom_http_request_all,指标包含数据        Metrics.counter("custom_http_request_all", tags).increment();        Object object = null;        try {            object = joinPoint.proceed();        } catch (Exception e) {            //请求失败次数加1            Metrics.counter("custom_http_request_error", tags).increment();            throw e;        } finally {            long endTs = System.currentTimeMillis() - startTs;            //记录请求响应时间           Metrics.timer("custom_http_request_time", tags).record(endTs, TimeUnit.MILLISECONDS);        }        return object;    }}

    编写好切面后,重启服务;访问controller的接口,同样可以进行自定义监控指标埋点

    Spring Boot怎么自定义监控指标

    以上就是“Spring Boot怎么自定义监控指标”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: Spring Boot怎么自定义监控指标

    本文链接: https://lsjlt.com/news/350720.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Spring Boot怎么自定义监控指标
      今天小编给大家分享一下Spring Boot怎么自定义监控指标的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.创...
      99+
      2023-07-05
    • Spring Boot自定义监控指标的详细过程
      目录1.创建项目2.自定义指标方式一方式二3. 测试4.项目中的应用1.创建项目 pom.xml引入相关依赖 <project xmlns="http://maven.apac...
      99+
      2023-03-06
      Spring Boot自定义监控指标 Spring Boot自定义监控
    • 如何自定义Prometheus监控指标
      本篇内容介绍了“如何自定义Prometheus监控指标”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目前大部分使用Spring  ...
      99+
      2023-06-17
    • prometheus client_go为应用程序自定义监控指标
      目录使用prometheus client_go为应用程序添加监控指标原因去掉Proc和Go指标使用prometheus client_go为应用程序添加监控指标 使用promet...
      99+
      2023-02-15
      prometheus client_go监控指标 go监控指标
    • zabbix怎么自定义监控项
      本文小编为大家详细介绍“zabbix怎么自定义监控项”,内容详细,步骤清晰,细节处理妥当,希望这篇“zabbix怎么自定义监控项”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。zabbix自定义监控项首先打开zab...
      99+
      2023-07-02
    • Spring Boot如何自定义starter
      这篇文章主要介绍Spring Boot如何自定义starter,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、简介SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我...
      99+
      2023-06-02
    • Spring Boot 中自定义异常怎么处理
      这篇文章将为大家详细讲解有关Spring Boot 中自定义异常怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @Co...
      99+
      2023-06-02
    • Spring Boot怎么读取自定义配置文件
      这篇文章给大家分享的是有关Spring Boot怎么读取自定义配置文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@Value首先,会想到使用@Value注解,该注解只能去解析yaml文件中的简单类型,并绑定到...
      99+
      2023-06-15
    • Oracle EM 12c怎样自定义监控
      这篇文章给大家介绍Oracle EM 12c怎样自定义监控,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。   有个需求,需要收集close_wa...
      99+
      2024-04-02
    • Spring Boot中怎么定义接口
      Spring Boot中怎么定义接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们在 Controller 中定义接口的时候,一般都是像下面这样:@GetMapping...
      99+
      2023-06-15
    • Spring Boot之FilterRegistrationBean-自定义Filter详解
      Spring Boot之FilterRegistrationBean-自定义Filter 项目老的用spring写的,新的升级到了springboot,原代码中有在web.xml中定...
      99+
      2024-04-02
    • spring boot装载自定义yml文件
      yml格式的配置文件感觉很人性化,所以想把项目中的.properties都替换成.yml文件,主要springboot自1.5以后就把@configurationProperties中的location参数去掉,各种查询之后发现可以用Yam...
      99+
      2023-05-31
      spring boot yml
    • zabbix如何自定义监控项
      这篇文章主要介绍zabbix如何自定义监控项,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!虽然Zabbix提供了很多的模板(简单理解为监控项的集合),在zabbix界面点击share按钮就可以直接跳到模板大全的官方网...
      99+
      2023-06-27
    • 怎么实现zabbix自定义监控nginx状态
      这篇文章主要介绍“怎么实现zabbix自定义监控nginx状态”,在日常操作中,相信很多人在怎么实现zabbix自定义监控nginx状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现zabbix自定义...
      99+
      2023-06-25
    • Spring Boot读取自定义配置文件
      目录@Value @ConfigurationProperties 显式注入 Spring IoC @EnableConfigurationProperties @Configura...
      99+
      2024-04-02
    • Spring Boot console log 格式自定义方式
      Spring Boot console log 格式自定义 Spring Boot 默认使用Logback 新增配置项:logging.pattern.console loggi...
      99+
      2024-04-02
    • spring boot 自定义starter的实现教程
      spring boot 使用 starter 解决了很多配置问题, 但是, 他是怎么来解决这些问题的呢?这里通过一个简单的例子, 来看一下, starter是怎么来设置默认配置的.一. 建 starter 项目自定义的starter...
      99+
      2023-05-30
      spring boot 自定义
    • prometheus怎么配置监控指标
      要配置Prometheus监控指标,您可以按照以下步骤操作: 配置监控目标:您需要在Prometheus的配置文件中定义要监控的目...
      99+
      2024-04-02
    • Java自定义Spring配置标签
      引言: 在Sping中,一般使用<bean>这样的元素来配置一个bean,Spring在创建容器的时候会扫描这些配置,根据配置创建对象存放于容器中,然后我们再从容器中取出...
      99+
      2024-04-02
    • 基于zabbix的Mysql自定义监控
                                   ...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作