Prometheus 最佳实践:正确设计指标和标签 🚀

大家好!今天,我想和大家聊聊在使用监控系统核心Prometheus时,最重要也是最基础的部分——“指标名称和标签设计”。为了准确高效地掌握应用程序的状态,从一开始就正确设计指标至关重要。

我们通过一个常见的跟踪HTTP请求数的场景,一起来看看哪种方法最好,好吗?🤔

###

❌ 常见错误:将所有信息都放入名称中

假设您想按方法(GET、POST)和状态码(200、404、500)跟踪应用程序处理的HTTP请求。最直观想到的方法可能就是这样:

http_requests_get_200_total
http_requests_post_500_total
http_requests_get_404_total
...

乍一看似乎很清晰,但这种方式有一个致命的缺点,它会阻碍Prometheus强大功能的充分利用:那就是 “指标爆炸(Metric Explosion)” 💣 现象。

HTTP 方法和状态码的每个组合都会生成一个新的指标。如果再添加用户 ID 或端点路径等其他属性呢?需要管理的指标数量将呈指数级增长,给系统带来巨大负担。此外,即使是“状态码为 500 的所有请求的总和”这样简单的聚合查询也会变得非常复杂和混乱。🤯

###

✅ Prometheus 方式:用标签赋予维度!

Prometheus 推荐的最理想方法就是这个:

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

我们来逐一看看为什么这种方式更出色?

1. 有意义的指标名称 📝

httprequeststotal 这个名称可以分为两部分:

  • http_requests: 明确指出要测量的对象是“HTTP 请求”。基本名称最好尽可能通用和全面。
  • _total: 这是一个标准后缀,表示该指标是“计数器(Counter)”类型。计数器表示一个持续累积增长的值。📈 通过这种方式明确指标类型,任何人都可以轻松理解该指标的特性。

2. 强大而灵活的标签 ✨

这里的核心就是 {method=”GET”, code=”200″} 这部分,即 标签(Label)。标签的作用是为指标赋予多维属性(Dimension)。

  • 属性分离: 将 method 或 code 等可以具有多种值的属性从指标名称中分离出来,作为标签。
  • 灵活查询: 使用标签,您可以通过 PromQL 自由地切片、过滤和聚合数据。例如,如果您想查看过去 5 分钟内按状态码划分的请求率,一个简单的查询就足够了,如下所示:
# 按状态码(code)分组,计算5分钟内的每秒请求率
sum by (code) (rate(http_requests_total[5m]))

如果像第一种方式那样使用指标名称,那么就会出现一个可怕的情况,您必须将所有指标,如 httprequests…200total、httprequests…500total 等,用 + 号相加。😱

###

🤔 其他错误示例

我们简单提一下为什么其他方式不好。

  • http_requests{method=”GET”, code=”200″, status=”total”}
  • _total 后缀已经表明这是一个计数器,因此添加 status=”total” 这样的标签是多余的重复。最好让指标尽可能简洁明了。
  • applicationhttprequests(method=’GET’, code=’200′)
  • 这种表示法不符合 Prometheus 自身的指标和标签语法。不使用括号 () 或单引号 ”。❌

###

💡 总结

设计 Prometheus 指标时需要记住的核心原则如下:

  1. 将指标名称通用化,以表示测量对象。
  2. 将可以具有多种值的属性(维度)分离为标签。
  3. 对计数器指标使用 _total 等标准后缀。

只要遵循这些原则,您就可以构建一个更加灵活、可扩展且强大的监控系统。希望这篇文章能为您的 Prometheus 之旅提供一点帮助!💪



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注