• prometheus自定义邮件告警和自定义微信机器人告警


    目录

    ————————————————————————————

    一.自定义邮件告警

    二.使用docker部署微信机器人告警

    1.制作镜像

    2.启动容器和指定webhook容器


    ————————————————————————————

    一.自定义邮件告警

    在alertmanager服务的配置文件中指定自定义告警文件

    1. ~]# vim alertmanager.yaml
    2. global:
    3. resolve_timeout: 5m
    4. smtp_smarthost: 'smtp.qq.com:465'
    5. smtp_from: 'x34989xxx@qq.com'
    6. smtp_auth_username: 'x34989xx@qq.com'
    7. smtp_auth_password: 'lxxxxxxxxtubdfd'
    8. smtp_require_tls: false
    9. smtp_hello: 'qq.com'
    10. templates:
    11. - '/etc/alertmanager/template/*.tmpl'
    12. route:
    13. group_by: ['alertname']
    14. group_wait: 10s
    15. group_interval: 10s
    16. repeat_interval: 1m
    17. receiver: 'email'
    18. receivers:
    19. - name: 'email'
    20. email_configs:
    21. - to: '20xxxxxx@qq.com'
    22. html: '{{ template "email.to.html" . }}'
    23. headers: { Subject: "告警" }
    24. send_resolved: true
    25. inhibit_rules:
    26. - source_match:
    27. severity: 'critical'
    28. target_match:
    29. severity: 'warning'
    30. equal: ['alertname', 'dev', 'instance']

    书写自定义配置文件

    1. {{ define "email.to.html" }}
    2. {{ if gt (len .Alerts.Firing) 0 }}
    3. {{ range .Alerts }}
    4. ======== 异常告警========== <br>
    5. 告警程序: Alertmanager <br>
    6. 告警主机: {{ .Annotations.summary }} <br>
    7. 告警类型: {{ .Annotations.alarmPolicyType }} <br>
    8. 告警级别: {{ .Labels.severity }} <br>
    9. 告警状态: {{ .Status }} <br>
    10. 告警详情: {{ .Annotations.description }} <br>
    11. 触发时间: {{ (.StartsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
    12. ==========end============= <br>
    13. {{ end }}
    14. {{ end }}
    15. {{ if gt (len .Alerts.Resolved) 0 }}
    16. {{ range .Alerts }}
    17. ======== <span style=color:#00FF00;font-size:11px;font-weight:bold;> 告警恢复 </span>==========<br>
    18. 告警程序: Alertmanager <br>
    19. 告警主机: {{ .Annotations.summary }} <br>
    20. 告警类型: {{ .Annotations.alarmPolicyType }} <br>
    21. 告警级别: {{ .Labels.severity }} <br>
    22. 告警状态: {{ .Status }} <br>
    23. 告警详情: {{ .Annotations.description }} <br>
    24. 触发时间: {{ (.StartsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
    25. 恢复时间: {{ (.EndsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
    26. ===========end============ <br>
    27. {{ end }}
    28. {{ end }}
    29. {{ end }}

     注:里面的标签需要根据内置的标签和自定义的标签来配置

    二.使用docker部署微信机器人告警

    注:这里的自定义告警用webhook来转发

    1.制作镜像

    1)准备webhook启动代码

    注:里面的标签需要和自己的配置的相同

    1. ~]# vim app.py
    2. # -*- coding: utf-8 -*-
    3. import os
    4. import json
    5. import requests
    6. import arrow
    7. from flask import Flask
    8. from flask import request
    9. app = Flask(__name__)
    10. def bytes2json(data_bytes):
    11. data = data_bytes.decode('utf8').replace("'", '"')
    12. return json.loads(data)
    13. def makealertdata(data):
    14. for output in data['alerts'][:]:
    15. try:
    16. pod_name = output['labels']['pod']
    17. except KeyError:
    18. try:
    19. pod_name = output['labels']['pod_name']
    20. except KeyError:
    21. pod_name = 'null'
    22. try:
    23. namespace = output['labels']['namespace']
    24. except KeyError:
    25. namespace = 'null'
    26. try:
    27. message = output['annotations']['message']
    28. except KeyError:
    29. try:
    30. message = output['annotations']['description']
    31. except KeyError:
    32. message = 'null'
    33. if output['status'] == 'firing':
    34. status_zh = '告警'
    35. title = '【%s】告警 %s 有新的报警' % (status_zh, output['annotations']['alarmPolicyType'])
    36. send_data = {
    37. "msgtype": "markdown",
    38. "markdown": {
    39. "content": "## %s \n\n" %title +
    40. ">**告警级别**: %s \n\n" % output['labels']['severity'] +
    41. ">**告警类型**: %s \n\n" % output['annotations']['metricDisplayName'] +
    42. ">**告警主机**: %s \n\n" % output['annotations']['summary'] +
    43. ">**告警负责人**: %s \n\n" % "<@v_keo>" +
    44. ">**告警详情**: %s \n\n" % message +
    45. ">**告警状态**: %s \n\n" % output['status'] +
    46. ">**触发时间**: %s \n\n" % arrow.get(output['startsAt']).to('Asia/Shanghai').format(
    47. 'YYYY-MM-DD HH:mm:ss ZZ')
    48. }
    49. }
    50. elif output['status'] == 'resolved':
    51. status_zh = '恢复'
    52. title = '【%s】环境 %s 有报警恢复' % (status_zh, output['annotations']['alarmPolicyType'])
    53. send_data = {
    54. "msgtype": "markdown",
    55. "markdown": {
    56. "content": "## %s \n\n" %title +
    57. ">**告警级别**: %s \n\n" % output['labels']['severity'] +
    58. ">**告警类型**: %s \n\n" % output['annotations']['metricDisplayName'] +
    59. ">**告警主机**: %s \n\n" % output['annotations']['summary'] +
    60. ">**告警负责人**: %s \n\n" % "<@v_keo>" +
    61. ">**告警详情**: %s \n\n" % message +
    62. ">**告警状态**: %s \n\n" % output['status'] +
    63. ">**触发时间**: %s \n\n" % arrow.get(output['startsAt']).to('Asia/Shanghai').format(
    64. 'YYYY-MM-DD HH:mm:ss ZZ') +
    65. ">**触发结束时间**: %s \n" % arrow.get(output['endsAt']).to('Asia/Shanghai').format(
    66. 'YYYY-MM-DD HH:mm:ss ZZ')
    67. }
    68. }
    69. return send_data
    70. def send_alert(data):
    71. token = os.getenv('ROBOT_TOKEN')
    72. if not token:
    73. print('you must set ROBOT_TOKEN env')
    74. return
    75. url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s' % token
    76. send_data = makealertdata(data)
    77. req = requests.post(url, json=send_data)
    78. result = req.json()
    79. if result['errcode'] != 0:
    80. print('notify dingtalk error: %s' % result['errcode'])
    81. @app.route('/', methods=['POST', 'GET'])
    82. def send():
    83. if request.method == 'POST':
    84. post_data = request.get_data()
    85. send_alert(bytes2json(post_data))
    86. return 'success'
    87. else:
    88. return 'weclome to use prometheus alertmanager dingtalk webhook server!'
    89. if __name__ == '__main__':
    90. app.run(host='0.0.0.0', port=5000)

    2)准备python需要的模块文件

    1. ~]# vim requirements.txt
    2. certifi==2018.10.15
    3. chardet==3.0.4
    4. Click==7.0
    5. Flask==1.0.2
    6. idna==2.7
    7. itsdangerous==1.1.0
    8. Jinja2==2.10
    9. MarkupSafe==1.1.0
    10. requests==2.20.1
    11. urllib3==1.24.1
    12. Werkzeug==0.14.1
    13. arrow==0.13.1

    3)书写dockerfile文件

    1. ~]# vim Dockerfile
    2. FROM python:3.6.4
    3. # set working directory
    4. WORKDIR /src
    5. # add app
    6. ADD . /src
    7. # install requirements
    8. RUN pip install selectivesearch -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    9. RUN pip install -r requirements.txt
    10. EXPOSE 500
    11. # run server
    12. CMD python app.py

    4)制作镜像

    1. ~]# docker build -f /data/prometheus/Dockerfile2/webkook/Dockerfile -t webhook:v1 . --network=host
    2. # -f : 指定dockerfile文件位置

    2.启动容器和指定webhook容器

    1)启动容器

    1. ~]# docker run --name=webhook --net=host -v /etc/localtime:/etc/localtime -v /data/prometheus/Dockerfile2/webkook/app.py:/src/app.py -d -e ROBOT_TOKEN=eb25f0c4-69ac-458c-af07-a6999beb05cd webhook:v1
    2. # /etc/localtime 时间要一致
    3. # -e ROBOT_TOKEN= 指定机器人 key

    2)告警配置指定webhook

    1. ]# cat alertmanager.yaml-wx
    2. global:
    3. resolve_timeout: 5m
    4. route:
    5. group_by: ['alertname']
    6. group_wait: 10s
    7. group_interval: 10s
    8. repeat_interval: 1m
    9. receiver: 'web.hook'
    10. receivers:
    11. - name: 'web.hook'
    12. webhook_configs:
    13. - url: 'http://起容器的ip:5000'
    14. send_resolved: true
    15. inhibit_rules:
    16. - source_match:
    17. severity: 'critical'
    18. target_match:
    19. severity: 'warning'
    20. equal: ['alertname', 'dev', 'instance']

    注:如果转发不了记得把端口映射出来

  • 相关阅读:
    身份证OCR识别:黑科技助力证件信息快速提取
    【无标题】
    Windows 根据github上的环境需求,安装一个虚拟环境,安装cuda和torch
    [大家的项目] cargo-offline 命令
    pytorch深度学习实战15
    浅谈JMM和并发三大特性(volatile、MESI、内存屏障)
    Springboot毕设项目儿童医院问诊导诊系统aqy75(java+VUE+Mybatis+Maven+Mysql)
    6-9 共享后缀的链表 分数 15
    Nuxt服务端请求及获取Cookie
    Java学习之继承一
  • 原文地址:https://blog.csdn.net/kali_yao/article/details/126412479