• prometheus 自定义 webhook 发送告警到钉钉


    prometheus 自定义 webhook 发送告警到钉钉

    package main
    
    import (
    	"bytes"
    	"encoding/json"
    	"fmt"
    	"log"
    	"strings"
    	"time"
    	"io/ioutil"
    	"net/http"
    )
    
    const (
    	DingDingUrl = "https://oapi.dingtalk.com/robot/send?access_token=access_token"
    )
    
    type Text struct {
    	Content string `json:"content"`
    }
    
    type Msg struct {
    	MsgType string `json:"msgtype"`
    	Text    Text   `json:"text"`
    }
    
    type Alert struct {
    	Status      string            `json:"status"`
    	Labels      map[string]string `json:"labels"`
    	Annotations map[string]string `json:"annotations"`
    	StartsAt    time.Time         `json:"startsAt"`
    	EndsAt      time.Time         `json:"endsAt"`
    }
    
    type Notification struct {
    	Version           string            `json:"version"`
    	GroupKey          string            `json:"groupKey"`
    	Status            string            `json:"status"`
    	Receiver          string            `json:"receiver"`
    	GroupLabels       map[string]string `json:"groupLabels"`
    	CommonLabels      map[string]string `json:"commonLabels"`
    	CommonAnnotations map[string]string `json:"commonAnnotations"`
    	ExternalURL       string            `json:"externalURL"`
    	Alerts            []Alert           `json:"alerts"`
    }
    
    func Dingtalk(w http.ResponseWriter, r *http.Request) {
    	b, _ := ioutil.ReadAll(r.Body)
    	defer r.Body.Close()
    	var notification Notification
    	log.Println(string(b))
    	json.Unmarshal(b, &notification)
    	log.Println(notification)
    	contents := []string{}
    	headers := fmt.Sprintf("group: %s  status:%s", notification.CommonLabels["group"], notification.Status)
    	log.Println(headers)
    	contents = append(contents, headers)
    	for _, each := range notification.Alerts {
    		body := fmt.Sprintf("status:%s %s", each.Status, each.Annotations["summary"])
    		contents = append(contents, body)
    	}
    	strings.Join(contents, "
    ")
    	msg := Msg{
    		MsgType: "text",
    		Text: Text{
    			Content: strings.Join(contents, "
    "),
    		},
    	}
    	msgJson, _ := json.Marshal(msg)
    	req, _ := http.NewRequest("POST", DingDingUrl, bytes.NewBuffer(msgJson))
    	req.Header.Add("Content-Type", "application/json")
    	client := http.Client{}
    	res,_ := client.Do(req)
    	defer res.Body.Close()
    	body, _ := ioutil.ReadAll(res.Body)
    	log.Printf("%s
    ", body)
    	fmt.Fprint(w, "hello world
    ")
    }
    
    func main() {
    	http.HandleFunc("/send", Dingtalk)
    	http.ListenAndServe(":8090", nil)
    }
    
    
  • 相关阅读:
    中国移动全球通寻宝第四期攻略
    推荐一个奥运门票交流的网站!
    国务院发出通知明确2008年部分节假日放假安排
    [转]开发人员如何谈加薪,抛砖引玉,欢迎大家各抒己见。
    中级.NET开发人员应该知道些什么?
    linux系统管理 系统安全及应用
    Linux10 进程 定时任务 僵尸进程
    shell脚本练习
    虚拟机和liunx系统的装机
    Linux三剑客awk的应用对比案例详解
  • 原文地址:https://www.cnblogs.com/WisWang/p/12071462.html
Copyright © 2020-2023  润新知