package main import ( "bytes" "encoding/json" "flag" "fmt" "os" "io/ioutil" "net/http" ) type alertManOut struct { Alerts []struct { Annotations struct { Description string `json:"description"` Summary string `json:"summary"` } `json:"annotations"` EndsAt string `json:"endsAt"` GeneratorURL string `json:"generatorURL"` Labels map[string]string `json:"labels"` StartsAt string `json:"startsAt"` Status string `json:"status"` } `json:"alerts"` CommonAnnotations struct { Summary string `json:"summary"` } `json:"commonAnnotations"` CommonLabels struct { Alertname string `json:"alertname"` } `json:"commonLabels"` ExternalURL string `json:"externalURL"` GroupKey string `json:"groupKey"` GroupLabels struct { Alertname string `json:"alertname"` } `json:"groupLabels"` Receiver string `json:"receiver"` Status string `json:"status"` Version string `json:"version"` } type discordOut struct { Content string `json:"content"` Name string `json:"username"` } func main() { webhookUrl := os.Getenv("DISCORD_WEBHOOK") if webhookUrl == "" { fmt.Fprintf(os.Stderr, "error: environment variable DISCORD_WEBHOOK not found\n") os.Exit(1) } whURL := flag.String("webhook.url", webhookUrl, "") flag.Parse() fmt.Fprintf(os.Stdout, "info: Listening on 0.0.0.0:9094\n") http.ListenAndServe(":9094", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) if err != nil { panic(err) } amo := alertManOut{} err = json.Unmarshal(b, &amo) if err != nil { panic(err) } // Format alerts Content := "\n" for _, alert := range amo.Alerts { Content += fmt.Sprintf("*%s* **%s** %s\n", alert.Labels["alertname"], alert.Labels["severity"], alert.Annotations.Summary) } // Send to Discord DO := discordOut{ Name: "Prometheus 🦋️", Content: Content, } DOD, _ := json.Marshal(DO) http.Post(*whURL, "application/json", bytes.NewReader(DOD)) })) }