SpringBoot自定义prometheus监控

放干货之前容许我说一些废话(其实觉得也是干货)
从数据层面,可以把prometheus理解成一个简单的数据库,每个metrices可以配置不同的标签,对应着一系列数值,但是如果给这些数值赋予各种业务的,资源的,服务性能的意义,并结合AlertManager,prometheus简直是个神器啊
网上文章很多,入门比较容易,但是我本人学习的时候有个地方理解了比较久,在promethues的graph页,如果查询metrics_name{tag1:"value1",...},可以查到数据,数据以线图展示,这个比较好理解,就是把这个系列每个时间点的数值绘制了出来,但是我要查五分钟内的:metrics_name{tag1:"value1",...}[5m],图表就无法展示了,一度无法理解,这个不就是应该展示前5分钟的数据吗,出现这种疑惑其实是没有理解prometheus真正用法,在prometheus里,永远要把数据想象成每一秒的数值,图表展示的必须是 【时间(精确到秒)】,【这一秒的数值】,是一个一维数组,而metrics_name{tag1:"value1",...}[5m]查出来的是一个二维数组【时间(精确到秒)】,【这一秒前五分钟内的所有数值】,自然就无法绘制线图了,所以我们要对这个数据的第二维度做一些聚合,例如做个sum,或者统计一下count,或者算一下增长量increase,或者平均增长量rate,或者瞬间增长量irate,就再次将二维数组变成了一维数组,就可以在graph中做展现了,栗子:
increase(metrics_name{tag1:"value1",...}[5m])

实战

假如我有一个定时器,springboot写的,每24小时执行一次,我希望通过prometheus做到少同步一次就告警。
大致思路使用Counter类型,每次执行成功count+1,prometheus增加rules,超过25小时(留一些余地)发现这个metrices增长量小于1说明没同步,就告警。直接贴代码不细说了,比较好理解,唯一不好的地方是组件把关键的接口暴露在/prometheus了,而我需要它在/metrics接口,而且组件默认暴露的接口中也有/metrics,但是不是prometheus需要的数据,所以在配置文件中设置只暴露prometheus,并自己新增/metrics做了一个转发,这个比较生硬,而且组件会默认收集jvm等相关信息暴露给prometheus,我在配置文件里关掉了


    org.springframework.boot
    spring-boot-starter-actuator


    io.micrometer
    micrometer-registry-prometheus

如果是格式yml配置文件:

management:
  metrics:
    binders:
      jvm:
        enabled: false
      files:
        enabled: false
      integration:
        enabled: false
      logback:
        enabled: false
      processor:
        enabled: false
      uptime:
        enabled: false
  endpoints:
    web:
      exposure:
        include: ["prometheus"]
      base-path: "/"

如果是格式properties配置文件:

management.metrics.binders.files.enabled=false
management.metrics.binders.integration.enabled=false
management.metrics.binders.jvm.enabled=false
management.metrics.binders.logback.enabled=false
management.metrics.binders.processor.enabled=false
management.metrics.binders.uptime.enabled=false
management.endpoints.web.exposure.include[0]=prometheus
management.endpoints.web.base-path=/
@Configuration
public class PromConfig {

  @Autowired
  PrometheusMeterRegistry registry;

  @Bean
  public Counter getCounter() {
    Counter counter = Counter.builder("goods_rank_sync_count")
        .tags("status", "success")
        .description("Number of successful goods rank sync")
        .register(registry);
    return counter;
  }
}
@GetMapping("metrics")
public void metrics(HttpServletResponse response) throws IOException {
  response.sendRedirect("/prometheus");
}

数据同步成功时调用:counter.increment();

你可能感兴趣的:(Java,springboot)