flapjack 0.7.18 → 0.7.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. data/CHANGELOG.md +7 -0
  2. data/bin/flapjack +3 -0
  3. data/bin/flapjack-nagios-receiver +4 -1
  4. data/bin/flapjack-netsaint-parser +2 -1
  5. data/bin/flapjack-populator +6 -3
  6. data/bin/receive-events +3 -1
  7. data/bin/simulate-failed-check +2 -1
  8. data/etc/flapjack_config.yaml.example +20 -0
  9. data/features/events.feature +1 -1
  10. data/features/events_check_names.feature +1 -1
  11. data/features/notification_rules.feature +1 -1
  12. data/features/notifications.feature +1 -1
  13. data/features/steps/events_steps.rb +18 -17
  14. data/features/steps/flapjack-netsaint-parser_steps.rb +1 -2
  15. data/features/steps/notifications_steps.rb +14 -1
  16. data/features/support/env.rb +27 -10
  17. data/flapjack.gemspec +1 -3
  18. data/lib/flapjack/coordinator.rb +30 -20
  19. data/lib/flapjack/data/contact.rb +3 -2
  20. data/lib/flapjack/data/entity.rb +3 -3
  21. data/lib/flapjack/data/entity_check.rb +116 -43
  22. data/lib/flapjack/data/event.rb +10 -10
  23. data/lib/flapjack/data/message.rb +3 -6
  24. data/lib/flapjack/data/notification.rb +122 -57
  25. data/lib/flapjack/data/notification_rule.rb +11 -11
  26. data/lib/flapjack/filters/acknowledgement.rb +2 -2
  27. data/lib/flapjack/filters/ok.rb +1 -1
  28. data/lib/flapjack/gateways/api/entity_check_presenter.rb +1 -0
  29. data/lib/flapjack/gateways/api/entity_methods.rb +4 -6
  30. data/lib/flapjack/gateways/api/rack/json_params_parser.rb +1 -1
  31. data/lib/flapjack/gateways/email.rb +3 -5
  32. data/lib/flapjack/gateways/email/{alert.html.haml → alert.html.erb} +0 -0
  33. data/lib/flapjack/gateways/jabber.rb +66 -35
  34. data/lib/flapjack/gateways/oobetet.rb +5 -7
  35. data/lib/flapjack/gateways/pagerduty.rb +7 -7
  36. data/lib/flapjack/gateways/web.rb +101 -41
  37. data/lib/flapjack/gateways/web/public/css/flapjack.css +1 -1
  38. data/lib/flapjack/gateways/web/views/{_css.haml → _css.html.erb} +2 -1
  39. data/lib/flapjack/gateways/web/views/_foot.html.erb +3 -0
  40. data/lib/flapjack/gateways/web/views/_head.html.erb +4 -0
  41. data/lib/flapjack/gateways/web/views/_nav.html.erb +9 -0
  42. data/lib/flapjack/gateways/web/views/check.html.erb +204 -0
  43. data/lib/flapjack/gateways/web/views/checks.html.erb +77 -0
  44. data/lib/flapjack/gateways/web/views/contact.html.erb +114 -0
  45. data/lib/flapjack/gateways/web/views/contacts.html.erb +42 -0
  46. data/lib/flapjack/gateways/web/views/entities.html.erb +39 -0
  47. data/lib/flapjack/gateways/web/views/entity.html.erb +67 -0
  48. data/lib/flapjack/gateways/web/views/index.html.erb +27 -0
  49. data/lib/flapjack/gateways/web/views/self_stats.html.erb +97 -0
  50. data/lib/flapjack/logger.rb +71 -23
  51. data/lib/flapjack/notifier.rb +157 -0
  52. data/lib/flapjack/patches.rb +1 -41
  53. data/lib/flapjack/pikelet.rb +4 -2
  54. data/lib/flapjack/{executive.rb → processor.rb} +32 -145
  55. data/lib/flapjack/version.rb +1 -1
  56. data/spec/lib/flapjack/coordinator_spec.rb +134 -71
  57. data/spec/lib/flapjack/data/contact_spec.rb +1 -0
  58. data/spec/lib/flapjack/data/entity_check_spec.rb +146 -30
  59. data/spec/lib/flapjack/data/entity_spec.rb +4 -4
  60. data/spec/lib/flapjack/data/event_spec.rb +4 -4
  61. data/spec/lib/flapjack/data/message_spec.rb +2 -3
  62. data/spec/lib/flapjack/data/notification_spec.rb +13 -19
  63. data/spec/lib/flapjack/gateways/api/entity_methods_spec.rb +2 -2
  64. data/spec/lib/flapjack/gateways/jabber_spec.rb +34 -0
  65. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -2
  66. data/spec/lib/flapjack/gateways/web/views/{check.haml_spec.rb → check.html.erb_spec.rb} +2 -2
  67. data/spec/lib/flapjack/gateways/web/views/{contact.haml_spec.rb → contact.html.erb_spec.rb} +3 -3
  68. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +14 -0
  69. data/spec/lib/flapjack/gateways/web_spec.rb +20 -8
  70. data/spec/lib/flapjack/logger_spec.rb +30 -28
  71. data/spec/lib/flapjack/notifier_spec.rb +6 -0
  72. data/spec/lib/flapjack/pikelet_spec.rb +8 -8
  73. data/spec/lib/flapjack/{executive_spec.rb → processor_spec.rb} +4 -4
  74. data/spec/spec_helper.rb +1 -13
  75. data/spec/support/erb_view_helper.rb +23 -0
  76. data/tasks/profile.rake +1 -1
  77. data/tmp/acknowledge.rb +3 -1
  78. data/tmp/create_event_ok.rb +3 -1
  79. data/tmp/create_event_unknown.rb +3 -1
  80. data/tmp/create_events_failure.rb +3 -1
  81. data/tmp/create_events_ok.rb +3 -1
  82. data/tmp/create_events_ok_fail_ack_ok.rb +3 -1
  83. data/tmp/create_events_ok_failure.rb +3 -1
  84. data/tmp/create_events_ok_failure_ack.rb +3 -1
  85. data/tmp/test_json_post.rb +5 -3
  86. data/tmp/test_notification_rules_api.rb +5 -3
  87. metadata +32 -61
  88. data/lib/flapjack/gateways/web/views/_foot.haml +0 -8
  89. data/lib/flapjack/gateways/web/views/_head.haml +0 -10
  90. data/lib/flapjack/gateways/web/views/_nav.haml +0 -14
  91. data/lib/flapjack/gateways/web/views/check.haml +0 -191
  92. data/lib/flapjack/gateways/web/views/checks.haml +0 -49
  93. data/lib/flapjack/gateways/web/views/contact.haml +0 -85
  94. data/lib/flapjack/gateways/web/views/contacts.haml +0 -30
  95. data/lib/flapjack/gateways/web/views/entities.haml +0 -28
  96. data/lib/flapjack/gateways/web/views/entity.haml +0 -50
  97. data/lib/flapjack/gateways/web/views/index.haml +0 -32
  98. data/lib/flapjack/gateways/web/views/self_stats.haml +0 -70
  99. data/spec/lib/flapjack/gateways/web/views/index.haml_spec.rb +0 -13
  100. data/spec/support/haml_view_helper.rb +0 -15
@@ -1,85 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - #{@contact.name} (contact)
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2= @contact.name
15
- %h3= "Contact Media"
16
- - if @contact.media && !@contact.media.empty?
17
- %table{:class => "table table-bordered table-hover table-condensed"}
18
- %tr
19
- %th Media
20
- %th Address
21
- %th Interval
22
- - @contact.media.each_pair do |mk, mv|
23
- %tr
24
- - if 'pagerduty'.eql?(mk)
25
- %td PagerDuty
26
- %td
27
- - @pagerduty_credentials.each_pair do |pk, pv|
28
- - if 'password'.eql?(pk)
29
- %p= "#{pk}: ..."
30
- - else
31
- %p= "#{pk}: #{pv}"
32
- %td -
33
- - else
34
- %td #{mk.capitalize}
35
- %td #{mv}
36
- %td
37
- - if interval = @contact.media_intervals[mk]
38
- #{@contact.media_intervals[mk]} seconds
39
- - else
40
- no custom interval
41
- - else
42
- %p No media
43
- %h3= "Entities and Checks"
44
- - if @entities_and_checks && !@entities_and_checks.empty?
45
- %table{:class => "table table-bordered table-hover table-condensed"}
46
- %tr
47
- %th Entity
48
- %th Checks
49
- - @entities_and_checks.each do |ec|
50
- - entity = ec[:entity]
51
- - checks = ec[:checks]
52
- %tr
53
- %td
54
- - link = "/entity/#{CGI.escape(entity.name)}"
55
- %a(title='entity status' href=link) #{entity.name}
56
- %td
57
- - checks.each do |check|
58
- - link = "/check?entity=#{CGI.escape(entity.name)}&check=#{CGI.escape(check)}"
59
- %a(title='check status' href=link) #{check}
60
- - else
61
- %p No entities
62
- %h3= "Notification Rules"
63
- - rules = @contact.notification_rules
64
- - if rules && rules.length > 0
65
- %table{:class => "table table-bordered table-hover table-condensed"}
66
- %tr
67
- %th ID
68
- %th Entities
69
- %th Entity Tags
70
- %th Warning Media
71
- %th Critical Media
72
- %th Time Restrictions
73
- - rules.each do |r|
74
- %tr
75
- %td #{r.id}
76
- %td #{r.entities.join(', ')}
77
- %td #{r.entity_tags ? r.entity_tags.join(', ') : ''}
78
- %td #{r.warning_media.join(', ')}
79
- %td #{r.critical_media.join(', ')}
80
- %td #{r.time_restrictions}
81
- - else
82
- %p No notification rules
83
- %div#push
84
- %div#footer
85
- = foot
@@ -1,30 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - Contacts
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2 Contacts
15
- - if @contacts && !@contacts.empty?
16
- %table{:class => "table table-bordered table-hover table-condensed"}
17
- %tr
18
- %th Name
19
- %th Email
20
- - @contacts.sort_by {|c| [c.first_name, c.last_name] }.each do |contact|
21
- %tr
22
- %td
23
- - link = "/contacts/#{contact.id}"
24
- %a(title='contact details' href=link) #{contact.name}
25
- %td= contact.email
26
- - else
27
- %p No contacts
28
- %div#push
29
- %div#footer
30
- = foot
@@ -1,28 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - #{@adjective.capitalize} Entities
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2 #{@adjective.capitalize} Entities
15
- %p #{@count_failing_entities} failing out of #{@count_all_entities}
16
- %table{:class => "table table-bordered table-hover table-condensed"}
17
- - if @entities.length > 0
18
- - @entities.sort.each do |entity|
19
- %tr
20
- %td
21
- - link = "/entity/#{CGI.escape(entity)}"
22
- %a{:href => link}
23
- #{entity}
24
- - else
25
- %p No check output has been processed yet, so there's no entities we can show you here.
26
- %div#push
27
- %div#footer
28
- = foot
@@ -1,50 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - #{@entity} (entity)
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2 #{@entity}
15
- - if @states.length > 0
16
- %table{:class => "table table-bordered table-hover table-condensed"}
17
- %tr
18
- %th Check
19
- %th State
20
- %th Last State Change
21
- %th Last Update
22
- %th Last Notification
23
- - @states.each do |entity, check, status, changed, updated, in_unscheduled_outage, in_scheduled_outage, notified_kind, notified|
24
- - colour_class = status
25
- - case status
26
- - when 'critical', 'unknown'
27
- - colour_class = 'error'
28
- - when 'ok', 'up'
29
- - colour_class = 'success'
30
- %tr{:class => colour_class}
31
- %td
32
- - link = "/check?entity=" + CGI.escape(entity) + "&check=" + CGI.escape(check)
33
- %a(title='check detail' href=link) #{check}
34
- %td
35
- = status.upcase
36
- = " (Acknowledged)" if in_unscheduled_outage
37
- = " (Scheduled Maintenance)" if in_scheduled_outage
38
- %td= relative_time_ago(Time.at(changed.to_i)) + ' ago'
39
- %td= relative_time_ago(Time.at(updated.to_i)) + ' ago'
40
- - if notified && (notified > 0)
41
- - last_notified = relative_time_ago(Time.at(notified.to_i)) + " ago, #{notified_kind}"
42
- - else
43
- - last_notified = 'never'
44
- %td= last_notified
45
- - else
46
- %div#foo
47
- %p This entity has no check output associated with it
48
- %div#push
49
- %div#footer
50
- = foot
@@ -1,32 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - Summary
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2 Summary
15
- %h4
16
- %a(title='failing entities' href='/entities_failing')
17
- #{@count_failing_entities}
18
- out of
19
- %a(title='all entities' href='/entities_all')
20
- #{@count_all_entities}
21
- entities have failing checks
22
- %h4
23
- %a(title='failing checks' href='/checks_failing')
24
- #{@count_failing_checks}
25
- out of
26
- %a(title='all checks' href='/checks_all')
27
- #{@count_all_checks}
28
- checks are failing
29
- %img{:src => '/img/flapjack_white_bg_400_353.jpeg', :height => 353, :width => 400}
30
- %div#push
31
- %div#footer
32
- = foot
@@ -1,70 +0,0 @@
1
- !!! 5
2
- - nav = render_haml('_nav.haml', self)
3
- - head = render_haml('_head.haml', self)
4
- - foot = render_haml('_foot.haml', self)
5
- %html
6
- %head
7
- %title Flapjack - Internal Statistics
8
- = head
9
- %body
10
- %div#wrap
11
- %div{:class => "container"}
12
- %div{:class => "page-header"}
13
- = nav
14
- %h2 Internal Statistics
15
- %table{:class => "table table-bordered table-hover table-condensed"}
16
- %tr
17
- %td Events queued:
18
- %td= @events_queued
19
- %tr
20
- %td Number of entities:
21
- %td= @count_all_entities
22
- %tr
23
- %td Number of failing entities:
24
- %td= @count_failing_entities
25
- %tr
26
- %td Number of checks:
27
- %td= @count_all_checks
28
- %tr
29
- %td Number of failing checks:
30
- %td= @count_failing_checks
31
- %tr
32
- %td Events processed (all time)
33
- %td #{@event_counters['all']} (ok: #{@event_counters['ok']}, failure: #{@event_counters['failure']}, action: #{@event_counters['action']})
34
- %tr
35
- %td Events processed (this instance)
36
- %td #{@event_counters_instance['all']} (ok: #{@event_counters_instance['ok']}, failure: #{@event_counters_instance['failure']}, action: #{@event_counters_instance['action']})
37
- %tr
38
- %td Average rate (this instance)
39
- %td #{@event_rate_all} events per second
40
- %tr
41
- %td Total keys in redis
42
- %td #{@dbsize}
43
- %tr
44
- %td Uptime
45
- %td= @uptime_string
46
- %tr
47
- %td Boot time
48
- %td= @boot_time
49
- %tr
50
- %td Current time
51
- %td= Time.now
52
- %h4
53
- Executive Instances:
54
- %table{:class => "table table-bordered table-hover"}
55
- %tr
56
- %th Hostname
57
- %th PID
58
- %th Started
59
- - @executive_instances.each do |i|
60
- - hostname, pid = i[0].split(':')
61
- - started = "#{relative_time_ago(Time.at(i[1].to_i))} ago"
62
- %tr
63
- %td= hostname
64
- %td= pid
65
- %td= started
66
- %p
67
- %a{:href => 'self_stats.json'} Instrument as JSON
68
- %div#push
69
- %div#footer
70
- = foot
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'web/views/checks.haml', :haml_view => true do
4
-
5
- it "should escape unsafe check characters in URI parameters" do
6
- @states = [['abc-xyz-01', 'Disk / Utilisation', '-', '-', '-', false, false, nil, nil]]
7
- @adjective = "all"
8
-
9
- page = render_haml('checks.haml', self)
10
- page.should match(%r{\?entity=abc-xyz-01&check=Disk\+%2F\+Utilisation})
11
- end
12
-
13
- end
@@ -1,15 +0,0 @@
1
- require 'haml'
2
- require 'flapjack/utility'
3
-
4
- module HamlViewHelper
5
-
6
- TEMPLATE_PATH = File.dirname(__FILE__) +
7
- '/../../lib/flapjack/gateways/web/views/'
8
-
9
- include Flapjack::Utility
10
-
11
- def render_haml(file, scope)
12
- Haml::Engine.new(File.read(TEMPLATE_PATH + file)).render(scope)
13
- end
14
-
15
- end