写点什么

使用 Prometheus 监控的一些注意事项

作者:耳东@Erdong
  • 2021 年 12 月 29 日
  • 本文字数:1700 字

    阅读完需:约 6 分钟

使用 Prometheus 监控的一些注意事项

在进行监控的时候,有一些事情是需要注意的,特别是针对 Prometheus 这块。


使用 Label

除了 Prometheus 很少有监控系统具有 Label(标签)的概念并且利用它们来进行查询的表达式语言,对于这些变化是需要一些时间来适应。


当你对某个监控指标想要有 add/average/sum 这样的监控数据的时候,不需要设计多个监控指标,只要在一个指标中添加这样的 Label 就可以。

比如创建 2 个指标 http_responses_500_total 和 http_responses_403_total,不如创建一个名为 http_responses_total 的指标 ,然后创建一个 Label 包含 500 和 403 这两个值,像 http_responses_tota{respone_code="500"} 和 http_responses_tota{respone_code="403"} 这样。


根据过往的经验,指标的任何部分都不要用程序来生成。


不要过度使用 Label

每个标签集都是一个额外的时间序列,具有内存、CPU、磁盘和网络成本。通常,这种资源开销可以忽略不计,但在具有大量指标和跨越数百台服务器的数百个标签集的场景中,这种资源开销会迅速增加。

通常的指导原则是,尽量将指标的基数保持在 10 以下,整个系统中对于超过 10 的指标应该限制在一个很小的数量。你的大多数参数都不应该有标签。

如果你的指标基数超过 100,或者有可能增长到 100 以上,那么需要调研其他解决方案,或者减少维度的数量,或者将分析从监控转移到通用处理系统。

为了更好地理解这些数字,让我们来看看 node_exporter 。node_exporter 公开每个节点挂载的文件系统的指标,大约几十个,每个节点都有 node_filesystem_avail 。如果您有 10,000 个节点,那么 node_filesystem_avail 的时间序列大约为 100,000,这对于 Prometheus 来说是可以解决的。

如果现在为每个用户添加配额,那么在 10,000 个节点上拥有 10,000 个用户的情况下,很快就会达到百万的两位数。对于 Prometheus 当前实现来说,这是太多了。即使数量较少,也存在偶然的成功过高,以至于您无法再在此计算机上拥有其他可能更有用的指标。

如果不确定,可以从不使用标签开始,然后随着具体用例的出现逐渐添加更多标签。

Counter vs. Gauge, Summary vs. Histogram

知道给定指标使用四种主要指标类型中的哪一种是很重要的。


要在 Counter 和 Gauge 之间进行选择是比较简单的,有一个简单的经验法则:如果该值可以下降,则它是一个 Gauge。


Counter 只能上升和重置,在进程重新启动时发生重置。它对于累积事件数或每个事件中的事物数量很有用。例如,HTTP 请求的总数,或 HTTP 请求中发送的字节总数。原始 Counter 在实际场景很少有使,一般都是使用 rate() 函数获取它们每秒增加的速率。

Gauge 可以被设定为某个值,这个值上升和下降。它们对于状态快照,例如进行中的请求,可用/总内存或温度非常有用。您永远不应该对 Gauge 类型数据指标使用 rate() 函数。


摘要和直方图是更复杂的指标类型,将在其各自的章节中进行讨论。


时间戳,而不是自事件发生以来的时间

如果要跟踪某件事发生后的时间,请导出发生该事件发生的 Unix 时间戳,而不是自该事发生以来的时间。

导出时间戳后,您可以使用表达式 time() - my_timestamp_metric 来计算事件发生以来的时间,从而消除了对更新逻辑的需求,并防止了更新逻辑被卡住。

内部回路

总的来说,工具带来的额外资源成本远远超过其为运营和开发带来的收益。


对于性能至关重要的代码,或者在给定进程中每秒调用超过 10 万次的代码,可能需要注意要更新多少个指标。

根据进程调用的情况,Java 计数器的增量需要 12-17ns。其他语言也有类似的性能。如果这段时间对于您的内部循环来说很重要,那么限制您在内部循环中增加的指标的数量,并尽可能避免标签,或缓存标签查找的结果,例如,Go 中的 With() 或 Java 中的 labels() 的返回值。

还要注意涉及时间或持续时间的指标更新,因为获取时间可能涉及系统调用。与所有涉及性能关键代码的问题一样,基准测试是确定任何给定更改的影响的最佳方法。

避免丢失指标

直到事情发生时才出现的时间序列很难处理,因为通常的简单操作不再足以正确处理它们。为了避免这种情况,为任何您知道可能预先存在的时间序列导出一个默认值,例如 0。

大多数 Prometheus 客户端库(包括 Go、Java 和 Python)将自动为您导出一个 0,用于不带标签的指标。

发布于: 刚刚
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
使用 Prometheus 监控的一些注意事项