You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.0 KiB
Go

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))
}))
}