hook2xmpp/prometheus/main.go

59 lines
1.6 KiB
Go

package prometheus
import (
"fmt"
"strings"
"net/http"
libHTTP "dev.sum7.eu/genofire/golang-lib/http"
"github.com/bdlm/log"
xmpp "github.com/mattn/go-xmpp"
"github.com/prometheus/alertmanager/notify"
"dev.sum7.eu/genofire/hook2xmpp/runtime"
)
const hookType = "prometheus"
func init() {
runtime.HookRegister[hookType] = func(client *xmpp.Client, hooks []runtime.Hook) func(w http.ResponseWriter, r *http.Request) {
log.WithField("type", hookType).Info("loaded")
return func(w http.ResponseWriter, r *http.Request) {
logger := log.WithField("type", hookType)
var request notify.WebhookMessage
if err := libHTTP.Read(r, &request); err != nil {
logger.Errorf("no readable payload: %s", err)
http.Error(w, fmt.Sprintf("no readable payload"), http.StatusInternalServerError)
return
}
firingAlerts := len(request.Alerts.Firing())
if firingAlerts > 0 {
content := fmt.Sprintf("[%s:%d] %s", request.Status, firingAlerts, strings.Join(request.CommonAnnotations.Values()," "))
} else {
content := fmt.Sprintf("[%s] %s", request.Status, strings.Join(request.CommonAnnotations.Values()," "))
}
logger = logger.WithField("body", content)
ok := false
for _, hook := range hooks {
if request.ExternalURL != hook.Secret {
continue
}
logger.Infof("run hook")
runtime.Notify(client, hook, content)
ok = true
}
if !ok {
logger.Warnf("no hook found")
http.Error(w, fmt.Sprintf("no configuration for %s for url: %s", hookType, request.ExternalURL), http.StatusNotFound)
}
}
}
}