Skip to content

Commit

Permalink
Limit message size in Slack sender (#279)
Browse files Browse the repository at this point in the history
* senders: slack: Limit message size

* senders: slack: Add message size limit test coverage

* Adjust for 40k limit
  • Loading branch information
iurimateus authored and borovskyav committed Mar 5, 2019
1 parent ded8130 commit 683fa52
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
24 changes: 22 additions & 2 deletions senders/slack/slack.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ const (
nodataEmoji = ":moira-state-nodata:"
exceptionEmoji = ":moira-state-exception:"
testEmoji = ":moira-state-test:"

messageMaxCharacters = 40000
additionalInfoCharactersCount = 400
)

var stateEmoji = map[moira.State]string{
Expand Down Expand Up @@ -93,13 +96,30 @@ func (sender *Sender) buildMessage(events moira.NotificationEvents, trigger moir

message.WriteString("\n```")

var printEventsCount int
messageCharsCount := len([]rune(message.String()))
messageLimitReached := false

for _, event := range events {
message.WriteString(fmt.Sprintf("\n%s: %s = %s (%s to %s)", event.FormatTimestamp(sender.location), event.Metric, event.GetMetricValue(), event.OldState, event.State))
line := fmt.Sprintf("\n%s: %s = %s (%s to %s)", event.FormatTimestamp(sender.location), event.Metric, event.GetMetricValue(), event.OldState, event.State)
if len(moira.UseString(event.Message)) > 0 {
message.WriteString(fmt.Sprintf(". %s", moira.UseString(event.Message)))
line += fmt.Sprintf(". %s", moira.UseString(event.Message))
}
lineCharsCount := len([]rune(line))
if messageCharsCount+lineCharsCount > messageMaxCharacters-additionalInfoCharactersCount {
messageLimitReached = true
break
}
message.WriteString(line)
messageCharsCount += lineCharsCount
printEventsCount++
}
message.WriteString("```")

if messageLimitReached {
message.WriteString(fmt.Sprintf("\n\n...and %d more events.", len(events)-printEventsCount))
}

if throttled {
message.WriteString("\nPlease, *fix your system or tune this trigger* to generate less events.")
}
Expand Down
12 changes: 12 additions & 0 deletions senders/slack/slack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package slack

import (
"fmt"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -136,6 +137,17 @@ func TestBuildMessage(t *testing.T) {
So(actual, ShouldResemble, expected)
})

events := make([]moira.NotificationEvent, 0)
Convey("Print moira message with 1129 events and cutoff", func() {
for i := 0; i < 1200; i++ {
events = append(events, event)
}
lines := strings.Repeat("\n02:40: Metric = 123 (OK to NODATA)", 1129)
actual := sender.buildMessage(events, trigger, false)
expected := fmt.Sprintf("*NODATA* [tag1][tag2] <http://moira.url/trigger/TriggerID|Name>\n```%s```\n\n...and 71 more events.", lines)
So(actual, ShouldResemble, expected)
})

Convey("Print moira message with empty triggerID, but with trigger name", func() {
actual := sender.buildMessage([]moira.NotificationEvent{event}, moira.TriggerData{Name: "Name"}, false)
expected := "*NODATA* Name\n```\n02:40: Metric = 123 (OK to NODATA)```"
Expand Down

0 comments on commit 683fa52

Please sign in to comment.