美文网首页读书
Spring Boot快速接入Prometheus监控

Spring Boot快速接入Prometheus监控

作者: 技术栈 | 来源:发表于2022-08-10 10:05 被阅读0次

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

    公司高层领导突然变得雷厉风行,貌似是撑不下去了,不赚钱的业务开发人员全部裁掉,一个不留,对应的系统直接下线;运维人员只留下一部分,内部活水几个开发人员过来,部门从此改名为 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 简单,但是公司系统为什么没有类似指标等可用性的监控。好听点说是公司没人推行此类技术;难听点说,系统不重要,可有可无或者说即便出了问题也会不了了知。

    相关文章

      网友评论

        本文标题:Spring Boot快速接入Prometheus监控

        本文链接:https://www.haomeiwen.com/subject/mgppwrtx.html