wildsight 0.1.16 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/wildsight/agent/agent.rb +1 -0
- data/lib/wildsight/context/context.rb +12 -18
- data/lib/wildsight/context/logger.rb +2 -15
- data/lib/wildsight/profiler/profiler.rb +76 -14
- data/lib/wildsight/rack/bottom_middleware.rb +28 -0
- data/lib/wildsight/rack/rack.rb +11 -0
- data/lib/wildsight/rack/top_middleware.rb +65 -0
- data/lib/wildsight/rails/active_record.rb +0 -1
- data/lib/wildsight/rails/railtie.rb +31 -40
- data/lib/wildsight/transport/faraday.rb +2 -2
- data/lib/wildsight/transport/net_http.rb +1 -2
- data/lib/wildsight/version.rb +1 -1
- data/lib/wildsight_custom.rb +4 -2
- metadata +5 -8
- data/lib/wildsight/context/active_record.rb +0 -17
- data/lib/wildsight/context/exception.rb +0 -24
- data/lib/wildsight/context/rack.rb +0 -64
- data/lib/wildsight/context/rails.rb +0 -33
- data/lib/wildsight/rack/middleware.rb +0 -17
- data/lib/wildsight/rack/middleware_context.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4791f160bb8740c344c10ceb3d07444b222911e
|
4
|
+
data.tar.gz: f55122ba5015cc584c5421b1e973a107dfccc335
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62b76b5ef370d73ff68f5b735b9dc290a8c17158023b1f71d02674e848a1fe908d5d171359bf21370b2b73afac06be073fdf95a7315a1a9e7a0405c6499ab611
|
7
|
+
data.tar.gz: f3a334daba22fe22d1900c52f68fad99500e33db8577b10e10a2779edf56110ec9a8bc958601bb7148836efcfbe879ffe510f16eabeca11731d60e143f8638cf
|
@@ -1,9 +1,3 @@
|
|
1
|
-
require 'wildsight/context/rack'
|
2
|
-
require 'wildsight/context/rails'
|
3
|
-
require 'wildsight/context/logger'
|
4
|
-
require 'wildsight/context/exception'
|
5
|
-
require 'wildsight/context/active_record'
|
6
|
-
|
7
1
|
module Wildsight
|
8
2
|
module Context
|
9
3
|
|
@@ -13,22 +7,18 @@ module Wildsight
|
|
13
7
|
|
14
8
|
class Context
|
15
9
|
|
16
|
-
include Wildsight::Context::Logs
|
17
|
-
include Wildsight::Context::Exception
|
18
|
-
include Wildsight::Context::Rack
|
19
|
-
include Wildsight::Context::Rails
|
20
|
-
include Wildsight::Context::ActiveRecord
|
21
|
-
|
22
|
-
attr_reader :name
|
23
|
-
|
24
10
|
def initialize(name, agent)
|
25
11
|
@name = name
|
26
12
|
@agent = agent
|
27
13
|
@data = {}
|
28
14
|
end
|
29
15
|
|
30
|
-
def
|
31
|
-
@
|
16
|
+
def name
|
17
|
+
@name
|
18
|
+
end
|
19
|
+
|
20
|
+
def data
|
21
|
+
@data
|
32
22
|
end
|
33
23
|
|
34
24
|
def unregister
|
@@ -43,8 +33,12 @@ module Wildsight
|
|
43
33
|
thread.thread_variable_set('wildsight.context', nil)
|
44
34
|
end
|
45
35
|
|
46
|
-
def
|
47
|
-
|
36
|
+
def report(series, occurred = DateTime.now, payload = {})
|
37
|
+
if occurred.kind_of?(Hash)
|
38
|
+
payload = occurred
|
39
|
+
occurred = DateTime.now
|
40
|
+
end
|
41
|
+
@agent.submit({ series: series, context: @name, occurred: occurred, payload: payload })
|
48
42
|
end
|
49
43
|
|
50
44
|
def profiler
|
@@ -3,18 +3,6 @@ require 'logger'
|
|
3
3
|
module Wildsight
|
4
4
|
module Context
|
5
5
|
|
6
|
-
module Logs
|
7
|
-
|
8
|
-
def log_data
|
9
|
-
@data[:logs] = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def log_report(log)
|
13
|
-
log_data << log
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
6
|
class Logger < ::Logger
|
19
7
|
|
20
8
|
def initialize(context = nil)
|
@@ -30,9 +18,8 @@ module Wildsight
|
|
30
18
|
:facility => progname,
|
31
19
|
:message => msg.to_s.strip
|
32
20
|
}
|
33
|
-
context = @context
|
34
|
-
context
|
35
|
-
context.log_report(payload)
|
21
|
+
context = @context || Wildsight::Context.detect
|
22
|
+
context.report(:logs, payload) if context
|
36
23
|
return nil
|
37
24
|
end
|
38
25
|
|
@@ -4,30 +4,92 @@ module Wildsight
|
|
4
4
|
|
5
5
|
def initialize(context)
|
6
6
|
@context = context
|
7
|
-
@
|
7
|
+
@data = {}
|
8
|
+
@profile = nil
|
8
9
|
end
|
9
10
|
|
10
11
|
def duration(name, time = nil, options = {}, &block)
|
12
|
+
p = @profile = Profile.new(@profile)
|
13
|
+
|
11
14
|
if block_given?
|
12
|
-
|
13
|
-
result = block.call
|
14
|
-
stop = DateTime.now.to_f
|
15
|
-
item = { before: start, after: stop }
|
15
|
+
@profile.profile!(&block)
|
16
16
|
else
|
17
|
-
|
18
|
-
item = { before: time[0], after: time[1] }
|
17
|
+
@profile.set(time[0], time[1])
|
19
18
|
end
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
durations
|
24
|
-
|
19
|
+
|
20
|
+
@profile = @profile.close
|
21
|
+
|
22
|
+
durations(name)[:intervals] << p.export
|
23
|
+
durations(name)[:duration] += p.duration
|
24
|
+
|
25
|
+
raise p.exception if p.exception
|
26
|
+
return p.result
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
@
|
29
|
+
def data
|
30
|
+
@data
|
31
|
+
end
|
32
|
+
|
33
|
+
def durations(name)
|
34
|
+
@data[name] ||= { intervals: [], duration: 0.0 }
|
29
35
|
end
|
30
36
|
|
31
37
|
end
|
38
|
+
|
39
|
+
class Profile
|
40
|
+
|
41
|
+
def initialize(parent)
|
42
|
+
@parent = parent
|
43
|
+
@subtimes = []
|
44
|
+
@result = nil
|
45
|
+
@exception = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def set(before, after)
|
49
|
+
@before = before
|
50
|
+
@after = after
|
51
|
+
end
|
52
|
+
|
53
|
+
def profile!(&block)
|
54
|
+
@before = DateTime.now.to_f
|
55
|
+
begin
|
56
|
+
@result = block.call
|
57
|
+
rescue Exception => e
|
58
|
+
@exception = e
|
59
|
+
end
|
60
|
+
@after = DateTime.now.to_f
|
61
|
+
end
|
62
|
+
|
63
|
+
def close
|
64
|
+
@parent << duration if @parent
|
65
|
+
@parent
|
66
|
+
end
|
67
|
+
|
68
|
+
def result
|
69
|
+
@result
|
70
|
+
end
|
71
|
+
|
72
|
+
def exception
|
73
|
+
@exception
|
74
|
+
end
|
75
|
+
|
76
|
+
def <<(time)
|
77
|
+
@subtimes << time
|
78
|
+
end
|
79
|
+
|
80
|
+
def duration
|
81
|
+
return raw - @subtimes.inject(0.0) { |c,x| c + x }
|
82
|
+
end
|
83
|
+
|
84
|
+
def raw
|
85
|
+
(@after - @before) * 1000
|
86
|
+
end
|
87
|
+
|
88
|
+
def export
|
89
|
+
{ before: @before, after: @after, duration: duration, raw: raw }
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
32
94
|
end
|
33
95
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Wildsight
|
2
|
+
module Rack
|
3
|
+
|
4
|
+
class BottomMiddleware
|
5
|
+
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
context = Wildsight::Rack.detect_context(env)
|
12
|
+
response = context.profiler.duration(:routes) { @app.call(env) }
|
13
|
+
return response
|
14
|
+
rescue Exception => e
|
15
|
+
context.report(:exception, extract(e))
|
16
|
+
raise e
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract(exception)
|
20
|
+
data = {:occurred => DateTime.now, :message => exception.message, :name => exception.class.name, :backtrace => exception.backtrace}
|
21
|
+
data[:cause] = extract_exception(exception.cause) if exception.cause
|
22
|
+
return data
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Wildsight
|
2
|
+
module Rack
|
3
|
+
|
4
|
+
class TopMiddleware
|
5
|
+
|
6
|
+
METRICS = [:middleware, :routes]
|
7
|
+
|
8
|
+
REQUEST_INCLUDE_KEYS = ['SCRIPT_NAME', 'QUERY_STRING', 'PATH_INFO', 'REMOTE_ADDR']
|
9
|
+
REQUEST_EXCLUDE_KEYS = ['HTTP_COOKIE']
|
10
|
+
RESPONSE_EXCLUDE_KEYS = ['Set-Cookie']
|
11
|
+
|
12
|
+
def initialize(app)
|
13
|
+
@app = app
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
context = Wildsight::Agent.default.context
|
18
|
+
context.bind_thread
|
19
|
+
|
20
|
+
context.data[:rack] ||= {
|
21
|
+
request_target: env['SCRIPT_NAME'].to_s + env['PATH_INFO'].to_s,
|
22
|
+
request_headers: {}
|
23
|
+
}
|
24
|
+
|
25
|
+
env.each_pair do |key,value|
|
26
|
+
name = key.to_s
|
27
|
+
context.data[:rack][:request_headers][key] = value if REQUEST_INCLUDE_KEYS.include?(name)
|
28
|
+
context.data[:rack][:request_headers][key] = value if name.start_with?('HTTP_')
|
29
|
+
context.data[:rack][:request_headers][key] = value if name.start_with?('REQUEST_')
|
30
|
+
context.data[:rack][:request_headers][key] = value if name.start_with?('SERVER_')
|
31
|
+
end
|
32
|
+
|
33
|
+
env[Wildsight::Rack::RACK_ENV_KEY] = context
|
34
|
+
|
35
|
+
response = context.profiler.duration(:middleware) { @app.call(env) }
|
36
|
+
|
37
|
+
if !context.data[:session_id] && !env['rack.session'].nil? && env['rack.session'].respond_to?(:id)
|
38
|
+
context.data[:session_id] ||= env['rack.session'].id
|
39
|
+
end
|
40
|
+
|
41
|
+
REQUEST_EXCLUDE_KEYS.each { |key| context.data[:rack][:request_headers].delete(key) }
|
42
|
+
|
43
|
+
if response
|
44
|
+
context.data[:rack][:response_code] ||= response[0]
|
45
|
+
context.data[:rack][:response_headers] ||= response[1].dup
|
46
|
+
RESPONSE_EXCLUDE_KEYS.each { |key| context.data[:rack][:response_headers].delete(key) }
|
47
|
+
end
|
48
|
+
|
49
|
+
context.data[:rack] = {
|
50
|
+
metrics: METRICS.inject({}) { |c, name| c[name] = context.profiler.data[name]; c }
|
51
|
+
}.merge(context.data[:rack])
|
52
|
+
|
53
|
+
context.report(:action_controller, context.data[:rack])
|
54
|
+
|
55
|
+
return response
|
56
|
+
ensure
|
57
|
+
env.delete(Wildsight::Rack::RACK_ENV_KEY)
|
58
|
+
context.release_thread
|
59
|
+
context.unregister
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -6,37 +6,6 @@ module Wildsight
|
|
6
6
|
|
7
7
|
@instrumented = true
|
8
8
|
|
9
|
-
::Rails::Engine.class_eval do
|
10
|
-
|
11
|
-
alias_method :call_without_ws, :call
|
12
|
-
|
13
|
-
def call(env)
|
14
|
-
context = Wildsight::Agent.default.context
|
15
|
-
context.bind_thread
|
16
|
-
context.rack_instrument_request(env)
|
17
|
-
|
18
|
-
response = context.profiler.duration(:middleware) { call_without_ws(env) }
|
19
|
-
|
20
|
-
return response
|
21
|
-
ensure
|
22
|
-
context.rack_report(env, response)
|
23
|
-
context.release_thread
|
24
|
-
context.unregister
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
::ActionDispatch::Routing::RouteSet.class_eval do
|
30
|
-
|
31
|
-
alias_method :call_without_ws, :call
|
32
|
-
|
33
|
-
def call(env)
|
34
|
-
context = Wildsight::Context::Rack.detect_context(env)
|
35
|
-
result = context.profiler.duration(:routing) { call_without_ws(env) }
|
36
|
-
return result
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
9
|
::AbstractController::Base.class_eval do
|
41
10
|
|
42
11
|
include Wildsight::Rails::ActionController
|
@@ -45,7 +14,7 @@ module Wildsight
|
|
45
14
|
alias_method :process_action_without_ws, :process_action
|
46
15
|
|
47
16
|
def process(*args)
|
48
|
-
context = Wildsight::
|
17
|
+
context = Wildsight::Rack.detect_context(self.respond_to?(:request) ? request.env : {})
|
49
18
|
if context
|
50
19
|
result = context.profiler.duration(:rails) { process_without_ws(*args) }
|
51
20
|
else
|
@@ -55,16 +24,31 @@ module Wildsight
|
|
55
24
|
end
|
56
25
|
|
57
26
|
def wildsight_context
|
58
|
-
@_wildsight_context ||= Wildsight::
|
27
|
+
@_wildsight_context ||= Wildsight::Rack.detect_context(self.respond_to?(:request) ? request.env : {})
|
59
28
|
end
|
60
29
|
|
61
30
|
def process_action(*args)
|
62
|
-
context = Wildsight::
|
63
|
-
|
31
|
+
context = Wildsight::Rack.detect_context(self.respond_to?(:request) ? request.env : {})
|
32
|
+
return process_action_without_ws(*args) unless context
|
33
|
+
|
34
|
+
if respond_to?(:request)
|
35
|
+
context.data[:rack][:request_target] = self.class.name + '#' + request.params['action']
|
36
|
+
|
37
|
+
context.data[:rack][:method] = request.method
|
38
|
+
context.data[:rack][:path] = request.original_fullpath
|
39
|
+
context.data[:rack][:params] = request.filtered_parameters
|
40
|
+
|
41
|
+
context.data[:rack][:session_id] = request.session.id
|
42
|
+
|
43
|
+
context.data[:rack][:url] = request.original_url
|
44
|
+
context.data[:rack][:protocol] = request.protocol
|
45
|
+
context.data[:rack][:host] = request.host_with_port
|
46
|
+
|
47
|
+
context.data[:rack][:remote_ip] = request.remote_ip
|
48
|
+
end
|
64
49
|
result = context.profiler.duration(:action) { process_action_without_ws(*args) }
|
65
50
|
return result
|
66
51
|
rescue Exception => e
|
67
|
-
request.env['rack.exception'] = e
|
68
52
|
raise e
|
69
53
|
end
|
70
54
|
|
@@ -75,8 +59,8 @@ module Wildsight
|
|
75
59
|
alias_method :render_without_ws, :render
|
76
60
|
|
77
61
|
def render(*args, &block)
|
78
|
-
context = Wildsight::
|
79
|
-
result = context.profiler.duration(:
|
62
|
+
context = Wildsight::Rack.detect_context(self.respond_to?(:request) ? request.env : {})
|
63
|
+
result = context.profiler.duration(:view) { render_without_ws(*args, &block) }
|
80
64
|
return result
|
81
65
|
end
|
82
66
|
|
@@ -86,6 +70,14 @@ module Wildsight
|
|
86
70
|
|
87
71
|
class Railtie < ::Rails::Railtie
|
88
72
|
|
73
|
+
initializer('wildsight.rails.middleware.top') do |app|
|
74
|
+
app.middleware.unshift(Wildsight::Rack::TopMiddleware)
|
75
|
+
end
|
76
|
+
|
77
|
+
initializer('wildsight.rails.middleware.bottom') do |app|
|
78
|
+
app.middleware.use(Wildsight::Rack::BottomMiddleware)
|
79
|
+
end
|
80
|
+
|
89
81
|
initializer('wildsight.rails.logger') do |app|
|
90
82
|
::Rails.logger.extend(ActiveSupport::Logger.broadcast(Wildsight::Context::Logger.new))
|
91
83
|
end
|
@@ -99,7 +91,6 @@ module Wildsight
|
|
99
91
|
|
100
92
|
initializer('wildsight.action_controller.metrics') do |app|
|
101
93
|
ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
|
102
|
-
|
103
94
|
end
|
104
95
|
end
|
105
96
|
|
@@ -124,7 +115,7 @@ module Wildsight
|
|
124
115
|
:occurred => args[1],
|
125
116
|
:duration => (args[2] - args[1]) * 1000
|
126
117
|
}
|
127
|
-
context.
|
118
|
+
context.report(:active_record, event)
|
128
119
|
end
|
129
120
|
end
|
130
121
|
|
@@ -7,6 +7,7 @@ module Wildsight
|
|
7
7
|
@agent = agent
|
8
8
|
@config = config
|
9
9
|
@connection = Faraday.new(:url => @config['transport']['url']) do |faraday|
|
10
|
+
faraday.request(:multipart)
|
10
11
|
faraday.request(:url_encoded)
|
11
12
|
faraday.adapter(Faraday.default_adapter)
|
12
13
|
end
|
@@ -15,8 +16,7 @@ module Wildsight
|
|
15
16
|
|
16
17
|
def send(payload)
|
17
18
|
begin
|
18
|
-
|
19
|
-
@agent.logger.log(:debug) { @connection.post(@uri, data).inspect }
|
19
|
+
@agent.logger.log(:debug) { @connection.post(@uri, payload: MultiJson.dump(payload)).inspect }
|
20
20
|
rescue Exception => e
|
21
21
|
@agent.logger.log(:error) { e }
|
22
22
|
end
|
@@ -13,8 +13,7 @@ module Wildsight
|
|
13
13
|
|
14
14
|
def send(payload)
|
15
15
|
begin
|
16
|
-
|
17
|
-
@agent.logger.log(:debug) { Net::HTTP.post_form(@uri, data).inspect }
|
16
|
+
@agent.logger.log(:debug) { Net::HTTP.post_form(@uri, payload: MultiJson.dump(payload)).inspect }
|
18
17
|
rescue Exception => e
|
19
18
|
@agent.logger.log(:error) { e }
|
20
19
|
end
|
data/lib/wildsight/version.rb
CHANGED
data/lib/wildsight_custom.rb
CHANGED
@@ -4,11 +4,13 @@ require 'wildsight/transport/transport'
|
|
4
4
|
require 'wildsight/metrics/metrics'
|
5
5
|
require 'wildsight/profiler/profiler'
|
6
6
|
require 'wildsight/context/context'
|
7
|
+
require 'wildsight/context/logger'
|
7
8
|
require 'wildsight/agent/agent'
|
8
9
|
|
9
10
|
if defined?(Rack)
|
10
|
-
require 'wildsight/rack/
|
11
|
-
require 'wildsight/rack/
|
11
|
+
require 'wildsight/rack/rack'
|
12
|
+
require 'wildsight/rack/top_middleware'
|
13
|
+
require 'wildsight/rack/bottom_middleware'
|
12
14
|
end
|
13
15
|
|
14
16
|
if defined?(Rails)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wildsight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marek Jelen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -103,19 +103,16 @@ files:
|
|
103
103
|
- lib/wildsight/agent/config.yml
|
104
104
|
- lib/wildsight/agent/logger.rb
|
105
105
|
- lib/wildsight/agent/tools.rb
|
106
|
-
- lib/wildsight/context/active_record.rb
|
107
106
|
- lib/wildsight/context/context.rb
|
108
|
-
- lib/wildsight/context/exception.rb
|
109
107
|
- lib/wildsight/context/logger.rb
|
110
|
-
- lib/wildsight/context/rack.rb
|
111
|
-
- lib/wildsight/context/rails.rb
|
112
108
|
- lib/wildsight/metrics/counter.rb
|
113
109
|
- lib/wildsight/metrics/gauge.rb
|
114
110
|
- lib/wildsight/metrics/metrics.rb
|
115
111
|
- lib/wildsight/metrics/statistics.rb
|
116
112
|
- lib/wildsight/profiler/profiler.rb
|
117
|
-
- lib/wildsight/rack/
|
118
|
-
- lib/wildsight/rack/
|
113
|
+
- lib/wildsight/rack/bottom_middleware.rb
|
114
|
+
- lib/wildsight/rack/rack.rb
|
115
|
+
- lib/wildsight/rack/top_middleware.rb
|
119
116
|
- lib/wildsight/rails/action_controller.rb
|
120
117
|
- lib/wildsight/rails/active_record.rb
|
121
118
|
- lib/wildsight/rails/railtie.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Wildsight
|
2
|
-
module Context
|
3
|
-
|
4
|
-
module Exception
|
5
|
-
|
6
|
-
def exception_data
|
7
|
-
@data[:exceptions] = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def exception_report(exception)
|
11
|
-
exception_data << exception_extract(exception)
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
def exception_extract(exception)
|
16
|
-
data = {:occurred => DateTime.now, :message => exception.message, :name => exception.class.name, :backtrace => exception.backtrace}
|
17
|
-
data[:cause] = extract_exception(exception.cause) if exception.cause
|
18
|
-
return data
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module Wildsight
|
2
|
-
module Context
|
3
|
-
|
4
|
-
module Rack
|
5
|
-
|
6
|
-
RACK_ENV_KEY = 'wildsight.context'
|
7
|
-
|
8
|
-
REQUEST_INCLUDE_KEYS = ['SCRIPT_NAME', 'QUERY_STRING', 'PATH_INFO', 'REMOTE_ADDR']
|
9
|
-
REQUEST_EXCLUDE_KEYS = ['HTTP_COOKIE']
|
10
|
-
RESPONSE_EXCLUDE_KEYS = ['Set-Cookie']
|
11
|
-
|
12
|
-
def self.detect_context(env)
|
13
|
-
env[RACK_ENV_KEY] || Wildsight::Context.detect
|
14
|
-
end
|
15
|
-
|
16
|
-
def rack_instrument_request(env)
|
17
|
-
env[RACK_ENV_KEY] = self
|
18
|
-
end
|
19
|
-
|
20
|
-
def rack_data
|
21
|
-
@data[:rack] ||= {}
|
22
|
-
end
|
23
|
-
|
24
|
-
def rack_report(env, response = nil)
|
25
|
-
env.delete(RACK_ENV_KEY)
|
26
|
-
|
27
|
-
rack_data[:request_target] ||= env['SCRIPT_NAME'].to_s + env['PATH_INFO'].to_s
|
28
|
-
|
29
|
-
env.each_pair do |key,value|
|
30
|
-
name = key.to_s
|
31
|
-
rack_data[:request_headers] ||= {}
|
32
|
-
rack_data[:request_headers][key] = value if REQUEST_INCLUDE_KEYS.include?(name)
|
33
|
-
rack_data[:request_headers][key] = value if name.start_with?('HTTP_')
|
34
|
-
rack_data[:request_headers][key] = value if name.start_with?('REQUEST_')
|
35
|
-
rack_data[:request_headers][key] = value if name.start_with?('SERVER_')
|
36
|
-
end
|
37
|
-
|
38
|
-
if !rack_data[:session_id] && !env['rack.session'].nil? && env['rack.session'].respond_to?(:id)
|
39
|
-
rack_data[:session_id] ||= env['rack.session'].id
|
40
|
-
end
|
41
|
-
|
42
|
-
REQUEST_EXCLUDE_KEYS.each { |key| rack_data[:request_headers].delete(key) }
|
43
|
-
|
44
|
-
if response
|
45
|
-
rack_data[:response_code] ||= response[0]
|
46
|
-
rack_data[:response_headers] ||= response[1].dup
|
47
|
-
RESPONSE_EXCLUDE_KEYS.each { |key| rack_data[:response_headers].delete(key) }
|
48
|
-
end
|
49
|
-
|
50
|
-
exception = env['rack.exception'] || env['action_dispatch.exception'] || env['sinatra.error']
|
51
|
-
|
52
|
-
if exception
|
53
|
-
exception_report(exception)
|
54
|
-
end
|
55
|
-
|
56
|
-
self.submit
|
57
|
-
rescue => e
|
58
|
-
@agent.logger.log(:error, e)
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Wildsight
|
2
|
-
module Context
|
3
|
-
|
4
|
-
module Rails
|
5
|
-
|
6
|
-
def rails_data
|
7
|
-
@data[:rails] ||= {}
|
8
|
-
end
|
9
|
-
|
10
|
-
def rails_extract(controller)
|
11
|
-
if respond_to?(:request)
|
12
|
-
request = controller.request
|
13
|
-
|
14
|
-
rack_data[:request_target] = controller.class.name + '#' + request.params['action']
|
15
|
-
|
16
|
-
rack_data[:method] = request.method
|
17
|
-
rack_data[:path] = request.original_fullpath
|
18
|
-
rack_data[:params] = request.filtered_parameters
|
19
|
-
|
20
|
-
rack_data[:session_id] = request.session.id
|
21
|
-
|
22
|
-
rack_data[:url] = request.original_url
|
23
|
-
rack_data[:protocol] = request.protocol
|
24
|
-
rack_data[:host] = request.host_with_port
|
25
|
-
|
26
|
-
rack_data[:remote_ip] = request.remote_ip
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Wildsight
|
2
|
-
module Rack
|
3
|
-
|
4
|
-
class MiddlewareContext
|
5
|
-
|
6
|
-
def initialize(app)
|
7
|
-
@app = app
|
8
|
-
end
|
9
|
-
|
10
|
-
def call(env)
|
11
|
-
@context = Wildsight::Agent.default.context
|
12
|
-
@context.bind_thread
|
13
|
-
@context.rack_instrument_request(env)
|
14
|
-
response = @app.call(env)
|
15
|
-
rescue Exception => exception
|
16
|
-
env['rack.exception'] = exception
|
17
|
-
raise exception
|
18
|
-
ensure
|
19
|
-
@context.rack_report(env, response)
|
20
|
-
@context.release_thread
|
21
|
-
@context.unregister
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|