binnacle 0.4.8 → 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +26 -26
- data/lib/binnacle/client.rb +10 -6
- data/lib/binnacle/commands/tail.rb +23 -15
- data/lib/binnacle/logging/formatter.rb +3 -4
- data/lib/binnacle/resources/event.rb +19 -6
- data/lib/binnacle/trap/exception_event.rb +4 -6
- data/lib/binnacle/version.rb +1 -1
- data/spec/client_spec.rb +15 -41
- data/spec/commands_spec.rb +22 -12
- data/spec/logger_spec.rb +6 -1
- data/spec/vcr/binnacle_client/events_invokes_the_events_api.yml +52 -55
- data/spec/vcr/binnacle_client/events_returns_a_collection_of_event_objects.yml +52 -55
- data/spec/vcr/binnacle_client/recents_invokes_the_events_api_recents.yml +59 -22
- data/spec/vcr/binnacle_client/recents_returns_a_collection_of_event_objects.yml +98 -22
- data/spec/vcr/binnacle_client/report_exception_invokes_the_events_api_signal.yml +23 -24
- data/spec/vcr/binnacle_client/signal_asynch_invokes_the_events_api_signal.yml +26 -19
- data/spec/vcr/binnacle_client/signal_invokes_the_events_api_signal.yml +60 -15
- data/spec/vcr/binnacle_client_ready_/returns_true_if_a_connection_has_been_successfully_established.yml +45 -6
- data/spec/vcr/binnacle_command/requires_a_known_subcommand_argument.yml +42 -0
- data/spec/vcr/binnacle_command/tail_command_validates_the_passed_params_before_executing.yml +42 -0
- data/spec/vcr/binnacle_command/tail_command_with_n_flag_returns_recent_events.yml +61 -16
- data/spec/vcr/binnacle_http_logger/_htt_party_adapter_should_log__ge_t_requests.yml +38 -1
- data/spec/vcr/binnacle_http_logger/_http_client_adapter_should_log__ge_t_requests.yml +74 -0
- data/spec/vcr/binnacle_http_logger/open_uri_adapter_should_log__ge_t_requests.yml +333 -0
- data/spec/vcr/binnacle_http_logger/typhoeus_adapter_should_log__ge_t_requests.yml +38 -1
- data/spec/vcr/binnacle_logging/logging_allows_passing_other_parameters_using_a_hash.yml +35 -33
- data/spec/vcr/binnacle_logging/logging_invokes_the_events_api_signal.yml +60 -15
- data/spec/vcr/binnacle_logging/logging_respects_the_logger_severity.yml +54 -15
- data/vendor/assets/javascripts/binnacle/binnacle.js +39 -18
- metadata +6 -4
- data/spec/exception_event_spec.rb +0 -72
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 957b5284e87ffafca6a136ed720f5b7fc95cf095
|
4
|
+
data.tar.gz: 78b6d5c88873e108f166a13b2d8b001ded78c98d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652ce111e80447a30de76e235bc54626908cb9a25d2bab117d9360643ed045b301a416e91206793c30ff47744e78911e9bf1141c7242b6b6c2386225238e6509
|
7
|
+
data.tar.gz: 56720fc4a5ce64a7966472b6703d0a03714215fdab8253f232b63c6b8d640a418b1b257ac61ca15dc98f9a8cfea26a480f9a701bf91352b01e283a018f0634a2
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
binnacle (0.4.
|
4
|
+
binnacle (0.4.9)
|
5
5
|
addressable (~> 2.5)
|
6
6
|
colorize (~> 0.8.1)
|
7
7
|
faraday (~> 0.11)
|
@@ -29,37 +29,37 @@ GEM
|
|
29
29
|
ethon (0.10.1)
|
30
30
|
ffi (>= 1.3.0)
|
31
31
|
eventmachine (1.2.3)
|
32
|
-
excon (0.
|
33
|
-
faraday (0.12.
|
32
|
+
excon (0.57.1)
|
33
|
+
faraday (0.12.1)
|
34
34
|
multipart-post (>= 1.2, < 3)
|
35
35
|
faye-websocket (0.10.7)
|
36
36
|
eventmachine (>= 0.12.0)
|
37
37
|
websocket-driver (>= 0.5.1)
|
38
38
|
ffi (1.9.18)
|
39
|
-
fivemat (1.3.
|
40
|
-
hashdiff (0.3.
|
41
|
-
http (2.2.
|
39
|
+
fivemat (1.3.5)
|
40
|
+
hashdiff (0.3.4)
|
41
|
+
http (2.2.2)
|
42
42
|
addressable (~> 2.3)
|
43
43
|
http-cookie (~> 1.0)
|
44
44
|
http-form_data (~> 1.0.1)
|
45
45
|
http_parser.rb (~> 0.6.0)
|
46
46
|
http-cookie (1.0.3)
|
47
47
|
domain_name (~> 0.5)
|
48
|
-
http-form_data (1.0.
|
48
|
+
http-form_data (1.0.3)
|
49
49
|
http_parser.rb (0.6.0)
|
50
|
-
httparty (0.
|
50
|
+
httparty (0.15.5)
|
51
51
|
multi_xml (>= 0.5.2)
|
52
52
|
httpclient (2.8.3)
|
53
|
-
json (2.0
|
53
|
+
json (2.1.0)
|
54
54
|
multi_xml (0.6.0)
|
55
55
|
multipart-post (2.0.0)
|
56
56
|
patron (0.8.0)
|
57
57
|
public_suffix (2.0.5)
|
58
|
-
rack (2.0.
|
58
|
+
rack (2.0.3)
|
59
59
|
rack-timeout (0.4.2)
|
60
60
|
rails-assets-atmosphere (2.3.2)
|
61
61
|
rails-assets-base64 (1.0.0)
|
62
|
-
rails-assets-binnacle (0.2.
|
62
|
+
rails-assets-binnacle (0.2.6)
|
63
63
|
rails-assets-atmosphere (= 2.3.2)
|
64
64
|
rails-assets-base64 (= 1.0.0)
|
65
65
|
rails-assets-firebase (= 3.7.1)
|
@@ -67,21 +67,21 @@ GEM
|
|
67
67
|
rails-assets-firebase (3.7.1)
|
68
68
|
rails-assets-moment (2.18.0)
|
69
69
|
rake (10.5.0)
|
70
|
-
rspec (3.
|
71
|
-
rspec-core (~> 3.
|
72
|
-
rspec-expectations (~> 3.
|
73
|
-
rspec-mocks (~> 3.
|
70
|
+
rspec (3.6.0)
|
71
|
+
rspec-core (~> 3.6.0)
|
72
|
+
rspec-expectations (~> 3.6.0)
|
73
|
+
rspec-mocks (~> 3.6.0)
|
74
74
|
rspec-collection_matchers (1.1.3)
|
75
75
|
rspec-expectations (>= 2.99.0.beta1)
|
76
|
-
rspec-core (3.
|
77
|
-
rspec-support (~> 3.
|
78
|
-
rspec-expectations (3.
|
76
|
+
rspec-core (3.6.0)
|
77
|
+
rspec-support (~> 3.6.0)
|
78
|
+
rspec-expectations (3.6.0)
|
79
79
|
diff-lcs (>= 1.2.0, < 2.0)
|
80
|
-
rspec-support (~> 3.
|
81
|
-
rspec-mocks (3.
|
80
|
+
rspec-support (~> 3.6.0)
|
81
|
+
rspec-mocks (3.6.0)
|
82
82
|
diff-lcs (>= 1.2.0, < 2.0)
|
83
|
-
rspec-support (~> 3.
|
84
|
-
rspec-support (3.
|
83
|
+
rspec-support (~> 3.6.0)
|
84
|
+
rspec-support (3.6.0)
|
85
85
|
rspec-wait (0.0.9)
|
86
86
|
rspec (>= 3, < 4)
|
87
87
|
safe_yaml (1.0.4)
|
@@ -89,8 +89,8 @@ GEM
|
|
89
89
|
docile (~> 1.1.0)
|
90
90
|
json (>= 1.8, < 3)
|
91
91
|
simplecov-html (~> 0.10.0)
|
92
|
-
simplecov-html (0.10.
|
93
|
-
thin (1.7.
|
92
|
+
simplecov-html (0.10.1)
|
93
|
+
thin (1.7.1)
|
94
94
|
daemons (~> 1.0, >= 1.0.9)
|
95
95
|
eventmachine (~> 1.0, >= 1.0.4)
|
96
96
|
rack (>= 1, < 3)
|
@@ -99,7 +99,7 @@ GEM
|
|
99
99
|
ethon (>= 0.9.0)
|
100
100
|
unf (0.1.4)
|
101
101
|
unf_ext
|
102
|
-
unf_ext (0.0.7.
|
102
|
+
unf_ext (0.0.7.4)
|
103
103
|
vcr (3.0.3)
|
104
104
|
webmock (2.3.2)
|
105
105
|
addressable (>= 2.3.6)
|
@@ -123,7 +123,7 @@ DEPENDENCIES
|
|
123
123
|
httparty (~> 0.14)
|
124
124
|
patron (~> 0.8)
|
125
125
|
rack (~> 2.0)
|
126
|
-
rails-assets-binnacle (>= 0.2.
|
126
|
+
rails-assets-binnacle (>= 0.2.6)!
|
127
127
|
rake (~> 10.5)
|
128
128
|
rspec (~> 3.5, >= 3.2.0)
|
129
129
|
rspec-collection_matchers (~> 1.1, >= 1.1.2)
|
data/lib/binnacle/client.rb
CHANGED
@@ -29,15 +29,19 @@ module Binnacle
|
|
29
29
|
@formatter = Binnacle::Logging::Formatter.new(self)
|
30
30
|
end
|
31
31
|
|
32
|
-
def signal(channel_id, event_name, client_id, session_id, log_level, tags = [], json = {}, asynch = false)
|
32
|
+
def signal(channel_id, event_name, client_id, session_id, log_level, environment = Event.rails_env, tags = [], json = {}, asynch = false)
|
33
33
|
event = Binnacle::Event.new()
|
34
|
-
event.configure(channel_id, event_name, client_id, session_id, log_level, nil, tags, json)
|
34
|
+
event.configure(channel_id, event_name, client_id, session_id, log_level, environment, nil, tags, json)
|
35
35
|
event.connection = connection
|
36
36
|
asynch ? event.post_asynch : event.post
|
37
37
|
end
|
38
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)
|
39
|
+
def signal_asynch(channel_id, event_name, client_id = '', session_id = '', log_level = 'INFO', environment = Event.rails_env, tags = [], json = {})
|
40
|
+
signal(channel_id, event_name, client_id, session_id, log_level, environment, tags, json, true)
|
41
|
+
end
|
42
|
+
|
43
|
+
def broadcast(channel_id, event_name, json)
|
44
|
+
signal(channel_id, event_name, "", "", 'CABLE', nil, [], json, true)
|
41
45
|
end
|
42
46
|
|
43
47
|
def recents(lines, since, channel)
|
@@ -82,7 +86,7 @@ module Binnacle
|
|
82
86
|
event_name = %[#{data[:method]} #{data[:path]}]
|
83
87
|
|
84
88
|
event = Binnacle::Event.new()
|
85
|
-
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', data[:time], [], data)
|
89
|
+
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', nil, data[:time], [], data)
|
86
90
|
write(event)
|
87
91
|
end
|
88
92
|
|
@@ -91,7 +95,7 @@ module Binnacle
|
|
91
95
|
event_name = %[#{data[:method]} #{data[:url]}]
|
92
96
|
|
93
97
|
event = Binnacle::Event.new()
|
94
|
-
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', data[:time], [], data)
|
98
|
+
event.configure(logging_channel_id, event_name, client_id, session_id, 'log', nil, data[:time], [], data)
|
95
99
|
write(event)
|
96
100
|
end
|
97
101
|
|
@@ -22,6 +22,8 @@ module Binnacle::Commands
|
|
22
22
|
opt(:lines, "Get the last n events on the Channel", type: :int, short: '-n')
|
23
23
|
opt(:since, "Number of minutes in the past to search for events", type: :int)
|
24
24
|
opt(:encrypted, "Use SSL/HTTPS", default: true)
|
25
|
+
opt(:environment, "The target environment (Rails.env)", type: :string, default: 'production')
|
26
|
+
opt(:payload, "Show JSON Payload", default: false)
|
25
27
|
end
|
26
28
|
|
27
29
|
if (errors = validate(opts)).empty?
|
@@ -48,23 +50,23 @@ module Binnacle::Commands
|
|
48
50
|
def self.dispatch(opts)
|
49
51
|
# tail --follow
|
50
52
|
if opts[:follow_given] && opts[:app_given]
|
51
|
-
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:app], true, opts[:encrypted])
|
53
|
+
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:app], opts[:environment], true, opts[:encrypted], opts[:payload])
|
52
54
|
elsif opts[:follow_given] && opts[:channel_given]
|
53
|
-
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], false, opts[:encrypted])
|
55
|
+
monitor(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], opts[:environment], false, opts[:encrypted], opts[:payload])
|
54
56
|
end
|
55
57
|
|
56
58
|
# tail --lines
|
57
|
-
lines(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], opts[:lines], opts[:since], opts[:
|
59
|
+
lines(opts[:host], opts[:api_key], opts[:api_secret], opts[:channel], opts[:lines], opts[:since], opts[:environment], opts[:encrypted]) if opts[:lines_given]
|
58
60
|
end
|
59
61
|
|
60
62
|
#
|
61
63
|
# tail --follow --host=my_host --channel=my_channel
|
62
|
-
def self.monitor(host, api_key, api_secret, channel, is_app = false, encrypted = true)
|
64
|
+
def self.monitor(host, api_key, api_secret, channel, environment, is_app = false, encrypted = true, payload = false)
|
63
65
|
EM.run do
|
64
66
|
Signal.trap("INT") { EventMachine.stop }
|
65
67
|
Signal.trap("TERM") { EventMachine.stop }
|
66
68
|
|
67
|
-
ws_url = build_ws_url(host, api_key, api_secret, channel, is_app, encrypted)
|
69
|
+
ws_url = build_ws_url(host, api_key, api_secret, channel, environment, is_app, encrypted)
|
68
70
|
ws = Faye::WebSocket::Client.new(ws_url)
|
69
71
|
|
70
72
|
ws.on :open do |event|
|
@@ -73,7 +75,7 @@ module Binnacle::Commands
|
|
73
75
|
|
74
76
|
ws.on :message do |event|
|
75
77
|
if event.data !~ /\s/ && event.data != 'X'
|
76
|
-
print_event_from_json(event.data)
|
78
|
+
print_event_from_json(event.data, payload)
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
@@ -85,24 +87,24 @@ module Binnacle::Commands
|
|
85
87
|
|
86
88
|
#
|
87
89
|
# 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)
|
90
|
+
def self.lines(host, api_key, api_secret, channel, lines, since, environment = 'production', encrypted = true, payload = false)
|
89
91
|
puts "Retrieving last #{lines} lines since #{since} minutes ago from Channel #{channel} ..."
|
90
92
|
Binnacle.configuration.encrypted = encrypted
|
91
93
|
client = Binnacle::Client.new(api_key, api_secret, host)
|
92
94
|
|
93
95
|
client.recents(lines, since, channel).each do |e|
|
94
|
-
print_event(e)
|
96
|
+
print_event(e, payload)
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
98
100
|
protected
|
99
101
|
|
100
|
-
def self.build_ws_url(host, api_key, api_secret, channel, is_app = false, encrypted =
|
102
|
+
def self.build_ws_url(host, api_key, api_secret, channel, environment, is_app = false, encrypted = Binnacle.configuration.encrypted)
|
101
103
|
Addressable::URI.new(
|
102
104
|
host: host,
|
103
105
|
port: Binnacle::Configuration::DEFAULT_PORT,
|
104
106
|
scheme: encrypted ? 'wss' : 'ws',
|
105
|
-
path: ["/api/subscribe", is_app ? "app" : "channel", channel].join("/"),
|
107
|
+
path: ["/api/subscribe", is_app ? "app" : "channel", channel, environment].join("/"),
|
106
108
|
query: build_ws_query(api_key, api_secret)
|
107
109
|
).to_s
|
108
110
|
end
|
@@ -118,7 +120,7 @@ module Binnacle::Commands
|
|
118
120
|
}.map { |n,v| "#{n}=#{v}" }.join("&")
|
119
121
|
end
|
120
122
|
|
121
|
-
def self.print_event(event)
|
123
|
+
def self.print_event(event, payload = false)
|
122
124
|
message = ""
|
123
125
|
|
124
126
|
level = '%-10.10s' % event.log_level
|
@@ -138,7 +140,9 @@ module Binnacle::Commands
|
|
138
140
|
level.colorize(:blue)
|
139
141
|
end.colorize(mode: :bold)
|
140
142
|
|
141
|
-
|
143
|
+
env = event.environment.colorize(mode: :bold)
|
144
|
+
|
145
|
+
message << "#{env}::#{level} [#{Time.at(event.event_time)}] "
|
142
146
|
|
143
147
|
message << ('%-10.10s' % event.event_name).colorize(color: :green, mode: :bold)
|
144
148
|
|
@@ -158,19 +162,23 @@ module Binnacle::Commands
|
|
158
162
|
|
159
163
|
unless event.tags.empty?
|
160
164
|
tags = event.tags.join(',')
|
161
|
-
rest << "#{'tags'.colorize(mode: :bold)} = [#{
|
165
|
+
rest << "#{'tags'.colorize(mode: :bold)} = [#{tags}]"
|
162
166
|
end
|
163
167
|
|
164
168
|
message << " :: ".colorize(mode: :bold) + rest.join(", ") unless rest.empty?
|
165
169
|
|
170
|
+
if payload && event.json
|
171
|
+
message << "\n\t ==> #{event.json}"
|
172
|
+
end
|
173
|
+
|
166
174
|
puts message
|
167
175
|
end
|
168
176
|
|
169
|
-
def self.print_event_from_json(json)
|
177
|
+
def self.print_event_from_json(json, payload = false)
|
170
178
|
begin
|
171
179
|
data = JSON.parse(json)
|
172
180
|
event = Binnacle::Event.from_hash(data)
|
173
|
-
print_event(event)
|
181
|
+
print_event(event, payload)
|
174
182
|
rescue JSON::ParserError => jpe
|
175
183
|
# do nothing!
|
176
184
|
end
|
@@ -14,15 +14,14 @@ module Binnacle
|
|
14
14
|
event = Binnacle::Event.new()
|
15
15
|
|
16
16
|
logging_tags = current_tags.dup
|
17
|
-
|
18
17
|
if progname
|
19
|
-
event.configure_from_logging_progname(progname, @client.logging_channel_id, client_id, session_id, severity, datetime, [], { message: msg })
|
18
|
+
event.configure_from_logging_progname(progname, @client.logging_channel_id, client_id, session_id, severity, nil, datetime, [], { message: msg })
|
20
19
|
elsif defined?(ActiveSupport::TaggedLogging) && logging_tags && !logging_tags.empty? && logging_tags.size > 2
|
21
20
|
logging_tags.shift(2)
|
22
21
|
event_name = logging_tags.shift
|
23
|
-
event.configure_from_logging_progname(event_name, @client.logging_channel_id, client_id, session_id, severity, datetime, logging_tags, { message: msg })
|
22
|
+
event.configure_from_logging_progname(event_name, @client.logging_channel_id, client_id, session_id, severity, nil, datetime, logging_tags, { message: msg })
|
24
23
|
else
|
25
|
-
event.configure(@client.logging_channel_id, 'log', client_id, session_id, severity, datetime, [], { message: msg })
|
24
|
+
event.configure(@client.logging_channel_id, 'log', client_id, session_id, severity, nil, datetime, [], { message: msg })
|
26
25
|
end
|
27
26
|
|
28
27
|
event
|
@@ -11,8 +11,9 @@ module Binnacle
|
|
11
11
|
attr_accessor :tags
|
12
12
|
attr_accessor :json
|
13
13
|
attr_accessor :event_time
|
14
|
+
attr_accessor :environment
|
14
15
|
|
15
|
-
def configure(channel_id, event_name, client_id, session_id, log_level, ts = Time.now, tags = [], json = {})
|
16
|
+
def configure(channel_id, event_name, client_id, session_id, log_level, environment = Event.rails_env, ts = Time.now, tags = [], json = {})
|
16
17
|
self.channel_id = channel_id
|
17
18
|
self.event_name = event_name
|
18
19
|
self.client_id = client_id
|
@@ -21,9 +22,10 @@ module Binnacle
|
|
21
22
|
self.log_level = log_level
|
22
23
|
self.tags = tags
|
23
24
|
self.json = json
|
25
|
+
self.environment = environment || Event.rails_env
|
24
26
|
end
|
25
27
|
|
26
|
-
def configure_from_logging_progname(progname, channel_id, client_id, session_id, log_level, ts = Time.now, tags = [], json = {})
|
28
|
+
def configure_from_logging_progname(progname, channel_id, client_id, session_id, log_level, environment = Event.rails_env, ts = Time.now, tags = [], json = {})
|
27
29
|
if progname.is_a?(Hash)
|
28
30
|
self.client_id = progname[:client_id] || client_id
|
29
31
|
self.session_id = progname[:session_id] || session_id
|
@@ -32,6 +34,7 @@ module Binnacle
|
|
32
34
|
self.tags = progname[:tags] || tags
|
33
35
|
self.json = json
|
34
36
|
self.json.merge!(progname[:json]) if progname[:json]
|
37
|
+
self.environment = environment || Event.rails_env
|
35
38
|
elsif progname.is_a?(String)
|
36
39
|
self.client_id = client_id
|
37
40
|
self.session_id = session_id
|
@@ -39,10 +42,12 @@ module Binnacle
|
|
39
42
|
self.event_name = progname
|
40
43
|
self.tags = tags
|
41
44
|
self.json = json
|
45
|
+
self.environment = environment || Event.rails_env
|
42
46
|
end
|
43
47
|
|
44
48
|
self.timestamp = ts ? ts : Time.now
|
45
49
|
self.log_level = log_level
|
50
|
+
self.environment = environment || Event.rails_env
|
46
51
|
end
|
47
52
|
|
48
53
|
def timestamp=(ts)
|
@@ -60,6 +65,7 @@ module Binnacle
|
|
60
65
|
event.event_time = Time.at(h['eventTime']/1000)
|
61
66
|
event.tags = h['tags']
|
62
67
|
event.json = h['json']
|
68
|
+
event.environment = h['environment']
|
63
69
|
|
64
70
|
event
|
65
71
|
end
|
@@ -73,6 +79,7 @@ module Binnacle
|
|
73
79
|
"clientId" => client_id,
|
74
80
|
"logLevel" => log_level,
|
75
81
|
"tags" => tags,
|
82
|
+
"environment" => environment,
|
76
83
|
"json" => json
|
77
84
|
}.to_json
|
78
85
|
end
|
@@ -85,16 +92,22 @@ module Binnacle
|
|
85
92
|
"/api/events/#{channel}"
|
86
93
|
end
|
87
94
|
|
88
|
-
def self.recents(connection, lines, since, channel)
|
89
|
-
path = [route(channel), 'recents'].compact.join('/')
|
95
|
+
def self.recents(connection, lines, since, channel, environment = rails_env)
|
96
|
+
path = [route(channel), environment, 'recents'].compact.join('/')
|
90
97
|
|
91
98
|
get(connection, path, {'limit' => lines, 'since' => since})
|
92
99
|
end
|
93
100
|
|
94
|
-
def self.events(connection, channel, date, start_hour, end_hour, lines)
|
95
|
-
path = [route(channel), date].compact.join('/')
|
101
|
+
def self.events(connection, channel, date, start_hour, end_hour, lines, environment = rails_env)
|
102
|
+
path = [route(channel), environment, date].compact.join('/')
|
96
103
|
|
97
104
|
get(connection, path, {'start_hour' => start_hour, 'end_hour' => end_hour, 'limit' => lines})
|
98
105
|
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
|
109
|
+
def self.rails_env
|
110
|
+
defined?(Rails) ? Rails.env : "production"
|
111
|
+
end
|
99
112
|
end
|
100
113
|
end
|
@@ -59,7 +59,9 @@ module Binnacle
|
|
59
59
|
private
|
60
60
|
|
61
61
|
def unwrap_exception(exception)
|
62
|
-
if exception.respond_to?(:
|
62
|
+
if exception.respond_to?(:cause)
|
63
|
+
exception.cause
|
64
|
+
elsif exception.respond_to?(:original_exception)
|
63
65
|
exception.original_exception
|
64
66
|
elsif exception.respond_to?(:continued_exception)
|
65
67
|
exception.continued_exception
|
@@ -122,10 +124,6 @@ module Binnacle
|
|
122
124
|
'UNKNOWN'
|
123
125
|
end
|
124
126
|
|
125
|
-
def extract_rails_environment_level
|
126
|
-
defined?(Rails) ? Rails.env : "UNKNOWN"
|
127
|
-
end
|
128
|
-
|
129
127
|
def extract_libraries_loaded
|
130
128
|
libraries = {}
|
131
129
|
begin
|
@@ -157,7 +155,7 @@ module Binnacle
|
|
157
155
|
message: @exception.message,
|
158
156
|
component: @component,
|
159
157
|
method: @method,
|
160
|
-
environment_level:
|
158
|
+
environment_level: Event.rails_env,
|
161
159
|
hostname: extract_hostname,
|
162
160
|
user_agent: @request.user_agent,
|
163
161
|
ruby_version: extract_ruby_version,
|
data/lib/binnacle/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Binnacle::Client do
|
4
|
-
before
|
4
|
+
before do
|
5
|
+
reset_env
|
6
|
+
Binnacle.configure do |config|
|
7
|
+
config.encrypted = false
|
8
|
+
end
|
9
|
+
end
|
5
10
|
let(:client) { Binnacle::Client.new('vceth4xcwqfoowpz2esi', '1grttyb8ozbe9axt88ji', 'localhost') }
|
6
11
|
|
7
12
|
describe 'signal' do
|
8
13
|
it 'invokes the events api signal', :vcr do
|
9
|
-
client.signal('icoc0tnol3obe8pas207', 'TEST_EVT', 'binnacle-rb', 'My Sess', 'INFO')
|
14
|
+
client.signal('icoc0tnol3obe8pas207', 'TEST_EVT', 'binnacle-rb', 'My Sess', 'INFO', 'development')
|
10
15
|
|
11
16
|
expect(a_request(:get, 'http://localhost:8080/api/endpoints'))
|
12
17
|
expect(
|
@@ -67,62 +72,31 @@ describe Binnacle::Client do
|
|
67
72
|
it 'invokes the events api recents', :vcr do
|
68
73
|
expect(a_request(:get, 'http://localhost:8080/api/endpoints'))
|
69
74
|
expect(
|
70
|
-
a_request(:get, "http://localhost:8080/api/events/icoc0tnol3obe8pas207/recents?limit=10&since=500")
|
75
|
+
a_request(:get, "http://localhost:8080/api/events/icoc0tnol3obe8pas207/production/recents?limit=10&since=500")
|
71
76
|
).to(have_been_made.times(1))
|
72
77
|
end
|
73
78
|
|
74
79
|
it 'returns a collection of event objects', :vcr do
|
75
|
-
expect(@recents).to have(
|
80
|
+
expect(@recents).to have(1).events
|
76
81
|
end
|
77
82
|
end
|
78
83
|
|
79
84
|
describe 'events' do
|
80
|
-
before {
|
85
|
+
before {
|
86
|
+
@events = client.events('icoc0tnol3obe8pas207', '2017-07-06', 11, 12, 500)
|
87
|
+
}
|
81
88
|
|
82
89
|
it 'invokes the events api', :vcr do
|
83
90
|
expect(a_request(:get, 'http://localhost:8080/api/endpoints'))
|
84
91
|
expect(
|
85
|
-
a_request(:get, "http://localhost:8080/api/events/icoc0tnol3obe8pas207/
|
92
|
+
a_request(:get, "http://localhost:8080/api/events/icoc0tnol3obe8pas207/production/2017-07-06?end_hour=12&limit=500&start_hour=11")
|
86
93
|
).to(have_been_made.times(1))
|
87
94
|
end
|
88
95
|
|
89
96
|
it 'returns a collection of event objects', :vcr do
|
90
|
-
expect(@events).to have(
|
91
|
-
expect(@events).to all(satisfy { |e| e.event_time.strftime("%Y-%m-%d") == '
|
97
|
+
expect(@events).to have(1).events
|
98
|
+
expect(@events).to all(satisfy { |e| e.event_time.strftime("%Y-%m-%d") == '2017-07-06' })
|
92
99
|
end
|
93
100
|
|
94
101
|
end
|
95
|
-
|
96
|
-
describe 'report_exception' do
|
97
|
-
before { Binnacle.binnacle_logger.pause }
|
98
|
-
after { Binnacle.binnacle_logger.continue }
|
99
|
-
|
100
|
-
it 'invokes the events api signal', :vcr do
|
101
|
-
|
102
|
-
Binnacle.configure do |config|
|
103
|
-
config.error_channel = 'id0czm8eryfffcgp875c'
|
104
|
-
config.encrypted = false
|
105
|
-
end
|
106
|
-
|
107
|
-
exception = ZeroDivisionError.new
|
108
|
-
env = Rack::MockRequest.env_for(client.connection.active_url)
|
109
|
-
client.report_exception(exception, env, false)
|
110
|
-
|
111
|
-
expect(a_request(:get, 'http://localhost:8080/api/endpoints'))
|
112
|
-
expect(
|
113
|
-
a_request(:post, "http://localhost:8080/api/events/id0czm8eryfffcgp875c").
|
114
|
-
with(body: hash_including({
|
115
|
-
"channelId": "id0czm8eryfffcgp875c",
|
116
|
-
"eventName":"ZeroDivisionError",
|
117
|
-
"logLevel":"EXCEPTION"
|
118
|
-
}))
|
119
|
-
).to(have_been_made.times(1))
|
120
|
-
|
121
|
-
# TODO: need a way to check nested partial hash in the body for:
|
122
|
-
# "json": hash_including({
|
123
|
-
# "exception":"ZeroDivisionError",
|
124
|
-
# "message":"ZeroDivisionError"
|
125
|
-
# })
|
126
|
-
end
|
127
|
-
end
|
128
102
|
end
|