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, ¬ification)
    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, "\n")
    msg := Msg{
        MsgType: "text",
        Text: Text{
            Content: strings.Join(contents, "\n"),
        },
    }
    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\n", body)
    fmt.Fprint(w, "hello world\n")
}

func main() {
    http.HandleFunc("/send", Dingtalk)
    http.ListenAndServe(":8090", nil)
}

你可能感兴趣的:(prometheus 自定义 webhook 发送告警到钉钉)