skylight 1.3.1 → 1.4.0.beta
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/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
|