使用 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,用于不带标签的指标。
版权声明: 本文为 InfoQ 作者【耳东@Erdong】的原创文章。
原文链接:【http://xie.infoq.cn/article/6848849a7e2c04bf22134e1ba】。未经作者许可,禁止转载。
评论