add prometheus support

This commit is contained in:
Martin/Geno 2019-06-18 01:22:30 +02:00
parent 85ed49c032
commit 24c5656f84
4 changed files with 69 additions and 0 deletions

View File

@ -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

View File

@ -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"
) )

63
prometheus/main.go Normal file
View File

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

1
prometheus/main_test.go Normal file
View File

@ -0,0 +1 @@
package prometheus