From f21c976b27dc7ee5d1957662fc8e2e94b7ca6a42 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 6 Mar 2019 16:58:01 +0100 Subject: [PATCH] fix discord notifier so it doesn't crash when there are no image generated --- pkg/services/alerting/notifiers/discord.go | 81 ++++++++++++---------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/pkg/services/alerting/notifiers/discord.go b/pkg/services/alerting/notifiers/discord.go index 57d9d438fa2..c7178211f0e 100644 --- a/pkg/services/alerting/notifiers/discord.go +++ b/pkg/services/alerting/notifiers/discord.go @@ -111,63 +111,68 @@ func (this *DiscordNotifier) Notify(evalContext *alerting.EvalContext) error { json, _ := bodyJSON.MarshalJSON() - content_type := "application/json" - - var body []byte - - if embeddedImage { - - var b bytes.Buffer - - w := multipart.NewWriter(&b) - - f, err := os.Open(evalContext.ImageOnDiskPath) + cmd := &m.SendWebhookSync{ + Url: this.WebhookURL, + HttpMethod: "POST", + ContentType: "application/json", + } + if !embeddedImage { + cmd.Body = string(json) + } else { + err := this.embedImage(cmd, evalContext.ImageOnDiskPath, json) if err != nil { - this.log.Error("Can't open graph file", err) + this.log.Error("failed to embed image", "error", err) return err } + } - defer f.Close() - - fw, err := w.CreateFormField("payload_json") - if err != nil { - return err - } + if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil { + this.log.Error("Failed to send notification to Discord", "error", err) + return err + } - if _, err = fw.Write([]byte(string(json))); err != nil { - return err - } + return nil +} - fw, err = w.CreateFormFile("file", "graph.png") - if err != nil { - return err +func (this *DiscordNotifier) embedImage(cmd *m.SendWebhookSync, imagePath string, existingJSONBody []byte) error { + f, err := os.Open(imagePath) + defer f.Close() + if err != nil { + if os.IsNotExist(err) { + cmd.Body = string(existingJSONBody) + return nil } - - if _, err = io.Copy(fw, f); err != nil { + if !os.IsNotExist(err) { return err } + } - w.Close() + var b bytes.Buffer + w := multipart.NewWriter(&b) - body = b.Bytes() - content_type = w.FormDataContentType() + fw, err := w.CreateFormField("payload_json") + if err != nil { + return err + } - } else { - body = json + if _, err = fw.Write([]byte(string(existingJSONBody))); err != nil { + return err } - cmd := &m.SendWebhookSync{ - Url: this.WebhookURL, - Body: string(body), - HttpMethod: "POST", - ContentType: content_type, + fw, err = w.CreateFormFile("file", "graph.png") + if err != nil { + return err } - if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil { - this.log.Error("Failed to send notification to Discord", "error", err) + if _, err = io.Copy(fw, f); err != nil { return err } + w.Close() + + cmd.Body = string(b.Bytes()) + cmd.ContentType = w.FormDataContentType() + return nil }