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

55次阅读

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

本章次要对如何应用开源组件和 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,反对将收到的这些音讯发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,容联云电话等,这里就不细讲了,如果配置有问题能够随时征询我。

正文完
 0