警报值由Prometheus模板中的字典中的字符串替换

时间:2019-12-17 17:02:21

标签: prometheus

我在Prometheus中具有APC UPS的SNMP监视。

我有这样的警报规则:

  - alert: 'APC status'
    expr: apc_snmp_power_status{job="apc_snmp"} != 2
    #snmp upsBasicOutputStatus, UID 1.3.6.1.4.1.318.1.1.1.4.1.1.0
    for: 3m
    labels:
      severity: 'warning'
    annotations:
      title: 'APC {{ $labels.apcname }} status error.'
      description: 'APC UPS management card  {{ $labels.instance }} reports that UPS {{ $labels.apcname }} is not in Online status. (status {{ $value }}). 
                      1: unknown \
                      2: onLine \
                      3: onBattery \
                      4: onSmartBoost \
                      5: timedSleeping \
                      6: softwareBypass \
                      7: off \
                      8: rebooting \
                      ... '

是否可以在此处实现任何模板,该模板将用字典中的相应字符串替换$ value?

我想以表单

接收通知

'APC UPS管理卡1.2.3.4报告UPS myAPC处于 onBattery 状态。 (状态 3 )。'

1 个答案:

答案 0 :(得分:0)

经过几个小时的挖掘,它似乎可以正常工作:

  - alert: 'APC status'
    expr: apc_snmp_power_status{job="apc_snmp"} != 2
    #snmp upsBasicOutputStatus, UID 1.3.6.1.4.1.318.1.1.1.4.1.1.0
    for: 30s
    labels:
      severity: 'warning'
    annotations:
      title: 'APC {{ $labels.apcname }} status error.'
      description: 'APC UPS management card  {{ $labels.instance }} reports that UPS {{ $labels.apcname }} is in 
                    {{      if eq ($value | humanize) "1" }} unknown
                    {{ else if eq ($value | humanize) "2" }} onLine
                    {{ else if eq ($value | humanize) "3" }} onBattery
                    {{ else if eq ($value | humanize) "4" }} onSmartBoost
                    {{ else if eq ($value | humanize) "5" }} timedSleeping
                    {{ else if eq ($value | humanize) "6" }} softwareBypass
                    {{ else if eq ($value | humanize) "7" }} off
                    {{ else if eq ($value | humanize) "8" }} rebooting {{ end }} status. (status {{ $value }})'

问题是比较float64类型和int,我通过'humanize'函数和int引号解决了它。 我不知道GoLang,也许还有另一个更简单的解决方案。