Springboot中集成Prometheus

目录:

(1)Prometheus基本原理和使用
(2)Springboot中集成Prometheus

上文介绍了prometheus的基本原理和使用。本文将继续介绍如何在springboot中集成prometheus。


基本配置

首先需要在springboot项目中引入两个依赖包,分别是spring-boot-starter-actuatormicrometer-registry-prometheus

spring-boot-starter-actuator

Spring Boot Actuator是一个Spring Boot的子项目,它提供了一些用于监控和管理Spring Boot应用程序的端点(endpoints)和功能。
通过使用Actuator,可以轻松地监视应用程序的运行情况,包括度量指标、健康信息、配置信息等。

Actuator 默认只会开放 /actuator/health 和 /actuator/info这两个端点,如果要开放其他 endpoint,需要额外在 application.properties 中做设置:

management.endpoints.web.exposure.include=*   # 暴露所有端点
management.endpoints.web.base-path="/status"  # 将/actuator/xxx修改为/status/xxx,防止被猜到
management.endpoints.server.request.metric-name="application:request"  # 自定义接口指标名
management.endpoints.client.request.metric-name="application:client_request"  # 自定义http客户端指标名
management.server.port=10111   # 指定端口,默认跟server.port一样,可以防止被猜到

其他配置请参考官方文档。

在Actuator中,一个重要的端口为/actuator/prometheus。上文说过,Prometheus根据配置的job定时去拉取各个监控节点的数据,任何组件只要提供对应的HTTP接口就可以接入监控,不需要任务SDK或其他集成过程。因此,该端口只要能提供prometheus格式的指标,就能在Prometheus中查询到。

micrometer-registry-prometheus

Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API,支持多种度量指标类型,这些指标可以用于观察、警报以及对应用程序当前状态做出响应。

为了让度量指标符合Prometheus需要的格式,因此还需要引入micrometer-registry-prometheus

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置好之后,启动项目,访问actuator提供的prometheus端口,就能看到prometheus指标了。

# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine
# TYPE jvm_classes_loaded_classes gauge
jvm_classes_loaded_classes 15091.0
# HELP spring_security_filterchains_authentication_anonymous_before_total  
# TYPE spring_security_filterchains_authentication_anonymous_before_total counter
spring_security_filterchains_authentication_anonymous_before_total{security_security_reached_filter_section="before",spring_security_filterchain_position="0",spring_security_filterchain_size="0",spring_security_reached_filter_name="none",} 7.0
# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live_threads gauge
jvm_threads_live_threads 57.0
# HELP tomcat_sessions_active_current_sessions  
# TYPE tomcat_sessions_active_current_sessions gauge
tomcat_sessions_active_current_sessions 0.0

当然,要在prometheus中查询的话还需要配置抓取指标的job:

- job_name: "application"
    scrape_interval: 20s
    scrape_timeout: 20s
    metrics_path: "/status/prometheus"
    static_configs:
      - targets: ["localhost:8080"]

在这里插入图片描述

PromQL表达式

前文说过,Prometheus中有很多函数,可以从不同维度来对指标进行统计。
其中,最常用的有rate(), increase(),irate(), deriv()等函数。

rate表示每秒的速率,increase表示在时间窗口内的增长数量,increase = rate x 时间窗口。

在计算某个时间窗口内的指标变化情况时,比如rate和increase,至少需要两个样本数据。当数据样本少于2个时,无法计算结果。这意味着,你必须选取合适的时间窗口。

通常来说,时间窗口选择的最佳实践是采样间隔时间的四倍。也就是说,如果job的采样间隔时间是15s,则时间窗口为1min比较合适。当使用Grafana时,也可以用$__rate_interval模版变量来自动选择一个合适的时间窗口。

rate()

此函数计算整个采样周期内每秒的增长率。

例如:rate(http_requests_total[5m]) 得出的是HTTP在5分钟窗口内,平均每秒的请求率。作为最常见的函数,它以可预测的每秒输出单位产生平滑的rate。

irate()

即 “瞬时rate”,此函数和rate()一样,计算每秒的增长率,但只对规定采样周期内的最后两个样本进行计算,而忽略前面所有样本。

例如:irate(http_requests_total[5m]) 选取规定5分钟窗口内的最后两个样本,并计算两者之间每秒的增长率。如果想让一个放大的图形显示出对rate变化的快速响应,那这个函数就很有用,它呈现的结果会比rate()的有更多的峰值。

increase()

此函数和 rate() 完全一样,只是它没有将最终单位转换为 “每秒”(1/s)。每个规定的采样周期就是它的最终单位。

例如:increase(http_requests_total[5m]) 得出的是5分钟的采样周期内处理完成的HTTP请求的总增长量(单位1/5m)。因此increase(foo[5m])/ (5 * 60) 等同于rate(foo[5m])。

这三个函数都有一个共同的要求,就是它们在规定的采样周期中都需要有至少两个样本才能运行。少于两个样本的序列将从结果中删除。

如何精准计算在固定时间窗口和该窗口中一些数据点的增长是一个要权衡和不完美的近似值问题。Prometheus选择的方法是在所提供的采样周期中通过有限的数据,来提供平均下来最正确的答案。让我们来看看它是如何做到这点的。

数据外推

rate()和 increase()两个函数的外推经常让人混淆。

例如,对于只有整数增量的counter,increase() 也可能返回非整数结果,如2.5883。这是因为increase() 是在规定时间窗口的总范围内得到counter增长量的近似值(比如increase(foo[5m])中的5分钟)。

实际上,时间窗口中的第一个和最后一个样本,永远不会与规定时间窗口的开始和结束100%重合。因此increase() (以及rate())会在窗口与窗口的界限中外推第一个和最后一个数据点之间的斜率,以得出一个平均而言更接近整个窗口内预期增长的数值(如果在窗口边界确实有样本)。

下图显示了一个使用 rate()的例子,窗口时间为1分钟,采样间隔为15秒,在窗口中发生了一次counter实际增加 1 的情况。

如图所示,报告结果是基于窗口中第一个和最后一个样本之间的斜率产生的,并外推到窗口边界处。

注意,这种外推是有一些例外的:当第一个或最后一个样本距离各自的窗口边界大于窗口中样本之间平均间隔的1.1倍时,序列会在窗口中开始或结束。在这种情况下,外推只向窗口边界延伸半个平均样本区间,而不是全部。同样,函数会避免外推至负值,因为counter总是从0开始,永远不会是负值。相反,只有达到预期值0时,外推才会发生。

避免过度外推如下图所示:

当采样的数据不连续,数据量较少时,通过rate或increase函数画出来的图形可能看起来不符合实际,这正是因为数据外推造成的。
当采样数据保持一定数量且连续不断时,rate函数或increase函数的数据外推机制才符合实际情况。

处理Counter重置

尽管counter一般只会叠加,但在某些情况下,它们也会重置为0 。

为了不把这些重置解释成实际的负rate,和counter相关的函数具有检测和处理这些重置的逻辑:

  • 当在提供的时间窗口下迭代样本时,函数会检查是否有任何样本的值比前一个低,并将这种情况解释为counter重置。Counter在重置后总是从0开始,那么根据这个假设,这些函数只是将新的采样值加到之前看到的采样值上,以补偿重置。

参考资料

[1].https://www.cnblogs.com/cjsblog/p/14434883.html
[2].https://promlabs.com/blog/2022/12/11/avoid-these-6-mistakes-when-getting-started-with-prometheus/
[3].https://promlabs.com/blog/2021/01/29/how-exactly-does-promql-calculate-rates/
[4].https://www.metricfire.com/blog/understanding-the-prometheus-rate-function/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值