当前位置: 首页 > news >正文

深入理解 Prometheus Metrics 存储类型及应用

前面我们介绍了Prometheus 数据规范 和 PromQL查询,两篇博文都提及四种数据存储类型,这些类型主要用于跟踪和评估特定过程或活动状态的可量化度量,帮助我们对系统核心指标的观察和监控。本文深入探讨Prometheus支持的四种指标数据、应用场景以及查询这些指标类型的常用PromQL函数,从而帮助你深入理解监控指标及其意义,更熟练使用PromQL进行查询分析。
在这里插入图片描述

Counters

计数器是一个累积度量,主要用于跟踪随时间增加的数量。简单地说,一个一个计数! 计数器是监视事件速率的理想工具,例如对web服务器的请求总数、任务完成情况或错误发生情况。它被设计为只增加,这意味着它的值永远不会减少(除非重置为零,通常是由于重新启动或重置生成它的进程)。

计数器通常在仪表板中可视化,以显示一段时间内的趋势,例如对web服务的请求率。例如,如果错误率或特定事件超过阈值,它们可以触发警报,指示被监视系统中的潜在问题。

Node Exporter 中的node_network_receive_bytes_total是一个计数器的示例,可用于跟踪在网络接口上接收的字节总数。

使用像rate() 或increase() 这样的PromQL函数来计算一段时间内计数器的每秒平均增长率。PromQL中的rate() 函数用于计算给定时间间隔内指标的每秒平均增长率。为了确定特定时间段内指标的总变化,PromQL increase() 计算给定时间范围内指标的累积增长。reset() 函数标识在给定时间段内计数器被重置的次数。

关于计数器复位的说明:

在某些情况下,计数器可以重置。计数器重置最常见的原因是生成度量的进程重新启动。这可能是由于服务重新启动、部署或系统重新启动所致。当这种情况发生时,计数器再次从零开始。

这种重置行为对于理解如何解释计数器数据至关重要,特别是在使用PromQL中的rate() 或increase() 等函数时。这些函数被设计用于计数复位。它们可以通过识别计数器值何时从一个采集间隔减少到下一个采集间隔来检测复位。在检测到重置后,这些函数假设计数器已设置为零,然后再次开始增加。

注意计数器重置很重要,因为它们会影响您对数据的解释。计数器值急剧下降后又增加可能会被误解为被测量度量的减少,而实际上,它只是一个重置。理解这种行为是准确监控和分析Prometheus指标的关键。

Gauges

Gauges(仪表)代表一种可以增加或减少的度量,类似于温度计。仪表是通用的,可以测量内存使用、温度或队列大小等值,在特定时间点给出系统状态的快照。更新仪表类型值非常简单易懂,根据它们所跟踪的指标来递增或递减,可以在任何给定时间设置一个特定的值。

仪表通常使用仪表板中的线形图来显示其值随时间的变化。它们可以方便地观察被测量对象的当前状态和趋势,而不是变化的速度。

在用于Java应用程序的JMX Exporter中,可以使用一个Gauge来监视标记为jvm_threads_current的JVM中活动线程的数量。当使用可以上下波动的Gauge时,通常使用特定函数来计算时间序列上的统计度量。

这些功能包括:

  • Avg_over_time() -用于计算平均值
  • Max_over_time() -用于查找最大值
  • Min_over_time() -用于查找最小值
  • Quantile_over_time() -用于确定指定时间段内的百分位数
  • Delta() -用于测量值在时间序列上的差异

这些功能有助于分析测量指标的趋势和变化,为被监视系统的性能和状态提供有价值的见解。

Histogram

直方图用于抽样和汇总分布,例如延迟。直方图非常适合理解度量值的分布,并有助于性能分析,如跟踪请求延迟或响应大小。

直方图有效地将测量数据分类到定义的间隔分组中,称为桶,并统计适合每个桶的测量数据的数量(即计数器)。这些桶是在检测阶段预先定义的。

在Prometheus Histogram类型中需要注意的一个关键问题是,桶是累积的。这意味着每个bucket计算小于或等于其上界的所有值,从而提供数据的累积分布。简单地说,每个桶包含所有先前桶的计数。我们将在下面的示例中对此进行探讨。

让我们看一个示例:使用bucket -观察响应时间,将请求时间划分为有意义的时间段,例如:

0到200ms : le=“200”(小于或等于200)

200ms至300ms : le=“300”(小于或等于300)

…等等

Prometheus 也默认添加一个 +inf bucket (无穷大)

假设观察到的API响应时间为175ms;桶的计数值看起来像这样:

BucketCount
0 - 2001
0 - 3001
0 - 5001
0 - 10001
0 - +Inf1

这里可以看到直方图的累积特性是如何工作的。

假设下面的观察中,我们的API的响应时间是300ms;计数值看起来像这样:

BucketCount
0 - 2001
0 - 3002
0 - 5002
0 - 10002
0 - +Inf2

要正确查询直方图类型度量,必须注意它的结构。

每个桶都可以作为一个“计数器”,可以通过添加_bucket后缀和le标签来访问它。默认情况下会生成_count_sum的后缀,以帮助进行定性计算。举例:

http_request_duration_seconds*_sum*{host="example.last9.io"} 9754.113
http_request_duration_seconds*_count*{host="example.last9.io"} 6745http_request_duration_seconds_*bucket*{host="example.last9.io", le="200"} 300
http_request_duration_seconds_*bucket*{host="example.last9.io", le="300"} 124
...

histogram_quantile() 函数从直方图中计算分位数(例如,中位数,第95百分位数)。它接受一个分位数(介于0和1之间的值)和一个直方图度量作为参数,并在直方图的桶中计算该分位数的估计值。

例如,histogram_quantile(0.95, metric_name_here)估计直方图中在95%以下的观察值落的值,从而提供对请求延迟等分布尾部的洞察。

直方图数据类型还可以进行聚合,即将多个直方图合并为单个直方图。假设您正在监视跨不同服务器的响应时间。每个服务器发出响应时间的直方图,我们可以汇总这些单独的直方图,以了解所有服务器上的总体响应时间分布。这种聚合是通过将所有直方图中相应桶中的计数相加来完成的。

例如,使用像这样的PromQL查询:

sum by (le) (rate(http_request_duration_seconds_bucket{endpoint="payment"}[5m]))

在本例中,sum by (le)部分聚合标记为“payment”的端点的所有实例中的每个桶(le 标签)中的计数。rate函数在5分钟间隔([5m])内应用,计算每个桶的每秒增长率,这有助于从计数器导出直方图。该查询为指定端点提供了跨所有服务器的请求持续时间分布的统一视图。

  • Native Histograms

Prometheus Native Histograms 是 Prometheus 2.40 版本引入的一种用于高效存储和查询直方图数据的原生功能。直方图(Histogram)是一种统计图表,在监控领域用于展示数据的分布情况。传统的直方图在 Prometheus 中有一定的局限性,例如在存储和计算成本上较高。Native Histograms 旨在解决这些问题,提供更高效的数据存储和查询方式。

和传统直方图类似,Native Histograms 也使用桶来划分数据范围。数据被划分到不同的桶中,以记录落在每个范围内的数据点数量。例如,对于一个记录请求响应时间的直方图,可能会有诸如 “0 - 10ms”、“10 - 20ms” 等桶。但 Native Histograms 在桶的表示上有所创新。它使用一种紧凑的、基于位(bit)的编码方式来存储桶信息,相比于传统直方图的存储方式,大大减少了存储开销。

Summary

摘要跟踪事件的大小和数量。摘要非常适合计算分位数和平均值;摘要用于需要在时间和空间上进行聚合的指标,如请求延迟或事务持续时间。

摘要度量在滑动时间窗口内自动计算、存储分位数(例如,第50、90、95百分位数)。这意味着它跟踪观察的数量(如请求)和它们的大小(如延迟),然后实时计算这些观察的分位数。Prometheus摘要通常由三部分组成:观察到的事件的计数(_count)、这些事件值的总和(_sum)和计算的分位数。

举例:

# HELP http_request_duration_seconds The duration of HTTP requests in seconds
# TYPE http_request_duration_seconds summary
http_request_duration_seconds{quantile="0.5"} 0.055
http_request_duration_seconds{quantile="0.9"} 0.098
http_request_duration_seconds{quantile="0.95"} 0.108
http_request_duration_seconds{quantile="0.99"} 0.15
http_request_duration_seconds_sum 600
http_request_duration_seconds_count 10000

当您需要单个实例或组件的准确分位数,并且不打算跨不同维度或标签聚合这些分位数时,摘要更适合。与直方图相比,直方图在跨多个实例或维度聚合数据时很有用,比如计算跨多个服务器的全局请求延迟。

摘要的一个重要限制是不能跨多个实例聚合它们的分位数。虽然可以对计数和总和求和,但分位数仅在单个汇总实例的上下文中有意义。

摘要可能会占用更多的资源,因为它们会动态地计算分位数,并保持一个滑动窗口的观察结果。直方图在内存和CPU使用方面可能更有效,特别是在处理高基数数据时。由于桶的配置是固定的,因此它们也可以针对存储进行优化。


http://www.mrgr.cn/news/62779.html

相关文章:

  • 【Linux】设备树
  • 夯实根基之MySql从入门到精通(一)
  • Python中的for循环
  • 如何在本地搭建一个three.js的开发环境
  • Java 子类继承父类,构造方法调用规则
  • 工作总结PPT模板免费下载,有这些网站就够了
  • Python 的函数嵌套调用
  • 建筑八大员标准员题库
  • YOLO V2 网络构架解析
  • 搜维尔科技:数据手套|动作捕捉|模拟仿真|VR交互解决方案
  • 继承(2)
  • ArcGIS005:ArcMap常用操作101-150例动图演示
  • HCIA(ACL)
  • 聊一聊Qt中的Slider和ProgressBar
  • 前端中断取消网络请求
  • C++变量声明与定义(有对引用的解释)
  • JAVA开发入门
  • Mysql 日志
  • 开启TikTok直播的全攻略:从网络条件到设备准备
  • 嵌入式软件信号量、互斥功能实现,解决不可重入性
  • 编程之路:蓝桥杯备赛指南
  • 安科瑞AM5SE-IS 防逆流保护装置 功能全面 逆功率保护
  • 【Hive sql 面试题】用一条sql语句查询出每门课都大于80分的学生姓名
  • hive将包含逗号的字段拆分为多列
  • chrome编辑替换js文件的图文教程
  • 易考八股文之SpringBoot和SSM的优缺点