导出格式

指标可以使用简单的 基于文本的 导出格式暴露给 Prometheus。有各种 客户端库 为您实现此格式。如果您的首选语言没有客户端库,您可以 创建您自己的

基于文本的格式

从 Prometheus 2.0 版本开始,所有向 Prometheus 暴露指标的进程都需要使用基于文本的格式。在本节中,您可以找到关于此格式的一些 基本信息 以及更 详细的分解

基本信息

方面 描述
起始 2014 年 4 月
支持于 Prometheus 版本 >=0.4.0
传输 HTTP
编码 UTF-8, \n 行尾
HTTP Content-Type text/plain; version=0.0.4 (缺少 version 值将导致回退到最新的文本格式版本。)
可选 HTTP Content-Encoding gzip
优点
  • 人类可读
  • 易于组装,特别是对于极简情况(无需嵌套)
  • 逐行可读(类型提示和文档字符串除外)
局限性
  • 冗长
  • 类型和文档字符串不是语法的组成部分,意味着几乎不存在指标契约验证
  • 解析成本
支持的指标原语
  • 计数器
  • 仪表
  • 直方图
  • 摘要
  • 未分类

文本格式详情

Prometheus 基于文本的格式是面向行的。行由换行符 (\n) 分隔。最后一行必须以换行符结尾。空行将被忽略。

行格式

在行内,标记可以被任意数量的空格和/或制表符分隔(如果它们会与前一个标记合并,则必须至少用一个分隔)。前导和尾随空格将被忽略。

注释、帮助文本和类型信息

# 作为第一个非空白字符的行是注释。除非 # 后的第一个标记是 HELPTYPE,否则它们将被忽略。这些行按如下方式处理:如果标记是 HELP,则至少需要一个额外的标记,即指标名称。所有剩余的标记都被认为是该指标名称的文档字符串。 HELP 行可能包含任何 UTF-8 字符序列(在指标名称之后),但反斜杠和换行符必须分别转义为 \\\n。对于任何给定的指标名称,只能存在一个 HELP 行。

如果标记是 TYPE,则正好需要两个额外的标记。第一个是指标名称,第二个是 countergaugehistogramsummaryuntyped,定义该名称的指标类型。对于给定的指标名称,只能存在一个 TYPE 行。指标名称的 TYPE 行必须出现在该指标名称的第一个样本报告之前。如果指标名称没有 TYPE 行,则类型设置为 untyped

剩余的行使用以下语法描述样本(每行一个)(EBNF

metric_name [
  "{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]

在样本语法中

  • metric_namelabel_name 带有通常的 Prometheus 表达式语言限制。
  • label_value 可以是任何 UTF-8 字符序列,但反斜杠 (\)、双引号 (") 和换行符 (\n) 字符必须分别转义为 \\\"\n
  • value 是一个浮点数,表示方式符合 Go 的 ParseFloat() 函数的要求。除了标准的数值之外,NaN+Inf-Inf 是有效值,分别表示非数字、正无穷大和负无穷大。
  • timestamp 是一个 int64(自 epoch 以来的毫秒数,即 1970-01-01 00:00:00 UTC,不包括闰秒),表示方式符合 Go 的 ParseInt() 函数的要求。

分组和排序

给定指标的所有行必须作为一个单独的组提供,可选的 HELPTYPE 行首先出现(没有特定的顺序)。除此之外,首选在重复导出中进行可重复的排序,但不是必需的,即如果计算成本过高,则不要排序。

每一行必须具有指标名称和标签的唯一组合。否则,摄取行为是未定义的。

直方图和摘要

histogramsummary 类型在文本格式中很难表示。以下约定适用

  • 名为 x 的摘要或直方图的样本总和作为名为 x_sum 的单独样本给出。
  • 名为 x 的摘要或直方图的样本计数作为名为 x_count 的单独样本给出。
  • 名为 x 的摘要的每个分位数都作为单独的样本行给出,名称相同为 x,标签为 {quantile="y"}
  • 名为 x 的直方图的每个桶计数都作为单独的样本行给出,名称为 x_bucket,标签为 {le="y"}(其中 y 是桶的上限)。
  • 直方图必须有一个 {le="+Inf"} 的桶。它的值必须x_count 的值相同。
  • 直方图的桶和摘要的分位数必须按其标签值的递增数值顺序出现(分别为 lequantile 标签)。

文本格式示例

下面是一个完整的 Prometheus 指标导出示例,包括注释、HELPTYPE 表达式、直方图、摘要、字符转义示例等等。

# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027 1395066363000
http_requests_total{method="post",code="400"}    3 1395066363000

# Escaping in label values:
msdos_file_access_time_seconds{path="C:\\DIR\\FILE.TXT",error="Cannot find file:\n\"FILE.TXT\""} 1.458255915e9

# Minimalistic line:
metric_without_timestamp_and_labels 12.47

# A weird metric from before the epoch:
something_weird{problem="division by zero"} +Inf -3982045

# A histogram, which has a pretty complex representation in the text format:
# HELP http_request_duration_seconds A histogram of the request duration.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.05"} 24054
http_request_duration_seconds_bucket{le="0.1"} 33444
http_request_duration_seconds_bucket{le="0.2"} 100392
http_request_duration_seconds_bucket{le="0.5"} 129389
http_request_duration_seconds_bucket{le="1"} 133988
http_request_duration_seconds_bucket{le="+Inf"} 144320
http_request_duration_seconds_sum 53423
http_request_duration_seconds_count 144320

# Finally a summary, which has a complex representation, too:
# HELP rpc_duration_seconds A summary of the RPC duration in seconds.
# TYPE rpc_duration_seconds summary
rpc_duration_seconds{quantile="0.01"} 3102
rpc_duration_seconds{quantile="0.05"} 3272
rpc_duration_seconds{quantile="0.5"} 4773
rpc_duration_seconds{quantile="0.9"} 9001
rpc_duration_seconds{quantile="0.99"} 76656
rpc_duration_seconds_sum 1.7560473e+07
rpc_duration_seconds_count 2693

OpenMetrics 文本格式

OpenMetrics 是一个基于 Prometheus 文本格式构建的指标线路格式标准化的努力。它可以用于抓取目标,并且至少从 v2.23.0 开始也可以用于联合指标。

Exemplars (实验性)

利用 OpenMetrics 格式允许导出和查询 Exemplars。Exemplars 提供了一个时间点快照,该快照与针对其他汇总的 MetricFamily 的指标集相关。此外,它们可能附加了一个跟踪 ID,当与跟踪系统一起使用时,可以提供与特定服务相关的更详细信息。

要启用此实验性功能,您必须至少具有 v2.26.0 版本,并在参数中添加 --enable-feature=exemplar-storage

Protobuf 格式

早期版本的 Prometheus 除了当前的基于文本的格式外,还支持基于 Protocol Buffers(又名 Protobuf)的导出格式。在 Prometheus 2.0 中,Protobuf 格式被标记为已弃用,Prometheus 停止从所述导出格式中摄取样本。

但是,新的实验性功能被添加到 Prometheus 中,其中 Protobuf 格式被认为是最可行的选择。使 Prometheus 再次接受 Protocol Buffers。

以下是实验性功能的列表,一旦启用,将配置 Prometheus 以优先使用 Protobuf 导出格式

功能标志 引入它的版本
native-histograms 2.40.0
created-timestamp-zero-ingestion 2.50.0

历史版本

有关历史格式版本的详细信息,请参阅旧版 客户端数据导出格式 文档。

原始 Protobuf 格式的当前版本(以及最近针对原生直方图的扩展)在 prometheus/client_model 仓库 中维护。

此文档是开源的。请通过提交问题或拉取请求来帮助改进它。