乐趣区

关于prometheus:Prometheus监控神器Alertmanager篇2

本章次要对如何应用开源组件和 Alertmanager 组件集成警报告诉。Kubernetes 的警报集成后续会间接在配置文件解说,原理大同小异,此处仅对相干警报告诉做集成。

警报告诉接收器

后面始终是在 Web UI 查看警报信息,当初开始应用接收器与 Alertmanager 集成,发送警报信息到 Email企业微信 钉钉机器人,对于警报要求比拟高的同学,能够依据上面提到的开源组件 【PrometheusAlert 全家桶】 配置飞书、短信、语音电话等警报。

Email

后面曾经讲过,Alertmanager 默认反对配置 Email,也是最一般的形式,在 Alertmanager 组件中内置了 SMTP 协定。间接能够把后面的 Alertmanager.yml 中的 SMTP 局部截取进去,而后进行调整与配置

global:
  resolve_timeout: 5m
  # smtp 配置
  smtp_from: "1234567890@qq.com" # 发送邮件主题
  smtp_smarthost: 'smtp.qq.com:465' # 邮箱服务器的 SMTP 主机配置
  smtp_auth_username: "1234567890@qq.com" # 登录用户名
  smtp_auth_password: "auth_pass" # 此处的 auth password 是邮箱的第三方登录受权明码,而非用户明码,尽量用 QQ 来测试。smtp_require_tls: false # 有些邮箱须要开启此配置,这里应用的是 163 邮箱,仅做测试,不须要开启此性能。route:
  receiver: ops
  group_wait: 30s # 在组内期待所配置的工夫,如果同组内,30 秒内呈现雷同报警,在一个组内呈现。group_interval: 5m # 如果组内内容不变动,合并为一条警报信息,5m 后发送。repeat_interval: 24h # 发送报警距离,如果指定工夫内没有修复,则从新发送报警。group_by: [alertname]  # 报警分组
  routes:
      - match:
          team: operations
        group_by: [env,dc]
        receiver: 'ops'
      - receiver: ops # 路由和标签,依据 match 来指定发送指标,如果 rule 的 lable 蕴含 alertname,应用 ops 来发送
        group_wait: 10s
        match:
          team: operations
# 接收器指定发送人以及发送渠道
receivers:
# ops 分组的定义
- name: ops
  email_configs:
  - to: '9935226@qq.com,xxxxx@qq.com' # 如果想发送多集体就以 ',' 做宰割,写多个邮件人即可。send_resolved: true
    headers:
      from: "警报核心"
      subject: "[operations] 报警邮件"
      to: "小煜狼皇"

配置实现后,间接重启 Alertmanager 组件,使配置失效,而后应用后面内存阈值触发一次警报来看下发送后果。

收到的警报信息:

当警报接触当前收到的复原信息。

企业微信

首先你要具备企业微信管理员的权限,如果没有能够本人注册一个,进行测试,我这里有自行注册的企业微信

第一步登录进入当前,在利用治理中新建利用。

第二步,创立利用,信息填写如下,上传利用 logo 随便。

创立胜利当前如下图。

这时候须要把 AgentIdSecret 记录下来,对于你的这种 Secret 信息,最好治理好,我的用过就会删除,所以不必放心安全隐患。

| ID | key |
| :—–: | :—-: |
|AgentId|1000004|
|Secret|F-fzpgsabmfiFt7_4QRQwWEl8eyx7evO12sRYe_Q5vA|

第三步,当初咱们来用新建的企业微信利用在 Alertmanager 配置,能够配置全局,也能够对独自须要发送的接收器,因为警报须要分级,所以须要独自解决,在这里应用的的独自的配置,须要晓得 企业 ID,以及 部门 ID

企业 ID 通过

部门 ID 通过通讯录获取

# 企业微信配置
  wechat_configs:
  - corp_id: 'wwxxxxx' # 企业 ID 是惟一标识
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信 api 接口,对立定义
    send_resolved: true # 设置发送警报复原信息
    to_party: '2' # 部门 id,比方我的叫警报组,因而显示的是 2,如果你 DB 组,就可能会是 3,WEB 组就是 4,顺次类推,另外须要接管警报的相干人员必须在这个部门里。agent_id: '1000004' # 新建利用的 agent_id
    api_secret: 'F-fzpgsabmfiFt7_4QRQwWEl8eyx7evO12sRYe_Q5vA' # 新建利用的 Secret

这时候咱们重启 Alertmanager,而后应用之前的形式来触发模仿警报,看看发送是不是曾经没有问题了,这时咱们的企业微信中、Email 都能够收到警报了,这里的警报曾经被我用模块解决过了。可读性会更高。

cat wechat.tmpl
## wechat 模板
{{define "wechat.default.message"}}
{{if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{range .Alerts}}
警报级别:{{.Labels.status}}

警报类型:{{.Labels.alertname}}

故障主机: {{.Labels.instance}}

警报主题: {{.Annotations.summary}}

警报详情: {{.Annotations.description}}

⏱ : {{(.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end}}
{{- end}}

{{if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:
{{range .Alerts}}
警报级别:{{.Labels.status}}

警报类型:{{.Labels.alertname}}

故障主机: {{.Labels.instance}}

警报主题: {{.Annotations.summary}}

警报详情: {{.Annotations.description}}

⏱ : {{(.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
⏲ : {{(.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end}}
{{- end}}
{{- end}}

Firing 警报:

上面是 Resolve 的警报:

钉钉机器人(Webhook)

对于钉钉大家都曾经很相熟了,大部分企业都曾经启用钉钉办公了,同时其推出的收费的 webhook 机器人也很受大家的欢送。咱们这里讲一下借助第三方开源组件如何对钉钉集成警报性能。

首先须要在钉钉创立机器人,而后在白名单中增加关键字信息与 ip 限度等平安设置,这个只有你有群,你就能够在群外面建,非常简单,这里就不做演示了

先把 Prometheus-webhook-Dingtalk 组件装好。

mkdir -p /etc/prometheus-webhook-dingtalk/template/
cd /etc/prometheus-webhook-dingtalk/
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar xf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-1.4.0.linux-amd64/* /etc/prometheus-webhook-dingtalk/
mv prometheus-webhook-dingtalk /bin/
cat <<EOF> /lib/systemd/system/prometheus-webhook-dingtalk.service 
[Unit]
Description=prometheus-webhook-dingding
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/bin/prometheus-webhook-dingtalk --web.listen-address=":8070" --web.enable-ui --config.file="/etc/prometheus-webhook-dingtalk/config.yml"
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
## 启动服务
systemctl enable prometheus-webhook-dingtalk.service
systemctl start prometheus-webhook-dingtalk.service

配置文件

## Request timeout
# timeout: 5s

## Customizable templates path
## Customizable templates path
templates:
        # - contrib/templates/legacy/template.tmpl
  # 自定义模板门路
  - /etc/prometheus-webhook-dingtalk/template/default.tmpl

## 你还能够应用 'default_message' 笼罩默认模板
## 上面的示例应用 v0.3.0 中的“legacy”模板
# default_message:
#   title: '{{template"legacy.title".}}'
#   text: '{{template"legacy.content".}}'

## Targets, previously was known as "profiles"
# 定义的 webhook,钉钉创立的 webhook token
targets:
# 如果有多个分组就能够在这里定义多个接口
  ops:
    url: https://oapi.dingtalk.com/robot/send?access_token=a4feed2322222222222222222222222
  web:
    url: https://oapi.dingtalk.com/robot/send?access_token=a4feed2325c1333333333333333333333

定义模板:

cd /etc/prometheus-webhook-dingtalk/template
cat default.tmpl
{{define "__subject"}}[{{.Status | toUpper}}{{if eq .Status "firing"}}:{{.Alerts.Firing | len}}{{end}}] {{.GroupLabels.SortedPairs.Values | join ""}} {{if gt (len .CommonLabels) (len .GroupLabels) }}({{with .CommonLabels.Remove .GroupLabels.Names}}{{.Values | join" "}}{{end}}){{end}}{{end}}
{{define "__alertmanagerURL"}}{{.ExternalURL}}/#/alerts?receiver={{.Receiver}}{{end}}

{{define "__text_alert_list"}}{{range .}}
**Labels**
{{range .Labels.SortedPairs}}> - {{.Name}}: {{.Value | markdown | html}}
{{end}}
**Annotations**
{{range .Annotations.SortedPairs}}> - {{.Name}}: {{.Value | markdown | html}}
{{end}}
**Source:** [{{.GeneratorURL}}]({{.GeneratorURL}})
{{end}}{{end}}

{{/* Firing */}}

{{define "default.__text_alert_list"}}{{range .}}

**Trigger Time:** {{dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**Summary:** {{.Annotations.summary}}

**Description:** {{.Annotations.description}}

**Graph:** [????]({{.GeneratorURL}})

**Details:**
{{range .Labels.SortedPairs}}{{if and (ne (.Name) "severity") (ne (.Name) "summary") }}> - {{.Name}}: {{.Value | markdown | html}}
{{end}}{{end}}
{{end}}{{end}}

{{/* Resolved */}}

{{define "default.__text_resolved_list"}}{{range .}}

**Trigger Time:** {{dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**Resolved Time:** {{dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}

**Summary:** {{.Annotations.summary}}

**Graph:** [????]({{.GeneratorURL}})

**Details:**
{{range .Labels.SortedPairs}}{{if and (ne (.Name) "severity") (ne (.Name) "summary") }}> - {{.Name}}: {{.Value | markdown | html}}
{{end}}{{end}}
{{end}}{{end}}

{{/* Default */}}
{{define "default.title"}}{{template "__subject" .}}{{end}}
{{define "default.content"}}#### \[{{.Status | toUpper}}{{if eq .Status "firing"}}:{{.Alerts.Firing | len}}{{end}}\] **[{{index .GroupLabels "alertname"}}]({{template "__alertmanagerURL" .}})**
{{if gt (len .Alerts.Firing) 0 -}}

![Firing-img](https://is3-ssl.mzstatic.com/image/thumb/Purple20/v4/e0/23/cf/e023cf56-0623-0cdf-afce-97ae90eabfda/mzl.uplmrpgi.png/320x0w.jpg)

**Alerts Firing**
{{template "default.__text_alert_list" .Alerts.Firing}}
{{- end}}
{{if gt (len .Alerts.Resolved) 0 -}}

![Resolved-img](https://is3-ssl.mzstatic.com/image/thumb/Purple18/v4/41/72/99/4172990a-f666-badf-9726-6204a320c16e/mzl.dypdixoy.png/320x0w.png)

**Alerts Resolved**
{{template "default.__text_resolved_list" .Alerts.Resolved}}
{{- end}}
{{- end}}

{{/* Legacy */}}
{{define "legacy.title"}}{{template "__subject" .}}{{end}}
{{define "legacy.content"}}#### \[{{.Status | toUpper}}{{if eq .Status "firing"}}:{{.Alerts.Firing | len}}{{end}}\] **[{{index .GroupLabels "alertname"}}]({{template "__alertmanagerURL" .}})**
{{template "__text_alert_list" .Alerts.Firing}}
{{- end}}

{{/* Following names for compatibility */}}
{{define "ding.link.title"}}{{template "default.title" .}}{{end}}
{{define "ding.link.content"}}{{template "default.content" .}}{{end}}

在 Aertmanager 中配置警报

# 接收器指定发送人以及发送渠道
receivers:
# ops 分组的定义
- name: ops
  email_configs:
  - to: '9935226@qq.com,10000@qq.com'
    send_resolved: true
    headers: {Subject: "[operations] 报警邮件"} # 接管邮件的题目
  # 钉钉配置
  webhook_configs:
  - url: http://localhost:8070/dingtalk/ops/send # 这里是在钉钉开源组件中的接口,如果独自定义的 receiver 须要对应你的分组与钉钉机器人的 webhook token
    # 企业微信配置
  wechat_configs:
  - corp_id: 'ww5421dksajhdasjkhj'
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
    send_resolved: true
    to_party: '2'
    agent_id: '1000002'
    api_secret: 'Tm1kkEE3RGqVhv5hO-khdakjsdkjsahjkdksahjkdsahkj'
# web
- name: web
  email_configs:
  - to: '9935226@qq.com'
    send_resolved: true
    headers: {Subject: "[web] 报警邮件"} # 接管邮件的题目
  webhook_configs:
  - url: http://localhost:8070/dingtalk/web/send

持续应用下面的触发模仿警报,此时会同时让三个警报都承受到警报信息,咱们这里只是为了调试,往往一个警报告诉就能够满足需要了,对于重要业务还是须要应用电话以及短信揭示。

钉钉 Firing 警报:

钉钉 Resolve 警报:

警报告诉模板

Prometheus 创立警报转发给 Alertmanager,Alertmanager 会依据不同的 Label 向不同的 Receiver 发送警报告诉,如 Email、钉钉、企业微信、飞书、短信等等。所有 Receiver 都一个接管模板,而后通过模板格式化当前发送警报信息给 Receiver。
Alertmanager 自带的模板是基于 Go 语言的 template 模板,用户能够依据本人的需要去定义本人须要的模板,下面我给出的模板曾经足够大家的根底应用了。

上面介绍下通常自定义模板中会须要用到的一些参数阐明

| 名称 | 数据类型 | 形容 |
| :—–: | :—-: |:—-: |
|Receiver|string| 承受警报告诉的接收器名称 |
|Status|string| 警报状态,例如:Firing 或 Resolved 的告诉 |
|Alert |Alert| 警报告诉的实在内容,警报中的所有列表 |
|GroupLables|KV| 蕴含警报告诉的组标签 |
|CommandLabels|KV| 所有警报的公共标签,蕴含 GroupLabels 的所有标签 |
|CommandAnnotations|KV| 正文,比方自定义的一些字符串 |
|ExternalURL|string| 警报信息中的 Alertmanager 地址 |

下面说的 KV 类型是一组应用不标示标签与正文的 Key/Value 字符串对,能够在 Alertmanager 中的默认模板中看到其定义。default.tmpl

其中邮件中所显示的 View In AlertManager,Receiver 与 ExternalURL 的定义其实就是模板中的 .ExternalURL.Receiver

{{define "__alertmanager"}}AlertManager{{end}}

{{define "__alertmanagerURL"}}{{.ExternalURL}}/#/alerts?receiver={{.Receiver | urlquery}}{{end}}
...

在收到的邮箱警报中能够看到 View In AlertManager 的链接地址是:http://192.168.1.220:19093/#/alerts?receiver=ops

对于 Alert 的类型,警报列表的字段还蕴含了如下参数与定义、形容

| 名称 | 数据类型 | 形容 |
| :—–: | :—-: |:—-: |
|Status|string| 定义警报状态是曾经解决或处于触发状态 |
|Label |KV| 蕴含警报中的标签 |
|Annotations|KV| 警报的一组正文 |
|StartsAt|time.Time| 警报触发工夫 |
|EndsAt|time.Time| 警报完结工夫,只在警报完结的工夫时设置 |
|GeneratorURL|string| 警报规定的连贯 URL,也就是 Prometheus 中的 Rules 查问地址 |

对于警报中的告诉模板首先要相熟 go 语言的 template 语法以及 HTML 简略的基础知识,而后把下面相干的元数据的一些信息理解分明,就能够本人调整模板了,如果你切实懒的改,我调整好的模板能够间接拿去用,把对应的指标、标签名字改一下就能够用了。

以下是我本人批改了一下的模板警报格局,大家能够看看,这个是通过官网的 default.tmpl 批改的。

开源警报组件举荐

  • Prometheus-Webhook-Dingtalk

一个开源的第三方警报插件,针对钉钉机器人 webhook 做集成,Go 语言编写,当初迭代的曾经很不错了,可能有一些性能还是有些限度,比方针对 Markdown @某个人无奈实现,起因是因钉钉本身 API 没有反对这个性能。

  • Alertmanager-wechatrobot-webhook

这个开源组件是将Alertmanger Webhook 音讯转换为能够接管音讯的企业微信机器人,也是 go 语言编写,Alertmanager 默认曾经集成企业微信配置,如果有非凡需要,须要应用企业微信机器人的能够看看这个。

  • PrometheusAlert 全家桶

如果有对短信、电话警报等其余需要的同学,举荐这个开源警报组件,Go 语言编写,Web 框架是 Beego,反对将收到的这些音讯发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,容联云电话等,这里就不细讲了,如果配置有问题能够随时征询我。

退出移动版