关于linux:Prometheus-AlertManager-生产实践直接根据-toemail-label-发-alert-到对应邮箱

44次阅读

共计 2179 个字符,预计需要花费 6 分钟才能阅读完成。

概述

通过之前的文章 – Prometheus Alertmanager 生产配置趟过的坑总结, 咱们曾经晓得 AlertManager 作为告警平台,是十分弱小的,能够去重 (deduplicating),分组 (grouping),并将它们路由 (routing) 到正确的接收器 (receiver) 集成,如电子邮件,微信,或钉钉。它还负责解决警报的静默 / 屏蔽 (silencing)、定时发送 / 不发送 (Mute) 和克制 (inhibition) 问题。

失常的 AlertManager 解决告警流程,是要通过 Alerts -> Route -> Receivers 这么一个步骤的

  1. Alerts 里带了一些标签,如 env, team, job 等
  2. 依据提前编辑好的 Route, 对 alerts 进行路由,比方 env=prod 的发给哪些 receiver, team=db 的发给哪些人。..
  3. 在 Receivers 里曾经提前录入了这些须要解决 prod,解决 db 告警的 receivers 邮箱。告警这样发给对应的收件人。

然而,如果我在 Alerts 里自带收件人信息(如邮箱),能不能间接应用?而不须要再录入所有的 receivers。

答案当然是能够!通过模板(template)实现这个需要。Let’s GO!💪💪💪

模板(Template)简介

AlertManager 模板最后的目标是为了对告警的音讯做定制化的。
比方同样的 Alerts,我:

  • 通过 SMS 发送,冀望是纯文本格式;
  • 通过 email 发送,冀望是 HTML 格局;
  • 通过钉钉、企微发送,冀望是 Markdown 格局;
  • 而且在这些渠道中,

    • 题目是不同的排列组合
    • 告警内容也是不同的段落格局和用词(比方通过钉钉、企微会退出更多的 emoji)

AlertManager 模板是和 Prometheus 模板一样,应用的同样是 Go template。当然,具体的数据和函数会有轻微的区别,因为在这里次要解决的是告警 而非单个告警。

示例如下:

receivers:
  - name: emergency
    slack_configs:
    - api_url: https://hooks.slack.com/services/XXXXXXXX
      channel: '#emergency'
      title: 'Alerts in {{.GroupLabels.cluster}} {{.GroupLabels.env}}!'

AlertManager 进阶

除了模板化 txt 字段,告诉的定义(比方:发给谁)也能够被模板化。通常每个 team 都有本人的路由树,以及绝对应的收件人(receivers)。如果另一个团队(不是监控团队,也不是运维团队,而是测试等团队)想要发送给本人团队告警,他们须要从头到尾设置 label、设置匹配其团队 labels 的路由树、把团队内的收件人信息配置到 AlertManager 的 receiver 里。

那如果你是监控团队,你用 AlertManager 做了个告警平台提供给内部团队甚至客户应用,每次都得这么搞会有“亿点点”麻烦。

该怎么办呢?🤔🤔🤔

解决方案

解决方案就是:

  • Label
  • AlertManager 告诉模板

首先,间接在 Label 里提供相干的接管人信息,而后通过 AlertManager 的模板,将 receiver -> to 写上对应的模板即可。

具体演示如下:

计划演示

首先,是蕴含收件人信息 label 的 alerts,如下:

[
  {
    "labels": {
      "alertname": "<requiredAlertName>",
      "<labelname>": "<labelvalue>",
      "email_to": "foo@example.com,bar@example.com",
      ...
    },
    "annotations": {"<labelname>": "<labelvalue>",},
    "startsAt": "<rfc3339>",
    "endsAt": "<rfc3339>",
    "generatorURL": "<generator_url>"
  },
  ...
]

每个 alert 都提供 email_to 这样的 label。

而后,在 AlertManager 中,能够设置如下 routereceiver, 如下:

global:
  smtp_smarthost: 'localhost:25'
  smtp_from: 'smtp@example.com'
route:
  group_by: [email_to, alertname]
  receiver: customer_email
receivers:
  - name: customer_email
    email_configs:
      - to: '{{.GroupLabels.email_to}}'
    headers:
      subject: 'Alert: {{.GroupLabels.alertname}}'

留神,group_by 必须包含 email_to label,这样它才算 .GroupLabels. 下的一员。

当有 alerts 来时,如 "email_to": "foo@example.com,bar@example.com", 会 route 到 customer_email, 其收件人是 {{.GroupLabels.email_to}}, 会被模板化为:foo@example.com,bar@example.com, 告警邮件天然就会发过来。

实现!🎉🎉🎉

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0