从根本上说,Prometheus 将所有数据都存储为时间序列:属于同一指标和同一组标签维度的时间戳值流。除了存储的时间序列外,Prometheus 还可以根据查询结果生成临时派生时间序列。
每个时间序列都由其指标名称和称为标签的可选键值对唯一标识。
指标名称:
指定要测量的系统一般特征(例如,http_requests_total - 接收到的 HTTP 请求总数)。
指标名称可包含 ASCII 字母、数字、下划线和冒号。它必须匹配 [a-zA-Z_:][a-zA-Z0-9_:]* 正则表达式。
注意:冒号是为用户定义的记录规则保留的。它们不应被输出程序或直接仪器使用。
指标标签:
使 Prometheus 的维度数据模型能够识别同一指标名称的任何给定标签组合。它可识别该指标的特定维度实例(例如:使用 POST 方法向 /api/tracks 处理程序发送的所有 HTTP 请求)。查询语言允许根据这些维度进行过滤和聚合。
更改任何标签的值,包括添加或删除标签,都将创建一个新的时间序列。
标签可包含 ASCII 字母、数字和下划线。它们必须与 [a-zA-Z_][a-zA-Z0-9_]* 正则表达式匹配。
以 __(两个"_")开头的标签名称保留供内部使用。
标签值可包含任何 Unicode 字符。
标签值为空的标签等同于不存在的标签。
例如:
prometheus_http_requests_total{code="200", handler="/metrics", instance="localhost:9090", job="prometheus"} 808
其中:
prometheus_http_requests_total 为指标名称
code、handler、instance、job 为指标的标签
808 为指标值
样本构成实际的时间序列数据。每个样本包括:
一个 float64 值
毫秒精度的时间戳
注意:从 Prometheus v2.40 版开始,实验性地支持本地直方图。采样值不再是一个简单的 float64,而是一个完整的直方图。
给定一个指标名称和一组标签后,时间序列经常使用这种符号来识别:
<metric name>{<label name>=<label value>, ...}
其中:
<metric name> 为指标名称
<label name> 为指标标签名称
<label value> 为指标标签值
例如,一个指标名称为 api_http_requests_total、标签为 method="POST" 和 handler="/messages" 的时间序列可以这样编写:
api_http_requests_total{method="POST", handler="/messages"}
这与 OpenTSDB 使用的符号相同。