Prometheus监控指标查询性能调优

这篇具有很好参考价值的文章主要介绍了Prometheus监控指标查询性能调优。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Prometheus监控指标查询性能调优

一、背景

在《SRE: Google运维解密》一书中作者指出,监控系统需要能够有效的支持白盒监控和黑盒监控。黑盒监控只在某个问题目前正在发生,并且造成了某个现象时才会发出紧急警报。“白盒监控则大量依赖对系统内部信息的检测,如系统日志、抓取提供指标信息的 HTTP 节点等。白盒监控系统因此可以检测到即将发生的问题及那些重试所掩盖的问题等”。为了完善系统的白盒监控,会员团队基于 Prometheus + Grafana 开源组件构建了监控告警平台。最近一段时间在查询监控指标时遇到了性能瓶颈,表现为一些监控页面的图表加载特别慢,查询近7天的监控数据就会失败,极大的降低了开发人员的工作效率。

 文章来源地址https://www.toymoban.com/news/detail-646359.html

二、排查

1.初步排查

 

选取其中一个加载失败的监控页面,查询近7天的监控数据,通过浏览器的开发者工具观察到的指标数据查询接口响应耗时如下图所示:

Prometheus监控指标查询性能调优

 

分析指标数据查询接口和监控图表的对应关系后发现,监控图表加载失败是查询接口超时所导致的。使用超时的指标查询语句直接查询 Prometheus,即便将采样步长调高到40分钟,查询响应耗时依然有48秒之多。说明查询的主要耗时都用在 Prometheus 的查询处理上。

 

2.Prometheus查询处理流程分析

想要继续弄清楚 Prometheus 的查询处理为什么需要耗时这么久,我们需要简单了解一下 Prometheus 的查询处理流程。Prometheus 使用了一个基于标签(label)、值和时间戳的简单数据模型,这些标签和样本一起构成了数据序列(series),每个样本都是由时间戳和值组成。

 

Prometheus监控指标查询性能调优

 

Prometheus 将这些数据存储在其内部的时间序列数据库中(Prometheus 也支持外部存储系统)。Prometheus 的数据库被划分为基本的存储单元,称为 block,其中包含一定时间范围(默认2小时)的数据。block 的结构如下图所示:

 

Prometheus监控指标查询性能调优

 

 

block 中最重要的两个组成部分是 chunks 和 index。chunks 中保存的是特定序列在一定时间范围内的采样集合,一个 chunk 只包含一个序列的数据。index 中保存的是 Prometheus 访问数据使用的索引信息。在 index 中保存着两种类的索引:postings index 和 series index。

 

  • postings index:保存着标签与包含该标签的序列之间的对应关系。例如,标签 __name__ ="logback_events_total" 可以被包含在两个序列中,logback_events_total {job="app1", level="error"}和 logback_events_total {job="app2", level="error"}。

     

  • series index:保存着序列和 chunk 之间的对应关系。例如,序列 {__name__=”logback_events_total”, job=”app1”, level="error"} 可能保存在00001和00002两个 chunk 里。

 

block 中还包含了一个 meta.json 文件(保存 block 的元数据信息)和 一个 tombstones 文件(保存已经删除的序列以及关于它们的信息)。

 

Prometheus 的查询处理通常包含以下五个基本步骤:

 

  • 通过查询的时间范围确定对应的 block。

  • 通过 postings index 确定与标签匹配的序列。

  • 通过 series index 确定这些序列对应的 chunk。

  • 从这些 chunk 中检索样本数据。

  • 如果查询中包含操作符、聚合操作或内置函数,还需要基于样本数据进行二次计算。

 

3.详细排查

 

了解了 Prometheus 的查询处理流程后,我们可以得出以下结论:

 

1)查询的时间范围越大则耗时也就会越多,因为查询时间范围越大则涉及的 block 也会越多。

 

2)标签的值越多则查询耗时也就会越多,因为标签每增加一个值就会生成一个新的序列。

 

3)查询中使用了操作符、聚合操作或内置函数也会增加耗时,因为需要基于样本数据进行二次计算。

 

为了后面描述方便,我们先引入一个定义:基数(cardinality)。基数的基本定义是指一个给定集合中的元素的数量。以logback_events_total 这个指标为例,我们来理解下Prometheus 中标签基数和指标基数。

 

Prometheus监控指标查询性能调优

 

 

logback_events_total 指标有两个标签,其中标签 job 有两个值,那么它的基数为2,同理 level 标签的基数为5,logback_events_total 指标的基数为10。指标基数越高查询耗时也就会越多。

 

理解了基数的定义后,我们选取一个查询超时的监控指标来进行基数分析。先看下这个指标的一条标签数据:

http_server_requests_seconds_count{
    application="app1", 
    cluster="cluster1", 
    exception="xxxException", 
    instance="xxx", 
    job="app1", 
    method="GET", 
    returnCode="A0000", 
    status="200", 
    uri="/xxx"
}

 

执行如下 PromQL(Prometheus自定义的数据查询语言) 来查询该指标每个标签的基数(用实际标签名替换下面语句中的 label_name):

 

count(count by (label_name) (http_server_requests_seconds_count))

 

该指标的标签基数汇总如下:

 

Prometheus监控指标查询性能调优

 

 

可以看到,instance 和uri 这两个标签的基数都很高。执行如下 PromQL 查询该指标的基数,发现该指标的基数达到了147610。

 

count({__name__="http_server_requests_seconds_count"})

 

用同样的方式分析了下其他问题指标,指标基数同样达到了10万以上。作为对比,我们抽样分析了几个加载比较快的指标,指标基数大都在1万以下。因此可以确认,查询耗时高主要是指标基数过高引起的。实际监控图表配置的查询语句中还使用了一些聚合操作(例如 sum)和内置函数(例如 rate),也在一定程度上增加了查询耗时。

 

三、优化

 

Prometheus 提供了一种叫做记录规则(Recording Rule)的方式来优化我们的查询语句,记录规则的基本思想是:预先计算经常要用或计算开销较大的表达式,并将其结果保存为一组新的时间序列。以上面提到的 http_server_requests_seconds_count 这个指标为例,优化前的一个监控图表的查询语句如下:

 

sum(rate(http_server_requests_seconds_count{application="$application", cluster=~"$cluster", uri!~"/actuator/.*|/\\*.*|root|/|/health/check"}[1m])) by (uri)

 

从查询语句可以看出,该监控图表依赖于 application、cluster 和 uri 这三个标签的聚合数据,因此可以创建如下的记录规则(记录规则的详细创建方式可以参考 Prometheus 官方文档):

 

record: http_server_requests_seconds_count:rate:1m:acuexpr: sum(rate(http_server_requests_seconds_count{uri !~ "/actuator/.*|/\\*.*|root|/|/health/check"}[1m])) by (application,cluster,uri)

 

记录规则创建后默认只包含记录规则创建时间之后的数据,并不包含创建之前的历史数据。Prometheus从 v2.27 版本开始支持通过命令行指令来手工回溯历史数据(对于 Prometheus v2.38及以下版本,需要在实例启动时开启--storage.tsdb.allow-overlapping-blocks 参数),通过 promtool tsdb create-blocks-from rules --help 可以了解该指令的使用,这里给出了一个该指令的样例:


promtool tsdb create-blocks-from rules \
--start 1680348042 \
--end 1682421642 \
--url http://mypromserver.com:9090 \
rules.yaml

 

promtool tsdb create-blocks-from rules 命令的输出是一个目录(默认是 data/ ),其中包含了记录规则文件中所有规则历史数据的 block。为了让新生成的 block 生效,必须将它们手工移动到正在运行的 Prometheus 实例数据目录下。移动后,新产生的 block 将在下一次压缩运行时与现有 block 合并。

 

在执行完上面的操作后通过 PromQL 查询这个记录规则的基数,发现指标基数下降到了4878。原来监控图表的查询语句可以调整为:

 

sum(http_server_requests_seconds_count:rate:1m:acu{application="$application", cluster=~"$cluster"}) by (uri)

 

对优化后的监控图表进行测试,效果对比如下图所示,可以看到查询的时间范围越长,效果提升越明显。这主要得益于记录规则带来的指标基数大幅降低以及函数计算的预先处理。

 

Prometheus监控指标查询性能调优

 

 

在实际场景中,如果有多个监控图表都用到了同一个监控指标,可以整体评估一下记录规则应该怎么创建。因为一个记录规则也是一组时间序列,在满足查询需求的前提下尽量避免创建过多的记录规则。

 

四、小结

 

当 Prometheus 指标基数过高时,就会出现监控图表加载很慢甚至加载失败。通过 Prometheus 提供的记录规则,我们可以对查询语句进行优化从而减少查询耗时。除了记录规则外,还有一些技巧可以优化查询性能,例如增加 Prometheus 指标采集间隔,删除不用的指标序列等。实际上,在监控指标设计阶段就应该对指标基数进行评估,必要时对标签取值进行取舍。例如,一个标签对应 HTTP 响应码,可以将它的取值定义为 1XX、2XX、3XX、4XX、5XX,相比详细的响应码可以大大降低指标基数。

 

作者丨会员技术团队

到了这里,关于Prometheus监控指标查询性能调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Prometheus相关的主机监控指标

    CPU负载指标 node_load1 node_load5 node_load15 以上三个指标为主机CPU平均负载,分别对应一分钟、五分钟和十五分钟的时间间隔。CPU负载是指某段时间内占用CPU时间的进程和等待CPU时间的进程数之和。一般来说,cpu负载数/cpu核数如果超过0.7,应该开始关注机器性能情况 ,如果超过

    2023年04月17日
    浏览(36)
  • Prometheus实现自定义指标监控

    前面我们已经通过 Prometheus+Grafana 实现了监控,可以在 Grafana 上看到对应的 SpringBoot 应用信息了, 通过这些信息我们可以对 SpringBoot 应用有更全面的监控。 但是如果我们需要对一些业务指标做监控,我们应该怎么做呢?这篇文章就带你一步步实现一个模拟的订单业务指 标监

    2024年02月12日
    浏览(47)
  • Prometheus监控运维实战十: 主机监控指标

    1、CPU指标 CPU负载 以上三个指标为主机的CPU平均负载,分别对应一分钟、五分钟和十五分钟的时间间隔。CPU负载是指某段时间内占用CPU时间的进程和等待CPU时间的进程数之和。一般来说,cpu负载数/cpu核数如果超过0.7,应该开始关注机器性能情况 ,如果超过1的话,运维人员应

    2024年02月06日
    浏览(49)
  • Prometheus之rabbitmq监控指标详解

    rabbitmq_channels 用于显示RabbitMQ服务器上当前打开的通道数量。 通过监控这个指标,您可以了解到RabbitMQ服务器打开的通道数随时间变化的情况,以及通道数量是否很高或者非常低。 rabbitmq_connections 用于显示与RabbitMQ服务器的连接总数。 该指标可以帮助您跟踪RabbitMQ服务器的连

    2024年02月14日
    浏览(38)
  • Prometheus常用exporter及其常用监控指标

    CPU相关指标: node_cpu_seconds_total{mode=\\\"idle\\\"} :CPU空闲时间(秒)的总和。这是评估CPU使用率的重要指标之一。 node_cpu_seconds_total{mode=\\\"system\\\"} 、 node_cpu_seconds_total{mode=\\\"user\\\"} 等:分别表示CPU在内核态和用户态的运行时间。 内存相关指标: node_memory_MemTotal_bytes :内存总量(以字节为

    2024年03月11日
    浏览(65)
  • 【云原生•监控】基于Prometheus实现自定义指标弹性伸缩(HPA)

    「Autoscaling即弹性伸缩,是Kubernetes中的一种非常核心的功能,它可以根据给定的指标(例如 CPU 或内存)自动缩放Pod副本,从而可以更好地管理和利用计算资源,提高系统的可用性和性能,同时减少开销和成本。弹性伸缩可以解决服务负载存在较大波动或资源实际使用与预估

    2024年02月14日
    浏览(46)
  • 统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?

    简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。网络设备种类多种多样、不同厂商提供的管理接口(如命令行接口)又不相同,这使得网络管理变得愈发复杂。为解决这一问题,SNMP应运而生。SNMP作为广泛应用于TCP/IP网络的标准网络管理协议,提供了

    2024年01月24日
    浏览(35)
  • 统一观测丨使用 Prometheus 监控云原生网关,我们该关注哪些指标?

    可观测体系的概念由来已有,随着分布式微服务迅猛发展,对可观测体系的依赖也越来越深,可观测体系通常包括 Metrics、Tracing、Logging 三类数据,再外加报警机制,即可构成完整的监控报警机制,业界对可观测也有系统性说明,如下: 回到我们日常问题排查,基本路径大致

    2024年02月09日
    浏览(44)
  • K8S篇之实现利用Prometheus监控pod的实时数据指标

    一、监控部署 1、将k8s集群中kube-state-metrics指标进行收集,服务进行部署 1.1 pod性能指标(k8s集群组件自动集成) k8s组件本身提供组件自身运行的监控指标以及容器相关的监控指标。通过cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,集成到 Kubelet中,当Ku

    2024年02月05日
    浏览(58)
  • 性能测试 —— Tomcat监控与调优:Jconsole监控

    JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具,JConsole使用Java虚拟机(Java VM),提供在Java平台上运行的应用程序的性能和资源消耗的信息。在Java平台,标准版(Java SE平台)6,JConsole的已经更新到目前的外观,类似于Windows和GNOME桌面(其他平台,将目前标准的J

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包