搞懂 Prometheus 这四种指标类型,谁都可能成为监控老司机?

news2024/10/5 13:42:39

指标是用来衡量性能、消耗、效率和许多其他软件属性随时间的变化趋势。它们允许工程师通过警报和仪表盘来监控一系列测量值的演变(如CPU或内存使用量、请求持续时间、延迟等)。指标在IT监控领域有着悠久的历史,并被工程师广泛使用,与日志和链路追踪一起被用来检测系统是否有不符合预期的表现。

在其最基本的形式中,一个指标数据点是由以下三个部分构成:

  • 一个指标名称

  • 收集该数据点的时间戳

  • 一个由数字表示的测量值

在过去的十年里,随着系统变得越来越复杂,出现了维度度量的概念,也就是说,度量还包括一组标签或标识(即维度),以提供额外的上下文。支持维度指标的监控系统允许工程师通过查询特定的指标名称,并通过标签进行过滤和分组,从而轻易地在多个组件和维度上汇总和分析一个指标。

Prometheus定义了一个度量说明格式和一个远程写入协议,社区和许多供应商都采用这个协议来说明和收集度量成为事实上的标准。OpenMetrics是另一个CNCF项目,它建立在Prometheus导出格式的基础上,为收集度量标准提供了一个与厂商无关的标准化模型,旨在成为互联网工程任务组(IEFT)的一部分。

最近,另一个CNCF项目OpenTelemetry出现了,它的目标是提供一个新的标准,能够统一指标、链路跟踪和日志的收集,使跨领域的遥测信号收集和关联更容易。

我们希望你在读完这些文章后,你能理解每个标准之间的差异,这样你就能决定哪一个能更好地满足你当前(和未来)的需求。

1、Prometheus指标

首先要做的事。Prometheus收集的指标有四种,作为其暴露格式的一部分。

  • Counters

  • Gauges

  • Histograms

  • Summaries

Prometheus 使用拉取模型来收集这些指标;也就是说,Prometheus 主动抓取暴露指标的HTTP端点。这些端点可以是由被监控的组件自然暴露,也可以通过社区建立的数百个Prometheus导出器之一暴露出来。Prometheus提供了不同编程语言的客户端库,你可以用它来监控你的代码。

由于服务发现机制和集群内的共享网络访问,拉取模型在监控 Kubernetes 集群时效果很好,但用 Prometheus 监控动态的虚拟机集群、AWS Fargate 容器或 Lambda函数就比较困难了。

为什么呢?主要原因是交易确定要抓取的指标端点,而且对这些端点的访问可能受到网络安全策略的限制。为了解决其中的一些问题,社区在2021年底发布了Prometheus Agent Mode,它只收集指标并使用远程写入协议将其发送到监控后端。

Prometheus 可以抓取 Prometheus 暴露格式和 OpenMetrics 格式的指标。在这两种情况下,指标通过HTTP接口暴露,使用简单的基于文本的格式(更常用和广泛支持)或更有效和强大的 Protobuf 格式。文本格式的一大优势是它的可读性,这意味着你可以在浏览器中打开它或使用像curl这样的工具来检索当前暴露的指标集。

Prometheus 使用一个非常简单的指标模型,有四种指标类型,只在客户端SDK中支持。所有的指标类型都是用一种数据类型或由多个单一数据类型的组合在暴露格式中表示。这个数据类型包括一个指标名称、一组标签和一个浮点数。时间戳是由监控后端(例如 Prometheus)或代理在抓取指标时添加的。

指标名称和标签集的每个唯一组合定义了一条时间序列,而每个时间戳和浮点数定义了一个系列中的样本(即一个数据点)。

一些惯例被用来表示不同的度量类型。

Prometheus暴露格式的一个非常有用的特点是能够将元数据与度量相关联,以定义其类型并提供描述。例如,Prometheus提供了这些信息,Grafana利用这些信息向用户显示额外的上下文信息,帮助他们选择正确的度量并应用正确的PromQL函数。

图片

# HELP用来为指标提供描述,# TYPE为指标提供类型。

现在,让我们来更详细地介绍一下每个Prometheus指标类型。

计数器(Counter)

Counter类型指标被用于单调增加的测量结果。因此它们总是累积的数值,值只能上升。唯一的例外是 Counter 重启,在这种情况下,它的值会被重置为零。

Counter 的实际值通常本身并不十分有用。一个计数器的值经常被用来计算两个时间戳之间的 delta 或者随时间变化的速率。

例如,Counter 的一个典型用例是记录API调用次数,这是一个总是会增加的测量值。

# HELP http_requests_total Total number of http api requests# TYPE http_requests_total counterhttp_requests_total{api="add_product"} 4633433

指标名称是http_requests_total,它有一个名为api的标签,值为add_product,Counter 的值为 4633433。

这意味着自从上次服务启动或Counter重置以来,add_product的 API 已经被调用了 4633433 次。按照惯例,Counter 类型的指标通常以_total为后缀。

这个绝对数字并没有给我们提供多少信息,但当与 PromQL 的 rate 函数(或其他监控后端的类似函数)一起使用时,它可以帮助我们了解该API每秒收到的请求数。下面的 PromQL 查询计算了过去5分钟内每秒的平均请求数。

rate(http_requests_total{api="add_product"}[5m])

为了计算一段时期内的绝对变化,我们将使用 delta 函数,在 PromQL 中称为increate():

increase(http_requests_total{api="add_product"}[5m])

这将返回过去5分钟内的总请求数,这相当于用每秒的速率乘以间隔时间的秒数(在我们的例子中是5分钟):

rate(http_requests_total{api="add_product"}[5m]) * 5 * 60

其他你可能会使用 Counter 类型指标的例子:测量电子商务网站的订单数量,在网络接口上发送和接收的字节数,或者应用程序中的错误数量。如果它是一个会一直上升的指标,那么就使用一个Counter

下面是一个例子,说明如何使用 Prometheus 客户端库在 Python 中创建和增加一个计数器指标:​​​​​​​

from prometheus_client import Counterapi_requests_counter = Counter(                        'http_requests_total',                        'Total number of http api requests',                        ['api']                       )api_requests_counter.labels(api='add_product').inc()

需要注意的是,由于Counter可以被重置为零,你要确保你用来存储和查询指标的后端能够支持这种情况,并且在Counter重启的情况下仍然提供准确的结果。

Prometheus 和兼容 PromQL 的 Prometheus 远程存储系统,如 Promscale,可以正确处理 Counter 重启。

仪表(Gauge)

Gauge 指标用于可以任意增加或减少的测量。这是你可能更熟悉的指标类型,因为即使没有经过额外处理的实际值也是有意义的,它们经常被使用到。例如,测量温度、CPU和内存使用的指标,或者队列的大小都是Gauge。

例如,为了测量一台主机的内存使用情况,我们可以使用一个Gauge指标,比如:​​​​​​​

# HELP node_memory_used_bytes Total memory used in the node in bytes# TYPE node_memory_used_bytes gaugenode_memory_used_bytes{hostname="host1.domain.com"} 943348382

上面的指标表明,在测量时,节点 host1.domain.com 使用的内存约为 900 MB。该指标的值是有意义的,不需要任何额外的计算,因为它告诉我们该节点上消耗了多少内存。

与使用 Counter 指标时不同,rate和delta函数对Gauge没有意义。然而,计算特定时间序列的平均数、最大值、最小值或百分比的函数经常与 Gauge一起使用。

在 Prometheus 中,这些函数的名称是avg_over_timemax_over_timemin_over_timequantile_over_time。要计算过去10分钟内在host1.domain.com 上使用的平均内存,你可以这样做:

avg_over_time(node_memory_used_bytes{hostname="host1.domain.com"}[10m])

要使用 Prometheus 客户端库在 Python 中创建一个 Gauge 指标,你可以这样做:

from prometheus_client import Gaugememory_used = Gauge(                'node_memory_used_bytes',                'Total memory used in the node in bytes',                ['hostname']              )memory_used.labels(hostname='host1.domain.com').set(943348382)

直方图(Histogram)

Histogram 指标对于表示测量的分布很有用。它们经常被用来测量请求持续时间或响应大小。

直方图将整个测量范围划分为一组区间,称为桶,并计算每个桶中有多少测量值。

一个直方图指标包括几个项目:

  1. 一个包含测量次数的Counter。指标名称使用_count后缀。

  2. 一个包含所有测量值之和的Counter。指标名称使用_sum后缀。

  3. 直方图桶被暴露为一系列的Counter,使用指标名称的后缀_bucket和表示桶的上限的le label。Prometheus中的桶是包含桶的边界的,即一个上限为N的桶(即le label)包括所有数值小于或等于N的数据点。

例如,测量运行在 host1.domain.com 实例上的 add_productAPI 端点实例的响应时间的 Histogram 指标可以表示为:​​​​​​​

# HELP http_request_duration_seconds Api requests response time in seconds# TYPE http_request_duration_seconds histogramhttp_request_duration_seconds_sum{api="add_product" instance="host1.domain.com"} 8953.332http_request_duration_seconds_count{api="add_product" instance="host1.domain.com"} 27892http_request_duration_seconds_bucket{api="add_product" instance="host1.domain.com" le="0"}http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.01"} 0http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.025"} 8http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.05"} 1672http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.1"} 8954http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.25"} 14251http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.5"} 24101http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="1"} 26351http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="2.5"} 27534http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="5"} 27814http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="10"} 27881http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="25"} 27890http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="+Inf"} 27892

上面的例子包括sum、counter和12个桶。sum和counter可以用来计算一个测量值随时间变化的平均值。在PromQL中,过去5分钟的平均请求响应时间可以通过如下方式计算得到。

rate(http_request_duration_seconds_sum{api=”add_product”, instance=”host1.domain.com”}[5m]) / rate(http_request_duration_seconds_count{api=”add_product”, instance=”host1.domain.com”}[5m])

它也可以被用来计算各时间序列的平均数。下面的 PromQL 查询将计算出所有API和实例在过去5分钟内的平均请求响应时间。

sum(rate(http_request_duration_seconds_sum[5m])) / sum(rate(http_request_duration_seconds_count[5m]))

利用 Histogram,你可以在查询时计算单个时间序列以及多个时间序列的百分位。在PromQL中,我们将使用histogram_quantile函数。Prometheus使用分位数而不是百分位数。

它们本质上是一样的,但是以0到1的比例表示的,而百分位数是以0到100的比例表示的。要计算在host1.domain.com上运行的add_product API响应时间的第99百分位数(0.99四分位数),你可以使用以下查询。

histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{api=”add_product”, instance=”host1.domain.com”}[5m]))

Histograms 的一大优势是可以进行汇总。下面的查询返回所有API和实例的响应时间的第99个百分点‍:

histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))

在云原生环境中,通常有许多相同组件的多个实例在运行,能否跨实例汇总数据是关键。

Histograms有三个主要的缺点:

  • 首先,桶必须是预定义的,这需要一些前期的设计。如果你的桶没有被很好地定义,你可能无法计算出你需要的百分比,或者会消耗不必要的资源。例如,如果你有一个总是需要超过一秒钟的API,那么拥有上限(le label)小于一秒钟的桶将是无用的,只会消耗监控后端服务器的计算和存储资源。另一方面,如果99.9%的API请求耗时少于50毫秒,那么拥有一个上限为100毫秒的初始桶将无法让你准确测量API的性能。

  • 第二,他们提供的是近似的百分位数,而不是精确的百分位数。这通常没什么问题,只要你的桶被设计为提供具有合理准确性的结果。

  • 第三,由于百分位数需要在服务器端计算,当有大量数据需要处理时,它们的计算成本会非常高。在Prometheus中减轻这种情况的一个方法是使用录制规则来预先计算所需的百分位数。

下面的例子显示了如何使用 Prometheus 的 Python 客户端库创建一个带有自定义桶的直方图指标。

from prometheus_client import Histogramapi_request_duration = Histogram(                        name='http_request_duration_seconds',                        documentation='Api requests response time in seconds',                        labelnames=['api', 'instance'],                        buckets=(0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 25 )                       )api_request_duration.labels(    api='add_product',    instance='host1.domain.com').observe(0.3672)

汇总(Summary)

像直方图一样,Summary指标对于测量请求持续时间和响应体大小很有用。

像直方图一样,汇总度量对于测量请求持续时间和响应大小很有用。

一个Summary指标包括这些指标:

  • 一个包含总测量次数的Counter。指标名称使用_count后缀。

  • 一个包含所有测量值之和的Counter。指标名称使用_sum后缀。可以选择使用带有分位数标签的指标名称,来暴露一些测量值的分位数指标。由于你不希望这些量值是从应用程序运行的整个时间内测得的,Prometheus客户端库通常会使用流式的分位值,这些分位值是在一个滑动的(通常是可配置的)时间窗口上计算得到的。

例如,测量在 host1.domain.com 上运行的 add_productAPI 端点实例的响应时间的 Summary 指标可以表示为:​​​​​​​

# HELP http_request_duration_seconds Api requests response time in seconds# TYPE http_request_duration_seconds summaryhttp_request_duration_seconds_sum{api="add_product" instance="host1.domain.com"} 8953.332http_request_duration_seconds_count{api="add_product" instance="host1.domain.com"} 27892http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0"}http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.5"} 0.232227334http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.90"} 0.821139321http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.95"} 1.528948804http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.99"} 2.829188272http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="1"} 34.283829292

上面这个例子包括总和和计数以及五个分位数。分位数0相当于最小值,分位数1相当于最大值。分位数0.5是中位数,分位数0.90、0.95和0.99相当于在host1.domain.com上运行的add_product API端点响应时间的第90、95和99个百分位。

像直方图一样,Summary指标包括总和和计数,可用于计算随时间的平均值以及不同时间序列的平均值。

Summary提供了比Histogram更精确的百分位计算结果,但这些百分位有三个主要缺点:

  • 首先,客户端计算百分位是很昂贵的。这是因为客户端库必须保持一个有序的数据点列表,以进行这种计算。在Prometheus SDK中的实现限制了内存中保留和排序的数据点的数量,这降低了准确性以换取效率的提高。注意,并非所有的Prometheus客户端库都支持汇总指标中的量值。例如,Python SDK就不支持。

  • 第二,你要查询的量值必须由客户端预先定义。只有那些已经提供了指标的量值才能通过查询返回。没有办法在查询时计算其他百分位。增加一个新的百分位指标需要修改代码,该指标才可以被使用。

  • 第三,也是最重要的一点,不可能把多个Summary指标进行聚合计算。这使得它们对动态现代系统中的大多数用例毫无用处,在这些用例中,通常我们对一个特定的组件感兴趣,这个视角是全局的,它不与特定的实例关联。

因此,想象一下,在我们的例子中,add_product 的 API 端点运行在10个主机上,在这些服务之前有一个负载均衡器。我们没有任何聚合函数可以用来计算add_product API 接口在所有请求中响应时间的第99百分位数,无论这些请求被发送到哪个后端实例上。我们只能看到每个主机的第99个百分点。

同样地,我们也只能知道某个接口,比如 add_productAPI 端点的(在某个实例上的)第99百分位数,而不能对不同的接口进行聚合。

下面的代码使用 Prometheus 的 Python 客户端库创建了一个 Summary 指标。

from prometheus_client import Summaryapi_request_duration = Summary(                        'http_request_duration_seconds',                        'Api requests response time in seconds',                        ['api', 'instance']                       )api_request_duration.labels(api='add_product', instance='host1.domain.com').observe(0.3672)

上面的代码没有定义任何量化指标,只会产生总和和计数指标。Prometheus 的Python SDK 不支持 Summary 指标中的分位数计算。

Histogram还是Summary?

在大多数情况下,直方图是首选,因为它更灵活,并允许汇总百分位数。

在不需要百分位数而只需要平均数的情况下,或者在需要非常精确的百分位数的情况下,汇总是有用的。例如,在履行关键系统的合约责任的情况下。

下表总结了直方图和汇总表的优点和缺点。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理类联考——数学——汇总篇——知识点突破——应用题——至少至多

🐴 ⛲️ 一、考点讲解 至少至多问题也属于动态的最值问题,是考生失分率较高的题型,这类题目思路比较灵活,无固定化的公式和结论,所以考生必须灵活处理。 二、考试解读 这类题目难度较大,属于拉分题目。对…

企业综合信息化,人力资源管理,培训考学管理,电子采购(源码系统)

前言: 随着现代信息技术的不断发展,企业综合信息化已成为一种必然趋势。企业综合信息化是指将信息技术与企业业务流程相结合,实现企业资源的优化配置和高效利用,提升企业的竞争力和生产力。在实现企业综合信息化的过程中&#xff…

页面解析之结构化数据

结构化的数据是最好处理,一般都是类似JSON格式的字符串,直接解析JSON数据,提取JSON的关键字段即可。 1、JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式;适用于进行数据交互的场景,比如网站前台…

汇报一下日常健身和锻炼方面的进展

跑步app最终从“咕咚”和“悦跑圈”二选一,锁定到悦跑圈上了。 七月太热,配速下降,但还能玩出花样 八月中旬气温稍降,配速提升,拟合抛物线 截至发博日,实际连续跑步接近600天了 截至发博日,完成2023跑量96…

测评补单:Temu卖家的市场攻略,轻松吸引更多流量和转化!

拼多多通过广告和低价策略的做法迅速拿下了美国市场。在欧美市场取得初步成果后,Temu又踏步走向了其他海外市场。今年7月,Temu先后进入了日本、韩国两地,进军亚洲市场。8月底,Temu又再一次扩张,这次目的地是东南亚。其…

新加坡市场最全开发攻略

作为东盟经济的“发动机”!新加坡是继纽约、伦敦、香港之后的第四大国际金融中心。据《2022年全球竞争力》报告显示,新加坡是亚洲地区排名最高的,位列全球三甲之一。 同时,新加坡作为东盟(ASEAN)的核心成员国,还是世贸…

QT QProgressBar控件 使用详解

本文详细的介绍了QProgressBar控件的各种操作,例如:新建界面、设置最大最小值、设置进度、返回进度最小值、返回进度最大值、返回当前进度值、重置进度默认值、返回进度条文本、设置进度条文本、设置显示进度条、设置垂直水平、样式表、信号槽、源代码、…

第2章_freeRTOS入门与工程实践之单片机程序设计模式

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id724601559592 配套资料获取:https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

Leetcode376. 摆动序列

Every day a Leetcode 题目来源:376. 摆动序列 解法1:动态规划 约定: 某个序列被称为「上升摆动序列」,当且仅当该序列是摆动序列,且最后一个元素呈上升趋势。某个序列被称为「下降摆动序列」,当且仅当…

再聊Java Stream的一些实战技能与注意点

大家好,又见面了。 在此前我的文章中,曾分2篇详细探讨了下JAVA中Stream流的相关操作,2篇文章收获了累计 10w阅读、2k点赞以及 5k收藏的记录。能够得到众多小伙伴的认可,是技术分享过程中最开心的事情。 不少小伙伴在评论中提出了…

前端开发工程师:职业前景、工资、 具体工作

该篇适用于从零基础学习前端的小白 一、职业前景 前端这两年也是非常火的,就业的前景也是非常不错的。 1.需求持续增长: 随着互联网和移动设备的普及,越来越多的企业和组织需要建立和维护网站、应用程序和在线平台。这导致了对具有前端开发…

Spring Cloud Eureka:服务注册与发现

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud Eureka:服务注册与发现 Spring Cloud Eureka是Spring Cloud生态系统中的一个组件,它是用于实现服务注册与发现的服务治理组件。在…

VMware16安装ghost版win7

文章目录 准备工作GHO 文件装机工具 新建虚拟机配置虚拟机还需要一个 CD/DVD PE 安装步骤分区还原挂载 CD/DVD开始还原 还原之后 准备工作 GHO 文件 可以去百度搜索这种文件,我这里是从系统之家下载的deepin win7 ghost 系统 装机工具 因为下载的 ghost 版的 w…

查找:分块查找算法分析

数据分块存储,分块查找特点:块内无序、块间有序。 1.分块查找的算法思想 1.使用顺序查找查索引 设置一个索引表, 索引表数据结构设计: //索引表 typedef struct {ElemType maxValue;int low,high; }Index;//顺序表存储实际元素 ElemType List[100] ;分…

圆的反演 hdu 4773

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 题目大意 http://acm.hdu.edu.cn/showproblem.php?pid4773 给定2个不相交的圆以及圆外1点P。求过P并且与另两个圆相切(外切)的圆&#xff0c…

使用TortoiseGit导出两次提交时间之间的差异文件

同时选择两个提交时间,右键后点击Compare revisions 多选需要导出的待发布的文件,然后右键点击Export selection to... 在弹窗中选择文件夹(导出待发布的文件) 导出效果(目录) 导出效果(文件&am…

MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响

起因 在GreatSQL社区上有一位用户提出了“手工构建MGR碰到的次节点一直处于recovering状态”,经过排查后,发现了是因为新密码验证插件caching_sha2_password导致的从节点一直无法连接主节点,帖子地址:(https://greatsql.cn/threa…

基于Android系统图书管理系统

摘要 随着移动终端使用率的快速增加,Android智能产品已日益成为越来越多的人们选择的移动终端产品。伴随着Android智能手机与平板电脑已经在我们生活大量的使用,越来越多的基于Android开发平台的应用也随之产生。 便捷的图书检索和借阅:用户可…

Java“牵手”京东商品列表页数据采集+商品价格数据排序,商品销量排序数据,京东商品API采集方法

京东商品列表API是京东平台提供给开发者的应用程序编程接口,通过API可以获取京东平台上商品列表数据。 京东商品列表API可以提供多种不同的推荐商品列表API接口,开发者可以根据自己的需求选择适合自己的接口。其中,最常用的是基于用户反馈的…

项目经理如何做好跨部门的沟通与协作?

对项目经理来说沟通不良,会对项目造成严重影响,跨部门沟通更是项目管理中的难题。原本应该合作解决的问题,到了跨部门会议上,又各说各话,找不到共识。 在不同部门各有不同立场与利益的情况下,怎样才能把话…