flapjack 1.6.0 → 2.0.0b1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -6
- data/.gitmodules +1 -1
- data/.rspec +1 -1
- data/.ruby-version +1 -1
- data/.travis.yml +12 -13
- data/CHANGELOG.md +2 -9
- data/CONTRIBUTING.md +7 -2
- data/Gemfile +4 -13
- data/LICENCE +1 -0
- data/README.md +8 -2
- data/Rakefile +2 -2
- data/bin/flapjack +3 -12
- data/build.sh +4 -2
- data/etc/flapjack_config.toml.example +273 -0
- data/features/ack_after_sched_maint.feature +18 -21
- data/features/cli.feature +11 -71
- data/features/cli_flapjack-feed-events.feature +14 -15
- data/features/cli_flapjack-nagios-receiver.feature +12 -41
- data/features/cli_flapper.feature +12 -41
- data/features/cli_purge.feature +5 -6
- data/features/cli_receive-events.feature +6 -7
- data/features/cli_simulate-failed-check.feature +5 -6
- data/features/events.feature +206 -181
- data/features/events_check_names.feature +4 -7
- data/features/notification_rules.feature +144 -223
- data/features/notifications.feature +65 -57
- data/features/rollup.feature +45 -47
- data/features/steps/cli_steps.rb +4 -5
- data/features/steps/events_steps.rb +163 -373
- data/features/steps/notifications_steps.rb +408 -264
- data/features/steps/packaging-lintian_steps.rb +0 -4
- data/features/steps/time_travel_steps.rb +0 -26
- data/features/support/daemons.rb +6 -31
- data/features/support/env.rb +65 -74
- data/flapjack.gemspec +22 -24
- data/lib/flapjack.rb +14 -7
- data/lib/flapjack/cli/flapper.rb +74 -173
- data/lib/flapjack/cli/maintenance.rb +278 -109
- data/lib/flapjack/cli/migrate.rb +950 -0
- data/lib/flapjack/cli/purge.rb +19 -22
- data/lib/flapjack/cli/receiver.rb +150 -326
- data/lib/flapjack/cli/server.rb +8 -235
- data/lib/flapjack/cli/simulate.rb +42 -57
- data/lib/flapjack/configuration.rb +51 -37
- data/lib/flapjack/coordinator.rb +138 -129
- data/lib/flapjack/data/acknowledgement.rb +177 -0
- data/lib/flapjack/data/alert.rb +97 -158
- data/lib/flapjack/data/check.rb +611 -0
- data/lib/flapjack/data/condition.rb +70 -0
- data/lib/flapjack/data/contact.rb +226 -456
- data/lib/flapjack/data/event.rb +96 -184
- data/lib/flapjack/data/extensions/associations.rb +59 -0
- data/lib/flapjack/data/extensions/short_name.rb +25 -0
- data/lib/flapjack/data/medium.rb +428 -0
- data/lib/flapjack/data/metrics.rb +194 -0
- data/lib/flapjack/data/notification.rb +22 -281
- data/lib/flapjack/data/rule.rb +473 -0
- data/lib/flapjack/data/scheduled_maintenance.rb +244 -0
- data/lib/flapjack/data/state.rb +221 -0
- data/lib/flapjack/data/statistic.rb +112 -0
- data/lib/flapjack/data/tag.rb +277 -0
- data/lib/flapjack/data/test_notification.rb +182 -0
- data/lib/flapjack/data/unscheduled_maintenance.rb +159 -0
- data/lib/flapjack/data/validators/id_validator.rb +20 -0
- data/lib/flapjack/exceptions.rb +6 -0
- data/lib/flapjack/filters/acknowledgement.rb +23 -16
- data/lib/flapjack/filters/base.rb +0 -5
- data/lib/flapjack/filters/delays.rb +53 -43
- data/lib/flapjack/filters/ok.rb +23 -14
- data/lib/flapjack/filters/scheduled_maintenance.rb +3 -3
- data/lib/flapjack/filters/unscheduled_maintenance.rb +12 -3
- data/lib/flapjack/gateways/aws_sns.rb +65 -49
- data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -2
- data/lib/flapjack/gateways/aws_sns/alert_subject.text.erb +2 -2
- data/lib/flapjack/gateways/aws_sns/rollup_subject.text.erb +1 -1
- data/lib/flapjack/gateways/email.rb +107 -90
- data/lib/flapjack/gateways/email/alert.html.erb +19 -18
- data/lib/flapjack/gateways/email/alert.text.erb +20 -14
- data/lib/flapjack/gateways/email/alert_subject.text.erb +2 -1
- data/lib/flapjack/gateways/email/rollup.html.erb +14 -13
- data/lib/flapjack/gateways/email/rollup.text.erb +13 -10
- data/lib/flapjack/gateways/jabber.rb +679 -671
- data/lib/flapjack/gateways/jabber/alert.text.erb +9 -6
- data/lib/flapjack/gateways/jsonapi.rb +164 -350
- data/lib/flapjack/gateways/jsonapi/data/join_descriptor.rb +44 -0
- data/lib/flapjack/gateways/jsonapi/data/method_descriptor.rb +21 -0
- data/lib/flapjack/gateways/jsonapi/helpers/headers.rb +63 -0
- data/lib/flapjack/gateways/jsonapi/helpers/miscellaneous.rb +136 -0
- data/lib/flapjack/gateways/jsonapi/helpers/resources.rb +227 -0
- data/lib/flapjack/gateways/jsonapi/helpers/serialiser.rb +313 -0
- data/lib/flapjack/gateways/jsonapi/helpers/swagger_docs.rb +322 -0
- data/lib/flapjack/gateways/jsonapi/methods/association_delete.rb +115 -0
- data/lib/flapjack/gateways/jsonapi/methods/association_get.rb +288 -0
- data/lib/flapjack/gateways/jsonapi/methods/association_patch.rb +178 -0
- data/lib/flapjack/gateways/jsonapi/methods/association_post.rb +116 -0
- data/lib/flapjack/gateways/jsonapi/methods/metrics.rb +71 -0
- data/lib/flapjack/gateways/jsonapi/methods/resource_delete.rb +119 -0
- data/lib/flapjack/gateways/jsonapi/methods/resource_get.rb +186 -0
- data/lib/flapjack/gateways/jsonapi/methods/resource_patch.rb +239 -0
- data/lib/flapjack/gateways/jsonapi/methods/resource_post.rb +197 -0
- data/lib/flapjack/gateways/jsonapi/middleware/array_param_fixer.rb +27 -0
- data/lib/flapjack/gateways/jsonapi/{rack → middleware}/json_params_parser.rb +7 -6
- data/lib/flapjack/gateways/jsonapi/middleware/request_timestamp.rb +18 -0
- data/lib/flapjack/gateways/oobetet.rb +222 -170
- data/lib/flapjack/gateways/pager_duty.rb +388 -0
- data/lib/flapjack/gateways/pager_duty/alert.text.erb +13 -0
- data/lib/flapjack/gateways/slack.rb +56 -48
- data/lib/flapjack/gateways/slack/alert.text.erb +1 -1
- data/lib/flapjack/gateways/slack/rollup.text.erb +1 -1
- data/lib/flapjack/gateways/sms_aspsms.rb +155 -0
- data/lib/flapjack/gateways/sms_aspsms/alert.text.erb +7 -0
- data/lib/flapjack/gateways/sms_aspsms/rollup.text.erb +2 -0
- data/lib/flapjack/gateways/sms_messagenet.rb +77 -57
- data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +3 -2
- data/lib/flapjack/gateways/sms_nexmo.rb +53 -51
- data/lib/flapjack/gateways/sms_nexmo/alert.text.erb +2 -2
- data/lib/flapjack/gateways/sms_nexmo/rollup.text.erb +1 -1
- data/lib/flapjack/gateways/sms_twilio.rb +79 -62
- data/lib/flapjack/gateways/sms_twilio/alert.text.erb +3 -2
- data/lib/flapjack/gateways/web.rb +437 -345
- data/lib/flapjack/gateways/web/middleware/request_timestamp.rb +18 -0
- data/lib/flapjack/gateways/web/public/css/bootstrap.css +3793 -4340
- data/lib/flapjack/gateways/web/public/css/bootstrap.css.map +1 -0
- data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.svg +273 -214
- data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/flapjack/gateways/web/public/js/bootstrap.js +1637 -1607
- data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -2
- data/lib/flapjack/gateways/web/views/_pagination.html.erb +19 -0
- data/lib/flapjack/gateways/web/views/check.html.erb +159 -121
- data/lib/flapjack/gateways/web/views/checks.html.erb +82 -41
- data/lib/flapjack/gateways/web/views/contact.html.erb +59 -71
- data/lib/flapjack/gateways/web/views/contacts.html.erb +32 -8
- data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
- data/lib/flapjack/gateways/web/views/{layout.erb → layout.html.erb} +7 -23
- data/lib/flapjack/gateways/web/views/self_stats.html.erb +32 -33
- data/lib/flapjack/gateways/web/views/tag.html.erb +32 -0
- data/lib/flapjack/gateways/web/views/tags.html.erb +51 -0
- data/lib/flapjack/logger.rb +34 -3
- data/lib/flapjack/notifier.rb +180 -112
- data/lib/flapjack/patches.rb +8 -63
- data/lib/flapjack/pikelet.rb +185 -143
- data/lib/flapjack/processor.rb +323 -191
- data/lib/flapjack/record_queue.rb +33 -0
- data/lib/flapjack/redis_proxy.rb +66 -0
- data/lib/flapjack/utility.rb +21 -15
- data/lib/flapjack/version.rb +2 -1
- data/libexec/httpbroker.go +218 -14
- data/libexec/oneoff.go +13 -10
- data/spec/lib/flapjack/configuration_spec.rb +286 -0
- data/spec/lib/flapjack/coordinator_spec.rb +103 -157
- data/spec/lib/flapjack/data/check_spec.rb +175 -0
- data/spec/lib/flapjack/data/contact_spec.rb +26 -349
- data/spec/lib/flapjack/data/event_spec.rb +76 -291
- data/spec/lib/flapjack/data/medium_spec.rb +19 -0
- data/spec/lib/flapjack/data/rule_spec.rb +43 -0
- data/spec/lib/flapjack/data/scheduled_maintenance_spec.rb +976 -0
- data/spec/lib/flapjack/data/unscheduled_maintenance_spec.rb +34 -0
- data/spec/lib/flapjack/gateways/aws_sns_spec.rb +111 -60
- data/spec/lib/flapjack/gateways/email_spec.rb +194 -161
- data/spec/lib/flapjack/gateways/jabber_spec.rb +961 -162
- data/spec/lib/flapjack/gateways/jsonapi/methods/check_links_spec.rb +155 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/checks_spec.rb +426 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/contact_links_spec.rb +217 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/contacts_spec.rb +425 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/events_spec.rb +271 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/media_spec.rb +257 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/medium_links_spec.rb +163 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/metrics_spec.rb +8 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/rule_links_spec.rb +212 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/rules_spec.rb +289 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenance_links_spec.rb +49 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenances_spec.rb +242 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/tag_links_spec.rb +274 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/tags_spec.rb +302 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenance_links_spec.rb +49 -0
- data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenances_spec.rb +339 -0
- data/spec/lib/flapjack/gateways/jsonapi_spec.rb +1 -1
- data/spec/lib/flapjack/gateways/oobetet_spec.rb +151 -79
- data/spec/lib/flapjack/gateways/pager_duty_spec.rb +353 -0
- data/spec/lib/flapjack/gateways/slack_spec.rb +53 -53
- data/spec/lib/flapjack/gateways/sms_aspsms_spec.rb +106 -0
- data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +111 -54
- data/spec/lib/flapjack/gateways/sms_nexmo_spec.rb +50 -51
- data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +108 -48
- data/spec/lib/flapjack/gateways/web_spec.rb +144 -216
- data/spec/lib/flapjack/notifier_spec.rb +132 -1
- data/spec/lib/flapjack/pikelet_spec.rb +111 -50
- data/spec/lib/flapjack/processor_spec.rb +210 -40
- data/spec/lib/flapjack/redis_proxy_spec.rb +45 -0
- data/spec/lib/flapjack/utility_spec.rb +11 -15
- data/spec/service_consumers/fixture_data.rb +547 -0
- data/spec/service_consumers/pact_helper.rb +21 -32
- data/spec/service_consumers/pacts/flapjack-diner_v2.0.json +4652 -0
- data/spec/service_consumers/provider_states_for_flapjack-diner.rb +279 -322
- data/spec/service_consumers/provider_support.rb +8 -0
- data/spec/spec_helper.rb +34 -44
- data/spec/support/erb_view_helper.rb +1 -1
- data/spec/support/factories.rb +58 -0
- data/spec/support/jsonapi_helper.rb +15 -26
- data/spec/support/mock_logger.rb +43 -0
- data/spec/support/xmpp_comparable.rb +24 -0
- data/src/flapjack/transport_test.go +30 -1
- data/tasks/dump_keys.rake +82 -0
- data/tasks/events.rake +7 -7
- data/tasks/support/flapjack_config_benchmark.toml +28 -0
- data/tasks/support/flapjack_config_benchmark.yaml +0 -2
- metadata +175 -222
- data/Guardfile +0 -14
- data/etc/flapjack_config.yaml.example +0 -477
- data/features/cli_flapjack-populator.feature +0 -90
- data/features/support/silent_system.rb +0 -4
- data/lib/flapjack/cli/import.rb +0 -108
- data/lib/flapjack/data/entity.rb +0 -652
- data/lib/flapjack/data/entity_check.rb +0 -1044
- data/lib/flapjack/data/message.rb +0 -56
- data/lib/flapjack/data/migration.rb +0 -234
- data/lib/flapjack/data/notification_rule.rb +0 -425
- data/lib/flapjack/data/semaphore.rb +0 -44
- data/lib/flapjack/data/tagged.rb +0 -48
- data/lib/flapjack/gateways/jsonapi/check_methods.rb +0 -206
- data/lib/flapjack/gateways/jsonapi/check_presenter.rb +0 -221
- data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -186
- data/lib/flapjack/gateways/jsonapi/entity_methods.rb +0 -223
- data/lib/flapjack/gateways/jsonapi/medium_methods.rb +0 -185
- data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +0 -132
- data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +0 -141
- data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +0 -139
- data/lib/flapjack/gateways/jsonapi/report_methods.rb +0 -146
- data/lib/flapjack/gateways/pagerduty.rb +0 -318
- data/lib/flapjack/gateways/pagerduty/alert.text.erb +0 -10
- data/lib/flapjack/gateways/web/public/css/select2-bootstrap.css +0 -87
- data/lib/flapjack/gateways/web/public/css/select2.css +0 -615
- data/lib/flapjack/gateways/web/public/css/tablesort.css +0 -67
- data/lib/flapjack/gateways/web/public/img/select2-spinner.gif +0 -0
- data/lib/flapjack/gateways/web/public/img/select2.png +0 -0
- data/lib/flapjack/gateways/web/public/img/select2x2.png +0 -0
- data/lib/flapjack/gateways/web/public/js/backbone.js +0 -1581
- data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +0 -322
- data/lib/flapjack/gateways/web/public/js/flapjack.js +0 -82
- data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.js +0 -1640
- data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.widgets.js +0 -1390
- data/lib/flapjack/gateways/web/public/js/modules/contact.js +0 -520
- data/lib/flapjack/gateways/web/public/js/modules/entity.js +0 -28
- data/lib/flapjack/gateways/web/public/js/modules/medium.js +0 -40
- data/lib/flapjack/gateways/web/public/js/select2.js +0 -3397
- data/lib/flapjack/gateways/web/public/js/tablesort.js +0 -44
- data/lib/flapjack/gateways/web/public/js/underscore.js +0 -1276
- data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +0 -173
- data/lib/flapjack/gateways/web/views/entities.html.erb +0 -30
- data/lib/flapjack/gateways/web/views/entity.html.erb +0 -51
- data/lib/flapjack/rack_logger.rb +0 -47
- data/lib/flapjack/redis_pool.rb +0 -42
- data/spec/lib/flapjack/data/entity_check_spec.rb +0 -1418
- data/spec/lib/flapjack/data/entity_spec.rb +0 -872
- data/spec/lib/flapjack/data/message_spec.rb +0 -30
- data/spec/lib/flapjack/data/migration_spec.rb +0 -104
- data/spec/lib/flapjack/data/notification_rule_spec.rb +0 -232
- data/spec/lib/flapjack/data/notification_spec.rb +0 -53
- data/spec/lib/flapjack/data/semaphore_spec.rb +0 -24
- data/spec/lib/flapjack/filters/acknowledgement_spec.rb +0 -6
- data/spec/lib/flapjack/filters/delays_spec.rb +0 -6
- data/spec/lib/flapjack/filters/ok_spec.rb +0 -6
- data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +0 -6
- data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +0 -6
- data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +0 -315
- data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +0 -223
- data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +0 -131
- data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +0 -389
- data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +0 -231
- data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +0 -169
- data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +0 -114
- data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +0 -590
- data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -249
- data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +0 -21
- data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +0 -24
- data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +0 -16
- data/spec/lib/flapjack/redis_pool_spec.rb +0 -29
- data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +0 -4702
- data/tasks/entities.rake +0 -151
- data/tasks/profile.rake +0 -282
- data/tmp/acknowledge.rb +0 -13
- data/tmp/create_config_yaml.rb +0 -16
- data/tmp/create_event_ok.rb +0 -30
- data/tmp/create_event_unknown.rb +0 -30
- data/tmp/create_events_failure.rb +0 -34
- data/tmp/create_events_ok.rb +0 -32
- data/tmp/create_events_ok_fail_ack_ok.rb +0 -53
- data/tmp/create_events_ok_failure.rb +0 -41
- data/tmp/create_events_ok_failure_ack.rb +0 -53
- data/tmp/dummy_contacts.json +0 -43
- data/tmp/dummy_entities.json +0 -37
- data/tmp/generate_nagios_test_hosts.rb +0 -16
- data/tmp/notification_rules.rb +0 -73
- data/tmp/parse_config_yaml.rb +0 -7
- data/tmp/redis_find_spurious_unknown_states.rb +0 -52
- data/tmp/test_json_post.rb +0 -19
- data/tmp/test_notification_rules_api.rb +0 -171
@@ -38,41 +38,41 @@
|
|
38
38
|
<table class="table table-bordered table-hover table-condensed">
|
39
39
|
<tr>
|
40
40
|
<td>Events queued:</td>
|
41
|
-
<td><%= h @
|
42
|
-
</tr>
|
43
|
-
<tr>
|
44
|
-
<td>Number of enabled entities:</td>
|
45
|
-
<td><%= h @count_current_entities %></td>
|
46
|
-
</tr>
|
47
|
-
<tr>
|
48
|
-
<td>Number of failing entities:</td>
|
49
|
-
<td><%= h @count_failing_entities %></td>
|
41
|
+
<td><%= h @metrics[:event_queue_length] %></td>
|
50
42
|
</tr>
|
51
43
|
<tr>
|
52
44
|
<td>Number of enabled checks:</td>
|
53
|
-
<td><%= h @
|
45
|
+
<td><%= h @metrics[:check_counts][:enabled] %></td>
|
54
46
|
</tr>
|
55
47
|
<tr>
|
56
48
|
<td>Number of failing checks:</td>
|
57
|
-
<td><%= h @
|
49
|
+
<td><%= h @metrics[:check_counts][:failing] %></td>
|
58
50
|
</tr>
|
59
51
|
<tr>
|
60
|
-
<td>
|
61
|
-
<td>
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
52
|
+
<td>Number of disabled checks:</td>
|
53
|
+
<td><%= h @metrics[:check_counts][:all] - @metrics[:check_counts][:enabled] %></td>
|
54
|
+
</tr>
|
55
|
+
<tr>
|
56
|
+
<% if @global_stats.nil? %>
|
57
|
+
<td colspan="2">No statistics found.</td>
|
58
|
+
<% else %>
|
59
|
+
<td>Events processed (all time)</td>
|
60
|
+
<td>
|
61
|
+
<ul>
|
62
|
+
<li>all: <%= h @global_stats[:all_events] %> events</li>
|
63
|
+
<li>ok: <%= h @global_stats[:ok_events] %> events</li>
|
64
|
+
<li>failure: <%= h @global_stats[:failure_events] %> events</li>
|
65
|
+
<li>action: <%= h @global_stats[:action_events] %> events</li>
|
66
|
+
<li>invalid: <%= h @global_stats[:invalid_events] %> events</li>
|
67
|
+
</ul>
|
68
|
+
</td>
|
69
|
+
<% end %>
|
70
70
|
</tr>
|
71
71
|
<tr>
|
72
72
|
<td>Check Freshness</td>
|
73
73
|
<td>
|
74
74
|
<ul>
|
75
|
-
<% @
|
75
|
+
<% @metrics[:check_freshness].each_pair do |age, check_count| %>
|
76
76
|
<li>>= <%= h age %>: <%= h check_count %></li>
|
77
77
|
<% end %>
|
78
78
|
</ul>
|
@@ -80,7 +80,7 @@
|
|
80
80
|
</tr>
|
81
81
|
<tr>
|
82
82
|
<td>Total keys in redis</td>
|
83
|
-
<td><%= h @
|
83
|
+
<td><%= h @metrics[:total_keys] %></td>
|
84
84
|
</tr>
|
85
85
|
<tr>
|
86
86
|
<td>Current time</td>
|
@@ -97,13 +97,12 @@
|
|
97
97
|
<th>Uptime</th>
|
98
98
|
<th>Events Processed</th>
|
99
99
|
</tr>
|
100
|
-
<% @executive_instances.sort_by {|i, d| d[
|
100
|
+
<% @executive_instances.sort_by {|i, d| d[:uptime]}.each do |ei| %>
|
101
101
|
<%
|
102
102
|
instance_id, details = ei
|
103
103
|
hostname, pid = instance_id.split(':')
|
104
|
-
started = details[
|
105
|
-
|
106
|
-
event_rates = details['event_rates']
|
104
|
+
started = details[:uptime_string]
|
105
|
+
event_rates = details[:event_rates]
|
107
106
|
%>
|
108
107
|
<tr>
|
109
108
|
<td><%= h hostname %></td>
|
@@ -111,11 +110,11 @@
|
|
111
110
|
<td><%= h started %></td>
|
112
111
|
<td>
|
113
112
|
<ul>
|
114
|
-
<li>all: <%= h
|
115
|
-
<li>ok: <%= h
|
116
|
-
<li>failure: <%= h
|
117
|
-
<li>action: <%= h
|
118
|
-
<li>invalid: <%= h
|
113
|
+
<li>all: <%= h details[:all_events] %> (<%= h event_rates[:all_events] %> events/s)</li>
|
114
|
+
<li>ok: <%= h details[:ok_events] %> (<%= h event_rates[:ok_events] %> events/s)</li>
|
115
|
+
<li>failure: <%= h details[:failure_events] %> (<%= h event_rates[:failure_events] %> events/s)</li>
|
116
|
+
<li>action: <%= h details[:action_events] %> (<%= h event_rates[:action_events] %> events/s)</li>
|
117
|
+
<li>invalid: <%= h details[:invalid_events] %> (<%= h event_rates[:invalid_events] %> events/s)</li>
|
119
118
|
</ul>
|
120
119
|
</td>
|
121
120
|
</tr>
|
@@ -125,7 +124,7 @@
|
|
125
124
|
</div>
|
126
125
|
|
127
126
|
<p>
|
128
|
-
<a class="btn btn-success" href="
|
127
|
+
<a class="btn btn-success" href="<%= @base_url %>self_stats.json">View as JSON</a>
|
129
128
|
Learn how to
|
130
129
|
<a href="http://flapjack.io/docs/1.0/development/Gathering-internal-statistics-with-collectd"> use these metrics</a>.
|
131
130
|
</p>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<% page_title "Tag: #{h @tag[:name]}" %>
|
2
|
+
|
3
|
+
<div class="page-header">
|
4
|
+
<h2>Tag: <%= h @tag[:name] %></h2>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<% if @checks.nil? || @checks.empty? %>
|
8
|
+
<p>No checks</p>
|
9
|
+
<% else %>
|
10
|
+
<table class="table table-bordered table-hover table-condensed">
|
11
|
+
<tr>
|
12
|
+
<th>Name</th>
|
13
|
+
<th>Failing?</th>
|
14
|
+
</tr>
|
15
|
+
<% @checks.each do |check| %>
|
16
|
+
<tr>
|
17
|
+
<td><a href="<%= @base_url %>checks/<%= check[:id] %>" title="check details"><%= h check[:name] %></a></td>
|
18
|
+
<td><%=
|
19
|
+
case check[:failing]
|
20
|
+
when true
|
21
|
+
'Y'
|
22
|
+
when false
|
23
|
+
'N'
|
24
|
+
else
|
25
|
+
'?'
|
26
|
+
end %></a></td>
|
27
|
+
</tr>
|
28
|
+
<% end %>
|
29
|
+
</table>
|
30
|
+
<% end %>
|
31
|
+
<br>
|
32
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<% page_title 'Tags' %>
|
2
|
+
|
3
|
+
<div class="page-header">
|
4
|
+
<h2>Tags</h2>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="row">
|
8
|
+
<div class="col-md-8">
|
9
|
+
|
10
|
+
<form action="<%= @base_url %>tags" method="get" role="form" class="form-horizontal">
|
11
|
+
|
12
|
+
<div class="form-group">
|
13
|
+
<label class="col-sm-2 control-label" for="start_time">Name:</label>
|
14
|
+
<div class="col-sm-10">
|
15
|
+
<input type="text" name="name" class="form-control" size="20" maxlength="80" value="<%= h params[:name] %>">
|
16
|
+
<span class="help-block">
|
17
|
+
e.g. the exact name, or a /regexp/
|
18
|
+
</span>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="form-group">
|
22
|
+
<div class="col-sm-2"></div>
|
23
|
+
<div class="col-sm-10">
|
24
|
+
<button type="submit" class="btn btn-success">Refresh</button>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
</div>
|
29
|
+
|
30
|
+
</form><!-- form-horizontal-->
|
31
|
+
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<% if !@tags || @tags.empty? %>
|
36
|
+
<p>No tags</p>
|
37
|
+
<% else %>
|
38
|
+
<table class="table table-bordered table-hover table-condensed">
|
39
|
+
<tr>
|
40
|
+
<th>Name</th>
|
41
|
+
</tr>
|
42
|
+
<% @tags.each do |tag| %>
|
43
|
+
<tr>
|
44
|
+
<td><a href="<%= @base_url %>tags/<%= tag[:id] %>" title="tag details"><%= h tag[:name] %></a></td>
|
45
|
+
</tr>
|
46
|
+
<% end %>
|
47
|
+
</table>
|
48
|
+
<% end %>
|
49
|
+
<br>
|
50
|
+
|
51
|
+
<%= erb '_pagination.html'.to_sym, :layout => false %>
|
data/lib/flapjack/logger.rb
CHANGED
@@ -6,6 +6,26 @@ require 'monitor'
|
|
6
6
|
|
7
7
|
module Flapjack
|
8
8
|
|
9
|
+
class << self
|
10
|
+
# Thread and fiber-local
|
11
|
+
|
12
|
+
def configure_log(name, config = {})
|
13
|
+
Thread.current[:flapjack_logger_name] = name
|
14
|
+
Thread.current[:flapjack_logger_config] = config
|
15
|
+
end
|
16
|
+
|
17
|
+
def logger=(l)
|
18
|
+
Thread.current[:flapjack_logger] = l
|
19
|
+
end
|
20
|
+
|
21
|
+
def logger
|
22
|
+
Thread.current[:flapjack_logger] ||= Flapjack::Logger.new(
|
23
|
+
Thread.current[:flapjack_logger_name] || 'default',
|
24
|
+
Thread.current[:flapjack_logger_config] || {}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
9
29
|
class Logger
|
10
30
|
|
11
31
|
LEVELS = [:debug, :info, :warn, :error, :fatal]
|
@@ -26,10 +46,20 @@ module Flapjack
|
|
26
46
|
|
27
47
|
@formatter = proc do |severity, datetime, progname, msg|
|
28
48
|
t = datetime.iso8601(6)
|
29
|
-
"#{t} [#{severity}] :: #{name} :: #{msg}\n"
|
49
|
+
"#{t} [#{severity}] :: #{@name} :: #{msg}\n"
|
50
|
+
end
|
51
|
+
|
52
|
+
output = if config[:file].nil? || config[:file].empty? ||
|
53
|
+
!File.exists?(File.dirname(config[:file])) ||
|
54
|
+
!File.writable?(File.dirname(config[:file])) ||
|
55
|
+
(File.exists?(config[:file]) && !File.writable?(config[:file]))
|
56
|
+
|
57
|
+
STDOUT
|
58
|
+
else
|
59
|
+
config[:file]
|
30
60
|
end
|
31
61
|
|
32
|
-
@logger = ::Logger.new(
|
62
|
+
@logger = ::Logger.new(output)
|
33
63
|
@logger.formatter = @formatter
|
34
64
|
|
35
65
|
configure(config)
|
@@ -103,7 +133,7 @@ module Flapjack
|
|
103
133
|
end
|
104
134
|
|
105
135
|
LEVELS.each do |level|
|
106
|
-
define_method(level) {|progname, &block|
|
136
|
+
define_method(level) {|progname = nil, &block|
|
107
137
|
add(::Logger.const_get(level.upcase), nil, progname, &block)
|
108
138
|
}
|
109
139
|
end
|
@@ -112,6 +142,7 @@ module Flapjack
|
|
112
142
|
(LEVELS + [:configure, :close, :add]).include?(sym)
|
113
143
|
end
|
114
144
|
|
145
|
+
|
115
146
|
['debug', 'info', 'warn', 'error', 'fatal'].each { |level|
|
116
147
|
define_method("#{level}?") {
|
117
148
|
@logger.send("#{level}?")
|
data/lib/flapjack/notifier.rb
CHANGED
@@ -2,23 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'active_support/time'
|
4
4
|
|
5
|
-
require '
|
5
|
+
require 'flapjack/exceptions'
|
6
|
+
require 'flapjack/redis_proxy'
|
7
|
+
require 'flapjack/record_queue'
|
8
|
+
require 'flapjack/utility'
|
6
9
|
|
7
10
|
require 'flapjack/data/alert'
|
8
|
-
|
11
|
+
require 'flapjack/data/check'
|
9
12
|
require 'flapjack/data/contact'
|
10
|
-
require 'flapjack/data/entity_check'
|
11
|
-
require 'flapjack/data/notification'
|
12
13
|
require 'flapjack/data/event'
|
13
|
-
require 'flapjack/
|
14
|
-
require 'flapjack/utility'
|
15
|
-
|
16
|
-
require 'flapjack/gateways/email'
|
17
|
-
require 'flapjack/gateways/sms_messagenet'
|
18
|
-
require 'flapjack/gateways/slack'
|
19
|
-
require 'flapjack/gateways/sms_twilio'
|
20
|
-
require 'flapjack/gateways/sms_nexmo'
|
21
|
-
require 'flapjack/gateways/aws_sns'
|
14
|
+
require 'flapjack/data/notification'
|
22
15
|
|
23
16
|
module Flapjack
|
24
17
|
|
@@ -27,61 +20,45 @@ module Flapjack
|
|
27
20
|
include Flapjack::Utility
|
28
21
|
|
29
22
|
def initialize(opts = {})
|
30
|
-
@
|
31
|
-
@
|
32
|
-
@logger = opts[:logger]
|
33
|
-
@redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 2, :logger => @logger)
|
23
|
+
@lock = opts[:lock]
|
24
|
+
@config = opts[:config] || {}
|
34
25
|
|
35
|
-
@
|
26
|
+
@queue = Flapjack::RecordQueue.new(@config['queue'] || 'notifications',
|
27
|
+
Flapjack::Data::Notification)
|
36
28
|
|
37
29
|
queue_configs = @config.find_all {|k, v| k =~ /_queue$/ }
|
38
|
-
@queues = Hash[queue_configs.map {|k, v|
|
30
|
+
@queues = Hash[queue_configs.map {|k, v|
|
31
|
+
[k[/^(.*)_queue$/, 1], Flapjack::RecordQueue.new(v, Flapjack::Data::Alert)]
|
32
|
+
}]
|
39
33
|
|
40
|
-
|
41
|
-
if not File.directory?(File.dirname(notify_logfile))
|
42
|
-
puts "Parent directory for log file '#{notify_logfile}' doesn't exist"
|
43
|
-
puts "Exiting!"
|
44
|
-
exit
|
45
|
-
end
|
46
|
-
@notifylog = ::Logger.new(notify_logfile)
|
47
|
-
@notifylog.formatter = proc do |severity, datetime, progname, msg|
|
48
|
-
"#{datetime.to_s} | #{msg}\n"
|
49
|
-
end
|
34
|
+
raise "No queues for media transports" if @queues.empty?
|
50
35
|
|
51
|
-
tz = nil
|
52
36
|
tz_string = @config['default_contact_timezone'] || ENV['TZ'] || 'UTC'
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
logger.error("Invalid timezone string specified in default_contact_timezone or TZ (#{tz_string})")
|
57
|
-
exit_now!
|
37
|
+
tz = ActiveSupport::TimeZone[tz_string.untaint]
|
38
|
+
if tz.nil?
|
39
|
+
raise "Invalid timezone string specified in default_contact_timezone or TZ (#{tz_string})"
|
58
40
|
end
|
59
41
|
@default_contact_timezone = tz
|
60
42
|
end
|
61
43
|
|
62
44
|
def start
|
63
|
-
|
64
|
-
|
65
|
-
until @should_quit
|
66
|
-
@logger.debug("Waiting for notification...")
|
67
|
-
notification = Flapjack::Data::Notification.next(@notifications_queue,
|
68
|
-
:redis => @redis,
|
69
|
-
:logger => @logger)
|
70
|
-
process_notification(notification) unless notification.nil?
|
71
|
-
end
|
45
|
+
begin
|
46
|
+
Zermelo.redis = Flapjack.redis
|
72
47
|
|
73
|
-
|
74
|
-
|
48
|
+
loop do
|
49
|
+
@lock.synchronize do
|
50
|
+
@queue.foreach {|notif| process_notification(notif) }
|
51
|
+
end
|
75
52
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
53
|
+
@queue.wait
|
54
|
+
end
|
55
|
+
ensure
|
56
|
+
Flapjack.redis.quit
|
57
|
+
end
|
58
|
+
end
|
80
59
|
|
81
|
-
|
82
|
-
|
83
|
-
shutdown_redis = EM::Hiredis.connect(redis_uri)
|
84
|
-
shutdown_redis.rpush(@notifications_queue, Flapjack.dump_json('type' => 'shutdown'))
|
60
|
+
def stop_type
|
61
|
+
:exception
|
85
62
|
end
|
86
63
|
|
87
64
|
private
|
@@ -90,76 +67,167 @@ module Flapjack
|
|
90
67
|
# notification, updates the notification history in redis, generates the
|
91
68
|
# notifications
|
92
69
|
def process_notification(notification)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
if
|
102
|
-
|
103
|
-
|
104
|
-
|
70
|
+
Flapjack.logger.debug { "Processing notification: #{notification.inspect}" }
|
71
|
+
|
72
|
+
check = notification.check
|
73
|
+
check_name = check.name
|
74
|
+
|
75
|
+
# TODO check whether time should come from something stored in the notification
|
76
|
+
alerts = alerts_for(notification, check, :time => Time.now)
|
77
|
+
|
78
|
+
if alerts.nil? || alerts.empty?
|
79
|
+
Flapjack.logger.info { "No alerts" }
|
80
|
+
else
|
81
|
+
Flapjack.logger.info { "Alerts: #{alerts.size}" }
|
82
|
+
|
83
|
+
alerts.each do |alert|
|
84
|
+
medium = alert.medium
|
85
|
+
|
86
|
+
Flapjack.logger.info {
|
87
|
+
"#{check_name} | #{medium.contact.id} | " \
|
88
|
+
"#{medium.transport} | #{medium.address}\n" \
|
89
|
+
"Enqueueing #{medium.transport} alert for " \
|
90
|
+
"#{check_name} to #{medium.address} " \
|
91
|
+
" rollup: #{alert.rollup || '-'}"
|
92
|
+
}
|
93
|
+
|
94
|
+
@queues[medium.transport].push(alert)
|
95
|
+
end
|
105
96
|
end
|
106
97
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
98
|
+
notification.destroy
|
99
|
+
end
|
100
|
+
|
101
|
+
def alerts_for(notification, check, opts = {})
|
102
|
+
time = opts[:time]
|
103
|
+
|
104
|
+
Flapjack::Data::Medium.lock(Flapjack::Data::Check,
|
105
|
+
Flapjack::Data::ScheduledMaintenance,
|
106
|
+
Flapjack::Data::UnscheduledMaintenance,
|
107
|
+
Flapjack::Data::Rule,
|
108
|
+
Flapjack::Data::Alert,
|
109
|
+
Flapjack::Data::Tag,
|
110
|
+
Flapjack::Data::Notification,
|
111
|
+
Flapjack::Data::Contact,
|
112
|
+
Flapjack::Data::State) do
|
113
|
+
|
114
|
+
notification_state = notification.state
|
115
|
+
|
116
|
+
this_notification_ack = 'acknowledgement'.eql?(notification_state.action)
|
117
|
+
this_notification_ok = this_notification_ack ||
|
118
|
+
Flapjack::Data::Condition.healthy?(notification_state.condition)
|
119
|
+
|
120
|
+
# checks in sched/unsched maint will not be notified -- time should be taken
|
121
|
+
# from the processor's created notification, maint period check done there only
|
122
|
+
is_a_test = !(notification_state.action =~ /\Atest_notifications/).nil?
|
123
|
+
|
124
|
+
alerting_severity = is_a_test ? 'critical' : notification.severity
|
125
|
+
|
126
|
+
# clear alertable if OK, to get accurate rollup counts
|
127
|
+
if !is_a_test && !this_notification_ok
|
128
|
+
check.alertable = true
|
129
|
+
check.save
|
130
130
|
end
|
131
131
|
|
132
|
-
|
133
|
-
|
132
|
+
media = check.alerting_media(:time => time, :severity => alerting_severity).all
|
133
|
+
|
134
|
+
Flapjack.logger.debug {
|
135
|
+
"Alerting media for check #{check.name}:\n" +
|
136
|
+
media.collect {|m| "#{m.transport} #{m.address}"}.join("\n")
|
137
|
+
}
|
134
138
|
|
135
|
-
if
|
136
|
-
|
137
|
-
|
139
|
+
# clear alertable if OK, to get accurate rollup counts
|
140
|
+
if !is_a_test && this_notification_ok
|
141
|
+
check.alertable = false
|
142
|
+
check.save
|
138
143
|
end
|
139
144
|
|
140
|
-
|
145
|
+
media.inject([]) do |memo, alerting_medium|
|
146
|
+
alert_rollup = nil
|
147
|
+
alerting_check_ids = []
|
148
|
+
|
149
|
+
unless is_a_test
|
150
|
+
rollup_count_needed = !(alerting_medium.rollup_threshold.nil? ||
|
151
|
+
(alerting_medium.rollup_threshold <= 0))
|
152
|
+
|
153
|
+
if rollup_count_needed
|
154
|
+
alerting_check_ids = alerting_medium.alerting_checks(:time => time).ids
|
155
|
+
|
156
|
+
Flapjack.logger.debug {
|
157
|
+
"Alerting checks for medium #{alerting_medium.id}:\n" +
|
158
|
+
Flapjack::Data::Check.intersect(:id => alerting_check_ids).map(&:name).join("\n")
|
159
|
+
}
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
alert_rollup = if rollup_count_needed &&
|
164
|
+
(alerting_check_ids.size >= alerting_medium.rollup_threshold)
|
165
|
+
|
166
|
+
'problem'
|
167
|
+
else
|
168
|
+
'problem'.eql?(alerting_medium.last_rollup_type) ? 'recovery' : nil
|
169
|
+
end
|
141
170
|
|
142
|
-
|
171
|
+
last_state = alerting_medium.last_state
|
143
172
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
173
|
+
Flapjack.logger.debug "last_state #{last_state.inspect}"
|
174
|
+
|
175
|
+
last_state_ok = last_state.nil? ? nil :
|
176
|
+
(Flapjack::Data::Condition.healthy?(last_state.condition) ||
|
177
|
+
'acknowledgement'.eql?(last_state.action))
|
178
|
+
|
179
|
+
interval_allows = last_state.nil? ||
|
180
|
+
((last_state.created_at + (alerting_medium.interval || 0)) < notification_state.created_at)
|
181
|
+
|
182
|
+
Flapjack.logger.debug " last_state_ok = #{last_state_ok}\n" \
|
183
|
+
" interval_allows = #{interval_allows}\n" \
|
184
|
+
" alert_rollup , last_rollup_type = #{alert_rollup} , #{alerting_medium.last_rollup_type}\n" \
|
185
|
+
" condition , last_notification_condition = #{notification_state.condition} , #{last_state.nil? ? '-' : last_state.condition}\n" \
|
186
|
+
" no_previous_notification = #{last_state.nil?}\n"
|
187
|
+
|
188
|
+
next memo unless last_state.nil? ||
|
189
|
+
(!last_state_ok && this_notification_ok) ||
|
190
|
+
(alert_rollup != alerting_medium.last_rollup_type) ||
|
191
|
+
(this_notification_ack && !last_state_ok) ||
|
192
|
+
(last_state_ok && !this_notification_ok) ||
|
193
|
+
(notification_state.condition != last_state.condition) ||
|
194
|
+
interval_allows
|
151
195
|
end
|
152
|
-
else
|
153
|
-
contact.update_sent_alert_keys(
|
154
|
-
:media => media_type,
|
155
|
-
:check => event_id,
|
156
|
-
:state => notification.state)
|
157
|
-
end
|
158
196
|
|
159
|
-
|
160
|
-
|
197
|
+
alert = Flapjack::Data::Alert.new(:condition => notification_state.condition,
|
198
|
+
:action => notification_state.action,
|
199
|
+
:last_condition => (last_state.nil? ? nil : last_state.condition),
|
200
|
+
:last_action => (last_state.nil? ? nil : last_state.action),
|
201
|
+
:condition_duration => notification.condition_duration,
|
202
|
+
:acknowledgement_duration => notification.duration,
|
203
|
+
:rollup => alert_rollup)
|
204
|
+
|
205
|
+
unless alert_rollup.nil? || alerting_check_ids.empty?
|
206
|
+
alert.rollup_states = Flapjack::Data::Check.intersect(:id => alerting_check_ids).all.each_with_object({}) do |ch, m|
|
207
|
+
cond = ch.condition
|
208
|
+
m[cond] ||= []
|
209
|
+
m[cond] << ch.name
|
210
|
+
end
|
211
|
+
end
|
161
212
|
|
162
|
-
|
213
|
+
unless alert.save
|
214
|
+
raise "Couldn't save alert: #{alert.errors.full_messages.inspect}"
|
215
|
+
end
|
216
|
+
|
217
|
+
alerting_medium.alerts << alert
|
218
|
+
check.alerts << alert
|
219
|
+
|
220
|
+
Flapjack.logger.info "alerting for #{alerting_medium.transport}, #{alerting_medium.address}"
|
221
|
+
|
222
|
+
unless is_a_test
|
223
|
+
notification_state.latest_media << alerting_medium
|
224
|
+
alerting_medium.last_rollup_type = alert.rollup
|
225
|
+
alerting_medium.save
|
226
|
+
end
|
227
|
+
|
228
|
+
memo << alert
|
229
|
+
memo
|
230
|
+
end
|
163
231
|
end
|
164
232
|
end
|
165
233
|
|