Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
a69bdf94
Unverified
Commit
a69bdf94
authored
Jan 12, 2018
by
Carl Bergquist
Committed by
GitHub
Jan 12, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9967 from rburchell/master
Add support for inline image uploads to telegram notifier plugin
parents
f3a66ecb
43109dc8
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
89 additions
and
24 deletions
+89
-24
pkg/services/alerting/notifiers/telegram.go
+89
-24
No files found.
pkg/services/alerting/notifiers/telegram.go
View file @
a69bdf94
package
notifiers
import
(
"bytes"
"fmt"
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/log"
m
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/alerting"
"io"
"mime/multipart"
"os"
)
var
(
teleg
e
ramApiUrl
string
=
"https://api.telegram.org/bot%s/%s"
telegramApiUrl
string
=
"https://api.telegram.org/bot%s/%s"
)
func
init
()
{
...
...
@@ -47,9 +49,10 @@ func init() {
type
TelegramNotifier
struct
{
NotifierBase
BotToken
string
ChatID
string
log
log
.
Logger
BotToken
string
ChatID
string
UploadImage
bool
log
log
.
Logger
}
func
NewTelegramNotifier
(
model
*
m
.
AlertNotification
)
(
alerting
.
Notifier
,
error
)
{
...
...
@@ -59,6 +62,7 @@ func NewTelegramNotifier(model *m.AlertNotification) (alerting.Notifier, error)
botToken
:=
model
.
Settings
.
Get
(
"bottoken"
)
.
MustString
()
chatId
:=
model
.
Settings
.
Get
(
"chatid"
)
.
MustString
()
uploadImage
:=
model
.
Settings
.
Get
(
"uploadImage"
)
.
MustBool
()
if
botToken
==
""
{
return
nil
,
alerting
.
ValidationError
{
Reason
:
"Could not find Bot Token in settings"
}
...
...
@@ -72,31 +76,42 @@ func NewTelegramNotifier(model *m.AlertNotification) (alerting.Notifier, error)
NotifierBase
:
NewNotifierBase
(
model
.
Id
,
model
.
IsDefault
,
model
.
Name
,
model
.
Type
,
model
.
Settings
),
BotToken
:
botToken
,
ChatID
:
chatId
,
UploadImage
:
uploadImage
,
log
:
log
.
New
(
"alerting.notifier.telegram"
),
},
nil
}
func
(
this
*
TelegramNotifier
)
ShouldNotify
(
context
*
alerting
.
EvalContext
)
bool
{
return
defaultShouldNotify
(
context
)
}
func
(
this
*
TelegramNotifier
)
buildMessage
(
evalContext
*
alerting
.
EvalContext
,
sendImageInline
bool
)
*
m
.
SendWebhookSync
{
var
imageFile
*
os
.
File
var
err
error
func
(
this
*
TelegramNotifier
)
Notify
(
evalContext
*
alerting
.
EvalContext
)
error
{
this
.
log
.
Info
(
"Sending alert notification to"
,
"bot_token"
,
this
.
BotToken
)
this
.
log
.
Info
(
"Sending alert notification to"
,
"chat_id"
,
this
.
ChatID
)
bodyJSON
:=
simplejson
.
New
()
if
sendImageInline
{
imageFile
,
err
=
os
.
Open
(
evalContext
.
ImageOnDiskPath
)
defer
imageFile
.
Close
()
if
err
!=
nil
{
sendImageInline
=
false
// fall back to text message
}
}
bodyJSON
.
Set
(
"chat_id"
,
this
.
ChatID
)
bodyJSON
.
Set
(
"parse_mode"
,
"html"
)
message
:=
""
message
:=
fmt
.
Sprintf
(
"<b>%s</b>
\n
State: %s
\n
Message: %s
\n
"
,
evalContext
.
GetNotificationTitle
(),
evalContext
.
Rule
.
Name
,
evalContext
.
Rule
.
Message
)
if
sendImageInline
{
// Telegram's API does not allow HTML formatting for image captions.
message
=
fmt
.
Sprintf
(
"%s
\n
State: %s
\n
Message: %s
\n
"
,
evalContext
.
GetNotificationTitle
(),
evalContext
.
Rule
.
Name
,
evalContext
.
Rule
.
Message
)
}
else
{
message
=
fmt
.
Sprintf
(
"<b>%s</b>
\n
State: %s
\n
Message: %s
\n
"
,
evalContext
.
GetNotificationTitle
(),
evalContext
.
Rule
.
Name
,
evalContext
.
Rule
.
Message
)
}
ruleUrl
,
err
:=
evalContext
.
GetRuleUrl
()
if
err
==
nil
{
message
=
message
+
fmt
.
Sprintf
(
"URL: %s
\n
"
,
ruleUrl
)
}
if
evalContext
.
ImagePublicUrl
!=
""
{
message
=
message
+
fmt
.
Sprintf
(
"Image: %s
\n
"
,
evalContext
.
ImagePublicUrl
)
if
!
sendImageInline
{
// only attach this if we are not sending it inline.
if
evalContext
.
ImagePublicUrl
!=
""
{
message
=
message
+
fmt
.
Sprintf
(
"Image: %s
\n
"
,
evalContext
.
ImagePublicUrl
)
}
}
metrics
:=
""
...
...
@@ -107,19 +122,69 @@ func (this *TelegramNotifier) Notify(evalContext *alerting.EvalContext) error {
break
}
}
if
metrics
!=
""
{
message
=
message
+
fmt
.
Sprintf
(
"
\n
<i>Metrics:</i>%s"
,
metrics
)
if
sendImageInline
{
// Telegram's API does not allow HTML formatting for image captions.
message
=
message
+
fmt
.
Sprintf
(
"
\n
Metrics:%s"
,
metrics
)
}
else
{
message
=
message
+
fmt
.
Sprintf
(
"
\n
<i>Metrics:</i>%s"
,
metrics
)
}
}
var
body
bytes
.
Buffer
w
:=
multipart
.
NewWriter
(
&
body
)
fw
,
_
:=
w
.
CreateFormField
(
"chat_id"
)
fw
.
Write
([]
byte
(
this
.
ChatID
))
if
sendImageInline
{
fw
,
_
=
w
.
CreateFormField
(
"caption"
)
fw
.
Write
([]
byte
(
message
))
fw
,
_
=
w
.
CreateFormFile
(
"photo"
,
evalContext
.
ImageOnDiskPath
)
io
.
Copy
(
fw
,
imageFile
)
}
else
{
fw
,
_
=
w
.
CreateFormField
(
"text"
)
fw
.
Write
([]
byte
(
message
))
fw
,
_
=
w
.
CreateFormField
(
"parse_mode"
)
fw
.
Write
([]
byte
(
"html"
))
}
bodyJSON
.
Set
(
"text"
,
message
)
w
.
Close
(
)
url
:=
fmt
.
Sprintf
(
telegeramApiUrl
,
this
.
BotToken
,
"sendMessage"
)
body
,
_
:=
bodyJSON
.
MarshalJSON
()
apiMethod
:=
""
if
sendImageInline
{
this
.
log
.
Info
(
"Sending telegram image notification"
,
"photo"
,
evalContext
.
ImageOnDiskPath
,
"chat_id"
,
this
.
ChatID
,
"bot_token"
,
this
.
BotToken
)
apiMethod
=
"sendPhoto"
}
else
{
this
.
log
.
Info
(
"Sending telegram text notification"
,
"chat_id"
,
this
.
ChatID
,
"bot_token"
,
this
.
BotToken
)
apiMethod
=
"sendMessage"
}
url
:=
fmt
.
Sprintf
(
telegramApiUrl
,
this
.
BotToken
,
apiMethod
)
cmd
:=
&
m
.
SendWebhookSync
{
Url
:
url
,
Body
:
string
(
body
),
Body
:
body
.
String
(
),
HttpMethod
:
"POST"
,
HttpHeader
:
map
[
string
]
string
{
"Content-Type"
:
w
.
FormDataContentType
(),
},
}
return
cmd
}
func
(
this
*
TelegramNotifier
)
ShouldNotify
(
context
*
alerting
.
EvalContext
)
bool
{
return
defaultShouldNotify
(
context
)
}
func
(
this
*
TelegramNotifier
)
Notify
(
evalContext
*
alerting
.
EvalContext
)
error
{
var
cmd
*
m
.
SendWebhookSync
if
evalContext
.
ImagePublicUrl
==
""
&&
this
.
UploadImage
==
true
{
cmd
=
this
.
buildMessage
(
evalContext
,
true
)
}
else
{
cmd
=
this
.
buildMessage
(
evalContext
,
false
)
}
if
err
:=
bus
.
DispatchCtx
(
evalContext
.
Ctx
,
cmd
);
err
!=
nil
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment