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])java

实战

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

若是是格式yml配置文件:spring

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();数组