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