Skip to content

Commit d4cb4dd

Browse files
committed
WIP: Datadog Events
1 parent d4eaae8 commit d4cb4dd

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

pkg/services/datadog.go

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package services
2+
3+
import (
4+
"bytes"
5+
"context"
6+
texttemplate "text/template"
7+
8+
slackutil "github.com/argoproj/notifications-engine/pkg/util/slack"
9+
)
10+
11+
type DatadogNotification struct {
12+
Attachments string `json:"attachments,omitempty"`
13+
Blocks string `json:"blocks,omitempty"`
14+
GroupingKey string `json:"groupingKey"`
15+
NotifyBroadcast bool `json:"notifyBroadcast"`
16+
DeliveryPolicy slackutil.DeliveryPolicy `json:"deliveryPolicy"`
17+
}
18+
19+
func (n *DatadogNotification) GetTemplater(name string, f texttemplate.FuncMap) (Templater, error) {
20+
slackAttachments, err := texttemplate.New(name).Funcs(f).Parse(n.Attachments)
21+
if err != nil {
22+
return nil, err
23+
}
24+
slackBlocks, err := texttemplate.New(name).Funcs(f).Parse(n.Blocks)
25+
if err != nil {
26+
return nil, err
27+
}
28+
groupingKey, err := texttemplate.New(name).Funcs(f).Parse(n.GroupingKey)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
return func(notification *Notification, vars map[string]interface{}) error {
34+
if notification.Slack == nil {
35+
notification.Slack = &SlackNotification{}
36+
}
37+
var slackAttachmentsData bytes.Buffer
38+
if err := slackAttachments.Execute(&slackAttachmentsData, vars); err != nil {
39+
return err
40+
}
41+
notification.Slack.Attachments = slackAttachmentsData.String()
42+
43+
var slackBlocksData bytes.Buffer
44+
if err := slackBlocks.Execute(&slackBlocksData, vars); err != nil {
45+
return err
46+
}
47+
notification.Slack.Blocks = slackBlocksData.String()
48+
49+
var groupingKeyData bytes.Buffer
50+
if err := groupingKey.Execute(&groupingKeyData, vars); err != nil {
51+
return err
52+
}
53+
notification.Slack.GroupingKey = groupingKeyData.String()
54+
55+
notification.Slack.NotifyBroadcast = n.NotifyBroadcast
56+
notification.Slack.DeliveryPolicy = n.DeliveryPolicy
57+
return nil
58+
}, nil
59+
}
60+
61+
type DatadogOptions struct {
62+
Username string `json:"username"`
63+
Icon string `json:"icon"`
64+
Token string `json:"token"`
65+
SigningSecret string `json:"signingSecret"`
66+
Channels []string `json:"channels"`
67+
InsecureSkipVerify bool `json:"insecureSkipVerify"`
68+
ApiURL string `json:"apiURL"`
69+
DisableUnfurl bool `json:"disableUnfurl"`
70+
}
71+
72+
type datadogService struct {
73+
opts DatadogOptions
74+
}
75+
76+
func NewDatadogService(opts DatadogOptions) NotificationService {
77+
return &datadogService{opts: opts}
78+
}
79+
80+
func (s *datadogService) Send(notification Notification, dest Destination) error {
81+
slackNotification, msgOptions, err := buildMessageOptions(notification, dest, s.opts)
82+
if err != nil {
83+
return err
84+
}
85+
return slackutil.NewThreadedClient(
86+
newSlackClient(s.opts),
87+
slackState,
88+
).SendMessage(
89+
context.TODO(),
90+
dest.Recipient,
91+
slackNotification.GroupingKey,
92+
slackNotification.NotifyBroadcast,
93+
slackNotification.DeliveryPolicy,
94+
msgOptions,
95+
)
96+
}

pkg/services/services.go

+10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type Notification struct {
2727
Pagerduty *PagerDutyNotification `json:"pagerduty,omitempty"`
2828
PagerdutyV2 *PagerDutyV2Notification `json:"pagerdutyv2,omitempty"`
2929
Newrelic *NewrelicNotification `json:"newrelic,omitempty"`
30+
Datadog *DatadogNotification `json:"datadog,omitempty"`
3031
}
3132

3233
// Destinations holds notification destinations group by trigger
@@ -103,6 +104,9 @@ func (n *Notification) GetTemplater(name string, f texttemplate.FuncMap) (Templa
103104
if n.Newrelic != nil {
104105
sources = append(sources, n.Newrelic)
105106
}
107+
if n.Datadog != nil {
108+
sources = append(sources, n.Datadog)
109+
}
106110
return n.getTemplater(name, f, sources)
107111
}
108112

@@ -223,6 +227,12 @@ func NewService(serviceType string, optsData []byte) (NotificationService, error
223227
return nil, err
224228
}
225229
return NewWebexService(opts), nil
230+
case "datadpg":
231+
var opts DatadogOptions
232+
if err := yaml.Unmarshal(optsData, &opts); err != nil {
233+
return nil, err
234+
}
235+
return NewDatadogService(opts), nil
226236
default:
227237
return nil, fmt.Errorf("service type '%s' is not supported", serviceType)
228238
}

0 commit comments

Comments
 (0)