最近跟几个粉丝聊天吹水,说最近公司裁员严重,不仅裁掉了大部分的人,也裁掉了大部分的业务;之前公司有钱赚,什么产品都愿意做,无论行不行都会试一试,一堆没有什么流量的系统都在线上跑着,但是没有上级发话,一个也不敢停掉。站着资源不说,关键还得保证活着,基本就是运维人员要和系统同在,搞得我们这些运维苦不堪言。
公司高层领导突然变得雷厉风行,貌似是撑不下去了,不赚钱的业务开发人员全部裁掉,一个不留,对应的系统直接下线;运维人员只留下一部分,内部活水几个开发人员过来,部门从此改名为 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 简单,但是公司系统为什么没有类似指标等可用性的监控。好听点说是公司没人推行此类技术;难听点说,系统不重要,可有可无或者说即便出了问题也会不了了知。