1

   

监控指标重要么?

在现代 IT 运维中,有效的监控系统是保障服务稳定性的关键。根据行业数据,一个设计良好的监控体系能够帮助团队提前识别 85%以上的潜在问题,这意味着在大多数情况下,我们可以将故障扼杀在摇篮之中,从而极大地减少了对用户的影响。以一家拥有中等规模在线业务的企业为例,通过实施全面的性能监控,该企业成功地将平均修复时间(MTTR)从 30 分钟降低到了 10 分钟内,同时提高了系统的可用性达到 99.99%,相当于每年停机时间不超过1小时。此外,通过对资源使用效率进行持续优化,运营成本降低了 20%左右。由此可见,构建一套健全且高效的监控机制不仅有助于快速响应突发事件、提升用户体验,还能为企业带来显著的成本节约效果。因此,投入足够资源来建立和完善监控体系对于任何追求高效运维管理的组织来说都是至关重要的一步。

本文从我们最常用 PromQL 常见陷阱、PromQL 最佳实践和使用模版、总结共 3 个部分来阐述如何有效使用监控指标。

2

   

常见陷阱

在我使用 PromQL 的过程中,我遇到了一些值得分享的陷阱:

  • 时延指标:平均时延可能无法体现出服务的时延指标,对于有性能要求的服务必须要用 histogram_quantile 分位数进行指标统计。

  • 标签匹配:标签匹配时要小心。查询{job="api"}将匹配任何带有“api”作业标签的时间序列,同时{job!="api"}将匹配带有除“api”之外的任何作业标签的时间序列,以及那些根本没有作业标签的时间序列。

  • 速率与增加:该 rate()函数非常适合每秒平均值,但对于按整数增加的计数器,increase()通常会提供更直观的结果,另外还有一个 irate,它更能够体现出数据峰值。

  • 聚合和标签:使用聚合运算符时,请注意标签。查询 sum(http_requests_total)将对所有标签求和,可能会给出一个值。如果您想保留某些标签,请使用 by 子句:sum(http_requests_total) by (status)。

  • 范围向量选择器:始终在范围向量选择器中使用适当的时间范围。时间范围太短,您可能会错过重要数据;时间范围太长,您的查询可能会变慢或相关性降低。

  • 子查询陷阱:子查询功能强大,但也令人困惑。请确保您了解求值顺序,并谨慎使用嵌套子查询,因为它们会严重影响时许数据库性能。

3

   

最佳做法

3.1

   

指标过滤

从一个简单的例子开始:

http_requests_total

这个简单的查询返回一个即时向量,其中包含所有受监控端点的指标的当前值 http_requests_total。但 PromQL 的真正强大之处在于其选择、过滤和聚合数据的能力。

http_requests_total{status="200", method="GET"}

此查询仅选择状态代码为 200 且方法为 GET 的 HTTP 请求。标签是键值对,可为指标提供额外的上下文,对于深入了解特定数据非常有用。

您可以将各种匹配运算符与标签一起使用:

  • =:完全匹配

  • !=:不等于

  • =~:正则表达式匹配

  • !~:正则表达式不匹配

例如,选择状态代码在 5xx 范围内的所有 HTTP 请求:

http_requests_total{status=~"5.."}

即时向量为您提供单个时间点的指标快照,而范围向量允许您处理时间范围内的数据。以下是示例:

http_requests_total[5m]

http_requests_total 此查询返回过去 5 分钟内的所有值。当您需要计算比率或趋势时,范围向量特别有用。

3.2

   

函数和运算符

PromQL 提供了一组丰富的函数和运算符来操作和分析时间序列数据。让我们探索一些最常用的函数和运算符:

速率和增长率

该 rate()函数是 PromQL 中最常用的函数之一。它计算范围向量中时间序列的每秒平均增长率。例如:

rate(http_requests_total[5m])

此查询计算过去 5 分钟内每秒的 HTTP 请求速率。

该 increase()函数类似,但返回计数器在时间范围内的总增加量。对于按整数增加的计数器,通常更直观:

increase(http_requests_total[1h])

这将为您提供过去一小时内 HTTP 请求的总数。

3.3

   

直方图和摘要

Prometheus 支持直方图和摘要指标类型,这些指标对于测量值分布(如请求持续时间)至关重要。以下是计算请求持续时间第 95 个百分位数的示例:

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

此查询使用该 histogram_quantile 函数以及 sum 和 rate,这为我们关应用程序时延性能提供了宝贵见解。

3.4

   

聚合运算符

PromQL 在聚合数据方面表现出色。以下是一些常见的聚合运算符:

  • sum:计算维度之和

  • avg:计算维度平均值

  • min 和 max:查找维度上的最小值或最大值

  • count:计算向量中元素的数量

例如,要获取所有端点的 HTTP 请求总数:

sum(http_requests_total)

您还可以按特定标签进行聚合:

sum(http_requests_total) by (status)

这将为您提供按状态代码分组的总请求数,比如我们需要统计某个接口所有请求 4xx、5xx、2xx 总数,以衡量我们服务的可用性,这个指标会非常有用。

3.5

   

子查询和持续时间

子查询允许您在一系列评估时间范围内执行查询操作。它们对于计算“移动”平均值或检测缓慢移动的趋势特别有用。以下是使用时间持续时间的示例:

max_over_time(rate(http_requests_total[5m])[1h:5m])

此查询计算过去一小时内 HTTP 请求的最大速率,每 5 分钟评估一次速率。[1h:5m]语法指定时间长度为 1 小时,步长为 5 分钟。

3.6

   

使用时间戳

PromQL 允许您查询特定时间戳的数据。这对于历史分析很有用:

http_requests_total @ 1609459200

http_requests_total 此查询返回 Unix 时间戳 1609459200(2021 年 1 月 1 日,00:00:00 UTC)的值。

3.7

   

算术运算符

PromQL 支持各种算术运算符,允许您对指标值执行计算:

(instance_memory_limit_bytes - instance_memory_usage_bytes) / instance_memory_limit_bytes

此查询计算每个实例的内存使用率。

3.8

   

计算平均值和标准差

计算请求持续时间的平均值 (avg) 和标准差 (stddev):

avg(rate(http_request_duration_seconds_sum[5m])) by (path)
stddev(rate(http_request_duration_seconds_sum[5m])) by (path)

这些查询为您提供了过去 5 分钟内每个路径的请求持续时间的平均值和标准差。

3.9

   

使用标签值

标签值在 PromQL 中对于过滤和分组数据至关重要。以下是根据标签值进行过滤的示例:

sum(rate(http_requests_total{status=~"5.."}[5m])) by (path)

此查询计算 5xx 错误率的总和,并按路径标签值分组。

3.10

   

范围查询

范围查询允许您在一段时间内评估 PromQL 表达式。以下是示例:

rate(http_requests_total[5m])[30m:1m]

此范围查询计算过去 30 分钟内 5 分钟窗口内的 HTTP 请求速率,精度为 1 分钟。

3.11

   

时间位移操作

rate(http_requests_total[5m] offset 1w)

此表达式返回指标 http_requests_total 距离当前时间一周前的 5 分钟之内的 HTTP 请求量的增长率。

3.12

   

Kubernetes 监控

sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (node)

此查询汇总所有容器的 CPU 使用情况(按节点分组),让我们清楚地了解整个集群的资源利用率。

Kubernetes 监控的另一个有用查询是跟踪每个节点的 pod 数量:

sum(kube_pod_info) by (node)

这些查询对于监控我们的 Kubernetes 集群的健康和性能非常有帮助。

可是有时我们需要监控每个容器的资源利用率,当过高时要发出告警。

100 * sum(rate(container_cpu_usage_seconds_total{image!=""}[5m])) by (container_name)
  / sum(container_spec_cpu_quota{image!=""} / container_spec_cpu_period{image!=""}) by (container_name)
> 80

此查询:计算 5 分钟内每个容器的 CPU 使用率,将其除以 CPU 配额以获得百分比。如果任何容器的 CPU 使用率超过其配额的 80%,则会发出警报。

3.13

   

Grafana 集成

我喜欢 PromQL 的一点是它与 Grafana 等可视化工具的集成效果非常好。我经常在 Grafana 仪表板中直接使用 PromQL 查询来创建我们指标的实时可视化。

例如:

sum(rate(http_requests_total{status=~"$status"}[5m])) by (method)

通过使用$status 变量,您可以创建交互式仪表板,允许用户动态过滤数据。

4

   

总结

PromQL 已成为我的可观察性工具包中不可或缺的工具。它的强大功能和灵活性使其成为监控复杂分布式系统的理想选择,但在使用过程中要注意以下事项。

  • 避免高基数:生成大量时间序列的查询可能会很慢。请谨慎使用会产生许多唯一序列的标签组合,比如你把用户名当成一个 label 去统计,这样的话,Prometheus 指标可能就会直接爆炸,简单指标无法展示,严重了会让你的服务进程直接 OOM。

  • 优化读取操作:尽量减少需要读取的数据量。使用适当的时间范围并避免不必要的高精度查询。

  • 使用 Records 规则:对于您经常运行的复杂查询,请考虑设置记录规则来预先计算结果。

推荐

A Big Picture of Kubernetes

Kubernetes入门培训(内含PPT)


原创不易,随手关注或者”在看“,诚挚感谢!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐