flapjack 0.7.28 → 0.7.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +10 -0
- data/features/notification_rules.feature +25 -25
- data/features/rollup.feature +38 -18
- data/features/steps/events_steps.rb +10 -5
- data/features/steps/notifications_steps.rb +8 -4
- data/lib/flapjack/data/alert.rb +207 -0
- data/lib/flapjack/data/contact.rb +14 -7
- data/lib/flapjack/data/entity_check.rb +4 -3
- data/lib/flapjack/data/notification.rb +28 -27
- data/lib/flapjack/gateways/api/contact_methods.rb +32 -12
- data/lib/flapjack/gateways/email.rb +49 -53
- data/lib/flapjack/gateways/email/alert.html.erb +15 -15
- data/lib/flapjack/gateways/email/alert.text.erb +15 -15
- data/lib/flapjack/gateways/email/alert_subject.text.erb +3 -13
- data/lib/flapjack/gateways/email/rollup.html.erb +6 -6
- data/lib/flapjack/gateways/email/rollup.text.erb +7 -7
- data/lib/flapjack/gateways/email/rollup_subject.text.erb +1 -19
- data/lib/flapjack/gateways/jabber.rb +57 -47
- data/lib/flapjack/gateways/jabber/alert.text.erb +12 -0
- data/lib/flapjack/gateways/jabber/rollup.text.erb +2 -0
- data/lib/flapjack/gateways/pagerduty.rb +60 -30
- data/lib/flapjack/gateways/pagerduty/alert.text.erb +10 -0
- data/lib/flapjack/gateways/sms_messagenet.rb +29 -36
- data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +4 -14
- data/lib/flapjack/gateways/sms_messagenet/rollup.text.erb +2 -34
- data/lib/flapjack/gateways/web.rb +23 -14
- data/lib/flapjack/gateways/web/views/check.html.erb +16 -11
- data/lib/flapjack/gateways/web/views/contact.html.erb +58 -16
- data/lib/flapjack/gateways/web/views/self_stats.html.erb +80 -71
- data/lib/flapjack/notifier.rb +8 -2
- data/lib/flapjack/pikelet.rb +17 -3
- data/lib/flapjack/processor.rb +0 -1
- data/lib/flapjack/redis_pool.rb +1 -1
- data/lib/flapjack/utility.rb +13 -0
- data/lib/flapjack/version.rb +1 -1
- data/spec/lib/flapjack/data/contact_spec.rb +44 -29
- data/spec/lib/flapjack/gateways/api/contact_methods_spec.rb +24 -4
- data/spec/lib/flapjack/gateways/email_spec.rb +0 -5
- data/spec/lib/flapjack/gateways/jabber_spec.rb +5 -1
- data/spec/lib/flapjack/gateways/pagerduty_spec.rb +5 -2
- data/spec/lib/flapjack/gateways/{sms_messagenet.spec.rb → sms_messagenet_spec.rb} +16 -12
- data/spec/lib/flapjack/gateways/web_spec.rb +1 -1
- data/spec/spec_helper.rb +28 -6
- metadata +43 -89
@@ -1,15 +1,5 @@
|
|
1
|
-
|
2
|
-
<%
|
3
|
-
<%=
|
4
|
-
<% when "recovery" -%>
|
5
|
-
<%= "Recovery: " -%>
|
6
|
-
<% when "acknowledgement" -%>
|
7
|
-
<%= "Ack: " -%>
|
8
|
-
<% when "test" -%>
|
9
|
-
<%= "Test notification: " -%>
|
1
|
+
<%= @alert.type_sentence_case %>: '<%= @alert.check %>' on <%= @alert.entity -%>
|
2
|
+
<% unless ['acknowledgement', 'test'].include?(@alert.notification_type) -%>
|
3
|
+
is <%= @alert.state_title_case -%>
|
10
4
|
<% end -%>
|
11
|
-
|
12
|
-
<% unless ['acknowledgement', 'test'].include?(@notification_type) -%>
|
13
|
-
is <%= ['ok'].include?(@state) ? @state.upcase : @state.titleize -%>
|
14
|
-
<% end -%>
|
15
|
-
at <%= Time.at(@time).strftime('%-d %b %H:%M') %>, <%= @summary -%>
|
5
|
+
at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %>, <%= @alert.summary -%>
|
@@ -1,34 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
memo[alert[1]['state']] = (memo[alert[1]['state']] || 0) + 1
|
4
|
-
memo
|
5
|
-
end
|
6
|
-
|
7
|
-
states_summary = ['critical', 'warning', 'unknown'].inject([]) do |memo, state|
|
8
|
-
next memo unless state_counts[state]
|
9
|
-
memo << "#{state.titleize}: #{state_counts[state]}"
|
10
|
-
memo
|
11
|
-
end.join(', ')
|
12
|
-
|
13
|
-
states_detail = ['critical', 'warning', 'unknown'].inject([]) do |memo, state|
|
14
|
-
|
15
|
-
alerts = @rollup_alerts.find_all {|alert| alert[1]['state'] == state}
|
16
|
-
next memo if alerts.to_a.empty?
|
17
|
-
|
18
|
-
memo << "#{state.titleize}: " + alerts.inject([]) do |ret, alert|
|
19
|
-
entity, check = alert[0].split(':', 2)
|
20
|
-
ret << "'#{check}' on #{entity}"
|
21
|
-
ret
|
22
|
-
end.join(', ')
|
23
|
-
|
24
|
-
memo
|
25
|
-
end.join('; ')
|
26
|
-
|
27
|
-
-%>
|
28
|
-
<% case @rollup -%>
|
29
|
-
<% when "problem" -%>
|
30
|
-
<%= "Problem summary: " -%>
|
31
|
-
<% when "recovery" -%>
|
32
|
-
<%= "Problem summaries finishing: " -%>
|
33
|
-
<% end -%>
|
34
|
-
<%= states_summary %> (<%= states_detail -%>)
|
1
|
+
<%= @alert.type_sentence_case %>: <%= @alert.rollup_states_summary -%>
|
2
|
+
(<%= @alert.rollup_states_detail_text(:max_checks_per_state => 3) -%>)
|
@@ -371,20 +371,29 @@ module Flapjack
|
|
371
371
|
def self_stats
|
372
372
|
@fqdn = `/bin/hostname -f`.chomp
|
373
373
|
@pid = Process.pid
|
374
|
-
|
375
|
-
|
376
|
-
@
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
374
|
+
|
375
|
+
@dbsize = redis.dbsize
|
376
|
+
@executive_instances = redis.keys("executive_instance:*").inject({}) do |memo, i|
|
377
|
+
instance_id = i.match(/executive_instance:(.*)/)[1]
|
378
|
+
boot_time = redis.hget(i, 'boot_time').to_i
|
379
|
+
uptime = Time.now.to_i - boot_time
|
380
|
+
uptime_string = ChronicDuration.output(uptime, :format => :short, :keep_zero => true, :units => 2)
|
381
|
+
event_counters = redis.hgetall("event_counters:#{instance_id}")
|
382
|
+
event_rates = event_counters.inject({}) do |er, ec|
|
383
|
+
er[ec[0]] = uptime && uptime > 0 ? (ec[1].to_f / uptime).round : nil
|
384
|
+
er
|
385
|
+
end
|
386
|
+
memo[instance_id] = {
|
387
|
+
'boot_time' => boot_time,
|
388
|
+
'uptime' => uptime,
|
389
|
+
'uptime_string' => uptime_string,
|
390
|
+
'event_counters' => event_counters,
|
391
|
+
'event_rates' => event_rates
|
392
|
+
}
|
393
|
+
memo
|
394
|
+
end
|
395
|
+
@event_counters = redis.hgetall('event_counters')
|
396
|
+
@events_queued = redis.llen('events')
|
388
397
|
end
|
389
398
|
|
390
399
|
def entity_stats
|
@@ -19,6 +19,18 @@
|
|
19
19
|
</div>
|
20
20
|
<% state_qualifier = @check_enabled ? '' : "DISABLED. Last " %>
|
21
21
|
<h3><%= state_qualifier %>State: <%= @check_state ? h(@check_state.upcase) : '' %></h3>
|
22
|
+
<% if @current_unscheduled_maintenance %>
|
23
|
+
<% ack_msg = "#{@current_unscheduled_maintenance[:summary]}" %>
|
24
|
+
<% ack_msg = ack_msg.length > 0 ? ack_msg : 'no summary given' %>
|
25
|
+
<h4>Acknowledged (<%= h ack_msg %>)</h4>
|
26
|
+
<% start = Time.at(@current_unscheduled_maintenance[:start_time]) %>
|
27
|
+
<% finish = Time.at(@current_unscheduled_maintenance[:start_time] + @current_unscheduled_maintenance[:duration]) %>
|
28
|
+
<% remain = time_period_in_words( (finish - current_time).ceil ) %>
|
29
|
+
<p><%= h start.to_s %> -> <%= h finish.to_s %> (<%= h remain %> remaining)</p>
|
30
|
+
<form action="/end_unscheduled_maintenance/<%= check_path_escaped %>" method="post">
|
31
|
+
<input type="submit" value="End Unscheduled Maintenance (Unacknowledge)" class="button">
|
32
|
+
</form>
|
33
|
+
<% end %>
|
22
34
|
<% if (['warning', 'critical', 'unknown'].include?(@check_state) and !@current_scheduled_maintenance) %>
|
23
35
|
<form action="/acknowledgements/<%= check_path_escaped %>" method="post" class="form-inline">
|
24
36
|
<input type="hidden" name="acknowledgement_id" value="<%= @acknowledgement_id %>">
|
@@ -31,18 +43,10 @@
|
|
31
43
|
e.g. "5 hours"
|
32
44
|
</form>
|
33
45
|
<% end %>
|
34
|
-
<% if @current_unscheduled_maintenance %>
|
35
|
-
<h3>(Acknowledged - <%= h @current_unscheduled_maintenance[:summary] %>)</h3>
|
36
|
-
<% start = Time.at(@current_unscheduled_maintenance[:start_time]) %>
|
37
|
-
<% finish = Time.at(@current_unscheduled_maintenance[:start_time] + @current_unscheduled_maintenance[:duration]) %>
|
38
|
-
<% remain = time_period_in_words( (finish - current_time).ceil ) %>
|
39
|
-
<p><%= h start.to_s %> -> <%= h finish.to_s %> (<%= h remain %> remaining)</p>
|
40
|
-
<form action="/end_unscheduled_maintenance/<%= check_path_escaped %>" method="post">
|
41
|
-
<input type="submit" value="End Unscheduled Maintenance (Unacknowledge)" class="button">
|
42
|
-
</form>
|
43
|
-
<% end %>
|
44
46
|
<% if @current_scheduled_maintenance %>
|
45
|
-
|
47
|
+
<% maint_msg = "#{@current_scheduled_maintenance[:summary]}" %>
|
48
|
+
<% maint_msg = maint_msg.length > 0 ? maint_msg : 'no summary given' %>
|
49
|
+
<h4>In <a href="#scheduled_maintenance_periods">Scheduled Maintenance</a> (<%= h maint_msg %>)</h4>
|
46
50
|
<% start = Time.at(@current_scheduled_maintenance[:start_time]) %>
|
47
51
|
<% finish = Time.at(@current_scheduled_maintenance[:start_time] + @current_scheduled_maintenance[:duration]) %>
|
48
52
|
<% remain = time_period_in_words( (finish - current_time).ceil ) %>
|
@@ -84,6 +88,7 @@
|
|
84
88
|
Disabled
|
85
89
|
<% end %>
|
86
90
|
|
91
|
+
<a name="scheduled_maintenance_periods"></a>
|
87
92
|
<h3>Scheduled Maintenance Periods</h3>
|
88
93
|
<% if @scheduled_maintenances && !@scheduled_maintenances.empty? %>
|
89
94
|
<table class="table table-bordered table-hover table-condensed">
|
@@ -15,6 +15,8 @@
|
|
15
15
|
<h2><%= h @contact.name %></h2>
|
16
16
|
</div>
|
17
17
|
|
18
|
+
<% alerting = {} %>
|
19
|
+
|
18
20
|
<h3>Contact Media</h3>
|
19
21
|
<% if !@contact.media || @contact.media.empty? %>
|
20
22
|
<p>No media</p>
|
@@ -24,9 +26,11 @@
|
|
24
26
|
<th>Media</th>
|
25
27
|
<th>Address</th>
|
26
28
|
<th>Interval</th>
|
27
|
-
<th>
|
29
|
+
<th>Summary Mode</th>
|
30
|
+
<th>Summary Threshold</th>
|
28
31
|
</tr>
|
29
32
|
<% @contact.media.each_pair do |mk, mv| %>
|
33
|
+
<% alerting[mk] = @contact.alerting_checks_for_media(mk) %>
|
30
34
|
<tr>
|
31
35
|
<% if 'pagerduty'.eql?(mk) %>
|
32
36
|
<td>PagerDuty</td>
|
@@ -35,31 +39,69 @@
|
|
35
39
|
<p><%= 'password'.eql?(pk) ? h("#{pk}: ...") : h("#{pk}: #{pv}") %></p>
|
36
40
|
<% end %>
|
37
41
|
</td>
|
42
|
+
<td></td>
|
43
|
+
<td></td>
|
44
|
+
<td></td>
|
38
45
|
<% else %>
|
39
46
|
<td><%= h mk.capitalize %></td>
|
40
47
|
<td><%= h mv %></td>
|
48
|
+
<td>
|
49
|
+
<% if @contact.media_intervals[mk] %>
|
50
|
+
<%= h @contact.media_intervals[mk] %> seconds
|
51
|
+
<% else %>
|
52
|
+
no custom interval
|
53
|
+
<% end %>
|
54
|
+
</td>
|
55
|
+
<td>
|
56
|
+
<% if alerting[mk].length >= @contact.media_rollup_thresholds[mk].to_i %>
|
57
|
+
Yes -
|
58
|
+
<% else %>
|
59
|
+
No -
|
60
|
+
<% end %>
|
61
|
+
<%= alerting[mk].length %> alerting
|
62
|
+
</td>
|
63
|
+
<td>
|
64
|
+
<% if @contact.media_rollup_thresholds[mk] %>
|
65
|
+
<%= h @contact.media_rollup_thresholds[mk] %>
|
66
|
+
<% else %>
|
67
|
+
-
|
68
|
+
<% end %>
|
69
|
+
</td>
|
41
70
|
<% end %>
|
71
|
+
</tr>
|
72
|
+
<% end %>
|
73
|
+
</table>
|
74
|
+
<% end %>
|
42
75
|
|
76
|
+
<h3>Alerting Checks</h3>
|
77
|
+
<p>These failing checks are currently alerting because they are not acknowledged, not in scheduled maintenance, and currently allowed by this contact's notification rules.</p>
|
78
|
+
|
79
|
+
<table class="table table-bordered table-hover table-condensed">
|
80
|
+
<tr>
|
81
|
+
<th>Media</th>
|
82
|
+
<th>Alerting Checks</th>
|
83
|
+
</tr>
|
84
|
+
<% alerting.each_pair do |media, checks| %>
|
85
|
+
<% if checks.length > 0 %>
|
86
|
+
<tr>
|
87
|
+
<td><%= h media.capitalize %></td>
|
43
88
|
<td>
|
44
|
-
<%
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
<td>
|
51
|
-
<% if @contact.media_rollup_thresholds[mk] %>
|
52
|
-
<%= h @contact.media_rollup_thresholds[mk] %> failing checks
|
53
|
-
<% else %>
|
54
|
-
-
|
89
|
+
<% checks.each do |entity_check| %>
|
90
|
+
<% entity, check = entity_check.split(':', 2) %>
|
91
|
+
<% check_link = "<a href=\"/check?entity=#{u(entity)}&check=#{u(check)}\" title=\"check status\">" +
|
92
|
+
h(check) + "</a>"%>
|
93
|
+
<a href="/entity/<%= u(entity) %>" title="entity status"><%= h entity %></a> ::
|
94
|
+
<%= check_link %> <br />
|
55
95
|
<% end %>
|
56
96
|
</td>
|
57
97
|
</tr>
|
98
|
+
<% else %>
|
99
|
+
<tr><td colspan="2">No alerting checks, yay!</td></tr>
|
58
100
|
<% end %>
|
59
|
-
|
60
|
-
|
101
|
+
<% end %>
|
102
|
+
</table>
|
61
103
|
|
62
|
-
<h3>Entities and Checks</h3>
|
104
|
+
<h3>All Entities and Checks</h3>
|
63
105
|
<% if !@entities_and_checks || @entities_and_checks.empty? %>
|
64
106
|
<p>No entities</p>
|
65
107
|
<% else %>
|
@@ -77,7 +119,7 @@
|
|
77
119
|
<td><a href="/entity/<%= u(entity.name) %>" title="entity status"><%= h entity.name %></a></td>
|
78
120
|
<td>
|
79
121
|
<% checks.each do |check| %>
|
80
|
-
|
122
|
+
<%= "<a href=\"/check?entity=#{u(entity.name)}&check=#{u(check)}\" title=\"check status\">#{ h check }</a>" %>
|
81
123
|
<% end %>
|
82
124
|
</td>
|
83
125
|
</tr>
|
@@ -15,76 +15,85 @@
|
|
15
15
|
<h2>Internal Statistics</h2>
|
16
16
|
</div>
|
17
17
|
|
18
|
-
<
|
19
|
-
<
|
20
|
-
<
|
21
|
-
<
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
</
|
63
|
-
<
|
64
|
-
<
|
65
|
-
<
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
18
|
+
<div class="row">
|
19
|
+
<div class="span5">
|
20
|
+
<h4>Global Statistics:</h4>
|
21
|
+
<table class="table table-bordered table-hover table-condensed">
|
22
|
+
<tr>
|
23
|
+
<td>Events queued:</td>
|
24
|
+
<td><%= h @events_queued %></td>
|
25
|
+
</tr>
|
26
|
+
<tr>
|
27
|
+
<td>Number of entities:</td>
|
28
|
+
<td><%= h @count_all_entities %></td>
|
29
|
+
</tr>
|
30
|
+
<tr>
|
31
|
+
<td>Number of failing entities:</td>
|
32
|
+
<td><%= h @count_failing_entities %></td>
|
33
|
+
</tr>
|
34
|
+
<tr>
|
35
|
+
<td>Number of checks:</td>
|
36
|
+
<td><%= h @count_all_checks %></td>
|
37
|
+
</tr>
|
38
|
+
<tr>
|
39
|
+
<td>Number of failing checks:</td>
|
40
|
+
<td><%= h @count_failing_checks %></td>
|
41
|
+
</tr>
|
42
|
+
<tr>
|
43
|
+
<td>Events processed (all time)</td>
|
44
|
+
<td>
|
45
|
+
<ul>
|
46
|
+
<li>all: <%= h @event_counters['all'] %> events</li>
|
47
|
+
<li>ok: <%= h @event_counters['ok'] %> events</li>
|
48
|
+
<li>failure: <%= h @event_counters['failure'] %> events</li>
|
49
|
+
<li>action: <%= h @event_counters['action'] %> events</li>
|
50
|
+
</ul>
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
<tr>
|
54
|
+
<td>Total keys in redis</td>
|
55
|
+
<td><%= h @dbsize %></td>
|
56
|
+
</tr>
|
57
|
+
<tr>
|
58
|
+
<td>Current time</td>
|
59
|
+
<td><%= h Time.now.to_s %></td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
</div>
|
63
|
+
<div class="span7">
|
64
|
+
<h4>Processor Instances:</h4>
|
65
|
+
<table class="table table-bordered table-hover">
|
66
|
+
<tr>
|
67
|
+
<th>Hostname</th>
|
68
|
+
<th>PID</th>
|
69
|
+
<th>Uptime</th>
|
70
|
+
<th>Events Processed</th>
|
71
|
+
</tr>
|
72
|
+
<% @executive_instances.sort_by {|i, d| d['uptime']}.each do |ei| %>
|
73
|
+
<%
|
74
|
+
instance_id, details = ei
|
75
|
+
hostname, pid = instance_id.split(':')
|
76
|
+
started = details['uptime_string']
|
77
|
+
event_counters = details['event_counters']
|
78
|
+
event_rates = details['event_rates']
|
79
|
+
%>
|
80
|
+
<tr>
|
81
|
+
<td><%= h hostname %></td>
|
82
|
+
<td><%= h pid %></td>
|
83
|
+
<td><%= h started %></td>
|
84
|
+
<td>
|
85
|
+
<ul>
|
86
|
+
<li>all: <%= h event_counters['all'] %> (<%= h event_rates['all'] %> events/s)</li>
|
87
|
+
<li>ok: <%= h event_counters['ok'] %> (<%= h event_rates['ok'] %> events/s)</li>
|
88
|
+
<li>failure: <%= h event_counters['failure'] %> (<%= h event_rates['failure'] %> events/s)</li>
|
89
|
+
<li>action: <%= h event_counters['action'] %> (<%= h event_rates['action'] %> events/s)</li>
|
90
|
+
</ul>
|
91
|
+
</td>
|
92
|
+
</tr>
|
93
|
+
<% end %>
|
94
|
+
</table>
|
95
|
+
</div>
|
96
|
+
</div>
|
88
97
|
|
89
98
|
<p><a href="/self_stats.json">Instrument as JSON</a></p>
|
90
99
|
</div>
|
@@ -94,4 +103,4 @@
|
|
94
103
|
<%= foot %>
|
95
104
|
</div>
|
96
105
|
</body>
|
97
|
-
</html>
|
106
|
+
</html>
|
data/lib/flapjack/notifier.rb
CHANGED
@@ -92,7 +92,7 @@ module Flapjack
|
|
92
92
|
|
93
93
|
timestamp = Time.now
|
94
94
|
event_id = notification.event_id
|
95
|
-
entity_check = Flapjack::Data::EntityCheck.for_event_id(event_id, :redis => @redis)
|
95
|
+
entity_check = Flapjack::Data::EntityCheck.for_event_id(event_id, :redis => @redis, :logger => @logger)
|
96
96
|
contacts = entity_check.contacts
|
97
97
|
|
98
98
|
if contacts.empty?
|
@@ -106,13 +106,16 @@ module Flapjack
|
|
106
106
|
|
107
107
|
notification_contents = notification.contents
|
108
108
|
|
109
|
+
in_unscheduled_maintenance = entity_check.in_scheduled_maintenance?
|
110
|
+
in_scheduled_maintenance = entity_check.in_unscheduled_maintenance?
|
111
|
+
|
109
112
|
messages.each do |message|
|
110
113
|
media_type = message.medium
|
111
114
|
address = message.address
|
112
115
|
contents = message.contents.merge(notification_contents)
|
113
116
|
|
114
117
|
if message.rollup
|
115
|
-
|
118
|
+
rollup_alerts = message.contact.alerting_checks_for_media(media_type).inject({}) do |memo, alert|
|
116
119
|
ec = Flapjack::Data::EntityCheck.for_event_id(alert, :redis => @redis)
|
117
120
|
last_change = ec.last_change
|
118
121
|
memo[alert] = {
|
@@ -121,7 +124,10 @@ module Flapjack
|
|
121
124
|
}
|
122
125
|
memo
|
123
126
|
end
|
127
|
+
contents['rollup_alerts'] = rollup_alerts
|
128
|
+
|
124
129
|
contents['rollup_threshold'] = message.contact.rollup_threshold_for_media(media_type)
|
130
|
+
|
125
131
|
end
|
126
132
|
|
127
133
|
@notifylog.info("#{event_id} | " +
|