18 Prometheus 数据处理

概述

Zabbix可以查询Prometheus行格式标准的度量数据。

收集 Prometheus 数据需要如下两步:

  • 一个主 HTTP 监控项数据端点 , 例如: https://<prometheus host>/metrics

  • 一个预处理配置,预定步骤为 Prometheus 选项的依赖监控项,用于从主HTTP监控项收集的度量中查询所需数据。

有两个 Prometheus 预处理的预定步骤配置选项:

  • Prometheus 正则 - 用于普通监控项中查询Prometheus 数据

  • Prometheus 转 JSON - 用于普通监控项及低级发现中. 在这种情况下,将返回 JSON 格式的 Prometheus 数据.

配置

如果您配置了HTTP主监控项, 你需要创建一个使用 Prometheus 预定步骤配置的依赖监控项,配置步骤如下:

  • 点击监控项配置表单的类型(Type),选择相关项目(Dependent item)并配置主监控项

  • 切换到预处理(Preprocessing)选项页

  • 选择一个 Prometheus 预定步骤(Preprocessing steps),选择 Prometheus 正则Prometheus 转 JSON

18 Prometheus 数据处理 - 图1

参数描述样例
Pattern要定义所需的数据的正则规则,可以使用类似于Prometheus查询语言的语法规则 (参见对照表), 例如.:
<metric name> - 被选定的 metric 名称
{name=”<metric name>”} - 被选定的 metric 名称
{name=~”<regex>”} - 匹配被选定 metric 名称的正则表达式
{<label name>=”<label value>”,…} - 被选定的 label 名称
{<label name>=~”<regex>”,…} - 匹配被选定 label 名称的正则表达式
{name=~”.“}==<value> - 被选定的 metric 值
或以上两者的结合:
<metric name>{<label1 name>=”<label1 value>”,<label2 name>=~”<regex>”,…}==<value>

Label 值可以是UTF-8字符的任意序列,但反斜杠、双引号和换行符必须转义为 \, \”\n ; 其他字符不必转义 。
wmi_os_physical_memory_free_bytes
cpu_usage_system{cpu=“cpu-total”}
cpu_usage_system{cpu=~“.”}
cpu_usage_system{cpu=“cpu-total”,host=~“.”}
wmi_service_state{name=“dhcp”}==1
wmi_os_timezone{timezone=~“.”}==1
Output定义 Label 名称(可选)。在这种情况下,将返回与 Label名称对应的值。
此字段仅适用于 Prometheus 正则 选项。

Prometheus 转 JSON

可以使用低级(low-level)发现处理Prometheus数据,此时需要配置预处理步骤 选项为 Prometheus 转 JSON 将Prometheus数据转换为JSON格式数据。

详细参见 使用 Prometheus 数据发现.

查询语法对照表

下表列出了PromQL和Zabbix Prometheus预处理查询语法之间的差异。

PromQL 语法Zabbix Prometheus 预处理语法
差异
查询目标Prometheus 服务器Prometheus 格式的纯文本
返回瞬时向量(Instant vector)Metric 或 label 值 (Prometheus 正则)

每条度量数据的 JSON 列表(Prometheus 转 JSON)
Label 匹配运算符=, !=, =~, !~=, =~
Label 或 Metric 名称匹配的Regular 表达式RE2PCRE
比较运算符参见 列表只有 == (等于) 支持值过滤
相似
按 metric 名称等于字符串进行选定<metric name> or {name=”<metric name>”}<metric name> or {name=”<metric name>”}
按 metric 名称匹配正则表达式进行选定{name=~”<regex>”}{name=~”<regex>”}
按<label name>的值等于字符串进行选定{<label name>=”<label value>”,…}{<label name>=”<label value>”,…}
按<label name>的值匹配正则表达式进行选定{<label name>=~”<regex>”,…}{<label name>=~”<regex>”,…}
按值等于字符串进行选定{name=~”.“} == <value>{name=~”.“} == <value>