From 4fc50742a003272b6edcc97bf55b8b8f9d5eb0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 29 Jul 2016 14:55:02 +0200 Subject: [PATCH] feat(alerting): working on image rendering with alert notifications --- conf/defaults.ini | 6 ++ pkg/components/imguploader/imguploader.go | 67 +++++++++++++++++++++++ pkg/models/annotation.go | 24 ++++++++ pkg/models/annotations.go | 22 -------- pkg/services/alerting/interfaces.go | 1 + pkg/services/alerting/notifier.go | 4 ++ pkg/services/alerting/notifiers/base.go | 4 ++ 7 files changed, 106 insertions(+), 22 deletions(-) create mode 100644 pkg/components/imguploader/imguploader.go create mode 100644 pkg/models/annotation.go delete mode 100644 pkg/models/annotations.go diff --git a/conf/defaults.ini b/conf/defaults.ini index 4b1b66bea27..6d8ff7c4b2b 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -382,3 +382,9 @@ interval_seconds = 60 [grafana_net] url = https://grafana.net + +#################################### S3 Temp Store ########################## +[s3-temp-image-store] +bucket_url = +access_key = +secret_key = diff --git a/pkg/components/imguploader/imguploader.go b/pkg/components/imguploader/imguploader.go new file mode 100644 index 00000000000..d14d86279d3 --- /dev/null +++ b/pkg/components/imguploader/imguploader.go @@ -0,0 +1,67 @@ +package imguploader + +import ( + "io/ioutil" + "net/http" + "time" + + "github.com/grafana/grafana/pkg/log" + "github.com/grafana/grafana/pkg/util" + "github.com/kr/s3/s3util" +) + +type Uploader interface { + Upload(imgUrl string) (string, error) +} + +type S3Uploader struct { + bucket string + secretKey string + accessKey string +} + +func NewS3Uploader(bucket, accessKey, secretKey string) *S3Uploader { + return &S3Uploader{ + bucket: bucket, + accessKey: accessKey, + secretKey: secretKey, + } +} + +func (u *S3Uploader) Upload(imgUrl string) (string, error) { + client := http.Client{Timeout: time.Duration(60 * time.Second)} + + res, err := client.Get(imgUrl) + if err != nil { + return "", err + } + + s3util.DefaultConfig.AccessKey = u.accessKey + s3util.DefaultConfig.SecretKey = u.secretKey + log.Info("AccessKey: %s", u.accessKey) + log.Info("SecretKey: %s", u.secretKey) + + header := make(http.Header) + header.Add("x-amz-acl", "public-read") + header.Add("Content-Type", "image/png") + + fullUrl := u.bucket + util.GetRandomString(20) + ".png" + writer, err := s3util.Create(fullUrl, header, nil) + if err != nil { + return "", err + } + + defer writer.Close() + + imgData, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + + _, err = writer.Write(imgData) + if err != nil { + return "", err + } + + return fullUrl, nil +} diff --git a/pkg/models/annotation.go b/pkg/models/annotation.go new file mode 100644 index 00000000000..4543ab6c78a --- /dev/null +++ b/pkg/models/annotation.go @@ -0,0 +1,24 @@ +package models + +import ( + "time" + + "github.com/grafana/grafana/pkg/components/simplejson" +) + +type AnnotationType string + +type Annotation struct { + Id int64 + OrgId int64 + Type AnnotationType + Title string + Text string + AlertId int64 + UserId int64 + PreviousState string + NewState string + Timestamp time.Time + + Data *simplejson.Json +} diff --git a/pkg/models/annotations.go b/pkg/models/annotations.go deleted file mode 100644 index 149181fe81a..00000000000 --- a/pkg/models/annotations.go +++ /dev/null @@ -1,22 +0,0 @@ -package models - -import ( - "time" - - "github.com/grafana/grafana/pkg/components/simplejson" -) - -type AnnotationType string - -type AnnotationEvent struct { - Id int64 - OrgId int64 - Type AnnotationType - Title string - Text string - AlertId int64 - UserId int64 - Timestamp time.Time - - Data *simplejson.Json -} diff --git a/pkg/services/alerting/interfaces.go b/pkg/services/alerting/interfaces.go index 5174d368052..9688aba153a 100644 --- a/pkg/services/alerting/interfaces.go +++ b/pkg/services/alerting/interfaces.go @@ -14,6 +14,7 @@ type Scheduler interface { type Notifier interface { Notify(alertResult *EvalContext) GetType() string + NeedsImage() bool } type Condition interface { diff --git a/pkg/services/alerting/notifier.go b/pkg/services/alerting/notifier.go index eaa35018149..50743c96363 100644 --- a/pkg/services/alerting/notifier.go +++ b/pkg/services/alerting/notifier.go @@ -22,6 +22,10 @@ func (n *RootNotifier) GetType() string { return "root" } +func (n *RootNotifier) NeedsImage() bool { + return false +} + func (n *RootNotifier) Notify(context *EvalContext) { n.log.Info("Sending notifications for", "ruleId", context.Rule.Id) diff --git a/pkg/services/alerting/notifiers/base.go b/pkg/services/alerting/notifiers/base.go index 6295d548f94..48fe6c4eaa5 100644 --- a/pkg/services/alerting/notifiers/base.go +++ b/pkg/services/alerting/notifiers/base.go @@ -8,3 +8,7 @@ type NotifierBase struct { func (n *NotifierBase) GetType() string { return n.Type } + +func (n *NotifierBase) NeedsImage() bool { + return true +}