skylight 1.3.1 → 1.4.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/ext/libskylight.yml +5 -5
- data/lib/skylight/core.rb +7 -0
- data/lib/skylight/middleware.rb +22 -8
- data/lib/skylight/probes/middleware.rb +51 -0
- data/lib/skylight/railtie.rb +31 -1
- data/lib/skylight/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a44af3f665e6d0fd8a25dc3d867ea86dae43620
|
4
|
+
data.tar.gz: edac70c82631fb57e9990aeeedbb55a62e4111d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da6cec1e164c3c49cce1239c88efb74f7dca60e0b699aadf051cf97fb2def14a813e0a99badac04c50c2750ab2bd0f420d69fb88fb2421ce92ef4d9a42dc1bb6
|
7
|
+
data.tar.gz: 12bc7d82549fc243fd7446892d2387ce635a941d5ae23600713e9b2432d68dbb2b7793e8bcaa369227127b1027d964d1125492f273e89f5e5220813fcf027bed
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 1.4.0-beta (July 13, 2017)
|
2
|
+
|
3
|
+
* [FEATURE] Add probe for Rack Middlewares. To enable, add 'middleware' to `config.skylight.probes` list.
|
4
|
+
* [IMPROVEMENT] Increase limit for items tracked in a requests
|
5
|
+
* [IMPROVEMENT] Allow for more fine-grained control over position of Skylight::Middleware
|
6
|
+
* [IMPROVEMENT] Avoid processing Skylight::Middleware unnecessarily
|
7
|
+
|
1
8
|
## 1.3.1 (May 17, 2017)
|
2
9
|
|
3
10
|
* [IMPROVEMENT] Better suggestions in `skylight doctor`.
|
data/ext/libskylight.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
version: "1.
|
2
|
+
version: "1.4.0-7aecded"
|
3
3
|
checksums:
|
4
|
-
x86-linux: "
|
5
|
-
x86_64-linux: "
|
6
|
-
x86_64-linux-musl: "
|
7
|
-
x86_64-darwin: "
|
4
|
+
x86-linux: "79162dfc4dee8954869d2820e60e8d15d4f4915f66e29bedd15e68030acd5b27"
|
5
|
+
x86_64-linux: "117ac0ff29240a518717fcf52f7cd3eeec69a135c481693b8eb259bb4c2b528c"
|
6
|
+
x86_64-linux-musl: "bab4030060eb4b83d0543839e0f51b09545d7d5b20c3f7dd35ae6f81f3189499"
|
7
|
+
x86_64-darwin: "1c0fdb68c0dde34a1b0842403db2ea2ca6a0de2fb7d729e869f395f6d10383b5"
|
data/lib/skylight/core.rb
CHANGED
@@ -38,6 +38,7 @@ module Skylight
|
|
38
38
|
|
39
39
|
# @api private
|
40
40
|
TIERS = %w(
|
41
|
+
rack
|
41
42
|
api
|
42
43
|
app
|
43
44
|
view
|
@@ -67,6 +68,12 @@ module Skylight
|
|
67
68
|
Instrumenter.stop!(*args)
|
68
69
|
end
|
69
70
|
|
71
|
+
# Check tracing
|
72
|
+
def self.tracing?
|
73
|
+
inst = Instrumenter.instance
|
74
|
+
inst && inst.current_trace
|
75
|
+
end
|
76
|
+
|
70
77
|
# Start a trace
|
71
78
|
def self.trace(endpoint=nil, cat=nil, title=nil)
|
72
79
|
unless inst = Instrumenter.instance
|
data/lib/skylight/middleware.rb
CHANGED
@@ -40,6 +40,17 @@ module Skylight
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def self.with_after_close(resp, &block)
|
44
|
+
# Responses should be finished but in some situations they aren't
|
45
|
+
# e.g. https://github.com/ruby-grape/grape/issues/1041
|
46
|
+
if resp.respond_to?(:finish)
|
47
|
+
resp = resp.finish
|
48
|
+
end
|
49
|
+
|
50
|
+
resp[2] = BodyProxy.new(resp[2], &block)
|
51
|
+
resp
|
52
|
+
end
|
53
|
+
|
43
54
|
include Util::Logging
|
44
55
|
|
45
56
|
# For Util::Logging
|
@@ -51,7 +62,13 @@ module Skylight
|
|
51
62
|
end
|
52
63
|
|
53
64
|
def call(env)
|
54
|
-
if
|
65
|
+
# Skylight can handle double tracing, but avoid the BodyProxy if we don't need it
|
66
|
+
# This generally shouldn't happen, but older verions of Rails can allow the same
|
67
|
+
# middleware to be inserted multiple times
|
68
|
+
if Skylight.tracing?
|
69
|
+
t { "already tracing, skipping" }
|
70
|
+
@app.call(env)
|
71
|
+
elsif env["REQUEST_METHOD"] == "HEAD"
|
55
72
|
t { "middleware skipping HEAD" }
|
56
73
|
@app.call(env)
|
57
74
|
else
|
@@ -60,14 +77,11 @@ module Skylight
|
|
60
77
|
trace = Skylight.trace "Rack", 'app.rack.request'
|
61
78
|
resp = @app.call(env)
|
62
79
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
resp
|
80
|
+
if trace
|
81
|
+
Middleware.with_after_close(resp) { trace.submit }
|
82
|
+
else
|
83
|
+
resp
|
67
84
|
end
|
68
|
-
|
69
|
-
resp[2] = BodyProxy.new(resp[2]) { trace.submit } if trace
|
70
|
-
resp
|
71
85
|
rescue Exception
|
72
86
|
t { "middleware exception: #{trace}"}
|
73
87
|
trace.submit if trace
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Probes
|
3
|
+
module Middleware
|
4
|
+
class Probe
|
5
|
+
def install
|
6
|
+
ActionDispatch::MiddlewareStack::Middleware.class_eval do
|
7
|
+
alias build_without_sk build
|
8
|
+
def build(*args)
|
9
|
+
sk_instrument_middleware(build_without_sk(*args))
|
10
|
+
end
|
11
|
+
|
12
|
+
def sk_instrument_middleware(middleware)
|
13
|
+
return middleware if middleware.is_a?(Skylight::Middleware)
|
14
|
+
|
15
|
+
# Not sure how this would actually happen
|
16
|
+
return middleware if middleware.respond_to?(:call_without_sk)
|
17
|
+
|
18
|
+
# On Rails 3, ActionDispatch::Session::CookieStore is frozen, for one
|
19
|
+
return middleware if middleware.frozen?
|
20
|
+
|
21
|
+
middleware.instance_eval do
|
22
|
+
alias call_without_sk call
|
23
|
+
def call(*args, &block)
|
24
|
+
trace = Skylight::Instrumenter.try(:instance).try(:current_trace)
|
25
|
+
return call_without_sk(*args, &block) unless trace
|
26
|
+
|
27
|
+
begin
|
28
|
+
trace.endpoint = self.class.name
|
29
|
+
|
30
|
+
span = Skylight.instrument(title: self.class.name, category: "rack.middleware")
|
31
|
+
resp = call_without_sk(*args, &block)
|
32
|
+
|
33
|
+
Skylight::Middleware.with_after_close(resp) { trace.done(span) }
|
34
|
+
rescue Exception
|
35
|
+
# FIXME: Log this?
|
36
|
+
trace.done(span)
|
37
|
+
raise
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
middleware
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
register("ActionDispatch::MiddlewareStack::Middleware", "actionpack/action_dispatch", Middleware::Probe.new)
|
50
|
+
end
|
51
|
+
end
|
data/lib/skylight/railtie.rb
CHANGED
@@ -17,6 +17,10 @@ module Skylight
|
|
17
17
|
# Also available: excon, redis, sinatra, tilt, sequel
|
18
18
|
config.skylight.probes = ['net_http', 'action_controller', 'action_view', 'grape']
|
19
19
|
|
20
|
+
# The position in the middleware stack to place Skylight
|
21
|
+
# Default is first, but can be `{ after: Middleware::Name }` or `{ before: Middleware::Name }`
|
22
|
+
config.skylight.middleware_position = 0
|
23
|
+
|
20
24
|
initializer 'skylight.configure' do |app|
|
21
25
|
# Load probes even when agent is inactive to catch probe related bugs sooner
|
22
26
|
load_probes
|
@@ -27,7 +31,7 @@ module Skylight
|
|
27
31
|
if config
|
28
32
|
begin
|
29
33
|
if Instrumenter.start!(config)
|
30
|
-
app
|
34
|
+
set_middleware_position(app, config)
|
31
35
|
Rails.logger.info "[SKYLIGHT] [#{Skylight::VERSION}] Skylight agent enabled"
|
32
36
|
else
|
33
37
|
Rails.logger.info "[SKYLIGHT] [#{Skylight::VERSION}] Unable to start, see the Skylight logs for more details"
|
@@ -121,5 +125,31 @@ module Skylight
|
|
121
125
|
require "skylight/probes/#{p}"
|
122
126
|
end
|
123
127
|
end
|
128
|
+
|
129
|
+
def middleware_position
|
130
|
+
config.skylight.middleware_position.is_a?(Hash) ? config.skylight.middleware_position.symbolize_keys : config.skylight.middleware_position
|
131
|
+
end
|
132
|
+
|
133
|
+
def insert_middleware(app, config)
|
134
|
+
if middleware_position.has_key?(:after)
|
135
|
+
app.middleware.insert_after(middleware_position[:after], Skylight::Middleware, config: config)
|
136
|
+
elsif middleware_position.has_key?(:before)
|
137
|
+
app.middleware.insert_before(middleware_position[:before], Skylight::Middleware, config: config)
|
138
|
+
else
|
139
|
+
raise "The middleware position you have set is invalid. Please be sure `config.skylight.middleware_position` is set up correctly."
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def set_middleware_position(app, config)
|
144
|
+
if middleware_position.is_a?(Integer)
|
145
|
+
app.middleware.insert middleware_position, Middleware, config: config
|
146
|
+
elsif middleware_position.is_a?(Hash) && middleware_position.keys.count == 1
|
147
|
+
insert_middleware(app, config)
|
148
|
+
elsif middleware_position.nil?
|
149
|
+
app.middleware.insert 0, Middleware, config: config
|
150
|
+
else
|
151
|
+
raise "The middleware position you have set is invalid. Please be sure `config.skylight.middleware_position` is set up correctly."
|
152
|
+
end
|
153
|
+
end
|
124
154
|
end
|
125
155
|
end
|
data/lib/skylight/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skylight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tilde, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/skylight/probes/excon/middleware.rb
|
96
96
|
- lib/skylight/probes/grape.rb
|
97
97
|
- lib/skylight/probes/httpclient.rb
|
98
|
+
- lib/skylight/probes/middleware.rb
|
98
99
|
- lib/skylight/probes/mongo.rb
|
99
100
|
- lib/skylight/probes/mongoid.rb
|
100
101
|
- lib/skylight/probes/moped.rb
|
@@ -184,9 +185,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
184
185
|
version: 1.9.2
|
185
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
187
|
requirements:
|
187
|
-
- - "
|
188
|
+
- - ">"
|
188
189
|
- !ruby/object:Gem::Version
|
189
|
-
version:
|
190
|
+
version: 1.3.1
|
190
191
|
requirements: []
|
191
192
|
rubyforge_project:
|
192
193
|
rubygems_version: 2.6.11
|