moira

Форк
0
/
webhook.go 
65 строк · 1.6 Кб
1
package webhook
2

3
import (
4
	"bytes"
5
	"encoding/json"
6
	"fmt"
7
	"io/ioutil"
8
	"net/http"
9
	"net/url"
10
	"time"
11

12
	"go.avito.ru/DO/moira"
13
	"go.avito.ru/DO/moira/logging"
14
)
15

16
// Sender implements moira sender interface via webhook
17
type Sender struct{}
18

19
type JsonMessage struct {
20
	Events  *moira.NotificationEvents `json:"events"`
21
	Trigger *moira.TriggerData        `json:"trigger"`
22
}
23

24
// Init read yaml config
25
func (sender *Sender) Init(_ map[string]string, _ *time.Location) error {
26
	return nil
27
}
28

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)
34
	if err != nil {
35
		return fmt.Errorf("unable to marshal json")
36
	}
37
	logging.GetLogger(trigger.ID).Debug(fmt.Sprintf("Calling webhook with url %s", webhookUrl))
38
	return do(contact.Value, payload)
39
}
40

41
func do(webhookUrl string, payload []byte) error {
42
	parsedURL, err := url.Parse(webhookUrl)
43
	if err != nil {
44
		return err
45
	}
46
	req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewReader(payload))
47
	if err != nil {
48
		return err
49
	}
50
	req.Header.Set("Content-Type", "application/json")
51
	req.Header.Add("X-Source", "moira")
52

53
	client := &http.Client{Timeout: 5 * time.Second}
54
	res, err := client.Do(req)
55
	if err != nil {
56
		return err
57
	}
58

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)
62
	}
63
	return nil
64

65
}
66

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.