17 Prometheus 数据处理
概述
Zabbix 可以采集符合 Prometheus行协议格式的监控数据。
采集数据需要配置以下两步:
- 创建一个作为主监控项的HTTP监控项 指向合适的站点批量采集数据。例如:
https://<prometheus host>/metrics
- 配置使用Prometheus 预处理选项的依赖监控项,来从主监控项中获取需要的数据
Zabbix 有两个Prometheus 预处理选项:
- Prometheus正则匹配 - 可以应用于常规监控项中,用来从查询Prometheus行协议中提取数据
- Prometheus转JSON - 可以应用于常规监控项或低级别自动发现监控项。使用这个预处理步骤,将会将采集到的Prometheus 数据转化为JSON格式返回给监控项
批量处理
依赖监控项支持批量处理。为了启用缓存和索引,是 Prometheus 正则匹配 步骤必须是预处理配置的第一个步骤。当 Prometheus 正则匹配是预处理的第一步时,经过这个预处理步骤配置的第一组 <label>==<value>
条件解析后的Prometheus数据会被缓存并建立索引。这个缓存可以在其他依赖监控项的其他后续预处理过程中得到重用。为了更好的优化性能,第一个作为条件的label,应当匹配尽可能多的不同值。
如果有额外的预处理步骤需要在第一步之前执行,正确做法是将该步骤放在主要监控项或者新建一个依赖监控项,并将这个监控项作为处理Prometheus数据处理监控项的主监控项。
配置
假设您已经配置了 HTTP 主监控项,您需要创建一个 依赖监控项 来应用Prometheus 预处理步骤:
- 在配置表单中填入常规依赖监控项的参数
- 前往预处理选项卡
- 选择一个 Prometheus 预处理选项(Prometheus正则匹配 or Prometheus转JSON)
以下参数特定于 Prometheus正则匹配 预处理选项:
参数 | 描述 | 示例 |
---|---|---|
Pattern | 要定义所需数据的正则匹配规则,可以使用与PromQL(Prometheus 查询语言)十分类似的检索语言 (详见 对比表]), 举个例子: <metric name> - 指定指标名称 {name=~”<regex>”} - 根据正则表达式,匹配指标名称 {<label name>=”<label value>”,…} - 指定标签名称 {<label name>=~”<regex>”,…} - 根据正则表达式,匹配标签名称 {name=~”.“}==<value> - 指定指标值 或者将以上的条件任意组合: <metric name>{<label1 name>=”<label1 value>”,<label2 name>=~”<regex>”,…}==<value> 标签名称可以是任何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 |
Result processing | 定义如何返回处理结果,提供了值,标签 或应用适当的函数(如正则匹配的到了多行结果,需要对这些结果进行简单聚合): 值 - 返回指标的值(当匹配到多行记录时,会引发错误) 标签 - 在标签字段中指定的标签返回值(当匹配到多个指标时,会引发错误) 总和 - 返回值的总和 最小值 - 返回最小值 max - 返回最大值 平均值 - 返回平均值 计数 - 返回值的计数 此参数字段仅适用于Prometheus正则匹配预处理步骤。 | 实际用例见表后。 |
Output | 定义标签名称(可选)。 在这种情况下,返回与标签名称对应的值。 如果在 Result processing 字段中选择了“Label”,则此字段仅适用于 Prometheus pattern 选项。 |
****使用参数的示例****
- 要从以下内容返回
/var/db
的值:
node_disk_usage_bytes{path="/var/cache"} 2.1766144e+09
node_disk_usage_bytes{path="/var/db"} 20480
node_disk_usage_bytes{path="/var/dpkg"} 8192
node_disk_usage_bytes{path="/var/empty"} 4096
使用以下参数:
- 模式 -
node_disk_usage_bytes{path="/var/db"}
- 结果处理 - 选择’value’
- 您可能还对所有
node_disk_usage_bytes
参数的平均值感兴趣:
- 模式 -
node_disk_usage_bytes
- 结果处理 - 选择 ‘avg’
- 虽然 Prometheus 仅支持数值数据,但通常使用一种变通方法来返回相关的文本描述也很流行。 这可以通过指定标签的过滤器来实现。因此,要从以下内容返回 ‘color’ 标签的值:
elasticsearch_cluster_health_status{cluster="elasticsearch",color="green"} 1
elasticsearch_cluster_health_status{cluster="elasticsearch",color="red"} 0
elasticsearch_cluster_health_status{cluster="elasticsearch",color="yellow"} 0
使用以下参数:
- 模式 -
elasticsearch_cluster_health_status {cluster="elasticsearch"} == 1
- 结果处理 - 选择’label’
- 标签 - 指定 ‘color’
过滤器(基于数值 ‘1’)将匹配相应的行,而标签将返回健康状态描述(当前为 ‘green’;但也可能为 ‘red’ 或 ‘yellow’)。
Prometheus转JSON
来自Prometheus 的数据可以被低级别自动发现使用。要这样使用数据,必须要转化为JSON格式。Zabbix提供了Prometheus转JSON作为预处理步骤的选项,这可以直接按照格式要求返回数据。
查询语言比较
以下表格列出了 PromQL 和 Zabbix Prometheus 预处理查询语言之间的差异和相似之处。
PromQL即时向量选择器 | Zabbix Prometheus预处理 | |
---|---|---|
差异 | ||
查询目标 | Prometheus服务器 | Prometheus exposition 格式的纯文本 |
返回值 | 即时向量 | 指标或标签值(Prometheus 模式) 对于 JSON 中的单个值,为指标数组(Prometheus 转 JSON) |
标签匹配运算符 | =, !=, =~, !~ | =, !=, =~, !~ |
用于标签或指标名称匹配的正则表达式 | RE2 | PCRE |
比较运算符 | 参见 列表 | 仅支持 ==(等于)用于值过滤 |
相似之处 | ||
按等于字符串的指标名称选择 | <metric name> 或 {name=”<metric name>”} | <metric name> 或 {name=”<metric name>”} |
按匹配正则表达式的指标名称选择 | {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> |