altertmanager邮件报警+对接钉钉

altertmanager邮件报警+对接钉钉

axing
2023-09-06 / 0 评论 / 26 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年09月29日,已超过115天没有更新,若内容或图片失效,请留言反馈。

一、配置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&timestamp={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

评论 (0)

取消