AlertManager 钉钉报警_YP小站的博客-程序员秘密

技术标签: k8s  Kubernetes  docker  

AlertManager Dingtalk 简介

用于接收AlertManager服务通知并通过钉钉机器人报警

prometheus-operator 安装请参考往期文章

  • https://www.jianshu.com/p/0be31195aa8b

AlertManager 钉钉报警服务示例

image

项目地址

https://github.com/yangpeng14/alertmanager-dingtalk-hook

主要代码

import os
import json
import requests
import arrow

from flask import Flask
from flask import request

app = Flask(__name__)


@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!'


def bytes2json(data_bytes):
    data = data_bytes.decode('utf8').replace("'", '"')
    return json.loads(data)


def send_alert(data):
    token = os.getenv('ROBOT_TOKEN')
    if not token:
        print('you must set ROBOT_TOKEN env')
        return
    url = 'https://oapi.dingtalk.com/robot/send?access_token=%s' % token
    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'

        send_data = {
    
            "msgtype": "markdown",
            "markdown": {
    
                "title": "prometheus_alert",
                "text": "## 告警程序: prometheus_alert \n" +
                        "**告警级别**: %s \n\n" % output['labels']['severity'] +
                        "**告警类型**: %s \n\n" % output['labels']['alertname'] +
                        "**故障pod**: %s \n\n" % pod_name +
                        "**故障namespace**: %s \n\n" % namespace +
                        "**告警详情**: %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')
            }
        }
        req = requests.post(url, json=send_data)
        result = req.json()
        if result['errcode'] != 0:
            print('notify dingtalk error: %s' % result['errcode'])


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

使用 Docker 部署

$ docker run -p 5000:5000 --name -e ROBOT_TOKEN=<钉钉机器人TOKEN> dingtalk-hook -d yangpeng2468/alertmanager-dingtalk-hook:v1

使用 Kubernetes 部署

  • 第一步 创建kube-ops namespace,建议将钉钉机器人TOKEN创建成Secret资源对象
$ kubectl create namespace kube-ops

$ kubectl create secret generic dingtalk-secret --from-literal=token=<钉钉群聊的机器人TOKEN> -n kube-ops

secret "dingtalk-secret" created
  • 第二步 定义 DeploymentService 资源对象:dingtalk-hook.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dingtalk-hook
  namespace: kube-ops
spec:
  template:
    metadata:
      labels:
        app: dingtalk-hook
    spec:
      containers:
      - name: dingtalk-hook
        image: yangpeng2468/alertmanager-dingtalk-hook:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000
          name: http
        env:
        - name: ROBOT_TOKEN
          valueFrom:
            secretKeyRef:
              name: dingtalk-secret
              key: token
        resources:
          requests:
            cpu: 50m
            memory: 100Mi
          limits:
            cpu: 50m
            memory: 100Mi

---
apiVersion: v1
kind: Service
metadata:
  name: dingtalk-hook
  namespace: kube-ops
spec:
  selector:
    app: dingtalk-hook
  ports:
  - name: hook
    port: 5000
    targetPort: http
  • 第三步 创建上面的资源对象即可
$ kubectl create -f dingtalk-hook.yaml

deployment.extensions "dingtalk-hook" created
service "dingtalk-hook" created

$ kubectl get pods -n kube-ops

NAME                            READY     STATUS      RESTARTS   AGE
dingtalk-hook-c4fcd8cd6-6r2b6   1/1       Running     0          45m
......
  • 最后 AlertManagerwebhook 地址直接通过 DNS 形式访问即可
receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://dingtalk-hook.kube-ops.svc.cluster.local:5000'
    send_resolved: true

参考文档

钉钉自定义机器人文档 https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

AlertManager的使用 https://www.qikqiak.com/k8s-book/docs/57.AlertManager%E7%9A%84%E4%BD%BF%E7%94%A8.html

关注我

欢迎大家关注交流,定期分享自动化运维、DevOps、Kubernetes、Service Mesh和Cloud Native
image

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24794401/article/details/103245804

智能推荐

新一代视频编解码标准正式公布!_CSDN资讯的博客-程序员秘密

作者 |马超责编 | 王晓曼封图 |CSDN付费下载自东方IC出品 | CSDN(ID:CSDNnews)近日,新一代国际视频编解码标准(H.266/VVC)正式出炉,其中VVC是J...

Excel生成Guid(UUID)常用格式_excel guid_CircleSeven的博客-程序员秘密

一、名词解释维基百科:通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息数目的一个128位标识符,还有相关的术语:全局唯一标识符(GUID)。根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计。UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为 8-4-4-4-12 的32个字符。示例:550e8400-e29b-41d4-a7

解决vmware与主机无法连通的问题_weixin_30564785的博客-程序员秘密

我们选择NAT方式,来实现Ubuntu的静态IP地址配置。打开VMware,在顶部依次选择:编辑 &gt; 虚拟网路编辑器,打开虚拟网路编辑器:去掉VMnet0和VMnet1,只保留VMnet8。然后,去掉如下图中的“使用本地DHCP服务奖IP地址分配给虚拟机”:此外,这里的子网IP为:192.168.8.0,子网掩码为:255.255.255.0,因此,在Ubuntu中,...

SDN学习之Opendaylight浅析(四)_feature是什么sdn_亨格瑞的博客-程序员秘密

前面主要对ODL的基础进行梳理和总结,其实基础只是学习的很小的一部分,更多的时候还要阅读源码,在官网上面查找资料,当然基础打牢是必须的,比如说在不同版本的odl对事务提交的返回的future也略有不同,但是提交所做的处理在原理上面是相通,只是语法上的区别。总之,ODL学习之路漫漫,要有耐心和恒心,总会遇到各种各样的报错,积极思考耐心解决问题才是王道,这一讲主要针对ODL的feature进行...

Opensource Licenses_sztomarch的博客-程序员秘密

Opensource Licenses 协议列表https://www.gnu.org/licenses/license-list.htmlhttps://opensource.org/licenses/alphabetical协议选择参考[表格]https://choosealicense.com/appendix/常见的开源协议介绍,如下图http://...

一大波免费简历模板来袭……_万万冇想到的博客-程序员秘密

                                                                     (本内容转载自公众号“科技与Python”)简历是书面推销员“求职”的本质其实就是人的流通,和一般的商业行为无异:一方求售、一方求货。再说得明白些,企业是买主,挑精捡肥寻觅好货色;人才是商品,充实了内涵、做好包装,待价而沽;简历则无异于推销员,将人才引见...

随便推点

ARCGIS破解教程(arcgis10.2(含ARCGIS下载地址)_地图下载器的博客-程序员秘密

ARCGIS破解教程(arcgis10.2(含ARCGIS下载地址)发布时间:2018-01-17 版权:  准备工具:arcgis软件(arcgis下载地址:http://pan.baidu.com/s/1i5uMzU9)   下载完成后解压,会看到三个文件夹,如下图:  第一步:安装licensemanager  打开licensemanager文件,点击s...

ReactNative——UI6.ListView实现带标题的多列列表_sectionlist 多列_CodingForAndroid的博客-程序员秘密

ListView 实现多列列表 import React, {Component} from 'react';import { StyleSheet, ListView, SectionList, View, Text, TouchableOpacity, Image, Alert,} from 'react-native';var {width, height}

第13周-项目1-基类中成员的访问限定符和派生类的继承方式_ning847273990的博客-程序员秘密

In member function 'void StudentB::showB()':|error: 'int StudentA::num' is private|error: within this context|error: 'std::string StudentA::name' is private|error: within this context|error:

python画虚线代码_python中虚线标记区域的分割掩模_weixin_39802020的博客-程序员秘密

我想通过编码为一些图像制作分割掩模。有一个工具可以生成近似边界点坐标的xml文件。这些坐标可以通过获取标记值来获得。图像大小为800x600像素。在例如,从该工具中提取以下点。如何填充轮廓内用虚线标记的区域,例如白色?谢谢。在分数=[(737255),(736,265),(735,270),(739,273),(746,264),(755268),(765272),(767276),(769278...

Android-使用SurfaceView多线程绘制动画_android surfaceview 高效绘制动画_andyhuabing的博客-程序员秘密

使用SurfaceView中的Surface对象进行绘图,其本质就是利用SurfaceHolder的lockCanvas获取到Canvas对象进行绘制的,对于绘制动画来说,必须使用双缓冲,或者采用双线程,一个线程负责专门的预处理,比如图片数据读取,另外一个线程负责进行专绘制图形。因为SurfaceView每次绘图都会锁定Canvas,也就是说同一片区域这次没画完下次就不能画,因此要提高动画播放的效

推荐文章

热门文章

相关标签