skylight 1.7.2 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -33
- data/ext/extconf.rb +32 -6
- data/ext/libskylight.yml +6 -9
- data/ext/skylight_native.c +49 -18
- data/lib/skylight.rb +35 -1
- data/lib/skylight/api.rb +4 -2
- data/lib/skylight/cli.rb +1 -1
- data/lib/skylight/cli/doctor.rb +6 -4
- data/lib/skylight/config.rb +149 -518
- data/lib/skylight/data/cacert.pem +236 -812
- data/lib/skylight/helpers.rb +5 -1
- data/lib/skylight/instrumenter.rb +10 -241
- data/lib/skylight/middleware.rb +1 -89
- data/lib/skylight/native.rb +8 -6
- data/lib/skylight/native_ext_fetcher.rb +251 -0
- data/lib/skylight/normalizers/active_job/enqueue_at.rb +2 -20
- data/lib/skylight/probes/sinatra_add_middleware.rb +22 -0
- data/lib/skylight/railtie.rb +11 -131
- data/lib/skylight/sinatra.rb +1 -5
- data/lib/skylight/trace.rb +1 -229
- data/lib/skylight/util/http.rb +3 -3
- data/lib/skylight/vendor/cli/thor/actions/directory.rb +5 -15
- data/lib/skylight/version.rb +1 -1
- metadata +114 -91
- data/lib/skylight/compat.rb +0 -76
- data/lib/skylight/core.rb +0 -149
- data/lib/skylight/deprecation.rb +0 -55
- data/lib/skylight/formatters/http.rb +0 -20
- data/lib/skylight/gc.rb +0 -107
- data/lib/skylight/normalizers.rb +0 -192
- data/lib/skylight/normalizers/action_controller/process_action.rb +0 -50
- data/lib/skylight/normalizers/action_controller/send_file.rb +0 -50
- data/lib/skylight/normalizers/action_view/render_collection.rb +0 -22
- data/lib/skylight/normalizers/action_view/render_partial.rb +0 -21
- data/lib/skylight/normalizers/action_view/render_template.rb +0 -21
- data/lib/skylight/normalizers/active_model_serializers/render.rb +0 -26
- data/lib/skylight/normalizers/active_record/instantiation.rb +0 -17
- data/lib/skylight/normalizers/active_record/sql.rb +0 -55
- data/lib/skylight/normalizers/active_support/cache.rb +0 -51
- data/lib/skylight/normalizers/active_support/cache_clear.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_decrement.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_delete.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_exist.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_generate.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_increment.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read_multi.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_write.rb +0 -16
- data/lib/skylight/normalizers/coach/handler_finish.rb +0 -36
- data/lib/skylight/normalizers/coach/middleware_finish.rb +0 -23
- data/lib/skylight/normalizers/couch_potato/query.rb +0 -20
- data/lib/skylight/normalizers/default.rb +0 -27
- data/lib/skylight/normalizers/elasticsearch/request.rb +0 -20
- data/lib/skylight/normalizers/faraday/request.rb +0 -38
- data/lib/skylight/normalizers/grape/endpoint.rb +0 -30
- data/lib/skylight/normalizers/grape/endpoint_render.rb +0 -26
- data/lib/skylight/normalizers/grape/endpoint_run.rb +0 -33
- data/lib/skylight/normalizers/grape/endpoint_run_filters.rb +0 -23
- data/lib/skylight/normalizers/moped/query.rb +0 -100
- data/lib/skylight/probes.rb +0 -129
- data/lib/skylight/probes/action_controller.rb +0 -64
- data/lib/skylight/probes/action_dispatch.rb +0 -30
- data/lib/skylight/probes/action_view.rb +0 -43
- data/lib/skylight/probes/active_model_serializers.rb +0 -55
- data/lib/skylight/probes/elasticsearch.rb +0 -37
- data/lib/skylight/probes/excon.rb +0 -26
- data/lib/skylight/probes/excon/middleware.rb +0 -68
- data/lib/skylight/probes/faraday.rb +0 -22
- data/lib/skylight/probes/grape.rb +0 -88
- data/lib/skylight/probes/httpclient.rb +0 -46
- data/lib/skylight/probes/middleware.rb +0 -68
- data/lib/skylight/probes/mongo.rb +0 -161
- data/lib/skylight/probes/mongoid.rb +0 -21
- data/lib/skylight/probes/moped.rb +0 -39
- data/lib/skylight/probes/net_http.rb +0 -58
- data/lib/skylight/probes/redis.rb +0 -71
- data/lib/skylight/probes/sequel.rb +0 -37
- data/lib/skylight/probes/sinatra.rb +0 -76
- data/lib/skylight/probes/tilt.rb +0 -31
- data/lib/skylight/subscriber.rb +0 -122
- data/lib/skylight/user_config.rb +0 -60
- data/lib/skylight/util.rb +0 -17
- data/lib/skylight/util/allocation_free.rb +0 -26
- data/lib/skylight/util/clock.rb +0 -54
- data/lib/skylight/util/deploy.rb +0 -132
- data/lib/skylight/util/gzip.rb +0 -21
- data/lib/skylight/util/inflector.rb +0 -112
- data/lib/skylight/util/logging.rb +0 -127
- data/lib/skylight/util/multi_io.rb +0 -21
- data/lib/skylight/util/native_ext_fetcher.rb +0 -253
- data/lib/skylight/util/platform.rb +0 -75
- data/lib/skylight/util/proxy.rb +0 -13
- data/lib/skylight/vendor/active_support/notifications.rb +0 -207
- data/lib/skylight/vendor/active_support/notifications/fanout.rb +0 -159
- data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +0 -72
- data/lib/skylight/vendor/active_support/per_thread_registry.rb +0 -52
- data/lib/skylight/vendor/thread_safe.rb +0 -126
- data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +0 -133
- data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +0 -76
- data/lib/skylight/vm/gc.rb +0 -70
@@ -1,21 +1,3 @@
|
|
1
|
-
|
2
|
-
module Normalizers
|
3
|
-
module ActiveJob
|
4
|
-
class EnqueueAt < Normalizer
|
5
|
-
register "enqueue_at.active_job", enabled: false
|
1
|
+
warn "[DEPRECATED] [SKYLIGHT] [#{Skylight::VERSION}] Require 'skylight/core/normalizers/active_job/enqueue_at' instead of 'skylight/normalizers/active_job/enqueue_at'."
|
6
2
|
|
7
|
-
|
8
|
-
|
9
|
-
def normalize(_trace, _name, payload)
|
10
|
-
title = "Enqueue #{payload[:job].class}"
|
11
|
-
|
12
|
-
adapter_class_name = payload[:adapter].class.name
|
13
|
-
adapter_name = adapter_class_name.match(/^ActiveJob::QueueAdapters::(\w+)Adapter$/)[1].underscore
|
14
|
-
desc = "{ adapter: '#{adapter_name}', queue: '#{payload[:job].queue_name}' }"
|
15
|
-
|
16
|
-
[ CAT, title, desc ]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
3
|
+
require 'skylight/core/normalizers/active_job/enqueue_at'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Probes
|
3
|
+
module Sinatra
|
4
|
+
class Probe
|
5
|
+
def install
|
6
|
+
puts "Installed"
|
7
|
+
class << ::Sinatra::Base
|
8
|
+
alias build_without_sk build
|
9
|
+
|
10
|
+
def build(*args, &block)
|
11
|
+
puts "Using Middleware"
|
12
|
+
self.use Skylight::Middleware
|
13
|
+
build_without_sk(*args, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Skylight::Core::Probes.register("Sinatra::Base", "sinatra/base", Sinatra::Probe.new)
|
21
|
+
end
|
22
|
+
end
|
data/lib/skylight/railtie.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
require 'skylight'
|
2
|
-
require 'rails'
|
1
|
+
require 'skylight/core/railtie'
|
3
2
|
|
4
3
|
module Skylight
|
5
|
-
# @api private
|
6
4
|
class Railtie < Rails::Railtie
|
5
|
+
include Skylight::Core::Railtie
|
6
|
+
|
7
|
+
def self.config_class; Skylight::Config end
|
8
|
+
def self.middleware_class; Skylight::Middleware end
|
9
|
+
|
7
10
|
config.skylight = ActiveSupport::OrderedOptions.new
|
8
11
|
|
9
12
|
# The environments in which skylight should be enabled
|
@@ -16,144 +19,21 @@ module Skylight
|
|
16
19
|
# net_http, action_controller, action_view, middleware, and grape are on by default
|
17
20
|
# See https://www.skylight.io/support/getting-more-from-skylight#available-instrumentation-options
|
18
21
|
# for a full list.
|
19
|
-
config.skylight.probes = ['net_http', '
|
22
|
+
config.skylight.probes = ['net_http', 'action_controller', 'action_view', 'middleware', 'grape']
|
20
23
|
|
21
24
|
# The position in the middleware stack to place Skylight
|
22
25
|
# Default is first, but can be `{ after: Middleware::Name }` or `{ before: Middleware::Name }`
|
23
26
|
config.skylight.middleware_position = 0
|
24
27
|
|
25
28
|
initializer 'skylight.configure' do |app|
|
26
|
-
|
27
|
-
load_probes
|
28
|
-
|
29
|
-
config = load_skylight_config(app)
|
30
|
-
|
31
|
-
if activate?
|
32
|
-
if config
|
33
|
-
begin
|
34
|
-
if Instrumenter.start!(config)
|
35
|
-
set_middleware_position(app, config)
|
36
|
-
Rails.logger.info "[SKYLIGHT] [#{Skylight::VERSION}] Skylight agent enabled"
|
37
|
-
else
|
38
|
-
Rails.logger.info "[SKYLIGHT] [#{Skylight::VERSION}] Unable to start, see the Skylight logs for more details"
|
39
|
-
end
|
40
|
-
rescue ConfigError => e
|
41
|
-
Rails.logger.error "[SKYLIGHT] [#{Skylight::VERSION}] #{e.message}; disabling Skylight agent"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
elsif Rails.env.development?
|
45
|
-
unless config.user_config.disable_dev_warning?
|
46
|
-
log_warning config, "[SKYLIGHT] [#{Skylight::VERSION}] Running Skylight in development mode. No data will be reported until you deploy your app.\n" \
|
47
|
-
"(To disable this message for all local apps, run `skylight disable_dev_warning`.)"
|
48
|
-
end
|
49
|
-
elsif !Rails.env.test?
|
50
|
-
unless config.user_config.disable_env_warning?
|
51
|
-
log_warning config, "[SKYLIGHT] [#{Skylight::VERSION}] You are running in the #{Rails.env} environment but haven't added it to config.skylight.environments, so no data will be sent to skylight.io."
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def log_warning(config, msg)
|
59
|
-
if config
|
60
|
-
config.alert_logger.warn(msg)
|
61
|
-
else
|
62
|
-
Rails.logger.warn(msg)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def existent_paths(paths)
|
67
|
-
paths.respond_to?(:existent) ? paths.existent : paths.select { |f| File.exists?(f) }
|
68
|
-
end
|
69
|
-
|
70
|
-
def load_skylight_config(app)
|
71
|
-
path = config_path(app)
|
72
|
-
path = nil unless File.exist?(path)
|
73
|
-
|
74
|
-
unless tmp = app.config.paths['tmp'].first
|
75
|
-
Rails.logger.error "[SKYLIGHT] [#{Skylight::VERSION}] tmp directory missing from rails configuration"
|
76
|
-
return nil
|
77
|
-
end
|
78
|
-
|
79
|
-
config = Config.load(file: path, environment: Rails.env.to_s)
|
80
|
-
config[:root] = Rails.root
|
81
|
-
|
82
|
-
configure_logging(config, app)
|
83
|
-
|
84
|
-
config[:'daemon.sockdir_path'] ||= tmp
|
85
|
-
config[:'normalizers.render.view_paths'] = existent_paths(app.config.paths["app/views"]) + [Rails.root.to_s]
|
86
|
-
config
|
29
|
+
run_initializer(app)
|
87
30
|
end
|
88
31
|
|
89
|
-
|
90
|
-
if logger = app.config.skylight.logger
|
91
|
-
config.logger = logger
|
92
|
-
else
|
93
|
-
# Configure the log file destination
|
94
|
-
if log_file = app.config.skylight.log_file
|
95
|
-
config['log_file'] = log_file
|
96
|
-
elsif !config.key?('log_file') && !config.on_heroku?
|
97
|
-
config['log_file'] = File.join(Rails.root, 'log/skylight.log')
|
98
|
-
end
|
32
|
+
private
|
99
33
|
|
100
|
-
|
101
|
-
|
102
|
-
config['log_level'] = level
|
103
|
-
elsif !config.key?('log_level')
|
104
|
-
if level = app.config.log_level
|
105
|
-
config['log_level'] = level
|
106
|
-
end
|
107
|
-
end
|
34
|
+
def development_warning
|
35
|
+
super + "\n(To disable this message for all local apps, run `skylight disable_dev_warning`.)"
|
108
36
|
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def config_path(app)
|
112
|
-
File.expand_path(config.skylight.config_path, app.root)
|
113
|
-
end
|
114
|
-
|
115
|
-
def environments
|
116
|
-
Array(config.skylight.environments).map { |e| e && e.to_s }.compact
|
117
|
-
end
|
118
|
-
|
119
|
-
def activate?
|
120
|
-
if ENV.key?("SKYLIGHT_ENABLED")
|
121
|
-
ENV["SKYLIGHT_ENABLED"] !~ /^false$/i
|
122
|
-
else
|
123
|
-
environments.include?(Rails.env.to_s)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def load_probes
|
128
|
-
if probes = config.skylight.probes
|
129
|
-
Skylight.probe(*probes)
|
130
|
-
end
|
131
|
-
end
|
132
37
|
|
133
|
-
def middleware_position
|
134
|
-
config.skylight.middleware_position.is_a?(Hash) ? config.skylight.middleware_position.symbolize_keys : config.skylight.middleware_position
|
135
|
-
end
|
136
|
-
|
137
|
-
def insert_middleware(app, config)
|
138
|
-
if middleware_position.has_key?(:after)
|
139
|
-
app.middleware.insert_after(middleware_position[:after], Skylight::Middleware, config: config)
|
140
|
-
elsif middleware_position.has_key?(:before)
|
141
|
-
app.middleware.insert_before(middleware_position[:before], Skylight::Middleware, config: config)
|
142
|
-
else
|
143
|
-
raise "The middleware position you have set is invalid. Please be sure `config.skylight.middleware_position` is set up correctly."
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def set_middleware_position(app, config)
|
148
|
-
if middleware_position.is_a?(Integer)
|
149
|
-
app.middleware.insert middleware_position, Middleware, config: config
|
150
|
-
elsif middleware_position.is_a?(Hash) && middleware_position.keys.count == 1
|
151
|
-
insert_middleware(app, config)
|
152
|
-
elsif middleware_position.nil?
|
153
|
-
app.middleware.insert 0, Middleware, config: config
|
154
|
-
else
|
155
|
-
raise "The middleware position you have set is invalid. Please be sure `config.skylight.middleware_position` is set up correctly."
|
156
|
-
end
|
157
|
-
end
|
158
38
|
end
|
159
39
|
end
|
data/lib/skylight/sinatra.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
1
|
require 'skylight'
|
2
|
-
|
3
|
-
if Gem::Version(Sinatra::VERSION) < Gem::Version('1.4')
|
4
|
-
Skylight::DEPRECATOR.deprecation_warning("Support for Sinatra versions before 1.4")
|
5
|
-
end
|
6
|
-
|
2
|
+
require 'skylight/probes/sinatra_add_middleware'
|
7
3
|
Skylight.probe(:sinatra, :tilt, :sequel)
|
data/lib/skylight/trace.rb
CHANGED
@@ -1,232 +1,4 @@
|
|
1
1
|
module Skylight
|
2
|
-
class Trace
|
3
|
-
GC_CAT = 'noise.gc'.freeze
|
4
|
-
|
5
|
-
include Util::Logging
|
6
|
-
|
7
|
-
attr_reader :endpoint, :notifications
|
8
|
-
|
9
|
-
def self.new(instrumenter, endpoint, start, cat, title = nil, desc = nil)
|
10
|
-
inst = native_new(normalize_time(start), "TODO", endpoint)
|
11
|
-
inst.send(:initialize, instrumenter, cat, title, desc)
|
12
|
-
inst.endpoint = endpoint
|
13
|
-
inst
|
14
|
-
end
|
15
|
-
|
16
|
-
# TODO: Move this into native
|
17
|
-
def self.normalize_time(time)
|
18
|
-
# At least one customer has extensions that cause integer division to produce rationals.
|
19
|
-
# Since the native code expects an integer, we force it again.
|
20
|
-
(time.to_i / 100_000).to_i
|
21
|
-
end
|
22
|
-
|
23
|
-
def initialize(instrumenter, cat, title, desc)
|
24
|
-
raise ArgumentError, 'instrumenter is required' unless instrumenter
|
25
|
-
|
26
|
-
@instrumenter = instrumenter
|
27
|
-
@submitted = false
|
28
|
-
@broken = false
|
29
|
-
|
30
|
-
@notifications = []
|
31
|
-
|
32
|
-
@spans = []
|
33
|
-
|
34
|
-
# create the root node
|
35
|
-
@root = start(native_get_started_at, cat, title, desc, normalize: false)
|
36
|
-
|
37
|
-
@gc = config.gc.track unless ENV.key?("SKYLIGHT_DISABLE_GC_TRACKING")
|
38
|
-
end
|
39
|
-
|
40
|
-
def endpoint=(value)
|
41
|
-
@endpoint = value
|
42
|
-
native_set_endpoint(value)
|
43
|
-
value
|
44
|
-
end
|
45
|
-
|
46
|
-
def config
|
47
|
-
@instrumenter.config
|
48
|
-
end
|
49
|
-
|
50
|
-
def broken?
|
51
|
-
!!@broken
|
52
|
-
end
|
53
|
-
|
54
|
-
def record(cat, title=nil, desc=nil)
|
55
|
-
return if broken?
|
56
|
-
|
57
|
-
title.freeze if title.is_a?(String)
|
58
|
-
desc.freeze if desc.is_a?(String)
|
59
|
-
|
60
|
-
desc = @instrumenter.limited_description(desc)
|
61
|
-
|
62
|
-
time = Util::Clock.nanos - gc_time
|
63
|
-
|
64
|
-
stop(start(time, cat, title, desc), time)
|
65
|
-
|
66
|
-
nil
|
67
|
-
rescue => e
|
68
|
-
error "failed to record span; msg=%s; endpoint=%s", e.message, endpoint
|
69
|
-
broken!
|
70
|
-
nil
|
71
|
-
end
|
72
|
-
|
73
|
-
def instrument(cat, title=nil, desc=nil)
|
74
|
-
return if broken?
|
75
|
-
t { "instrument: #{cat}, #{title}" }
|
76
|
-
|
77
|
-
title.freeze if title.is_a?(String)
|
78
|
-
desc.freeze if desc.is_a?(String)
|
79
|
-
|
80
|
-
original_desc = desc
|
81
|
-
now = Util::Clock.nanos
|
82
|
-
desc = @instrumenter.limited_description(desc)
|
83
|
-
|
84
|
-
if desc == Instrumenter::TOO_MANY_UNIQUES
|
85
|
-
error "[SKYLIGHT] [#{Skylight::VERSION}] [E0002] You've exceeded the number of unique span descriptions per-request " \
|
86
|
-
"for endpoint: #{endpoint}."
|
87
|
-
debug "original desc=%s", original_desc
|
88
|
-
debug "cat=%s, title=%s, desc=%s", cat, title, desc
|
89
|
-
end
|
90
|
-
|
91
|
-
start(now - gc_time, cat, title, desc)
|
92
|
-
rescue => e
|
93
|
-
error "failed to instrument span; msg=%s; endpoint=%s", e.message, endpoint
|
94
|
-
broken!
|
95
|
-
nil
|
96
|
-
end
|
97
|
-
|
98
|
-
def done(span, meta=nil)
|
99
|
-
return unless span
|
100
|
-
return if broken?
|
101
|
-
|
102
|
-
if meta && meta[:defer]
|
103
|
-
deferred_spans[span] ||= (Util::Clock.nanos - gc_time)
|
104
|
-
return
|
105
|
-
end
|
106
|
-
|
107
|
-
stop(span, Util::Clock.nanos - gc_time)
|
108
|
-
rescue => e
|
109
|
-
error "failed to close span; msg=%s; endpoint=%s", e.message, endpoint
|
110
|
-
broken!
|
111
|
-
nil
|
112
|
-
end
|
113
|
-
|
114
|
-
# Middleware spans that were interrupted by a throw/catch should be cached here.
|
115
|
-
# keys: span ids
|
116
|
-
# values: nsec timestamp at which the span was cached here.
|
117
|
-
def deferred_spans
|
118
|
-
@deferred_spans ||= {}
|
119
|
-
end
|
120
|
-
|
121
|
-
def release
|
122
|
-
return unless @instrumenter.current_trace == self
|
123
|
-
@instrumenter.current_trace = nil
|
124
|
-
end
|
125
|
-
|
126
|
-
def broken!
|
127
|
-
debug "trace is broken"
|
128
|
-
@broken = true
|
129
|
-
end
|
130
|
-
|
131
|
-
def traced
|
132
|
-
time = gc_time
|
133
|
-
now = Util::Clock.nanos
|
134
|
-
|
135
|
-
if time > 0
|
136
|
-
t { fmt "tracking GC time; duration=%d", time }
|
137
|
-
stop(start(now - time, GC_CAT, nil, nil), now)
|
138
|
-
end
|
139
|
-
|
140
|
-
stop(@root, now)
|
141
|
-
end
|
142
|
-
|
143
|
-
def submit
|
144
|
-
t { "submitting trace" }
|
145
|
-
|
146
|
-
# This must always be called to clean up properly
|
147
|
-
release
|
148
|
-
|
149
|
-
if broken?
|
150
|
-
t { "broken, not submitting" }
|
151
|
-
return
|
152
|
-
end
|
153
|
-
|
154
|
-
if @submitted
|
155
|
-
t { "already submitted" }
|
156
|
-
return
|
157
|
-
end
|
158
|
-
|
159
|
-
@submitted = true
|
160
|
-
|
161
|
-
traced
|
162
|
-
|
163
|
-
@instrumenter.process(self)
|
164
|
-
rescue Exception => e
|
165
|
-
error e.message
|
166
|
-
t { e.backtrace.join("\n") }
|
167
|
-
end
|
168
|
-
|
169
|
-
private
|
170
|
-
|
171
|
-
def start(time, cat, title, desc, opts={})
|
172
|
-
time = self.class.normalize_time(time) unless opts[:normalize] == false
|
173
|
-
|
174
|
-
sp = native_start_span(time, cat.to_s)
|
175
|
-
native_span_set_title(sp, title.to_s) if title
|
176
|
-
native_span_set_description(sp, desc.to_s) if desc
|
177
|
-
|
178
|
-
@spans << sp
|
179
|
-
t { "started span: #{sp} - #{cat}, #{title}" }
|
180
|
-
|
181
|
-
sp
|
182
|
-
end
|
183
|
-
|
184
|
-
def stop(span, time)
|
185
|
-
t { "stopping span: #{span}" }
|
186
|
-
|
187
|
-
# If `stop` is called for a span that is not the last item in the stack,
|
188
|
-
# check to see if the last item has been marked as deferred. If so, close
|
189
|
-
# that span first, then try to close the original.
|
190
|
-
while deferred_spans[expected = @spans.pop]
|
191
|
-
normalized_stop(expected, deferred_spans.delete(expected))
|
192
|
-
end
|
193
|
-
|
194
|
-
handle_unexpected_stop(expected, span) unless span == expected
|
195
|
-
|
196
|
-
normalized_stop(span, time)
|
197
|
-
nil
|
198
|
-
end
|
199
|
-
|
200
|
-
def normalized_stop(span, time)
|
201
|
-
time = self.class.normalize_time(time)
|
202
|
-
native_stop_span(span, time)
|
203
|
-
end
|
204
|
-
|
205
|
-
def handle_unexpected_stop(expected, span)
|
206
|
-
message = "[E0001] Spans were closed out of order.\n"
|
207
|
-
|
208
|
-
if Skylight::Util::Logging.trace?
|
209
|
-
message << "Expected #{expected}, but received #{span}. See prior logs to match id to a name.\n" \
|
210
|
-
"If the received span was a Middleware it may be one that doesn't fully conform to " \
|
211
|
-
"the Rack SPEC."
|
212
|
-
else
|
213
|
-
message << "To debug this issue set `SKYLIGHT_ENABLE_TRACE_LOGS=true` " \
|
214
|
-
"in your environment. (Beware, it is quite noisy!)\n"
|
215
|
-
end
|
216
|
-
|
217
|
-
message << "\nThis request will not be tracked. Please contact support@skylight.io for more information."
|
218
|
-
|
219
|
-
error message
|
220
|
-
|
221
|
-
t { "expected=#{expected}, actual=#{span}" }
|
222
|
-
|
223
|
-
broken!
|
224
|
-
end
|
225
|
-
|
226
|
-
def gc_time
|
227
|
-
return 0 unless @gc
|
228
|
-
@gc.update
|
229
|
-
@gc.time
|
230
|
-
end
|
2
|
+
class Trace < Core::Trace
|
231
3
|
end
|
232
4
|
end
|