zoukankan      html  css  js  c++  java
  • 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)
    }
    
    
  • 相关阅读:
    在DOS的常用命令
    HTML中USEMAP的用法
    asp.net2.0角色管理,详细步骤
    利用ASP.NET动态生成HTML文件
    PetShop 4.0 详解之五(PetShop之业务逻辑层设计)
    使用成员资格和用户登录创建网站 (Visual Studio)
    Windows 找不到文件'(null)'.请确定文件名是否正确后,再试一下.要搜索文件,请单击[开始]按钮,然后单击"搜索"
    在ashx文件中读写session
    asp.net图片滚动+JAVASCRIPT(向右)
    动态编辑程序配置文件
  • 原文地址:https://www.cnblogs.com/WisWang/p/12071462.html
Copyright © 2011-2022 走看看