Spring Boot Metrics监控之Prometheus

前两篇博客分别介绍了 Prometheus 与 Grafana,都是为与 SpringBoot 集成做准备的

有了前面的基础准备工作,本篇直接上代码,起启动好 prometheus 与 grafana

要实现的目的:
  • 1.监控SpringBoot应用程序 JVM 情况
  • 2.模仿天猫双十一的电子大屏,实时显示请求总次数、下单总金额

下面是监控页面的效果图,监控应用的 jvm 、请求总次数、下单总金额情况
在这里插入图片描述

实现目的一:监控SpringBoot应用程序 JVM 情况
  • 1.新建SpringBoot项目,添加pom.xml依赖:
    引用了 io.micrometer 的依赖,它依赖了prometheus,prometheus对SpringBoot2.x版本不是很支持,而 io.micrometer 进行了改进,从而支持SpringBoot2.x版本
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>io.micrometer</groupId>
	<artifactId>micrometer-registry-prometheus</artifactId>
	<version>1.1.3</version>
</dependency>
  • 2.在 application.properties 中配置下
server.port=8088
spring.application.name=order-service-prometheus
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}
  • 3.在启动主类中添加Bean ,此配置是监控 jvm 的:
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName){
	return registry -> registry.config().commonTags("application",applicationName);
}
  • 4.启动应用,访问 http://localhost:8088/actuator/prometheus ,可以看到应用的一些 metrics 信息
  • 5.给 grafana 添加数据源与Dashboard,添加操作请参考 Grafana可视化图形界面,导入时请使用Dashboard Id为 4701,导入后马上看到 JVM 的情况,可看到我的这个应用是今天 17:25:06启动,已经运行了2.1小时,heap使用了5.32%已经下面的其他信息
    在这里插入图片描述

接下来使用自定义metrics,记录应用的请求总数,下单数与下单金额

实现目的二:实时显示请求总次数、下单总金额
  • 1.添加AOP配置类,目的:使用SpringAOP切面,配置切点,请求进入后用Counter类型的Metrics加一次:
@Component
@Aspect
public class AspectAop {

    @Pointcut("execution(public * com.zypcy.springcloud.orderserviceprometheus.controller.*.*(..))")
    public void pointCut(){}

    //统计请求的处理时间
    ThreadLocal<Long> startTime = new ThreadLocal<>();
    
    @Autowired
    MeterRegistry registry;
    private Counter counter;
    @PostConstruct
    private void init(){
        counter = registry.counter("requests_total","status","success");
    }

    @Before("pointCut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        startTime.set(System.currentTimeMillis());
        
        counter.increment(); //记录系统总请求数
    }

    @AfterReturning(returning = "returnVal" , pointcut = "pointCut()")
    public void doAfterReturning(Object returnVal){
        //处理完请求后
        System.out.println("方法执行时间:"+ (System.currentTimeMillis() - startTime.get()));
    }
}
  • 2.添加一个OrderController类,其中下单方法随机生成订单金额放入prometheus,内容如下:
@RequestMapping("/order")
@RestController
public class OrderController {

    @Autowired
    MeterRegistry registry;
    private Counter counter;
    private DistributionSummary summary;
    @PostConstruct
    private void init(){
        counter = registry.counter("requests_zhuyu_total","order","zhuyu");
        summary = registry.summary("order_amount_total","totalAmount","totalAmount");
    }

    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }

    @RequestMapping("/zhuyu")
    public String zhuyu(){
        counter.increment();
        return "zhuyu";
    }

    @RequestMapping("/order")
    public String order(){
        Random random = new Random();
        summary.record(random.nextInt(100));
        return "order";
    }
}
  • 3.启动应用,访问几次 hello、zhuyu、order方法,在prometheus web ui界面上使用 PromQL查询埋点监控信息
    输入 requests_total{job=“order-service-prometheus”} 查询请求总次数,结果为 15
    在这里插入图片描述
    输入 order_amount_total_sum{job=“order-service-prometheus”} 查询订单金额,结果为 344
    在这里插入图片描述
  • 4.使用 grafana 显示在 prometheus中通过 promql 查询出来的信息,在 grafana–dashboard上,点击 add panel,选择 Singlestat,然后在新增的 panel 上点击向下的箭头,再点击 edit,去配置 metrics 查询信息
    在这里插入图片描述
    在 General中改下name为 系统请求总数,在Metrics 中添加 PromQL查询,然后输入 30s 刷新一次,勾上 Instant 实时获取
    在这里插入图片描述
    点击上面的 save 图标进行保存,订单金额的监控面板也是这样创建,再去访问下应用的 hello、zhuyu、order方法,加点数据, 可以看到数据几乎实时显示出来了
    在这里插入图片描述
    下面是JVM监控,上面是应用数据监控,还有仪表盘和柱状图,还需要结合应用埋点

扩展:监控异常发生次数,应用处理响应时长等等

源码地址:https://gitee.com/zhuyu1991/spring-cloud/tree/master/prometheus

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
如果你想在Spring Cloud项目中使用Prometheus监控一个没有Controller的方法,可以考虑使用Micrometer来收集自定义的指标数据。Micrometer是一个通用的指标收集库,可以集成到Spring BootSpring Cloud项目中。 首先,你需要添加Micrometer依赖到你的项目中: ``` <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>${micrometer.version}</version> </dependency> ``` 然后,你可以在你的方法中添加Micrometer计数器来记录调用次数和执行时间。例如: ``` import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Timer; public class MyService { private final Counter myCounter = Metrics.counter("my_counter"); private final Timer myTimer = Metrics.timer("my_timer"); public void myMethod() { myCounter.increment(); Timer.Sample sample = Timer.start(); // 执行你的方法代码 sample.stop(myTimer); } } ``` 在上面的代码中,我们创建了一个计数器`myCounter`来记录方法调用次数,以及一个计时器`myTimer`来记录方法执行时间。在方法中,我们首先增加计数器的值,然后使用计时器记录方法的执行时间。 最后,你可以使用Prometheus的HTTP接口来访问Micrometer收集的指标数据。例如,你可以使用以下命令来查询`my_counter`计数器的值: ``` curl http://localhost:8080/actuator/prometheus | grep my_counter ``` 这样就可以在没有Controller的方法中使用Prometheus监控了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值