指标和标签命名
本文档中介绍的指标和标签惯例并非强制使用 Prometheus 的要求,但可以作为风格指南和最佳实践集合。各组织可能希望以不同的方式处理其中一些实践,例如命名约定。
指标名称
一个指标名称...
- ...必须符合有效字符的数据模型。
- ...应当具有一个与该指标所属领域相关的(单词)应用程序前缀。前缀有时被客户端库称为
namespace。对于特定于应用程序的指标,前缀通常就是应用程序名称本身。但有时,指标更为通用,例如客户端库导出的标准化指标。示例:prometheus_notifications_total(特定于 Prometheus 服务器)process_cpu_seconds_total(由许多客户端库导出)http_request_duration_seconds(用于所有 HTTP 请求)
- ...必须引用单一单位(例如,不要将秒与毫秒混合)和单一量(例如,不要将请求大小与请求持续时间混合)。
- ...应当使用基本单位(例如,秒、字节、米 - 而不是毫秒、兆字节、公里)。请参阅下方的基本单位列表。
- ...应当带有一个描述单位的后缀,使用复数形式。请注意,累积计数除了单位(如果适用)之外,还带有
total后缀。还要注意,这适用于狭义上的单位(如下表中的单位),但不适用于一般的可计数事物。例如,connections或notifications在本规则中不被视为单位,不必位于指标名称的末尾。(另请参阅下一段中的示例。)http_request_duration_secondsnode_memory_usage_byteshttp_requests_total(用于无单位的累积计数)process_cpu_seconds_total(用于带单位的累积计数)foobar_build_info(用于提供关于运行二进制文件的元数据 的伪指标)data_pipeline_last_record_processed_timestamp_seconds(用于跟踪数据处理管道中处理完最后一条记录的时间戳)
- ...可以按照在按字典顺序排序指标名称列表时能带来方便分组的方式来排列其名称组件,只要遵循所有其他规则即可。以下示例将通用名称组件放在前面,以便所有相关指标排序在一起:
prometheus_tsdb_head_truncations_closed_totalprometheus_tsdb_head_truncations_established_totalprometheus_tsdb_head_truncations_failed_totalprometheus_tsdb_head_truncations_total
以下示例也是有效的,但遵循了不同的权衡。它们单独阅读更容易,但像prometheus_tsdb_head_series这样不相关的指标可能会被排在中间。prometheus_tsdb_head_closed_truncations_totalprometheus_tsdb_head_established_truncations_totalprometheus_tsdb_head_failed_truncations_totalprometheus_tsdb_head_truncations_total
- ...应当在所有标签维度上代表被测量的同一逻辑事物。
- 请求持续时间
- 数据传输的字节数
- 以百分比表示的瞬时资源使用率
作为经验法则,对给定指标的所有维度进行 sum() 或 avg() 应当是有意义的(尽管不一定有用)。如果它没有意义,请将数据拆分为多个指标。例如,将各种队列的容量放在一个指标中是好的,而将队列的容量与队列中当前的元素数量混合则不好。
为什么要指标名称中包含单位和类型后缀?
一些指标命名规范(例如 OpenTelemetry)不建议甚至不允许在指标名称中包含有关指标单位和类型的信息。一个常见的论点是,这些信息已经在其他地方定义了(例如架构、元数据、其他标签等)。
Prometheus 强烈建议在指标名称中包含单位和类型,即使你将该信息存储在别处,原因如下:
- 指标消费的可靠性和用户体验:当与现代 UI 交互以在 PromQL 中使用此类指标时,可以显示有关指标类型和单位的丰富信息(自动补全、覆盖层、弹出窗口)。不幸的是,在功能强大的 UI 中进行交互式、临时查询并不是用户与指标交互的唯一方式。指标消费生态系统非常庞大。大多数消费以纯 YAML 配置的形式出现,用于各种可观测性工具,如告警、记录、自动扩缩容、仪表盘、分析、处理等。**至关重要**的是,特别是在监控/SRE 事件实践中,查看纯 YAML 中的 PromQL 表达式并理解你所使用的底层指标类型和单位。
- 指标冲突:随着采用率的增长和指标随时间的演变,有些情况下,指标名称中缺乏单位和类型信息会导致某些序列发生冲突(例如,用于秒和毫秒的
process_cpu)。
标签
使用标签来区分被测量事物的特征:
api_http_requests_total- 区分请求类型:operation="create|update|delete"api_request_duration_seconds- 区分请求阶段:stage="extract|transform|load"
不要将标签名称放在指标名称中,因为这会引入冗余,并且如果相应的标签被聚合掉,会引起混淆。
注意请记住,键值对标签的每一个唯一组合都代表一个新的时间序列,这会显著增加存储的数据量。不要使用标签来存储高基数(具有许多不同标签值)的维度,例如用户 ID、电子邮件地址或其他无限制的值集合。
基本单位
Prometheus 没有硬编码任何单位。为了更好的兼容性,应当使用基本单位。以下列出了一些指标族及其基本单位。该列表并非详尽无遗。
| 族 | 基本单位 | 备注 |
|---|---|---|
| 时间 | seconds (秒) | |
| 温度 | celsius (摄氏度) | 出于实际原因,摄氏度优于开尔文。在色温或温度必须是绝对值的特殊情况下,开尔文作为基本单位是可以接受的。 |
| 长度 | meters (米) | |
| 字节 | bytes (字节) | |
| 比特 | bytes (字节) | 为了避免合并不同指标时产生混淆,请始终使用 bytes,即使在 bits 看起来更常见的地方也是如此。 |
| 百分比 | ratio (比例) | 值为 0–1(而不是 0–100)。ratio 仅用作 disk_usage_ratio 等名称的后缀。通常的指标名称遵循 A_per_B 模式。 |
| 电压 | volts (伏特) | |
| 电流 | amperes (安培) | |
| 能量 | joules (焦耳) | |
| 功率 | 建议导出焦耳的计数器,然后 rate(joules[5m]) 就会得到以瓦特为单位的功率。 | |
| 质量 | grams (克) | 克优于千克,以避免 kilo 前缀带来的问题。 |