简单Prometheus查询用于指标检查
作者:Michal Kazmierczak
来源:mkaz.me
基数是关键。 它很容易失控,就像任何组合爆炸的实例一样。
这,再加上90%的指标从未被访问过的说法,创造了一个值得探索的领域。
观察性云供应商 已经提供了允许检查未使用数据并最终降低成本的工具。但是,当你没有访问这些工具的时候(即当你运行自己的Prometheus服务器时),你如何了解你的指标?
本文提出了一组简单的查询,允许检测到重指标。为了更好地说明结果,还有Grafana仪表板的提议。仪表板可以在下面的截图中看到。
目录
- 简短的理论介绍
- 查询
- 2.1. 所有系列的计数
- 2.2. 所有指标的计数
- 2.3. 所有工作的计数
- 2.4. 每个指标的系列计数
- 2.5. 每个工作的系列计数
- Grafana仪表板
1. 简短的理论介绍
简而言之,标签的基数是观察到的不同值的数量。一个指标的基数是观察到的所有标签值组合的数量。在最坏的情况下,它是所有标签基数的乘积。
一个很好的例子是一个计数HTTP请求的指标,具有path
、method
和response_code
标签。让我们考虑一个场景,观察到五个路径,三种方法和三种响应代码。然后,基数是5 * 3 * 3 = 45
。
如果我们决定做一个微妙的改变,将这个计数器变成直方图(有12个桶),不久我们的指标基数可能会增长到45 * 12 = 540
。
注意,在运行查询时,重要的是运行一个即时查询,而不是范围查询,因为对于本文的目的,最后一个记录的值就足够了 - 我们对随时间的变化不感兴趣。查询范围查询可能会非常慢。
让我们不再赘述,深入细节。
2.1. 所有系列的计数
首先,让我们获取总的系列数。这是所有唯一标签组合的计数(包括__name__
标签)。
count({__name__!=""})
这个查询依赖于一个简单的规则:Prometheus查询语言(PromQL)要求提供一个指标名称或至少一个标签匹配器。__name__
是添加到每个指标的内部标签,其值为指标名称。由于指标名称不能为空,所以!=""
表达式选择了所有指标。
这个强大的概念将在后续查询中重复使用。
2.2. 所有指标的计数
现在,让我们检查我们的Prometheus实例维护了多少指标。
count(count({__name__!=""}) by (__name__))
没什么不寻常的,这只是将前面的查询按__name__
分组并计数。
2.3. 所有工作的计数
类似地,让我们检查产生指标的工作数量。
count(count({__name__!=""}) by (job))
这是前一个查询的相同角度 - 按job
标签分组。
2.4. 每个指标的系列计数
现在让我们更深入一些,查看更详细的数据。
sort_desc(count({__name__!=""}) by (__name__)
)
这个查询输出每个指标的系列数。它有助于发现具有高基数的指标。使用sort_desc
我们可以在顶部看到最有趣的结果。
2.5. 每个工作的系列计数
同样,让我们将分组更改为job
。
sort_desc(count({__name__!=""}) by (job)
)
输出显示每个工作的工作数。它可能揭示出某个工作(非常经常代表一个单独的抓取目标)正在产生不成比例的多的系列。
3. Grafana仪表板
盯着仪表板看是有趣的。因此,我忍不住基于上述查询构建了一个仪表板。除了上述数字,它还有更多的伴随计算,比如一个指标在所有系列中所占的百分比。在这里查看。
- “Lightstep已经研究了客户,特别是对于指标(…) - 每十个指标中就有一个被查询过任何目的。” Ben Sigelman,Lightstep的CEO,在OpenObservability Talks上说,链接。
- 如果你是Grafana Cloud的满意用户,请查看基数管理仪表板。
- 也有仪表板的Gist作为备份,链接。
请注意,以上翻译可能不完全精确,因为专业术语和上下文的准确性需要专业知识。如果你需要更专业的翻译或对某些术语有特定疑问,请咨询相关领域的专家。