Spring Boot快速接入Prometheus监控
最近跟几个读者聊天吹水,说最近公司裁员严重,不仅裁掉了大部分的人,也裁掉了大部分的业务;之前公司有钱赚,什么产品都愿意做,无论行不行都会试一试,一堆没有什么流量的系统都在线上跑着,但是没有上级发话,一个也不敢停掉。站着资源不说,关键还得保证活着,基本就是运维人员要和系统同在,搞得我们这些运维苦不堪言。
公司高层领导突然变得雷厉风行,貌似是撑不下去了,不赚钱的业务开发人员全部裁掉,一个不留,对应的系统直接下线;运维人员只留下一部分,内部活水几个开发人员过来,部门从此改名为 DevOps 团队,大多数系统已经没有了,云上资源迅速收缩了一半。日常琐事基本没了,以前 KPI 写保证 xx 个系统稳定运行,现在没得写了,基本是多个人保证 1 个系统运行。没什么办法,领导发话,要精细化运营,不清楚有没有用,先活下去再说。
但是他们大多数人都是运维,语言层面 python、golang、sql 运用还算可以,日常云原生常见组件一些 Prometheus 语法之类的东西都能够熟练使用,但是有些服务压根就没有提供指标.... 对于抽象和封装太完美 Java 应用系统真是不清楚怎么上手,更不知道如何添加监控,问一些开发人员,多数对于 Prometheus 指标没有特别清晰的概念,侵入太多,就不愿意改,说来说去,只能看看 CPU、内存以及 nginx 上的 qps 和延迟。
如何为应用程序添加监控
之所以造成如上局面,主要是运维人员对于一些开发生态不了解导致的,其实对于常见 Java 应用程序基本都是基于 Spring 开发,而 Spring 本身就是封装和继承做到特别好,好到你根本不用了解他就可以在他的基础上做开发,这就是 Crud 程序员盛行的原因。而对于 Sring 监控也是一样的,也是非常简单,下面我以 SpringBoot 2.x 为例演示下对系统中所有接口以及中间件的监控。
- 第一步添加一个 jar 依赖到应用程序中
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- 添加配置项
management.endpoints.web.exposure.include=prometheus
spring.application.name=spring-petclinic-compose
management.server.port=8091
management.metrics.tags.application=${spring.application.name}
- 启动应用程序,访问:
http://127.0.0.1:8091/actuator/prometheus
所有指标都有了,只要有了指标,其它一切都好说了,只要采集到指标,计算好展示出来,超过阈值进行告警。
- 运行 Prometheus,并添加抓取配置
scrape_configs:
- job_name: 'application'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['application:8091']
- 添加查询
rate(http_server_requests_seconds_count[5m])
其实到这里也就差不多了,我上次在群里也是跟网友这么说的,但是反馈说根本不行,服务跑不起来,为了防止出现类似问题,我这里给出了我的一个源码 Demo 链接,只要 Java 开发环境配置好,导入到本地,就可以运行https://github.com/strictnerd/spring-petclinic-compose
目的达到了,运维人员到这里就可以止步了;如果是开发人员还可以继续了解下如何自定义指标收集,具体代码也已经上传到 github 具体可以参考https://github.com/strictnerd/spring-petclinic-compose
自定义指标
集成之后大家反馈的第一个问题就是指标太多,目前 io.micrometer
基本进行常见 http、tomcat、jetty、kafka、cache、redis、JVM CPU MEM、GC、logback...等等监控,具体自行查看 Spring 官网介绍 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics
如何关闭所有指标,并打开想要的指标?
management.metrics.enable.all=false
management.metrics.enable.http=false
management.metrics.enable.jvm=true
如上配置,我可以关闭所有的配置,但是唯独打开 jvm 的指标,如下所示:
这个自己根据需要进行监控指标采集和展示。
如何添加自己的指标维度
有些服务是隔离的,同一份代码但是在不同的地区部署,这个底层库已经留好了扩展结点,举个例子,比如我们需要在各个指标中加入一个 region 维度,添加如下代码即可,支持多个。
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}
这样每个指标中就会多出一个维度。
如何对部分没有监控的接口添加切面
虽然 io.micrometer
覆盖了服务中的大多数场景,但是根据业务实际情况,肯定有组件覆盖不到的地方,怎么办?那就使用 Timed 自定义处理。
- Timed 注解不会被 Spring 框架扫描,所以需要添加如下代码
@Bean
TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
- 在需要监控的代码片段上添加注解
- 查看指标
总结
看完上面的介绍,你会发现简单、简单、还是 tmd 简单,但是公司系统为什么没有类似指标等可用性的监控。好听点说是公司没人推行此类技术;难听点说,系统不重要,可有可无或者说即便出了问题也会不了了知。