一、配置altertmanager
二进制包下载地址:https://github.com/prometheus/alertmanager/releases/
官方文档: https://prometheus.io/docs/alerting/configuration/
一个报警信息在生命周期内有下面 3 种状态
`pending`: 当某个监控指标触发了告警表达式的条件,但还没有持续足够长的时间,即没有超过 `for` 阈值设定的时间,这个告警状态被标记为 `pending`
`firing`: 当某个监控指标触发了告警条件并且持续超过了设定的 `for` 时间,告警将由pending状态改成 `firing`。
Prometheus 在 firing 状态下将告警信息发送至 Alertmanager。
Alertmanager 应用路由规则,将通知发送给配置的接收器,例如邮件。
`inactive`: 当某个监控指标不再满足告警条件或者告警从未被触发时,这个告警状态被标记为 `inactive`
3种状态转换流程
初始状态:`inactive`
- 内存使用率正常,告警处于 `inactive` 状态。
expr设置的条件首次满足:
- 内存使用率首次超过 20%,告警状态变为 `pending`。
2分钟内情况:
- 如果内存使用率在超过 20% 的状态下持续了2分钟或以上,告警状态从 `pending` 变为 `firing`。
- 如果内存使用率在2分钟内恢复正常,状态从 `pending` 变回 `inactive`。
解压以后直接kubectl apply -f alertmanager.yml
[root@master01 ddd]# tar xf alertmanager-0.27.0.linux-amd64.tar.gz
[root@master01 ddd]# ls
alertmanager-0.27.0.linux-amd64 alertmanager-0.27.0.linux-amd64.tar.gz
[root@master01 ddd]# cd alertmanager-0.27.0.linux-amd64/
[root@master01 alertmanager-0.27.0.linux-amd64]# ls
alertmanager alertmanager.yml amtool LICENSE NOTICE
[root@master01 alertmanager-0.27.0.linux-amd64]# vi alertmanager
[root@master01 alertmanager-0.27.0.linux-amd64]# vi alertmanager.yml
配置文件
[root@master01 test]# cat altertmanager.yaml
# alertmanager-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: alert-config
namespace: monitor
data:
template_email.tmpl: |-
{{ define "email.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
@报警<br>
{{- range .Alerts }}
<strong>实例:</strong> {{ .Labels.instance }}<br>
<strong>概述:</strong> {{ .Annotations.summary }}<br>
<strong>详情:</strong> {{ .Annotations.description }}<br>
<strong>时间:</strong> {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
<br>
{{- end -}}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
@恢复<br>
{{- range .Alerts }}
<strong>实例:</strong> {{ .Labels.instance }}<br>
<strong>信息:</strong> {{ .Annotations.summary }}<br>
<strong>恢复:</strong> {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
<br>
{{- end -}}
{{- end }}
{{ end }}
config.yml: |-
templates: # 1、增加 templates 配置,指定模板文件
- '/etc/alertmanager/template_email.tmpl'
inhibit_rules:
- source_match:
# prometheus配置文件中的报警规则1产生的所有报警信息都带着下面2个标签,第一个标签是promethus自动添加,第二个使我们自己加的
alertname: NodeMemoryUsage
severity: critical
target_match:
severity: normal # prometheus配置文件中的报警规则2产生的所有报警信息都带着该标签
equal:
- instance # instance是每条报警规则自带的标签,值为对应的节点名
# 一、全局配置
global:
# (1)当alertmanager持续多长时间未接收到告警后标记告警状态为 resolved(解决了)
resolve_timeout: 5m
# (2)配置发邮件的邮箱
smtp_smarthost: 'smtp.163.com:25'
smtp_from: '15555519627@163.com'
smtp_auth_username: '15555519627@163.com'
smtp_auth_password: 'PZJWYQLDCKQGTTKZ' # 填入你开启pop3时获得的码
smtp_hello: '163.com'
smtp_require_tls: false
# 二、设置报警的路由分发策略
route:
# 定义用于告警分组的标签。当有多个告警消息有相同的 alertname 和 cluster 标签时,这些告警消息将会被聚合到同一个分组中
# 例如,接收到的报警信息里面有许多具有 cluster=XXX 和 alertname=YYY 这样的标签的报警信息将会批量被聚合到一个分组里面
group_by: ['alertname', 'cluster']
# 当一个新的报警分组被创建后,需要等待至少 group_wait 时间来初始化通知,
# 这种方式可以确保您能有足够的时间为同一分组来获取/累积多个警报,然后一起触发这个报警信息。
group_wait: 30s
# 短期聚合: group_interval 确保在短时间内,同一分组的多个告警将会合并/聚合到一起等待被发送,避免过于频繁的告警通知。
group_interval: 30s
# 长期提醒: repeat_interval确保长时间未解决的告警不会被遗忘,Alertmanager每隔一段时间定期提醒相关人员,直到告警被解决。
repeat_interval: 120s # 实验环境想快速看下效果,可以缩小该时间,比如设置为120s
# 上述两个参数的综合解释:
#(1)当一个新的告警被触发时,会立即发送初次通知
#(2)然后开始一个 group_interval 窗口(例如 30 秒)。
# 在 group_interval 窗口内,任何新的同分组告警会被聚合到一起,但不会立即触发发送。
#(3)聚合窗口结束后,
# 如果刚好抵达 repeat_interval 的时间点,聚合的告警会和原有未解决的告警一起发送通知。
# 如果没有抵达 repeat_interval 的时间点,则原有未解决的报警不会重复发送,直到到达下一个 repeat_interval 时间点。
# 这两个参数一起工作,确保短时间内的警报状态变化不会造成过多的重复通知,同时在长期未解决的情况下提供定期的提醒。
# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器,与下面receivers中定义的name呼应
receiver: default
routes: # 子路由规则。子路由继承父路由的所有属性,可以进行覆盖和更具体的规则匹配。
- receiver: email # 匹配此子路由的告警将发送到的接收器,该名字也与下面的receivers中定义的name呼应
group_wait: 10s # 等待时间,可覆盖父路由的
group_by: ['instance'] # 根据instance做分组
match: # 告警标签匹配条件,只有匹配到特定条件的告警才会应用该子路由规则。
team: node # 只有拥有 team=node 标签的告警才会路由到 email 接收器。
continue: true #不设置这个只能匹配一条
- receiver: mywebhook # 匹配此子路由的告警将发送到的接收器,该名字也与下面的receivers中定义的name呼应
group_wait: 10s # 等待时间,可覆盖父路由的
group_by: ['instance'] # 根据instance做分组
match: # 告警标签匹配条件,只有匹配到特定条件的告警才会应用该子路由规则。
team: node # 只有拥有 team=node 标签的告警才会路由到 email 接收器。
# 三、定义接收器,与上面的路由定义中引用的介receiver相呼应
receivers:
- name: 'default' # 默认接收器配置,未匹配任何特定路由规则的告警会发送到此接收器。
email_configs:
- to: '7902731@qq.com@qq.com'
send_resolved: true # : 当告警恢复时是否也发送通知。
- name: 'email' # 名为 email 的接收器配置,与之前定义的子路由相对应。
email_configs:
- to: '15555519627@163.com'
send_resolved: true
html: '{{ template "email.html" . }}'
#这个是对接webhook钉钉的
- name: 'mywebhook' # 默认接收器配置,未匹配任何特定路由规则的告警会发送到此接收器。
webhook_configs:
- url: 'http://promoter:8080/dingtalk/webhook1/send'
send_resolved: true # : 当告警恢复时是否也发送通知。
---
# alertmanager-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
namespace: monitor
labels:
app: alertmanager
spec:
selector:
matchLabels:
app: alertmanager
template:
metadata:
labels:
app: alertmanager
spec:
volumes:
- name: alertcfg
configMap:
name: alert-config
containers:
- name: alertmanager
# 版本去查看官网https://github.com/prometheus/alertmanager/releases/
# 1、官网镜像地址,需要你为containerd配置好镜像加速
#image: prom/alertmanager:v0.27.0
# 2、搞成了国内的地址
image: registry.cn-hangzhou.aliyuncs.com/egon-k8s-test/alertmanager:v0.27.0
imagePullPolicy: IfNotPresent
args:
- '--config.file=/etc/alertmanager/config.yml'
ports:
- containerPort: 9093
name: http
volumeMounts:
- mountPath: '/etc/alertmanager'
name: alertcfg
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 100m
memory: 256Mi
---
# alertmanager-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: alertmanager
namespace: monitor
labels:
app: alertmanager
spec:
selector:
app: alertmanager
type: NodePort
ports:
- name: web
port: 9093
targetPort: http
[root@master01 test]# kubectl -n monitor get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager NodePort 10.99.103.160 <none> 9093:30610/TCP 107m
grafana NodePort 10.99.18.224 <none> 3000:30484/TCP 28h
prometheus NodePort 10.108.206.132 <none> 9090:31119/TCP 3d1h
promoter ClusterIP 10.97.213.227 <none> 8080/TCP 18h
redis ClusterIP 10.97.184.21 <none> 6379/TCP,9121/TCP 2d22h
[root@master01 test]# kubectl -n monitor get pods
NAME READY STATUS RESTARTS AGE
alertmanager-56b46ff6b4-mvbb8 1/1 Running 0 125m
grafana-86cfcd87fb-59gtb 1/1 Running 1 (3h25m ago) 28h
node-exporter-6f4d4 1/1 Running 4 (3h25m ago) 2d21h
node-exporter-swr5j 1/1 Running 4 (3h25m ago) 2d21h
node-exporter-tf84v 1/1 Running 4 (3h25m ago) 2d21h
node-exporter-z9svr 1/1 Running 4 (3h25m ago) 2d21h
prometheus-7f8f87f55d-zbnsr 1/1 Running 1 (3h25m ago) 21h
promoter-6f68cff456-wqmg9 1/1 Running 1 (3h25m ago) 18h
redis-84bbc5df9b-rnm6q 2/2 Running 8 (3h25m ago) 2d22h
基于webhook对接钉钉报警
prometheus(报警规则)----》alertmanager组件-----------------------------》邮箱
prometheus(报警规则)----》alertmanager组件------钉钉的webhook软件------》钉钉
二、配置钉钉
1.下载钉钉
2.添加群聊(至少2个人才可以拉群)
3.在群里添加机器人得道AIP接口和密钥
测试是否可以正常使用
#python 3.8
import time
import sys
import hmac
import hashlib
import base64
import urllib.parse
import requests
timestamp = str(round(time.time() * 1000))
secret = 'SEC45045323ac8b379b88e04750c7954645edc54c4ffdedd717b82804c8684c0706'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
MESSAGE = sys.argv[1]
webhook_url =f'https://oapi.dingtalk.com/robot/send?access_token=13ddb964c0108de8b56eb944c5e407d448cb2db02e3885c45585f8eb06779def×tamp={timestamp}&sign={sign}'
response = requests.post(webhook_url,headers={'Content-Type': 'application/json'},json={"msgtype": "text","text": {"content":f"'{MESSAGE}'"}})
print(response.text)
print(response.status_code)
pip3 install requests -i https://mirrors.aliyun.com/pypi/simple/
python3 webhook_test.py 测试
部署钉钉的webhook软件
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
#解压出来里面的config.yml配置
cat > /usr/local/prometheus-webhook-dingtalk/config.yml << "EOF"
templates:
- /etc/template.tmpl
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=3acdac2167b83e0b54f751c0cfcbb676b7828af183aca2e21428c489883ced8b
# secret for signature
secret: SEC67f8b6d15997deaf686ab0509b2dad943aca99d700131f88d010ef57e591aea0
message: # 哪个target需要引用模版,就增加这一小段配置,其中default.tmpl就是你一会要定义的模版
text: '{{ template "default.tmpl" . }}'
# 可以添加其他的对接,主要用于对接到不同的群中的机器人
webhook_mention_all:
url: https://oapi.dingtalk.com/robot/send?access_token=3acdac2167b83e0b54f751c0cfcbb676b7828af183aca2e21428c489883ced8b
secret: SEC67f8b6d15997deaf686ab0509b2dad943aca99d700131f88d010ef57e591aea0
mention:
all: true
webhook_mention_users:
url: https://oapi.dingtalk.com/robot/send?access_token=3acdac2167b83e0b54f751c0cfcbb676b7828af183aca2e21428c489883ced8b
secret: SEC67f8b6d15997deaf686ab0509b2dad943aca99d700131f88d010ef57e591aea0
mention:
mobiles: ['18611453110']
EOF
可以做成系统服务
cat > /lib/systemd/system/dingtalk.service << 'EOF'
[Unit]
Description=dingtalk
Documentation=https://github.com/timonwong/prometheus-webhook-dingtalk/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/usr/local/prometheus-webhook-dingtalk
ExecStart=/usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --web.listen-address=0.0.0.0:8060 --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml
User=nobody
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart dingtalk
systemctl status dingtalk
配置alertmanager对接钉钉webhook
[root@master01 test]# cat altertmanager.yaml
# alertmanager-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: alert-config
namespace: monitor
data:
template_email.tmpl: |-
{{ define "email.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
@报警<br>
{{- range .Alerts }}
<strong>实例:</strong> {{ .Labels.instance }}<br>
<strong>概述:</strong> {{ .Annotations.summary }}<br>
<strong>详情:</strong> {{ .Annotations.description }}<br>
<strong>时间:</strong> {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
<br>
{{- end -}}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
@恢复<br>
{{- range .Alerts }}
<strong>实例:</strong> {{ .Labels.instance }}<br>
<strong>信息:</strong> {{ .Annotations.summary }}<br>
<strong>恢复:</strong> {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
<br>
{{- end -}}
{{- end }}
{{ end }}
config.yml: |-
templates: # 1、增加 templates 配置,指定模板文件
- '/etc/alertmanager/template_email.tmpl'
inhibit_rules:
- source_match:
# prometheus配置文件中的报警规则1产生的所有报警信息都带着下面2个标签,第一个标签是promethus自动添加,第二个使我们自己加的
alertname: NodeMemoryUsage
severity: critical
target_match:
severity: normal # prometheus配置文件中的报警规则2产生的所有报警信息都带着该标签
equal:
- instance # instance是每条报警规则自带的标签,值为对应的节点名
# 一、全局配置
global:
# (1)当alertmanager持续多长时间未接收到告警后标记告警状态为 resolved(解决了)
resolve_timeout: 5m
# (2)配置发邮件的邮箱
smtp_smarthost: 'smtp.163.com:25'
smtp_from: '15555519627@163.com'
smtp_auth_username: '15555519627@163.com'
smtp_auth_password: 'PZJWYQLDCKQGTTKZ' # 填入你开启pop3时获得的码
smtp_hello: '163.com'
smtp_require_tls: false
# 二、设置报警的路由分发策略
route:
# 定义用于告警分组的标签。当有多个告警消息有相同的 alertname 和 cluster 标签时,这些告警消息将会被聚合到同一个分组中
# 例如,接收到的报警信息里面有许多具有 cluster=XXX 和 alertname=YYY 这样的标签的报警信息将会批量被聚合到一个分组里面
group_by: ['alertname', 'cluster']
# 当一个新的报警分组被创建后,需要等待至少 group_wait 时间来初始化通知,
# 这种方式可以确保您能有足够的时间为同一分组来获取/累积多个警报,然后一起触发这个报警信息。
group_wait: 30s
# 短期聚合: group_interval 确保在短时间内,同一分组的多个告警将会合并/聚合到一起等待被发送,避免过于频繁的告警通知。
group_interval: 30s
# 长期提醒: repeat_interval确保长时间未解决的告警不会被遗忘,Alertmanager每隔一段时间定期提醒相关人员,直到告警被解决。
repeat_interval: 120s # 实验环境想快速看下效果,可以缩小该时间,比如设置为120s
# 上述两个参数的综合解释:
#(1)当一个新的告警被触发时,会立即发送初次通知
#(2)然后开始一个 group_interval 窗口(例如 30 秒)。
# 在 group_interval 窗口内,任何新的同分组告警会被聚合到一起,但不会立即触发发送。
#(3)聚合窗口结束后,
# 如果刚好抵达 repeat_interval 的时间点,聚合的告警会和原有未解决的告警一起发送通知。
# 如果没有抵达 repeat_interval 的时间点,则原有未解决的报警不会重复发送,直到到达下一个 repeat_interval 时间点。
# 这两个参数一起工作,确保短时间内的警报状态变化不会造成过多的重复通知,同时在长期未解决的情况下提供定期的提醒。
# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器,与下面receivers中定义的name呼应
receiver: default
routes: # 子路由规则。子路由继承父路由的所有属性,可以进行覆盖和更具体的规则匹配。
- receiver: email # 匹配此子路由的告警将发送到的接收器,该名字也与下面的receivers中定义的name呼应
group_wait: 10s # 等待时间,可覆盖父路由的
group_by: ['instance'] # 根据instance做分组
match: # 告警标签匹配条件,只有匹配到特定条件的告警才会应用该子路由规则。
team: node # 只有拥有 team=node 标签的告警才会路由到 email 接收器。
continue: true #不设置这个只能匹配一条
- receiver: mywebhook # 匹配此子路由的告警将发送到的接收器,该名字也与下面的receivers中定义的name呼应
group_wait: 10s # 等待时间,可覆盖父路由的
group_by: ['instance'] # 根据instance做分组
match: # 告警标签匹配条件,只有匹配到特定条件的告警才会应用该子路由规则。
team: node # 只有拥有 team=node 标签的告警才会路由到 email 接收器。
# 三、定义接收器,与上面的路由定义中引用的介receiver相呼应
receivers:
- name: 'default' # 默认接收器配置,未匹配任何特定路由规则的告警会发送到此接收器。
email_configs:
- to: '7902731@qq.com@qq.com'
send_resolved: true # : 当告警恢复时是否也发送通知。
- name: 'email' # 名为 email 的接收器配置,与之前定义的子路由相对应。
email_configs:
- to: '15555519627@163.com'
send_resolved: true
html: '{{ template "email.html" . }}'
#这个是对接webhook钉钉的
- name: 'mywebhook' # 默认接收器配置,未匹配任何特定路由规则的告警会发送到此接收器。
webhook_configs:
- url: 'http://promoter:8080/dingtalk/webhook1/send'
send_resolved: true # : 当告警恢复时是否也发送通知。
---
# alertmanager-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
namespace: monitor
labels:
app: alertmanager
spec:
selector:
matchLabels:
app: alertmanager
template:
metadata:
labels:
app: alertmanager
spec:
volumes:
- name: alertcfg
configMap:
name: alert-config
containers:
- name: alertmanager
# 版本去查看官网https://github.com/prometheus/alertmanager/releases/
# 1、官网镜像地址,需要你为containerd配置好镜像加速
#image: prom/alertmanager:v0.27.0
# 2、搞成了国内的地址
image: registry.cn-hangzhou.aliyuncs.com/egon-k8s-test/alertmanager:v0.27.0
imagePullPolicy: IfNotPresent
args:
- '--config.file=/etc/alertmanager/config.yml'
ports:
- containerPort: 9093
name: http
volumeMounts:
- mountPath: '/etc/alertmanager'
name: alertcfg
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 100m
memory: 256Mi
---
# alertmanager-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: alertmanager
namespace: monitor
labels:
app: alertmanager
spec:
selector:
app: alertmanager
type: NodePort
ports:
- name: web
port: 9093
targetPort: http
补充:报警图片
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing1.jpg
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing2.jpg
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing3.png
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing4.jpg
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing5.jpg
https://egonimages.oss-cn-beijing.aliyuncs.com/gaojing6.png
定制内容(略)
自行研究吧:https://github.com/timonwong/prometheus-webhook-dingtalk/blob/main/template/default.tmpl
评论 (0)