本章次要对如何应用开源组件和Alertmanager组件集成警报告诉。Kubernetes的警报集成后续会间接在配置文件解说,原理大同小异,此处仅对相干警报告诉做集成。
警报告诉接收器
后面始终是在Web UI 查看警报信息,当初开始应用接收器与Alertmanager集成,发送警报信息到 Email
、企业微信
、钉钉机器人
,对于警报要求比拟高的同学,能够依据上面提到的开源组件 【PrometheusAlert全家桶】
配置飞书、短信、语音电话等警报。
后面曾经讲过,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随便。
创立胜利当前如下图。
这时候须要把 AgentId
和 Secret
记录下来,对于你的这种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.gztar xf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gzmv 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-dingdingDocumentation=https://prometheus.io/After=network.target[Service]Type=simpleUser=prometheusExecStart=/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.targetEOF## 启动服务systemctl enable prometheus-webhook-dingtalk.servicesystemctl start prometheus-webhook-dingtalk.service
配置文件
## Request timeout# timeout: 5s## Customizable templates path## Customizable templates pathtemplates: # - 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 tokentargets:# 如果有多个分组就能够在这里定义多个接口 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/templatecat 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 -}}**Alerts Firing**{{ template "default.__text_alert_list" .Alerts.Firing }}{{- end }}{{ if gt (len .Alerts.Resolved) 0 -}}**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
,反对将收到的这些音讯发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,容联云电话等,这里就不细讲了,如果配置有问题能够随时征询我。