From dff91dece0329f7785120f321997b36fbe376009 Mon Sep 17 00:00:00 2001 From: Andrey Kolesnichenko Date: Mon, 17 Jan 2022 17:19:47 +0300 Subject: [PATCH] Add slack provider for events --- examples/events.md | 8 +++- examples/events_slack.go | 57 ++++++++++++++++++++++++++ examples/slack-events.png | Bin 0 -> 43826 bytes examples/slack.json | 35 ++++++++++++++++ provider/slack.go | 84 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 examples/events_slack.go create mode 100644 examples/slack-events.png create mode 100644 examples/slack.json create mode 100644 provider/slack.go diff --git a/examples/events.md b/examples/events.md index e3d65b5..12d0a6e 100644 --- a/examples/events.md +++ b/examples/events.md @@ -27,4 +27,10 @@ sre/provider/grafana.go:127 Annotation 1502808. Annotation added ## DataDog UO ![DataDog](/examples/datadog-events.png) -![DataDog](/examples/datadog-events2.png) \ No newline at end of file +![DataDog](/examples/datadog-events2.png) + +## Slack UI + +Send simple messages from `name` field or structured slack BlockKit json from `attributes["payload"]`(if present) + +![Slack](/examples/slack-events.png) \ No newline at end of file diff --git a/examples/events_slack.go b/examples/events_slack.go new file mode 100644 index 0000000..5ba8400 --- /dev/null +++ b/examples/events_slack.go @@ -0,0 +1,57 @@ +package main + +import ( + _ "embed" + "time" + + "github.com/devopsext/sre/common" + "github.com/devopsext/sre/provider" +) + +//go:embed slack.json +var payload []byte + +var logs = common.NewLogs() +var events = common.NewEvents() + +func test() { + + events.Now(":exclamation: First", nil) + + m := make(map[string]string) + m["payload"] = string(payload) + + events.Now(":grey_exclamation:Second", m) + events.Now(":grey_question: *Third*", nil) +} + +func main() { + + defer logs.Stop() // finalize logs delivery + defer events.Stop() // finalize events delivery + + // initialize Stdout logger + stdout := provider.NewStdout(provider.StdoutOptions{ + Format: "template", + Level: "debug", + Template: "{{.file}} {{.msg}}", + TimestampFormat: time.RFC3339Nano, + TextColors: true, + }) + // set caller offset for file:line proper usage + stdout.SetCallerOffset(2) + + // add Stdout logger + logs.Register(stdout) + + slack := provider.NewSlackEventer(provider.SlackOptions{ + WebHook: "", + Tags: "", + Timeout: 2, + }, logs, stdout) + + // add events + events.Register(slack) + + test() +} diff --git a/examples/slack-events.png b/examples/slack-events.png new file mode 100644 index 0000000000000000000000000000000000000000..80d8e3eceec0f05789fdf752d0fb55a940ea6adc GIT binary patch literal 43826 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 M&g5*-nOpb&3qv>CfB*mh literal 0 HcmV?d00001 diff --git a/examples/slack.json b/examples/slack.json new file mode 100644 index 0000000..eeb2026 --- /dev/null +++ b/examples/slack.json @@ -0,0 +1,35 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Daily News", + "emoji": true + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "`06:45 UTC (08:45 ETT)`:\t:grey_exclamation:\t| Germany_Industrial Orders MM" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Symbol*: EUR / EUR,CHF,XAG,XAU" + }, + { + "type": "mrkdwn", + "text": "*Type*: Industry Sector" + } + ] + } + ] +} \ No newline at end of file diff --git a/provider/slack.go b/provider/slack.go new file mode 100644 index 0000000..3eb44a2 --- /dev/null +++ b/provider/slack.go @@ -0,0 +1,84 @@ +package provider + +import ( + "bytes" + "context" + "fmt" + "github.com/devopsext/sre/common" + "github.com/devopsext/utils" + "io/ioutil" + "net/http" + "time" +) + +type SlackOptions struct { + WebHook string + Tags string + Timeout int +} + +type SlackEventer struct { + options SlackOptions + logger common.Logger + tags []string + client *http.Client + ctx context.Context +} + +func (se *SlackEventer) Now(name string, attributes map[string]string) { + se.At(name, attributes, time.Now()) +} + +func (se *SlackEventer) At(name string, attributes map[string]string, when time.Time) { + se.Interval(name, attributes, when, when) +} + +func (se *SlackEventer) Interval(name string, attributes map[string]string, begin, end time.Time) { + var body string + + body = fmt.Sprintf("{\"text\": \"%s\"}", name) + if payload, ok := attributes["payload"]; ok { + body = payload + } + + resp, err := http.Post(se.options.WebHook, "application/json", bytes.NewBuffer([]byte(body))) + if err != nil { + se.logger.Error("slack post:", err) + return + } + + defer resp.Body.Close() + + rBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + se.logger.Error("slack post response:", err) + return + } + se.logger.Debug(string(rBody)) +} + +func (se *SlackEventer) Stop() { + se.client.CloseIdleConnections() + se.logger.Info("Slack Eventer stopped.") +} + +func NewSlackEventer(options SlackOptions, logger common.Logger, stdout *Stdout) *SlackEventer { + if logger == nil { + logger = stdout + } + + if utils.IsEmpty(options.WebHook) { + logger.Debug("Slack Eventer is disabled") + return nil + } + + logger.Info("Slack Eventer is up…") + + return &SlackEventer{ + options: options, + logger: logger, + tags: common.MapToArray(common.GetKeyValues(options.Tags)), + client: common.MakeHttpClient(options.Timeout), + ctx: context.Background(), + } +}