add prometheus support
This commit is contained in:
parent
85ed49c032
commit
24c5656f84
|
@ -10,6 +10,7 @@ startup_notify_muc = []
|
||||||
|
|
||||||
# suported hooks are, which could be declared multiple times with different `secrets` (see [[hooks.grafana]]):
|
# suported hooks are, which could be declared multiple times with different `secrets` (see [[hooks.grafana]]):
|
||||||
[[hooks.grafana]]
|
[[hooks.grafana]]
|
||||||
|
[[hooks.prometheus]]
|
||||||
[[hooks.git]]
|
[[hooks.git]]
|
||||||
[[hooks.gitlab]]
|
[[hooks.gitlab]]
|
||||||
[[hooks.circleci]]
|
[[hooks.circleci]]
|
||||||
|
@ -19,6 +20,9 @@ secret = ""
|
||||||
notify_muc = []
|
notify_muc = []
|
||||||
notify_user = []
|
notify_user = []
|
||||||
|
|
||||||
|
# for handling webhooks from prometheus alertmanager
|
||||||
|
|
||||||
|
[[hooks.prometheus]]
|
||||||
|
|
||||||
# for handling webhooks from grafana
|
# for handling webhooks from grafana
|
||||||
# at http://localhost:8080/grafana
|
# at http://localhost:8080/grafana
|
||||||
|
|
1
main.go
1
main.go
|
@ -15,6 +15,7 @@ import (
|
||||||
_ "dev.sum7.eu/genofire/hook2xmpp/git"
|
_ "dev.sum7.eu/genofire/hook2xmpp/git"
|
||||||
_ "dev.sum7.eu/genofire/hook2xmpp/gitlab"
|
_ "dev.sum7.eu/genofire/hook2xmpp/gitlab"
|
||||||
_ "dev.sum7.eu/genofire/hook2xmpp/grafana"
|
_ "dev.sum7.eu/genofire/hook2xmpp/grafana"
|
||||||
|
_ "dev.sum7.eu/genofire/hook2xmpp/prometheus"
|
||||||
"dev.sum7.eu/genofire/hook2xmpp/runtime"
|
"dev.sum7.eu/genofire/hook2xmpp/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
content := strings.Join(request.GroupLabels.Values(), " ")
|
||||||
|
firingAlerts := request.Alerts.Firing()
|
||||||
|
if len(firingAlerts) > 0 {
|
||||||
|
for _, a := range firingAlerts {
|
||||||
|
if description, ok := a.Annotations["description"]; ok {
|
||||||
|
content = fmt.Sprintf("%s\n%s", content, description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content = fmt.Sprintf("[%s:%d] %s", request.Status, len(firingAlerts), content)
|
||||||
|
} else {
|
||||||
|
content = fmt.Sprintf("[%s] %s", request.Status, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger = logger.WithField("body", content)
|
||||||
|
|
||||||
|
ok := false
|
||||||
|
token := strings.TrimSpace(strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer "))
|
||||||
|
for _, hook := range hooks {
|
||||||
|
if token != 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
package prometheus
|
Loading…
Reference in New Issue