kopia lustrzana https://github.com/tmsmr/xmpp-webhook
				
				
				
			
		
			
				
	
	
		
			72 wiersze
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			72 wiersze
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"io/ioutil"
 | |
| 	"net/http"
 | |
| )
 | |
| 
 | |
| // interface for parser functions (grafana, prometheus, ...)
 | |
| type parserFunc func(*http.Request) (string, error)
 | |
| 
 | |
| type messageHandler struct {
 | |
| 	messages   chan<- string // chan to xmpp client
 | |
| 	parserFunc parserFunc
 | |
| }
 | |
| 
 | |
| // http request handler
 | |
| func (h *messageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | |
| 	// parse/generate message from http request
 | |
| 	m, err := h.parserFunc(r)
 | |
| 	if err != nil {
 | |
| 		w.WriteHeader(http.StatusInternalServerError)
 | |
| 	}
 | |
| 	// send message to xmpp client
 | |
| 	h.messages <- m
 | |
| 	w.WriteHeader(http.StatusNoContent)
 | |
| }
 | |
| 
 | |
| // returns new handler with a given parser function
 | |
| func newMessageHandler(m chan<- string, f parserFunc) *messageHandler {
 | |
| 	return &messageHandler{
 | |
| 		messages:   m,
 | |
| 		parserFunc: f,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /*************
 | |
| GRAFANA PARSER
 | |
| *************/
 | |
| func grafanaParserFunc(r *http.Request) (string, error) {
 | |
| 	// get alert data from request
 | |
| 	body, err := ioutil.ReadAll(r.Body)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	// grafana alert struct
 | |
| 	alert := &struct {
 | |
| 		Title   string `json:"title"`
 | |
| 		RuleURL string `json:"ruleUrl"`
 | |
| 		State   string `json:"state"`
 | |
| 		Message string `json:"message"`
 | |
| 	}{}
 | |
| 
 | |
| 	// parse body into the alert struct
 | |
| 	err = json.Unmarshal(body, &alert)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	// contruct alert message
 | |
| 	var message string
 | |
| 	switch alert.State {
 | |
| 	case "ok":
 | |
| 		message = "8-) " + alert.Title
 | |
| 	default:
 | |
| 		message = ":'-( " + alert.Title + "\n" + alert.Message + "\n" + alert.RuleURL
 | |
| 	}
 | |
| 
 | |
| 	return message, nil
 | |
| }
 |