放干货以前允许我说一些废话(其实以为也是干货)
从数据层面,能够把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();
数组