Prometheus Alertmanager Slack 配置:send_resolved 作为灵活值

Posted

技术标签:

【中文标题】Prometheus Alertmanager Slack 配置:send_resolved 作为灵活值【英文标题】:Prometheus Alertmanager Slack Configuration: send_resolved as flexible value 【发布时间】:2020-01-30 13:51:52 【问题描述】:

我想根据警报向 slack 发送解决通知。因此,我为每个警报创建了一个注释(“resolve”),它应该定义是否应该发送已解决的通知。

这是我的警报的外观:

        - alert: JobsFailing
          expr: rate(failed_jobs_submitterjob="my_job"[10m]) > 0
          for: 5m
          labels:
            severity: slack_critical
            service: my_service
          annotations:
            identifier: 'my_service_jobs_failing'
            description: 'Jobs are failing'
            resolve: true

这是我的 alertmanager.yaml:

    global:
      resolve_timeout: 5m
      slack_api_url: 'https://hooks.slack.com/services/...'
      http_config:
        proxy_url: 'some_proxy'

    templates:
      - /etc/config/notifications.tpl

    route:
      receiver: 'default-receiver'
      group_wait: 5s
      group_interval: 1m
      repeat_interval: 6h
      routes:
      - receiver: slack_critical
        match:
          severity: slack_critical

    receivers:
    - name: default-receiver

    - name: slack_critical
      slack_configs:
      - channel: '#alert_channel'
        username: "Alert"
        icon_emoji: ":monkey:"
        send_resolved:  .Annotations.resolve 
        title: ' template "custom_title" . '
        text: ' template "custom_slack_message" . '

我尝试对 .Annotations.resolve 使用字符串而不是布尔值

我尝试使用模板:

 define resolve_alert  if eq .Annotations.resolve "true" else  if eq .Annotations.resolve "false"  end 

send_resolved:  template resolve_alert . 

我尝试了 if 子句:

 if eq .Annotations.resolve true send_resolved: trueelsesend_resolved: falseend
send_resolved:  if or .Annotations.resolve | default false 

我希望 slack 配置能够获取值 .Annotations.resolve 并根据警报中定义的值向 slack 发送已解决的消息。使用 .Annotations.resolve 时得到的结果:

level=error ts=2019-10-01T09:08:12.284Z caller=coordinator.go:124 component=configuration msg="Loading configuration file failed" file=/etc/config/alertmanager.yml err="yaml: unmarshal errors:\n  line 28: cannot unmarshal !!map into bool"

使用模板时得到的结果:

level=error ts=2019-09-30T14:39:29.294Z caller=coordinator.go:124 component=configuration msg="Loading configuration file failed" file=/etc/config/alertmanager.yml err="yaml: line 27: did not find expected key"

任何意见都非常感谢...

【问题讨论】:

【参考方案1】:

send_resolved 是一个布尔值,而不是一个可模板化的字符串。你想要的是一个标签,当有一个路由到一个接收器和另一个路由到另一个时,每个路由都有不同的布尔值。

无法根据注释发送警报,只能根据标签。

【讨论】:

使用标签也不能解决问题,错误保持不变:cannot unmarshal !!map into bool 如果我使用 .Labels.resolved did not find expected key 如果我使用 if 子句: if .Labels.resolve == "test" trueelsefalseend 我也尝试定义一个额外的路由+接收器来实现不同的send_resolved,但这也没有成功......

以上是关于Prometheus Alertmanager Slack 配置:send_resolved 作为灵活值的主要内容,如果未能解决你的问题,请参考以下文章

linux(centos8):prometheus使用alertmanager发送报警邮件(prometheus 2.18.1/alertmanager 0.20.0)

Prometheus+alertmanager告警配置-2

Prometheus配合Alertmanager报警系统

Prometheus配置alertmanager告警邮件通知

2, Prometheus之部署Alertmanager

小姐姐带你入门Alertmanager与Prometheus告警规则