从 Prometheus 版本 2.0 开始,所有向 Prometheus 公开指标的进程都需要使用 文本格式。
基本信息
2014年4月,Prometheus 0.4.0及以后的版本中,prometheus已经支持了文本格式。它使用http协议传输数据,其内容是UTF-8编码,使用"\n"分隔的多行文本,http表头content-type=text/plain; version=0.0.4,支持gzip压缩(Content-Encoding=gzip)。
文本协议是人类可读的,容易构造,无需嵌套,而且可以逐行读取。在这些优点之外,它也以下缺点:文本内容中带有大量冗余信息,很难做指标验证,而且带来了额外的转换成本。
文本格式支持以下指标类型:Counter、Gauge、Histogram、Summary、Untyped
详细信息
文本格式是基于行的。行与行之间使用换行符(\n)分隔,最后一行必须以换行符结尾, 空行将被忽略。
在一行中,字符之间可以使用任意数量的空格/制表符(\t)分隔。这一行字符最前/最后的空格将被忽略。
注释、帮助文本、类型说明:
以#开头的行被认为是一个注释。注释会被忽略,除非#后面跟着HELP或TYPE关键字。带了HELP/TYPE关键字的行会按照下面的方式进行处理:
# HELP后面必须带上至少一个单词,第一个单词被认为是指标名称,它后面的内容作为指标名称的描述信息,可以带上任何的UTF-8编码的字符,其中的反斜杠和换行符需要进行转义。对于同一个指标名,只允许有一行HELP信息。
# TYPE 后面需要有2个单词,第一个必须是指标名,其后是counter、gauge、histogram、summary或untyped。对于同一个指标名也只允许出现一个TYPE行。而且必须出现在指标之前。如果某个指标前面没有TYPE行,这个指标会被认为是Untyped类型。
其余行可以用下面的语法进行描述:
metric_name [
"{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
其中:
- metric_name 和label_name受到Prometheus表达式语言限制。
- label_value 可以是任何 UTF-8 字符序列,但反斜杠 (\)、双引号 (") 和换行符 (\n) 字符必须分别转义为\\ 、\" 和 \\n。
- value 是一个由 Go 的 ParseFloat() 函数表示的浮点数。除了标准数值之外,NaN、+Inf 和 -Inf是分别表示非数字、正无穷大和负无穷大的有效值。
- timestamp 是一个(自1970-01-01 00:00:00 UTC以来的毫秒数,不包括闰秒),由 Go 的 ParseInt() 函数表示。
分组和排序
给定指标的所有行必须作为一个组提供,在它前面可以有 HELP和TYPE行(排名不分先后)。在此之上,可以对指标行进行可重复的排序,排序不是必需的,即如果计算成本过高,则不要排序。
每行的指标名称和标签的组合必须是唯一的,否则可能会导致无法预料的后果。
Histogram和Summary类型
histogram和summary类型很难在文本格式中进行描述,以下是它们的规范:
- Histogram/Summary指标中,x的sum值在一个单独的名为x_sum的行中给出。
- Histogram/Summary指标中,x的count值在一个单独的名为x_count的行中给出。
- Histogram/Summary指标中,x的分位值,会在指标名为x,带有{quantile="y"}的行中给出。
- histogram 类型指标的“ bucket count”,会在指标名为x_bucket,并且带有{le="y"}标签的行中给出,其中y是bucket的上边界。
- Histogram类型指标必须包含一个标签为{le="+Inf"}的bucket,它的值必须与x_count的值相同。
- histogram类型的bucket、Summary类型的quantile,必须以(le标签、quantile标签的值)从小到大的顺序排列。
范例
面是一个Prometheus 文本格式示例,包括 注释、表达式、histogram、summary、字符转义等等。
# 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
OpenMetric 的文本格式
OpenMetric是基于Prometheus文本格式的一个标准化、公制化的尝试。它在Prometheus v2.23.0之后可用。
在下一篇文章中会讲述OpenMetric规范相关的内容。