以下是生產環境中prometheus.rules.yml告警規則用例
prometheus默認的instance是ip:port格式的,無法知道主機名。
方法一:node_uname_info獲取
參考鏈接:https://blog.csdn.net/CHEndorid/article/details/106820612
主機名(nodename)在指標node_uname_info中,且node_uname_info的值恰巧為1,所以我們可以在PromQL中通過node_uname_info提取,只需要在原有PromQL后添加
* on(instance) group_left(nodename) (node_uname_info)
這樣,在prometheus告警的labels中,就可以通過nodename獲取主機名了
特別的,up==0的值是0,做乘法是不會得到結果的
示例:
- alert: cpu使用率過高告警
expr: (100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100))* on(instance) group_left(nodename) (node_uname_info) > 85
for: 5m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}({{$labels.nodename}})CPU使用率過高!"
description: '服務器{{$labels.instance}}({{$labels.nodename}})CPU使用率超過85%(目前使用:{{printf "%.2f" $value}}%)'
方法二:relabel_configs增加主機名標簽
此方法,可以適應所有報警的規則
在 prometheus增加主機配置是,添加配置即可
- job_name: 'hadoop-test-exporter'
consul_sd_configs:
- server: 'localhost:8500'
services: [hadoop-test-exporter]
relabel_configs: #把__meta_consul_service_id 映射主機名
- source_labels: [__meta_consul_service_id]
separator: ;
regex: (.*)
target_label: hostname
replacement: $1
action: replace
- source_labels: [__meta_consul_service_address] #映射主機IP
separator: ;
regex: (.*)
target_label: ip
replacement: $1
action: replace
- source_labels: ['__meta_consul_tags'] #根據tag來匹配分組
regex: '^.*,hadoop-test,.*$'
action: keep