一.自定义邮件告警

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

1.制作镜像

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

一.自定义邮件告警

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

# vim alertmanager.yaml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'x34989xxx@qq.com'
smtp_auth_username: 'x34989xx@qq.com'
smtp_auth_password: 'lxxxxxxxxtubdfd'
smtp_require_tls: false
smtp_hello: 'qq.com' templates:
- '/etc/alertmanager/template/*.tmpl' route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1m
receiver: 'email' receivers:
- name: 'email'
email_configs:
- to: '20xxxxxx@qq.com'
html: '{{ template "email.to.html" . }}'
headers: { Subject: "告警" }
send_resolved: true inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']

书写自定义配置文件

{{ define "email.to.html" }}
{{ if gt (len .Alerts.Firing) 0 }}
{{ range .Alerts }}
======== 异常告警========== <br>
告警程序: Alertmanager <br>
告警主机: {{ .Annotations.summary }} <br>
告警类型: {{ .Annotations.alarmPolicyType }} <br>
告警级别: {{ .Labels.severity }} <br>
告警状态: {{ .Status }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ (.StartsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
==========end============= <br>
{{ end }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
{{ range .Alerts }}
======== <span style=color:#00FF00;font-size:11px;font-weight:bold;> 告警恢复 </span>==========<br>
告警程序: Alertmanager <br>
告警主机: {{ .Annotations.summary }} <br>
告警类型: {{ .Annotations.alarmPolicyType }} <br>
告警级别: {{ .Labels.severity }} <br>
告警状态: {{ .Status }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ (.StartsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
恢复时间: {{ (.EndsAt.Add 28800e9) "2022-8-11 17:30:01" }} <br>
===========end============ <br>
{{ end }}
{{ end }}
{{ end }}

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

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

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

1.制作镜像

1)准备webhook启动代码

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

~]# vim app.py
# -*- coding: utf-8 -*-
import os
import json
import requests
import arrow from flask import Flask
from flask import request app = Flask(__name__) def bytes2json(data_bytes):
data = data_bytes.decode('utf8').replace("'", '"')
return json.loads(data) def makealertdata(data):
for output in data['alerts'][:]:
try:
pod_name = output['labels']['pod']
except KeyError:
try:
pod_name = output['labels']['pod_name']
except KeyError:
pod_name = 'null' try:
namespace = output['labels']['namespace']
except KeyError:
namespace = 'null' try:
message = output['annotations']['message']
except KeyError:
try:
message = output['annotations']['description']
except KeyError:
message = 'null'
if output['status'] == 'firing':
status_zh = '<font color=\"warning\">告警</font>'
title = '【%s】告警 %s 有新的报警' % (status_zh, output['annotations']['alarmPolicyType'])
send_data = {
"msgtype": "markdown",
"markdown": {
"content": "## %s \n\n" %title +
">**告警级别**: %s \n\n" % output['labels']['severity'] +
">**告警类型**: %s \n\n" % output['annotations']['metricDisplayName'] +
">**告警主机**: %s \n\n" % output['annotations']['summary'] +
">**告警负责人**: %s \n\n" % "<@v_keo>" +
">**告警详情**: %s \n\n" % message +
">**告警状态**: %s \n\n" % output['status'] +
">**触发时间**: %s \n\n" % arrow.get(output['startsAt']).to('Asia/Shanghai').format(
'YYYY-MM-DD HH:mm:ss ZZ')
}
}
elif output['status'] == 'resolved':
status_zh = '<font color=\"info\">恢复</font>'
title = '【%s】环境 %s 有报警恢复' % (status_zh, output['annotations']['alarmPolicyType'])
send_data = {
"msgtype": "markdown",
"markdown": {
"content": "## %s \n\n" %title +
">**告警级别**: %s \n\n" % output['labels']['severity'] +
">**告警类型**: %s \n\n" % output['annotations']['metricDisplayName'] +
">**告警主机**: %s \n\n" % output['annotations']['summary'] +
">**告警负责人**: %s \n\n" % "<@v_keo>" +
">**告警详情**: %s \n\n" % message +
">**告警状态**: %s \n\n" % output['status'] +
">**触发时间**: %s \n\n" % arrow.get(output['startsAt']).to('Asia/Shanghai').format(
'YYYY-MM-DD HH:mm:ss ZZ') +
">**触发结束时间**: %s \n" % arrow.get(output['endsAt']).to('Asia/Shanghai').format(
'YYYY-MM-DD HH:mm:ss ZZ')
}
}
return send_data
def send_alert(data):
token = os.getenv('ROBOT_TOKEN')
if not token:
print('you must set ROBOT_TOKEN env')
return
url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s' % token send_data = makealertdata(data)
req = requests.post(url, json=send_data)
result = req.json()
if result['errcode'] != 0:
print('notify dingtalk error: %s' % result['errcode']) @app.route('/', methods=['POST', 'GET'])
def send():
if request.method == 'POST':
post_data = request.get_data()
send_alert(bytes2json(post_data))
return 'success'
else:
return 'weclome to use prometheus alertmanager dingtalk webhook server!' if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

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

~]# vim requirements.txt
certifi==2018.10.15
chardet==3.0.4
Click==7.0
Flask==1.0.2
idna==2.7
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
requests==2.20.1
urllib3==1.24.1
Werkzeug==0.14.1
arrow==0.13.1

3)书写dockerfile文件

~]# vim Dockerfile
FROM python:3.6.4
# set working directory
WORKDIR /src
# add app
ADD . /src
# install requirements
RUN pip install selectivesearch -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
RUN pip install -r requirements.txt
EXPOSE 500
# run server
CMD python app.py

4)制作镜像

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

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

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=xxxxx4-69ac-458c-af07-a69xxebsxxd webhook:v1
# /etc/localtime 时间要一致
# -e ROBOT_TOKEN= 指定机器人 key

2)告警配置指定webhook

]# cat alertmanager.yaml-wx 

global:
resolve_timeout: 5m route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1m
receiver: 'web.hook' receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://起容器的ip:5000'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
  1. 注:如果转发不了记得把端口映射出来

prometheus Alertmanager webhook的更多相关文章

  1. Docker+Prometheus+Alertmanager+Webhook钉钉告警

    Docker+Prometheus+Alertmanager+Webhook钉钉告警 1.环境部署 1.1 二进制部署 1.2 docker部署 1.2.1 webhook 1.2.2 alertma ...

  2. prometheus学习系列十: Prometheus AlertManager配置文件说明

    alertmanager配置文件说明 alertmanager是通过命令行标记和配置文件配置的,命令行标记配置不可变的系统参数,配置文件定义抑制规则.通知路由和通知接收器.可以通过官方提供的routi ...

  3. Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

  4. 使用 Prometheus Alertmanager 模块发送 Doris 异常信息至钉钉报警群

    基础环境 1.Prometheus 版本:2.22.2 下载地址: https://github.com/prometheus/prometheus/releases/download/v2.22.2 ...

  5. istio prometheus预警Prometheus AlertManager

    1.安装alertmanager kubectl create -f 以下文件 alertmanager-templates.yaml.configmap.yaml.deployment.yaml.s ...

  6. [k8s]prometheus+alertmanager二进制安装实现简单邮件告警

    本次任务是用alertmanaer发一个报警邮件 本次环境采用二进制普罗组件 本次准备监控一个节点的内存,当使用率大于2%时候(测试),发邮件报警. k8s集群使用普罗官方文档 环境准备 下载二进制h ...

  7. prometheus学习系列九: Prometheus AlertManager使用

    在Prometheus的报警系统中,是分为2个部分的, 规则是配置是在prometheus中的, prometheus组件完成报警推送给alertmanager的, alertmanager然后管理这 ...

  8. Prometheus(五):Prometheus+Alertmanager 配置企业微信报警

    此处默认已安装Prometheus服务,服务地址:192.168.56.200  一.设置企业微信 1.1.企业微信注册(已有企业微信账号请跳过) 企业微信注册地址:https://work.weix ...

  9. Prometheus(四):Prometheus+Alertmanager 配置邮件报警

    此处默认已安装Prometheus服务,服务地址:192.168.56.200  一.安装Alertmanager 此处采用源码编译的方式安装.首先下载alertmanager的软件包,下载地址:ht ...

  10. Prometheus Alertmanager Grafana 监控警报

    Prometheus Alertmanager Grafana 监控警报 #node-exporter, Linux系统信息采集组件 #prometheus , 抓取.储存监控数据,供查询指标 #al ...

随机推荐

  1. Python 01-Unittest的使用 unittest简单应用

    class TestCase01(unittest.TestCase):     def setUp(self):         print("用例开始")     def te ...

  2. [转载]pytest报AttributeError: module ‘pytest‘ has no attribute ‘main‘

    转自:https://blog.csdn.net/yinying12/article/details/110522989 pytest报AttributeError: module 'pytest' ...

  3. [转载]危险操作一追到底--Linux的历史记录

    转自:https://zhuanlan.zhihu.com/p/524921170 危险操作一追到底--Linux的历史记录 KellanFan 为了更好的自己     概述 在Linux下使用his ...

  4. 3. 贪心思想(todo)

    目录 1. 分配饼干 2. 不重叠区间个数 3. 投飞镖刺破气球 5. 买卖股票最大的收益 6. 买卖股票的最大收益 II 9. 修改一个数成为非递减数组 10. 子数组的最大和 11. 分隔字符串使 ...

  5. redis 单节点迁移到集群 redis-shake

    1.迁移 1.1.同步到单节点 redis-shake下载  release-v2.1.2-20220329.tar.gz #redis cluster 某一个节点   服务器安装redis-shak ...

  6. css - content-visibility

    css - content-visibility content-visibility:实现可见网页只加载可见区域内容 介绍 content-visibility是一个css属性,它控制一个元素是否呈 ...

  7. 关于DIFF插件的使用

    diff插件主要是对比 两个字符串/数组/json对象 等等 差异得问题,多数情况用到测试,甄别错误场景 我主要使用得场景就是在系统日志中对比两组json得差异 1. 安装插件 npm install ...

  8. 面试题 --MySQL事务

    3.1 说一说你对数据库事务的了解 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的 ...

  9. 人眼对led灯的闪烁识别度:写单片机的时候,小于15ms,我们人眼视为常亮

    人眼对于每11毫秒闪烁一次约83赫兹基本感觉不到,每15毫秒闪烁一次约66赫兹轻微频闪. 所以写单片机的时候,小于15ms,我们人眼视为常亮

  10. Java语言中的复合运算符会自动进行类型转换

    计算1/1-1/2+1/3+--+1/99-1/100 public class LoopControlExercise08{ public static void main(String[] arg ...