Spring Boot快速接入Prometheus监控|写给Java开发运维

不想听我废话的,直接看代码就行:https://github.com/strictnerd/spring-petclinic-compose

最近跟几个粉丝聊天吹水,说最近公司裁员严重,不仅裁掉了大部分的人,也裁掉了大部分的业务;之前公司有钱赚,什么产品都愿意做,无论行不行都会试一试,一堆没有什么流量的系统都在线上跑着,但是没有上级发话,一个也不敢停掉。站着资源不说,关键还得保证活着,基本就是运维人员要和系统同在,搞得我们这些运维苦不堪言。

公司高层领导突然变得雷厉风行,貌似是撑不下去了,不赚钱的业务开发人员全部裁掉,一个不留,对应的系统直接下线;运维人员只留下一部分,内部活水几个开发人员过来,部门从此改名为 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

55a88bebc5b56f13c76cfb45337f724a.png

所有指标都有了,只要有了指标,其它一切都好说了,只要采集到指标,计算好展示出来,超过阈值进行告警。

  • 运行 Prometheus,并添加抓取配置

scrape_configs:
  - job_name: 'application'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['application:8091']
  • 添加查询

rate(http_server_requests_seconds_count[5m])
f1f7209efa0fcfd08fddb3663c559cfc.png f94acad4b83287057d0b11b3daede9a4.png

其实到这里也就差不多了,我上次在群里也是跟网友这么说的,但是反馈说根本不行,服务跑不起来,为了防止出现类似问题,我这里给出了我的一个源码 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 的指标,如下所示:

8f240075e814a40b4afcfafc638d4be6.png

这个自己根据需要进行监控指标采集和展示。

如何添加自己的指标维度

有些服务是隔离的,同一份代码但是在不同的地区部署,这个底层库已经留好了扩展结点,举个例子,比如我们需要在各个指标中加入一个 region 维度,添加如下代码即可,支持多个。

@Bean
 MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
  return registry -> registry.config().commonTags("region", "us-east-1");
 }
f6d5e75613f831a2579dc2f437a7d70f.png

这样每个指标中就会多出一个维度。

如何对部分没有监控的接口添加切面

虽然 io.micrometer 覆盖了服务中的大多数场景,但是根据业务实际情况,肯定有组件覆盖不到的地方,怎么办?那就使用 Timed 自定义处理。

  • Timed 注解不会被 Spring 框架扫描,所以需要添加如下代码

@Bean
 TimedAspect timedAspect(MeterRegistry registry) {
  return new TimedAspect(registry);
 }
  • 在需要监控的代码片段上添加注解3087be33fbdd9a9cab2f3378ada83bf7.png

  • 查看指标

8f2529641e26323525b3fd64cfaa1439.png

总结

看完上面的介绍,你会发现简单、简单、还是 tmd 简单,但是公司系统为什么没有类似指标等可用性的监控。好听点说是公司没人推行此类技术;难听点说,系统不重要,可有可无或者说即便出了问题也会不了了知。

55f023c1daddb84bfa78126ab1220276.png

推荐

搞搞 Prometheus 的告警原理

如何在云原生中监控JVM指标


原创不易,随手关注或者”在看“,诚挚感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值