Spring Boot Metrics监控之Prometheus

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

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

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

下面是监控页面的效果图,监控应用的 jvm 、请求总次数、下单总金额情况
Spring Boot Metrics监控之Prometheus

实现目的一:监控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%已经下面的其他信息
    Spring Boot Metrics监控之Prometheus

接下来使用自定义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
    Spring Boot Metrics监控之Prometheus
    输入 order_amount_total_sum{job=“order-service-prometheus”} 查询订单金额,结果为 344
    Spring Boot Metrics监控之Prometheus
  • 4.使用 grafana 显示在 prometheus中通过 promql 查询出来的信息,在 grafana–dashboard上,点击 add panel,选择 Singlestat,然后在新增的 panel 上点击向下的箭头,再点击 edit,去配置 metrics 查询信息
    Spring Boot Metrics监控之Prometheus
    在 General中改下name为 系统请求总数,在Metrics 中添加 PromQL查询,然后输入 30s 刷新一次,勾上 Instant 实时获取
    Spring Boot Metrics监控之Prometheus
    点击上面的 save 图标进行保存,订单金额的监控面板也是这样创建,再去访问下应用的 hello、zhuyu、order方法,加点数据, 可以看到数据几乎实时显示出来了
    Spring Boot Metrics监控之Prometheus
    下面是JVM监控,上面是应用数据监控,还有仪表盘和柱状图,还需要结合应用埋点

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

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