12
"go.avito.ru/DO/moira"
13
"go.avito.ru/DO/moira/logging"
16
// Sender implements moira sender interface via webhook
19
type JsonMessage struct {
20
Events *moira.NotificationEvents `json:"events"`
21
Trigger *moira.TriggerData `json:"trigger"`
24
// Init read yaml config
25
func (sender *Sender) Init(_ map[string]string, _ *time.Location) error {
29
// SendEvents implements Sender interface Send
30
func (sender *Sender) SendEvents(events moira.NotificationEvents, contact moira.ContactData, trigger moira.TriggerData, _, _ bool) error {
31
webhookUrl := contact.Value
32
msg := &JsonMessage{Events: &events, Trigger: &trigger}
33
payload, err := json.Marshal(msg)
35
return fmt.Errorf("unable to marshal json")
37
logging.GetLogger(trigger.ID).Debug(fmt.Sprintf("Calling webhook with url %s", webhookUrl))
38
return do(contact.Value, payload)
41
func do(webhookUrl string, payload []byte) error {
42
parsedURL, err := url.Parse(webhookUrl)
46
req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewReader(payload))
50
req.Header.Set("Content-Type", "application/json")
51
req.Header.Add("X-Source", "moira")
53
client := &http.Client{Timeout: 5 * time.Second}
54
res, err := client.Do(req)
59
if res.StatusCode < 200 || res.StatusCode > 299 {
60
body, _ := ioutil.ReadAll(res.Body)
61
return fmt.Errorf("failed to call webhook. Returned statuscode %v body %s", res.StatusCode, body)