binnacle 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +138 -0
- data/LICENSE.txt +22 -0
- data/README.asc +264 -0
- data/Rakefile +48 -0
- data/bin/binnacle +5 -0
- data/binnacle.gemspec +49 -0
- data/lib/binnacle.rb +112 -0
- data/lib/binnacle/client.rb +115 -0
- data/lib/binnacle/commands/commands.rb +20 -0
- data/lib/binnacle/commands/help.rb +21 -0
- data/lib/binnacle/commands/tail.rb +187 -0
- data/lib/binnacle/configuration.rb +278 -0
- data/lib/binnacle/connection.rb +66 -0
- data/lib/binnacle/errors.rb +4 -0
- data/lib/binnacle/http_logging/adapters/ethon.rb +44 -0
- data/lib/binnacle/http_logging/adapters/excon.rb +62 -0
- data/lib/binnacle/http_logging/adapters/http.rb +63 -0
- data/lib/binnacle/http_logging/adapters/httpclient.rb +93 -0
- data/lib/binnacle/http_logging/adapters/net_http.rb +54 -0
- data/lib/binnacle/http_logging/adapters/patron.rb +24 -0
- data/lib/binnacle/http_logging/adapters/typhoeus.rb +20 -0
- data/lib/binnacle/http_logging/http_logger.rb +83 -0
- data/lib/binnacle/logging/formatter.rb +62 -0
- data/lib/binnacle/logging/logging.rb +36 -0
- data/lib/binnacle/logging/request_log_subscriber.rb +120 -0
- data/lib/binnacle/resource.rb +54 -0
- data/lib/binnacle/resources/event.rb +100 -0
- data/lib/binnacle/trap/backtrace.rb +130 -0
- data/lib/binnacle/trap/exception_event.rb +176 -0
- data/lib/binnacle/trap/middleware.rb +45 -0
- data/lib/binnacle/trap/railtie.rb +28 -0
- data/lib/binnacle/version.rb +3 -0
- data/lib/generators/binnacle/binnacle_generator.rb +78 -0
- data/lib/generators/binnacle/templates/firebase-messaging-sw.js.erb +35 -0
- data/spec/adapters/ethon_adapter.rb +19 -0
- data/spec/adapters/excon_adapter.rb +10 -0
- data/spec/adapters/faraday_adapter.rb +46 -0
- data/spec/adapters/http_adapter.rb +14 -0
- data/spec/adapters/http_base_adapter.rb +37 -0
- data/spec/adapters/httparty_adapter.rb +10 -0
- data/spec/adapters/httpclient_adapter.rb +21 -0
- data/spec/adapters/net_http_adapter.rb +14 -0
- data/spec/adapters/open_uri_adapter.rb +17 -0
- data/spec/adapters/patron_adapter.rb +29 -0
- data/spec/adapters/typhoeus_adapter.rb +25 -0
- data/spec/backtrace_spec.rb +197 -0
- data/spec/binnacle_spec.rb +33 -0
- data/spec/client_spec.rb +128 -0
- data/spec/commands_spec.rb +91 -0
- data/spec/configuration_spec.rb +139 -0
- data/spec/connection_spec.rb +34 -0
- data/spec/exception_event_spec.rb +72 -0
- data/spec/http_logger_spec.rb +77 -0
- data/spec/logger_spec.rb +60 -0
- data/spec/spec_helper.rb +117 -0
- data/spec/support/index.html +8 -0
- data/spec/support/index.html.gz +0 -0
- data/spec/support/test.bin +0 -0
- data/spec/support/test_server.rb +31 -0
- data/spec/support/utf8-invalid.html +0 -0
- data/spec/support/utf8.html +8 -0
- data/spec/vcr/binnacle/configure_can_be_configured_via_a_hash_of_options.yml +42 -0
- data/spec/vcr/binnacle/configure_creates_a_module_level_instance_of_a_binnacle_client.yml +42 -0
- data/spec/vcr/binnacle_client/events_invokes_the_events_api.yml +124 -0
- data/spec/vcr/binnacle_client/events_returns_a_collection_of_event_objects.yml +124 -0
- data/spec/vcr/binnacle_client/recents_invokes_the_events_api_recents.yml +83 -0
- data/spec/vcr/binnacle_client/recents_returns_a_collection_of_event_objects.yml +83 -0
- data/spec/vcr/binnacle_client/report_exception_invokes_the_events_api_signal.yml +121 -0
- data/spec/vcr/binnacle_client/signal_asynch_invokes_the_events_api_signal.yml +74 -0
- data/spec/vcr/binnacle_client/signal_invokes_the_events_api_signal.yml +74 -0
- data/spec/vcr/binnacle_client_ready_/returns_true_if_a_connection_has_been_successfully_established.yml +42 -0
- data/spec/vcr/binnacle_command/tail_command_with_n_flag_returns_recent_events.yml +81 -0
- data/spec/vcr/binnacle_connection/initialize_fails_with_incorrect_credentials.yml +40 -0
- data/spec/vcr/binnacle_connection/initialize_retrieves_available_endpoints_upon_successful_connection.yml +42 -0
- data/spec/vcr/binnacle_http_logger/_htt_party_adapter_should_log__ge_t_requests.yml +122 -0
- data/spec/vcr/binnacle_http_logger/_http_adapter_should_log__ge_t_requests.yml +165 -0
- data/spec/vcr/binnacle_http_logger/_http_client_adapter_should_log__ge_t_requests.yml +274 -0
- data/spec/vcr/binnacle_http_logger/ethon_adapter_should_log__ge_t_requests.yml +87 -0
- data/spec/vcr/binnacle_http_logger/excon_adapter_should_log__ge_t_requests.yml +204 -0
- data/spec/vcr/binnacle_http_logger/faraday_adapter_should_log__ge_t_requests.yml +200 -0
- data/spec/vcr/binnacle_http_logger/net_http_adapter_should_log__ge_t_requests.yml +827 -0
- data/spec/vcr/binnacle_http_logger/open_uri_adapter_should_log__ge_t_requests.yml +751 -0
- data/spec/vcr/binnacle_http_logger/patron_adapter_should_log__ge_t_requests.yml +124 -0
- data/spec/vcr/binnacle_http_logger/typhoeus_adapter_should_log__ge_t_requests.yml +124 -0
- data/spec/vcr/binnacle_logging/logging_allows_passing_other_parameters_using_a_hash.yml +119 -0
- data/spec/vcr/binnacle_logging/logging_invokes_the_events_api_signal.yml +75 -0
- data/spec/vcr/binnacle_logging/logging_respects_the_logger_severity.yml +81 -0
- data/vendor/assets/javascripts/atmosphere/atmosphere.js +3487 -0
- data/vendor/assets/javascripts/base64/base64.js +61 -0
- data/vendor/assets/javascripts/binnacle.js +5 -0
- data/vendor/assets/javascripts/binnacle/binnacle.js +9090 -0
- data/vendor/assets/javascripts/firebase/firebase-app-externs.js +261 -0
- data/vendor/assets/javascripts/firebase/firebase-app.js +35 -0
- data/vendor/assets/javascripts/firebase/firebase-auth-externs.js +1300 -0
- data/vendor/assets/javascripts/firebase/firebase-auth.js +241 -0
- data/vendor/assets/javascripts/firebase/firebase-database-externs.js +1700 -0
- data/vendor/assets/javascripts/firebase/firebase-database.js +260 -0
- data/vendor/assets/javascripts/firebase/firebase-messaging-externs.js +164 -0
- data/vendor/assets/javascripts/firebase/firebase-messaging.js +35 -0
- data/vendor/assets/javascripts/firebase/firebase-storage-externs.js +663 -0
- data/vendor/assets/javascripts/firebase/firebase-storage.js +52 -0
- data/vendor/assets/javascripts/firebase/firebase.js +611 -0
- data/vendor/assets/javascripts/moment/locale/af.js +73 -0
- data/vendor/assets/javascripts/moment/locale/ar-dz.js +59 -0
- data/vendor/assets/javascripts/moment/locale/ar-kw.js +59 -0
- data/vendor/assets/javascripts/moment/locale/ar-ly.js +126 -0
- data/vendor/assets/javascripts/moment/locale/ar-ma.js +60 -0
- data/vendor/assets/javascripts/moment/locale/ar-sa.js +105 -0
- data/vendor/assets/javascripts/moment/locale/ar-tn.js +59 -0
- data/vendor/assets/javascripts/moment/locale/ar.js +142 -0
- data/vendor/assets/javascripts/moment/locale/az.js +105 -0
- data/vendor/assets/javascripts/moment/locale/be.js +134 -0
- data/vendor/assets/javascripts/moment/locale/bg.js +90 -0
- data/vendor/assets/javascripts/moment/locale/bn.js +119 -0
- data/vendor/assets/javascripts/moment/locale/bo.js +119 -0
- data/vendor/assets/javascripts/moment/locale/br.js +108 -0
- data/vendor/assets/javascripts/moment/locale/bs.js +143 -0
- data/vendor/assets/javascripts/moment/locale/ca.js +88 -0
- data/vendor/assets/javascripts/moment/locale/cs.js +172 -0
- data/vendor/assets/javascripts/moment/locale/cv.js +63 -0
- data/vendor/assets/javascripts/moment/locale/cy.js +81 -0
- data/vendor/assets/javascripts/moment/locale/da.js +60 -0
- data/vendor/assets/javascripts/moment/locale/de-at.js +79 -0
- data/vendor/assets/javascripts/moment/locale/de-ch.js +78 -0
- data/vendor/assets/javascripts/moment/locale/de.js +78 -0
- data/vendor/assets/javascripts/moment/locale/dv.js +100 -0
- data/vendor/assets/javascripts/moment/locale/el.js +100 -0
- data/vendor/assets/javascripts/moment/locale/en-au.js +67 -0
- data/vendor/assets/javascripts/moment/locale/en-ca.js +63 -0
- data/vendor/assets/javascripts/moment/locale/en-gb.js +67 -0
- data/vendor/assets/javascripts/moment/locale/en-ie.js +67 -0
- data/vendor/assets/javascripts/moment/locale/en-nz.js +67 -0
- data/vendor/assets/javascripts/moment/locale/eo.js +73 -0
- data/vendor/assets/javascripts/moment/locale/es-do.js +82 -0
- data/vendor/assets/javascripts/moment/locale/es.js +83 -0
- data/vendor/assets/javascripts/moment/locale/et.js +80 -0
- data/vendor/assets/javascripts/moment/locale/eu.js +66 -0
- data/vendor/assets/javascripts/moment/locale/fa.js +107 -0
- data/vendor/assets/javascripts/moment/locale/fi.js +107 -0
- data/vendor/assets/javascripts/moment/locale/fo.js +60 -0
- data/vendor/assets/javascripts/moment/locale/fr-ca.js +74 -0
- data/vendor/assets/javascripts/moment/locale/fr-ch.js +78 -0
- data/vendor/assets/javascripts/moment/locale/fr.js +83 -0
- data/vendor/assets/javascripts/moment/locale/fy.js +75 -0
- data/vendor/assets/javascripts/moment/locale/gd.js +76 -0
- data/vendor/assets/javascripts/moment/locale/gl.js +77 -0
- data/vendor/assets/javascripts/moment/locale/gom-latn.js +122 -0
- data/vendor/assets/javascripts/moment/locale/he.js +99 -0
- data/vendor/assets/javascripts/moment/locale/hi.js +124 -0
- data/vendor/assets/javascripts/moment/locale/hr.js +145 -0
- data/vendor/assets/javascripts/moment/locale/hu.js +109 -0
- data/vendor/assets/javascripts/moment/locale/hy-am.js +95 -0
- data/vendor/assets/javascripts/moment/locale/id.js +83 -0
- data/vendor/assets/javascripts/moment/locale/is.js +127 -0
- data/vendor/assets/javascripts/moment/locale/it.js +70 -0
- data/vendor/assets/javascripts/moment/locale/ja.js +80 -0
- data/vendor/assets/javascripts/moment/locale/jv.js +83 -0
- data/vendor/assets/javascripts/moment/locale/ka.js +89 -0
- data/vendor/assets/javascripts/moment/locale/kk.js +87 -0
- data/vendor/assets/javascripts/moment/locale/km.js +58 -0
- data/vendor/assets/javascripts/moment/locale/kn.js +126 -0
- data/vendor/assets/javascripts/moment/locale/ko.js +69 -0
- data/vendor/assets/javascripts/moment/locale/ky.js +88 -0
- data/vendor/assets/javascripts/moment/locale/lb.js +137 -0
- data/vendor/assets/javascripts/moment/locale/lo.js +70 -0
- data/vendor/assets/javascripts/moment/locale/lt.js +117 -0
- data/vendor/assets/javascripts/moment/locale/lv.js +97 -0
- data/vendor/assets/javascripts/moment/locale/me.js +111 -0
- data/vendor/assets/javascripts/moment/locale/mi.js +64 -0
- data/vendor/assets/javascripts/moment/locale/mk.js +90 -0
- data/vendor/assets/javascripts/moment/locale/ml.js +81 -0
- data/vendor/assets/javascripts/moment/locale/mr.js +159 -0
- data/vendor/assets/javascripts/moment/locale/ms-my.js +83 -0
- data/vendor/assets/javascripts/moment/locale/ms.js +82 -0
- data/vendor/assets/javascripts/moment/locale/my.js +96 -0
- data/vendor/assets/javascripts/moment/locale/nb.js +63 -0
- data/vendor/assets/javascripts/moment/locale/ne.js +123 -0
- data/vendor/assets/javascripts/moment/locale/nl-be.js +88 -0
- data/vendor/assets/javascripts/moment/locale/nl.js +88 -0
- data/vendor/assets/javascripts/moment/locale/nn.js +60 -0
- data/vendor/assets/javascripts/moment/locale/pa-in.js +124 -0
- data/vendor/assets/javascripts/moment/locale/pl.js +107 -0
- data/vendor/assets/javascripts/moment/locale/pt-br.js +61 -0
- data/vendor/assets/javascripts/moment/locale/pt.js +65 -0
- data/vendor/assets/javascripts/moment/locale/ro.js +75 -0
- data/vendor/assets/javascripts/moment/locale/ru.js +183 -0
- data/vendor/assets/javascripts/moment/locale/sd.js +98 -0
- data/vendor/assets/javascripts/moment/locale/se.js +61 -0
- data/vendor/assets/javascripts/moment/locale/si.js +71 -0
- data/vendor/assets/javascripts/moment/locale/sk.js +150 -0
- data/vendor/assets/javascripts/moment/locale/sl.js +162 -0
- data/vendor/assets/javascripts/moment/locale/sq.js +70 -0
- data/vendor/assets/javascripts/moment/locale/sr-cyrl.js +110 -0
- data/vendor/assets/javascripts/moment/locale/sr.js +110 -0
- data/vendor/assets/javascripts/moment/locale/ss.js +89 -0
- data/vendor/assets/javascripts/moment/locale/sv.js +69 -0
- data/vendor/assets/javascripts/moment/locale/sw.js +59 -0
- data/vendor/assets/javascripts/moment/locale/ta.js +130 -0
- data/vendor/assets/javascripts/moment/locale/te.js +89 -0
- data/vendor/assets/javascripts/moment/locale/tet.js +68 -0
- data/vendor/assets/javascripts/moment/locale/th.js +67 -0
- data/vendor/assets/javascripts/moment/locale/tl-ph.js +62 -0
- data/vendor/assets/javascripts/moment/locale/tlh.js +120 -0
- data/vendor/assets/javascripts/moment/locale/tr.js +90 -0
- data/vendor/assets/javascripts/moment/locale/tzl.js +91 -0
- data/vendor/assets/javascripts/moment/locale/tzm-latn.js +58 -0
- data/vendor/assets/javascripts/moment/locale/tzm.js +58 -0
- data/vendor/assets/javascripts/moment/locale/uk.js +151 -0
- data/vendor/assets/javascripts/moment/locale/ur.js +99 -0
- data/vendor/assets/javascripts/moment/locale/uz-latn.js +58 -0
- data/vendor/assets/javascripts/moment/locale/uz.js +58 -0
- data/vendor/assets/javascripts/moment/locale/vi.js +79 -0
- data/vendor/assets/javascripts/moment/locale/x-pseudo.js +68 -0
- data/vendor/assets/javascripts/moment/locale/yo.js +60 -0
- data/vendor/assets/javascripts/moment/locale/zh-cn.js +111 -0
- data/vendor/assets/javascripts/moment/locale/zh-hk.js +105 -0
- data/vendor/assets/javascripts/moment/locale/zh-tw.js +104 -0
- data/vendor/assets/javascripts/moment/min/locales.js +9252 -0
- data/vendor/assets/javascripts/moment/min/moment-with-locales.js +13700 -0
- data/vendor/assets/javascripts/moment/min/moment.min.js +7 -0
- data/vendor/assets/javascripts/moment/min/tests.js +78265 -0
- data/vendor/assets/javascripts/moment/moment.js +4463 -0
- data/vendor/assets/javascripts/moment/src/lib/create/check-overflow.js +34 -0
- data/vendor/assets/javascripts/moment/src/lib/create/date-from-array.js +21 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-anything.js +110 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-array.js +140 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-object.js +16 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-string-and-array.js +50 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-string-and-format.js +113 -0
- data/vendor/assets/javascripts/moment/src/lib/create/from-string.js +202 -0
- data/vendor/assets/javascripts/moment/src/lib/create/local.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/create/parsing-flags.js +26 -0
- data/vendor/assets/javascripts/moment/src/lib/create/utc.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/create/valid.js +49 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/abs.js +18 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/add-subtract.js +21 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/as.js +61 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/bubble.js +61 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/constructor.js +44 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/create.js +122 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/duration.js +16 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/get.js +25 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/humanize.js +85 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/iso-string.js +56 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/prototype.js +50 -0
- data/vendor/assets/javascripts/moment/src/lib/duration/valid.js +35 -0
- data/vendor/assets/javascripts/moment/src/lib/format/format.js +92 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/base-config.js +44 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/calendar.js +15 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/constructor.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/en.js +15 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/formats.js +23 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/invalid.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/lists.js +93 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/locale.js +39 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/locales.js +186 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/ordinal.js +7 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/pre-post-format.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/prototype.js +69 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/relative.js +30 -0
- data/vendor/assets/javascripts/moment/src/lib/locale/set.js +49 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/add-subtract.js +55 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/calendar.js +26 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/clone.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/compare.js +59 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/constructor.js +77 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/creation-data.js +9 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/diff.js +62 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/format.js +57 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/from.js +17 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/get-set.js +55 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/locale.js +34 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/min-max.js +63 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/moment.js +28 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/now.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/prototype.js +150 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/start-end-of.js +59 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/to-type.js +34 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/to.js +17 -0
- data/vendor/assets/javascripts/moment/src/lib/moment/valid.js +15 -0
- data/vendor/assets/javascripts/moment/src/lib/parse/regex.js +54 -0
- data/vendor/assets/javascripts/moment/src/lib/parse/token.js +33 -0
- data/vendor/assets/javascripts/moment/src/lib/units/aliases.js +30 -0
- data/vendor/assets/javascripts/moment/src/lib/units/constants.js +9 -0
- data/vendor/assets/javascripts/moment/src/lib/units/day-of-month.js +39 -0
- data/vendor/assets/javascripts/moment/src/lib/units/day-of-week.js +364 -0
- data/vendor/assets/javascripts/moment/src/lib/units/day-of-year.js +36 -0
- data/vendor/assets/javascripts/moment/src/lib/units/hour.js +144 -0
- data/vendor/assets/javascripts/moment/src/lib/units/millisecond.js +69 -0
- data/vendor/assets/javascripts/moment/src/lib/units/minute.js +29 -0
- data/vendor/assets/javascripts/moment/src/lib/units/month.js +283 -0
- data/vendor/assets/javascripts/moment/src/lib/units/offset.js +235 -0
- data/vendor/assets/javascripts/moment/src/lib/units/priorities.js +16 -0
- data/vendor/assets/javascripts/moment/src/lib/units/quarter.js +32 -0
- data/vendor/assets/javascripts/moment/src/lib/units/second.js +29 -0
- data/vendor/assets/javascripts/moment/src/lib/units/timestamp.js +20 -0
- data/vendor/assets/javascripts/moment/src/lib/units/timezone.js +16 -0
- data/vendor/assets/javascripts/moment/src/lib/units/units.js +20 -0
- data/vendor/assets/javascripts/moment/src/lib/units/week-calendar-utils.js +65 -0
- data/vendor/assets/javascripts/moment/src/lib/units/week-year.js +107 -0
- data/vendor/assets/javascripts/moment/src/lib/units/week.js +67 -0
- data/vendor/assets/javascripts/moment/src/lib/units/year.js +75 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/abs-ceil.js +7 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/abs-floor.js +8 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/abs-round.js +7 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/compare-arrays.js +16 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/defaults.js +10 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/deprecate.js +55 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/extend.js +19 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/has-own-prop.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/hooks.js +13 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/index-of.js +18 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-array.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-date.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-function.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-number.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-object-empty.js +8 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-object.js +5 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/is-undefined.js +3 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/keys.js +19 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/map.js +7 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/some.js +19 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/to-int.js +12 -0
- data/vendor/assets/javascripts/moment/src/lib/utils/zero-fill.js +7 -0
- data/vendor/assets/javascripts/moment/src/locale/af.js +63 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-dz.js +50 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-kw.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-ly.js +112 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-ma.js +51 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-sa.js +95 -0
- data/vendor/assets/javascripts/moment/src/locale/ar-tn.js +50 -0
- data/vendor/assets/javascripts/moment/src/locale/ar.js +128 -0
- data/vendor/assets/javascripts/moment/src/locale/az.js +96 -0
- data/vendor/assets/javascripts/moment/src/locale/be.js +125 -0
- data/vendor/assets/javascripts/moment/src/locale/bg.js +81 -0
- data/vendor/assets/javascripts/moment/src/locale/bn.js +109 -0
- data/vendor/assets/javascripts/moment/src/locale/bo.js +110 -0
- data/vendor/assets/javascripts/moment/src/locale/br.js +99 -0
- data/vendor/assets/javascripts/moment/src/locale/bs.js +133 -0
- data/vendor/assets/javascripts/moment/src/locale/ca.js +79 -0
- data/vendor/assets/javascripts/moment/src/locale/cs.js +163 -0
- data/vendor/assets/javascripts/moment/src/locale/cv.js +53 -0
- data/vendor/assets/javascripts/moment/src/locale/cy.js +72 -0
- data/vendor/assets/javascripts/moment/src/locale/da.js +50 -0
- data/vendor/assets/javascripts/moment/src/locale/de-at.js +69 -0
- data/vendor/assets/javascripts/moment/src/locale/de-ch.js +68 -0
- data/vendor/assets/javascripts/moment/src/locale/de.js +68 -0
- data/vendor/assets/javascripts/moment/src/locale/dv.js +89 -0
- data/vendor/assets/javascripts/moment/src/locale/el.js +88 -0
- data/vendor/assets/javascripts/moment/src/locale/en-au.js +58 -0
- data/vendor/assets/javascripts/moment/src/locale/en-ca.js +53 -0
- data/vendor/assets/javascripts/moment/src/locale/en-gb.js +58 -0
- data/vendor/assets/javascripts/moment/src/locale/en-ie.js +58 -0
- data/vendor/assets/javascripts/moment/src/locale/en-nz.js +57 -0
- data/vendor/assets/javascripts/moment/src/locale/eo.js +64 -0
- data/vendor/assets/javascripts/moment/src/locale/es-do.js +73 -0
- data/vendor/assets/javascripts/moment/src/locale/es.js +74 -0
- data/vendor/assets/javascripts/moment/src/locale/et.js +71 -0
- data/vendor/assets/javascripts/moment/src/locale/eu.js +57 -0
- data/vendor/assets/javascripts/moment/src/locale/fa.js +97 -0
- data/vendor/assets/javascripts/moment/src/locale/fi.js +98 -0
- data/vendor/assets/javascripts/moment/src/locale/fo.js +51 -0
- data/vendor/assets/javascripts/moment/src/locale/fr-ca.js +65 -0
- data/vendor/assets/javascripts/moment/src/locale/fr-ch.js +69 -0
- data/vendor/assets/javascripts/moment/src/locale/fr.js +74 -0
- data/vendor/assets/javascripts/moment/src/locale/fy.js +66 -0
- data/vendor/assets/javascripts/moment/src/locale/gd.js +67 -0
- data/vendor/assets/javascripts/moment/src/locale/gl.js +68 -0
- data/vendor/assets/javascripts/moment/src/locale/gom-latn.js +112 -0
- data/vendor/assets/javascripts/moment/src/locale/he.js +90 -0
- data/vendor/assets/javascripts/moment/src/locale/hi.js +115 -0
- data/vendor/assets/javascripts/moment/src/locale/hr.js +135 -0
- data/vendor/assets/javascripts/moment/src/locale/hu.js +100 -0
- data/vendor/assets/javascripts/moment/src/locale/hy-am.js +86 -0
- data/vendor/assets/javascripts/moment/src/locale/id.js +74 -0
- data/vendor/assets/javascripts/moment/src/locale/is.js +118 -0
- data/vendor/assets/javascripts/moment/src/locale/it.js +61 -0
- data/vendor/assets/javascripts/moment/src/locale/ja.js +71 -0
- data/vendor/assets/javascripts/moment/src/locale/jv.js +73 -0
- data/vendor/assets/javascripts/moment/src/locale/ka.js +80 -0
- data/vendor/assets/javascripts/moment/src/locale/kk.js +77 -0
- data/vendor/assets/javascripts/moment/src/locale/km.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/kn.js +116 -0
- data/vendor/assets/javascripts/moment/src/locale/ko.js +60 -0
- data/vendor/assets/javascripts/moment/src/locale/ky.js +78 -0
- data/vendor/assets/javascripts/moment/src/locale/lb.js +128 -0
- data/vendor/assets/javascripts/moment/src/locale/lo.js +61 -0
- data/vendor/assets/javascripts/moment/src/locale/lt.js +108 -0
- data/vendor/assets/javascripts/moment/src/locale/lv.js +88 -0
- data/vendor/assets/javascripts/moment/src/locale/me.js +101 -0
- data/vendor/assets/javascripts/moment/src/locale/mi.js +54 -0
- data/vendor/assets/javascripts/moment/src/locale/mk.js +81 -0
- data/vendor/assets/javascripts/moment/src/locale/ml.js +72 -0
- data/vendor/assets/javascripts/moment/src/locale/mr.js +150 -0
- data/vendor/assets/javascripts/moment/src/locale/ms-my.js +74 -0
- data/vendor/assets/javascripts/moment/src/locale/ms.js +73 -0
- data/vendor/assets/javascripts/moment/src/locale/my.js +86 -0
- data/vendor/assets/javascripts/moment/src/locale/nb.js +54 -0
- data/vendor/assets/javascripts/moment/src/locale/ne.js +114 -0
- data/vendor/assets/javascripts/moment/src/locale/nl-be.js +79 -0
- data/vendor/assets/javascripts/moment/src/locale/nl.js +79 -0
- data/vendor/assets/javascripts/moment/src/locale/nn.js +51 -0
- data/vendor/assets/javascripts/moment/src/locale/pa-in.js +115 -0
- data/vendor/assets/javascripts/moment/src/locale/pl.js +97 -0
- data/vendor/assets/javascripts/moment/src/locale/pt-br.js +52 -0
- data/vendor/assets/javascripts/moment/src/locale/pt.js +56 -0
- data/vendor/assets/javascripts/moment/src/locale/ro.js +66 -0
- data/vendor/assets/javascripts/moment/src/locale/ru.js +173 -0
- data/vendor/assets/javascripts/moment/src/locale/sd.js +88 -0
- data/vendor/assets/javascripts/moment/src/locale/se.js +51 -0
- data/vendor/assets/javascripts/moment/src/locale/si.js +61 -0
- data/vendor/assets/javascripts/moment/src/locale/sk.js +141 -0
- data/vendor/assets/javascripts/moment/src/locale/sl.js +152 -0
- data/vendor/assets/javascripts/moment/src/locale/sq.js +61 -0
- data/vendor/assets/javascripts/moment/src/locale/sr-cyrl.js +100 -0
- data/vendor/assets/javascripts/moment/src/locale/sr.js +100 -0
- data/vendor/assets/javascripts/moment/src/locale/ss.js +80 -0
- data/vendor/assets/javascripts/moment/src/locale/sv.js +60 -0
- data/vendor/assets/javascripts/moment/src/locale/sw.js +50 -0
- data/vendor/assets/javascripts/moment/src/locale/ta.js +120 -0
- data/vendor/assets/javascripts/moment/src/locale/te.js +79 -0
- data/vendor/assets/javascripts/moment/src/locale/tet.js +58 -0
- data/vendor/assets/javascripts/moment/src/locale/th.js +57 -0
- data/vendor/assets/javascripts/moment/src/locale/tl-ph.js +53 -0
- data/vendor/assets/javascripts/moment/src/locale/tlh.js +110 -0
- data/vendor/assets/javascripts/moment/src/locale/tr.js +81 -0
- data/vendor/assets/javascripts/moment/src/locale/tzl.js +82 -0
- data/vendor/assets/javascripts/moment/src/locale/tzm-latn.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/tzm.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/uk.js +142 -0
- data/vendor/assets/javascripts/moment/src/locale/ur.js +89 -0
- data/vendor/assets/javascripts/moment/src/locale/uz-latn.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/uz.js +49 -0
- data/vendor/assets/javascripts/moment/src/locale/vi.js +70 -0
- data/vendor/assets/javascripts/moment/src/locale/x-pseudo.js +58 -0
- data/vendor/assets/javascripts/moment/src/locale/yo.js +50 -0
- data/vendor/assets/javascripts/moment/src/locale/zh-cn.js +102 -0
- data/vendor/assets/javascripts/moment/src/locale/zh-hk.js +95 -0
- data/vendor/assets/javascripts/moment/src/locale/zh-tw.js +94 -0
- data/vendor/assets/javascripts/moment/src/moment.js +82 -0
- data/vendor/assets/javascripts/moment/templates/default.js +5 -0
- data/vendor/assets/javascripts/moment/templates/locale-header.js +6 -0
- data/vendor/assets/javascripts/moment/templates/test-header.js +6 -0
- metadata +943 -0
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'bundler/cli'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
namespace :binnacle do
|
7
|
+
desc "Pull JS assets from rails-assets-binnacle gem into vendo/assets/javascripts"
|
8
|
+
task :install_binnacle_js do
|
9
|
+
|
10
|
+
gems = [
|
11
|
+
'base64',
|
12
|
+
'moment',
|
13
|
+
'atmosphere',
|
14
|
+
'firebase',
|
15
|
+
'binnacle'
|
16
|
+
]
|
17
|
+
|
18
|
+
rails_manifest = "#{Dir.pwd}/vendor/assets/javascripts/binnacle.js"
|
19
|
+
|
20
|
+
FileUtils.rm_rf(Dir.glob("{Dir.pwd}/vendor/assets/javascripts/*"))
|
21
|
+
|
22
|
+
File.open(rails_manifest, "w+") do |f|
|
23
|
+
gems.each do |gem_name|
|
24
|
+
puts "Processing asset gem #{gem_name}..."
|
25
|
+
rails_assets_name = "rails-assets-#{gem_name}"
|
26
|
+
gem_directory = Bundler.rubygems.find_name(rails_assets_name).first.full_gem_path
|
27
|
+
gem_manifest = "#{gem_directory}/app/assets/javascripts/#{gem_name}.js"
|
28
|
+
source_assets_directory = "#{gem_directory}/app/assets/javascripts/#{gem_name}"
|
29
|
+
target_assets_directory = "#{Dir.pwd}/vendor/assets/javascripts/#{gem_name}"
|
30
|
+
|
31
|
+
target = File.dirname(target_assets_directory)
|
32
|
+
unless File.directory?(target)
|
33
|
+
FileUtils.mkdir_p(target)
|
34
|
+
puts "> creating target assets directory #{target_assets_directory}"
|
35
|
+
end
|
36
|
+
|
37
|
+
puts "> copying JS assets from #{rails_assets_name} to /app/assets/javascripts/#{gem_name}"
|
38
|
+
FileUtils.cp_r "#{source_assets_directory}/.", target_assets_directory, :verbose => true
|
39
|
+
|
40
|
+
puts "> writing #{gem_name} manifest contents to binnacle manifest..."
|
41
|
+
File.open(gem_manifest, "rb") do |fm|
|
42
|
+
contents = fm.read
|
43
|
+
f.puts(contents)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/bin/binnacle
ADDED
data/binnacle.gemspec
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'binnacle/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "binnacle"
|
8
|
+
spec.version = Binnacle::VERSION
|
9
|
+
spec.authors = ["Brian Sam-Bodden"]
|
10
|
+
spec.email = ["brian@binnacle.com"]
|
11
|
+
spec.summary = %q{ Ruby client for the Binnacle API }
|
12
|
+
spec.description = %q{ Binnacle Distributed Logging and Push Service. See http://binnacle.io }
|
13
|
+
spec.homepage = "http://binnacle.io/api"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'httpclient', '~> 2.8', '>= 2.8.0'
|
22
|
+
spec.add_runtime_dependency 'faraday', '~> 0.11'
|
23
|
+
spec.add_runtime_dependency 'faye-websocket', '~> 0.10', '>= 0.10.4'
|
24
|
+
spec.add_runtime_dependency 'trollop', '~> 2.1', '>= 2.1.2'
|
25
|
+
spec.add_runtime_dependency 'rack-timeout', '~> 0.4', '>= 0.4.2'
|
26
|
+
spec.add_runtime_dependency 'addressable', '~> 2.5'
|
27
|
+
spec.add_runtime_dependency 'colorize', '~> 0.8.1'
|
28
|
+
|
29
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
30
|
+
spec.add_development_dependency 'rake', '~> 10.5'
|
31
|
+
spec.add_development_dependency 'rspec', '~> 3.5', '>= 3.2.0'
|
32
|
+
spec.add_development_dependency 'rspec-collection_matchers', '~> 1.1', '>= 1.1.2'
|
33
|
+
spec.add_development_dependency 'rspec-wait', '~> 0.0.9'
|
34
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0', '>= 1.0.7'
|
35
|
+
spec.add_development_dependency 'simplecov', '~> 0.14'
|
36
|
+
spec.add_development_dependency 'vcr', '~> 3.0'
|
37
|
+
spec.add_development_dependency 'webmock', '~> 2.3'
|
38
|
+
spec.add_development_dependency 'fivemat', '~> 1.3', '>= 1.3.2'
|
39
|
+
spec.add_development_dependency 'rack', '~> 2.0'
|
40
|
+
|
41
|
+
# For outgoing HTTP logging testing
|
42
|
+
spec.add_development_dependency 'httparty', '~> 0.14'
|
43
|
+
spec.add_development_dependency 'excon', '~> 0.55'
|
44
|
+
spec.add_development_dependency 'typhoeus', '~> 1.1'
|
45
|
+
spec.add_development_dependency 'ethon', '~> 0.10'
|
46
|
+
spec.add_development_dependency 'patron', '~> 0.8'
|
47
|
+
spec.add_development_dependency 'http', '~> 2.2'
|
48
|
+
spec.add_development_dependency 'thin', '~> 1.7'
|
49
|
+
end
|
data/lib/binnacle.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'binnacle/configuration'
|
3
|
+
require 'binnacle/version'
|
4
|
+
require 'binnacle/errors'
|
5
|
+
require 'binnacle/connection'
|
6
|
+
require 'binnacle/resource'
|
7
|
+
require 'binnacle/client'
|
8
|
+
require 'binnacle/logging/logging'
|
9
|
+
require 'binnacle/commands/commands'
|
10
|
+
|
11
|
+
require 'binnacle/http_logging/http_logger'
|
12
|
+
require 'binnacle/http_logging/adapters/net_http'
|
13
|
+
require 'binnacle/http_logging/adapters/httpclient'
|
14
|
+
require 'binnacle/http_logging/adapters/excon'
|
15
|
+
require 'binnacle/http_logging/adapters/ethon'
|
16
|
+
require 'binnacle/http_logging/adapters/patron'
|
17
|
+
require 'binnacle/http_logging/adapters/http'
|
18
|
+
require 'binnacle/http_logging/adapters/typhoeus'
|
19
|
+
|
20
|
+
require 'rack-timeout'
|
21
|
+
|
22
|
+
module Binnacle
|
23
|
+
extend Forwardable
|
24
|
+
def_delegators :@client, :signal, :signal_asynch, :recents, :report_exception
|
25
|
+
|
26
|
+
[:signal, :signal_asynch, :recents, :report_exception].each do |m|
|
27
|
+
self.module_eval do
|
28
|
+
module_function(m)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
LOCK = Mutex.new
|
33
|
+
|
34
|
+
def self.configuration
|
35
|
+
@configuration || LOCK.synchronize { @configuration ||= Binnacle::Configuration.new }
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.configure(options = {})
|
39
|
+
set_options(options)
|
40
|
+
|
41
|
+
yield(configuration) if block_given?
|
42
|
+
|
43
|
+
configuration.prepare!
|
44
|
+
|
45
|
+
if configuration.ready?
|
46
|
+
create_client
|
47
|
+
setup_logger
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.binnacle_logger
|
52
|
+
@internal_logger ||= defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.binnacle_logger=(logger)
|
56
|
+
@internal_logger = logger
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.set_options(options)
|
60
|
+
options.each do |k,v|
|
61
|
+
configuration.send("#{k}=", v) rescue nil if configuration.respond_to?("#{k}=")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.create_client
|
66
|
+
binnacle_logger.info "Instantiating Binnacle Client..."
|
67
|
+
begin
|
68
|
+
@client = Client.new()
|
69
|
+
rescue Faraday::ConnectionFailed => fcf
|
70
|
+
binnacle_logger.error "Failed to connect to Binnacle. Check your settings!"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.setup_logger
|
75
|
+
if @client && configuration.can_setup_logger?
|
76
|
+
if defined?(Rails)
|
77
|
+
binnacle_logger.info "Configuring Binnacle Rails logger..."
|
78
|
+
@logger = Logging.new(@client, configuration.logging_channel)
|
79
|
+
@logger.level = Logger::INFO
|
80
|
+
if configuration.rails_verbose_logging?
|
81
|
+
Rails.logger.extend(ActiveSupport::Logger.broadcast(@logger))
|
82
|
+
end
|
83
|
+
Rack::Timeout.unregister_state_change_observer(:logger) if Rails.env.development?
|
84
|
+
else
|
85
|
+
binnacle_logger.info "Skipping Binnacle Rails logger configuration..."
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.logger
|
91
|
+
@logger
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.client
|
95
|
+
@client
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# JS Assets Inclusion
|
100
|
+
#
|
101
|
+
if defined?(Rails)
|
102
|
+
class Engine < ::Rails::Engine
|
103
|
+
# Rails -> use app/assets directory.
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if defined?(Rails::Railtie)
|
109
|
+
require 'binnacle/trap/middleware'
|
110
|
+
require 'binnacle/trap/railtie'
|
111
|
+
require 'binnacle/logging/request_log_subscriber'
|
112
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'binnacle/resources/event'
|
2
|
+
require 'binnacle/trap/exception_event'
|
3
|
+
require 'binnacle/logging/formatter'
|
4
|
+
require 'socket'
|
5
|
+
|
6
|
+
module Binnacle
|
7
|
+
class Client
|
8
|
+
|
9
|
+
attr_accessor :api_key, :api_secret
|
10
|
+
attr_accessor :connection
|
11
|
+
attr_accessor :logging_channel_id
|
12
|
+
attr_accessor :client_id
|
13
|
+
attr_accessor :session_id
|
14
|
+
attr_writer :ready
|
15
|
+
|
16
|
+
def initialize(api_key = nil, api_secret = nil, endpoint = nil, logging_channel_id = nil)
|
17
|
+
self.api_key = api_key || Binnacle.configuration.api_key
|
18
|
+
self.api_secret = api_secret || Binnacle.configuration.api_secret
|
19
|
+
if endpoint
|
20
|
+
self.connection = Connection.new(self.api_key, self.api_secret, Binnacle.configuration.build_url(endpoint))
|
21
|
+
else
|
22
|
+
self.connection = Connection.new(self.api_key, self.api_secret)
|
23
|
+
end
|
24
|
+
self.logging_channel_id = logging_channel_id || Binnacle.configuration.logging_channel
|
25
|
+
|
26
|
+
self.client_id = ""
|
27
|
+
self.session_id = ""
|
28
|
+
|
29
|
+
@formatter = Binnacle::Logging::Formatter.new(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def signal(channel_id, event_name, client_id, session_id, log_level, tags = [], json = {}, asynch = false)
|
33
|
+
event = Binnacle::Event.new()
|
34
|
+
event.configure(channel_id, event_name, client_id, session_id, log_level, nil, tags, json)
|
35
|
+
event.connection = connection
|
36
|
+
asynch ? event.post_asynch : event.post
|
37
|
+
end
|
38
|
+
|
39
|
+
def signal_asynch(channel_id, event_name, client_id = '', session_id = '', log_level = 'INFO', tags = [], json = {})
|
40
|
+
signal(channel_id, event_name, client_id, session_id, log_level, tags, json, true)
|
41
|
+
end
|
42
|
+
|
43
|
+
def recents(lines, since, channel)
|
44
|
+
Binnacle::Event.recents(connection, lines, since, channel)
|
45
|
+
end
|
46
|
+
|
47
|
+
def events(channel, date, start_hour, end_hour, lines)
|
48
|
+
Binnacle::Event.events(connection, channel, date, start_hour, end_hour, lines)
|
49
|
+
end
|
50
|
+
|
51
|
+
def report_exception(exception, env, asynch = true)
|
52
|
+
event = Binnacle::Trap::ExceptionEvent.new(exception, env)
|
53
|
+
event.connection = connection
|
54
|
+
asynch ? event.post_asynch : event.post
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Ruby Logger Implementation
|
59
|
+
#
|
60
|
+
|
61
|
+
def formatter
|
62
|
+
@formatter
|
63
|
+
end
|
64
|
+
|
65
|
+
def write(event)
|
66
|
+
if event
|
67
|
+
event.connection = connection
|
68
|
+
Binnacle.configuration.asynch_logging ? event.post_asynch : event.post
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def close
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def ready?
|
77
|
+
!connection.nil?
|
78
|
+
end
|
79
|
+
|
80
|
+
def log_rails_event(data)
|
81
|
+
session_id, client_id = session_and_client_ids
|
82
|
+
event_name = %[#{data[:method]} #{data[:path]}]
|
83
|
+
|
84
|
+
event = Binnacle::Event.new()
|
85
|
+
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', data[:time], [], data)
|
86
|
+
write(event)
|
87
|
+
end
|
88
|
+
|
89
|
+
def log_http_event(data)
|
90
|
+
session_id, client_id = session_and_client_ids
|
91
|
+
event_name = %[#{data[:method]} #{data[:url]}]
|
92
|
+
|
93
|
+
event = Binnacle::Event.new()
|
94
|
+
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', data[:time], [], data)
|
95
|
+
write(event)
|
96
|
+
end
|
97
|
+
|
98
|
+
def session_and_client_ids
|
99
|
+
if defined?(ActiveSupport::TaggedLogging) && Thread.current[:activesupport_tagged_logging_tags]
|
100
|
+
session_id, client_id = Thread.current[:activesupport_tagged_logging_tags].first(2)
|
101
|
+
else
|
102
|
+
session_id, client_id = self.session_id, self.client_id
|
103
|
+
end
|
104
|
+
|
105
|
+
unless client_id
|
106
|
+
# set it to the first non-loopback IP in the list
|
107
|
+
client_id = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address
|
108
|
+
end
|
109
|
+
|
110
|
+
[ session_id, client_id ]
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'trollop'
|
2
|
+
require_relative 'help'
|
3
|
+
require_relative 'tail'
|
4
|
+
|
5
|
+
class BinnacleCommand
|
6
|
+
def run(args)
|
7
|
+
ARGV.push(*args) if ENV["TEST_MODE"] == 'true' # testing cheat
|
8
|
+
|
9
|
+
subcommand = args[0].downcase.to_sym if args[0]
|
10
|
+
begin
|
11
|
+
if subcommand
|
12
|
+
Binnacle::Commands.send(subcommand)
|
13
|
+
else
|
14
|
+
Binnacle::Commands.send('help')
|
15
|
+
end
|
16
|
+
rescue NoMethodError => nme
|
17
|
+
puts "I don't know the subcommand command '#{subcommand}'"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Binnacle::Commands
|
2
|
+
|
3
|
+
def self.help
|
4
|
+
opts = Trollop::options do
|
5
|
+
banner HELP_BANNER
|
6
|
+
end
|
7
|
+
|
8
|
+
Trollop::educate unless ENV["TEST_MODE"] == 'true'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
HELP_BANNER = <<-EOS
|
13
|
+
Usage:
|
14
|
+
binnacle 'subcommand'
|
15
|
+
|
16
|
+
where [subcommands] are:
|
17
|
+
tail: tails signals on a Binnacle Application or Channel
|
18
|
+
help: shows this message
|
19
|
+
|
20
|
+
options for 'binnacle'
|
21
|
+
EOS
|
@@ -0,0 +1,187 @@
|
|
1
|
+
require 'faye/websocket'
|
2
|
+
require 'addressable/uri'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'json'
|
5
|
+
require 'colorize'
|
6
|
+
|
7
|
+
module Binnacle::Commands
|
8
|
+
|
9
|
+
def self.tail
|
10
|
+
if ENV["TEST_MODE"] == 'true'
|
11
|
+
String.disable_colorization = true
|
12
|
+
end
|
13
|
+
|
14
|
+
opts = Trollop::options do
|
15
|
+
banner TAIL_BANNER
|
16
|
+
opt(:host, "Binnacle Host", type: :string, default: 'localhost')
|
17
|
+
opt(:channel, "Binnacle Channel", type: :string)
|
18
|
+
opt(:app, "Binnacle App", type: :string)
|
19
|
+
opt(:api_key, "Binnacle API Key", type: :string, short: '-u')
|
20
|
+
opt(:api_secret, "Binnacle API Secret", type: :string, short: '-p')
|
21
|
+
opt(:follow, "Monitors a Binnacle Channel or App")
|
22
|
+
opt(:lines, "Get the last n events on the Channel", type: :int, short: '-n')
|
23
|
+
opt(:since, "Number of minutes in the past to search for events", type: :int)
|
24
|
+
opt(:encrypted, "Use SSL/HTTPS", default: true)
|
25
|
+
end
|
26
|
+
|
27
|
+
if (errors = validate(opts)).empty?
|
28
|
+
dispatch(opts)
|
29
|
+
else
|
30
|
+
puts "The following errors prevented the tail command from executing:"
|
31
|
+
errors.each { |e| puts " - #{e}" }
|
32
|
+
puts "\nSUBCOMMAND"
|
33
|
+
puts " tail -- listen to a Binnacle channel or app\n\n"
|
34
|
+
Trollop::educate unless ENV["TEST_MODE"] == 'true'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.validate(opts)
|
39
|
+
errors = []
|
40
|
+
errors << "No channel or app given" unless (opts[:channel_given] || opts[:app_given])
|
41
|
+
errors << "No authentication information given" unless (opts[:api_key_given] && opts[:api_secret_given])
|
42
|
+
errors << "Cannot use both 'follow' and 'lines'" if (opts[:follow_given] && opts[:lines_given])
|
43
|
+
errors << "Cannot use both 'app' and 'channel'" if (opts[:channel_given] && opts[:app_given])
|
44
|
+
errors << "Lines subcommand does not support montoring of Apps at this moment" if (opts[:lines_given] && opts[:app_given])
|
45
|
+
errors
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.dispatch(opts)
|
49
|
+
# tail --follow
|
50
|
+
if opts[:follow_given] && opts[:app_given]
|
51
|
+
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:app], true, opts[:encrypted])
|
52
|
+
elsif opts[:follow_given] && opts[:channel_given]
|
53
|
+
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], false, opts[:encrypted])
|
54
|
+
end
|
55
|
+
|
56
|
+
# tail --lines
|
57
|
+
lines(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], opts[:lines], opts[:since], opts[:encrypted_given] ? opts[:encrypted] : false) if opts[:lines_given]
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# tail --follow --host=my_host --channel=my_channel
|
62
|
+
def self.monitor(host, api_key, api_secret, channel, is_app = false, encrypted = true)
|
63
|
+
EM.run do
|
64
|
+
Signal.trap("INT") { EventMachine.stop }
|
65
|
+
Signal.trap("TERM") { EventMachine.stop }
|
66
|
+
|
67
|
+
ws_url = build_ws_url(host, api_key, api_secret, channel, is_app, encrypted)
|
68
|
+
ws = Faye::WebSocket::Client.new(ws_url)
|
69
|
+
|
70
|
+
ws.on :open do |event|
|
71
|
+
puts "Monitoring #{is_app ? 'App' : 'Channel'} #{channel} on #{host}..."
|
72
|
+
end
|
73
|
+
|
74
|
+
ws.on :message do |event|
|
75
|
+
if event.data !~ /\s/ && event.data != 'X'
|
76
|
+
print_event_from_json(event.data)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
ws.on :close do |event|
|
81
|
+
ws = nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# tail --lines=50 --since=10 --host=my_host --channel=my_channel
|
88
|
+
def self.lines(host, api_key, api_secret, channel, lines, since, encrypted = true)
|
89
|
+
puts "Retrieving last #{lines} lines since #{since} minutes ago from Channel #{channel} ..."
|
90
|
+
Binnacle.configuration.encrypted = encrypted
|
91
|
+
client = Binnacle::Client.new(api_key, api_secret, host)
|
92
|
+
|
93
|
+
client.recents(lines, since, channel).each do |e|
|
94
|
+
print_event(e)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
protected
|
99
|
+
|
100
|
+
def self.build_ws_url(host, api_key, api_secret, channel, is_app = false, encrypted = true)
|
101
|
+
Addressable::URI.new(
|
102
|
+
host: host,
|
103
|
+
port: Binnacle::Configuration::DEFAULT_PORT,
|
104
|
+
scheme: encrypted ? 'wss' : 'ws',
|
105
|
+
path: ["/api/subscribe", is_app ? "app" : "channel", channel].join("/"),
|
106
|
+
query: build_ws_query(api_key, api_secret)
|
107
|
+
).to_s
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.build_ws_query(api_key, api_secret)
|
111
|
+
{
|
112
|
+
"Authorization" => %[Basic #{Base64.encode64("#{api_key}:#{api_secret}").strip}],
|
113
|
+
"X-Atmosphere-tracking-id" => "0",
|
114
|
+
"X-Atmosphere-Framework" => "2.3.2-javascript",
|
115
|
+
"X-Atmosphere-Transport" => "websocket",
|
116
|
+
"Content-Type" => "application/json",
|
117
|
+
"X-atmo-protocol" => "true"
|
118
|
+
}.map { |n,v| "#{n}=#{v}" }.join("&")
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.print_event(event)
|
122
|
+
message = ""
|
123
|
+
|
124
|
+
level = '%-10.10s' % event.log_level
|
125
|
+
|
126
|
+
level = case
|
127
|
+
when ['INFO', 'EXPORT_JOB'].include?(level)
|
128
|
+
level.colorize(:blue)
|
129
|
+
when ['WARN', 'WARNING', 'OVERAGE'].include?(level)
|
130
|
+
level.colorize(:yellow)
|
131
|
+
when ['ERROR', 'FATAL', 'DELIVERY_FAILURE', 'EXCEPTION', 'OOPS', 'MYBAD'].include?(level)
|
132
|
+
level.colorize(:red)
|
133
|
+
when ['DEBUG'].include?(level)
|
134
|
+
level.colorize(:cyan)
|
135
|
+
when ['UNKNOWN'].include?(level)
|
136
|
+
level.colorize(:magenta)
|
137
|
+
else
|
138
|
+
level.colorize(:blue)
|
139
|
+
end.colorize(mode: :bold)
|
140
|
+
|
141
|
+
message << "#{level} [#{Time.at(event.event_time)}] "
|
142
|
+
|
143
|
+
message << ('%-10.10s' % event.event_name).colorize(color: :green, mode: :bold)
|
144
|
+
|
145
|
+
rest = []
|
146
|
+
|
147
|
+
unless event.client_id.nil? || event.client_id.empty?
|
148
|
+
rest << " #{'client_id'.colorize(mode: :bold)} = #{event.client_id}"
|
149
|
+
end
|
150
|
+
|
151
|
+
unless event.session_id.nil? || event.session_id.empty?
|
152
|
+
rest << "#{'session_id'.colorize(mode: :bold)} = #{event.session_id}"
|
153
|
+
end
|
154
|
+
|
155
|
+
unless event.ip_address.nil? || event.ip_address.empty?
|
156
|
+
rest << "#{'ip'.colorize(mode: :bold)} = #{('%-15.15s' % event.ip_address)}"
|
157
|
+
end
|
158
|
+
|
159
|
+
unless event.tags.empty?
|
160
|
+
tags = event.tags.join(',')
|
161
|
+
rest << "#{'tags'.colorize(mode: :bold)} = [#{event.tags}]"
|
162
|
+
end
|
163
|
+
|
164
|
+
message << " :: ".colorize(mode: :bold) + rest.join(", ") unless rest.empty?
|
165
|
+
|
166
|
+
puts message
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.print_event_from_json(json)
|
170
|
+
begin
|
171
|
+
data = JSON.parse(json)
|
172
|
+
event = Binnacle::Event.from_hash(data)
|
173
|
+
print_event(event)
|
174
|
+
rescue JSON::ParserError => jpe
|
175
|
+
# do nothing!
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
TAIL_BANNER = <<-EOS
|
182
|
+
Usage:
|
183
|
+
binnacle tail [options]
|
184
|
+
|
185
|
+
where [options] are:
|
186
|
+
|
187
|
+
EOS
|