signalfx-tracing 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -0
- data/lib/signalfx/tracing.rb +34 -8
- data/lib/signalfx/tracing/compat.rb +16 -0
- data/lib/signalfx/tracing/compat/phusion_passenger.rb +20 -0
- data/lib/signalfx/tracing/reporter/auto_reviving_async_reporter.rb +35 -0
- data/lib/signalfx/tracing/tracer.rb +15 -0
- data/lib/signalfx/tracing/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ccd213e2f5bb365118397b466f3ac34e660ab5e
|
4
|
+
data.tar.gz: 8b64213ad7583469a8e7c4aea8de6b7b3a6c12ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6c606ea3b6832d534d50c5ea50e9012e6a6d665300c2a7b40a657e241cc675f2548a7387c602dd60f6a39c3586061f412fe25880376dd21ee00be2b70ce7f8c
|
7
|
+
data.tar.gz: 5695eef0830c459b516d8d143a1e0e4e0a032a7120229141cb40a1dc9e1f012632c7a7795468f00120e2ae33fd34f223ac4f00339eb6ec7f5beed29fdd8c05e2
|
data/README.md
CHANGED
@@ -50,6 +50,9 @@ Valid lib names are listed below with the instrumentation documentation.
|
|
50
50
|
- Default: `signalfx-ruby-tracing`
|
51
51
|
- `access_token`: SignalFx access token for authentication.
|
52
52
|
- Default: `''`
|
53
|
+
- `fork_safe`: If `true`, makes the tracer safe to fork if events cannot
|
54
|
+
be controlled
|
55
|
+
- Default: `false`
|
53
56
|
|
54
57
|
Environment variables can be used to configure `service_name` and `access_token`
|
55
58
|
if not given to the `configure` method.
|
@@ -78,6 +81,15 @@ This section contains details and configuration for specific frameworks.
|
|
78
81
|
### Web servers
|
79
82
|
|
80
83
|
- Puma >= 3.0.0
|
84
|
+
- Passenger >= 5.0.25
|
85
|
+
|
86
|
+
Instrumentation for routes using these web servers is provided through Rack.
|
87
|
+
If using a framework that builds on top of Rack, such as Rails or Sinatra, our
|
88
|
+
instrumentation includes Rack instrumentation. In these cases, the routes
|
89
|
+
through the web server will be automatically traced.
|
90
|
+
|
91
|
+
When interfacing with these web servers as a Rack application, please configure
|
92
|
+
[Rack instrumentation](#rack) and insert it as middleware.
|
81
93
|
|
82
94
|
### Libraries/Frameworks
|
83
95
|
|
@@ -225,6 +237,8 @@ The source for this instrumentation is located [here](https://github.com/opentra
|
|
225
237
|
SignalFx::Tracing::Instrumenter.configure do |p|
|
226
238
|
p.instrument(:Rack)
|
227
239
|
end
|
240
|
+
|
241
|
+
use Rack::Tracer
|
228
242
|
```
|
229
243
|
|
230
244
|
## Rails
|
@@ -292,3 +306,18 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
292
306
|
p.instrument(:Sinatra)
|
293
307
|
end
|
294
308
|
```
|
309
|
+
|
310
|
+
## Troubleshooting
|
311
|
+
|
312
|
+
### Forking
|
313
|
+
|
314
|
+
If spans are no longer sent after forking a process, the span reporter thread
|
315
|
+
has been lost while copying to the process.
|
316
|
+
|
317
|
+
The reporter can be revived by calling `SignalFx::Tracing::Instrumenter.revive`
|
318
|
+
in the newly created process.
|
319
|
+
|
320
|
+
When the new process can't be handled directly, setting `fork_safe: true`
|
321
|
+
when configuring the instrumentation will use a reporter that checks and revives
|
322
|
+
itself every time a span is reported.
|
323
|
+
|
data/lib/signalfx/tracing.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'jaeger/client'
|
2
2
|
require 'jaeger/client/injectors'
|
3
3
|
require 'jaeger/client/extractors'
|
4
|
+
require 'signalfx/tracing/reporter/auto_reviving_async_reporter'
|
4
5
|
require 'signalfx/tracing/http_sender'
|
6
|
+
require 'signalfx/tracing/tracer'
|
5
7
|
require 'signalfx/tracing/register'
|
8
|
+
require 'signalfx/tracing/compat'
|
6
9
|
require 'thread'
|
7
10
|
|
8
11
|
module SignalFx
|
@@ -11,16 +14,21 @@ module SignalFx
|
|
11
14
|
|
12
15
|
class << self
|
13
16
|
|
14
|
-
attr_reader :ingest_url
|
17
|
+
attr_reader :ingest_url, :service_name, :access_token
|
15
18
|
attr_accessor :tracer
|
16
19
|
|
17
20
|
def configure(tracer: nil,
|
18
21
|
ingest_url: ENV['SIGNALFX_INGEST_URL'] || 'https://ingest.signalfx.com/v1/trace',
|
19
22
|
service_name: ENV['SIGNALFX_SERVICE_NAME'] || "signalfx-ruby-tracing",
|
20
23
|
access_token: ENV['SIGNALFX_ACCESS_TOKEN'],
|
21
|
-
auto_instrument: false
|
24
|
+
auto_instrument: false,
|
25
|
+
fork_safe: false)
|
22
26
|
@ingest_url = ingest_url
|
27
|
+
@service_name = service_name
|
28
|
+
@access_token = access_token
|
29
|
+
@fork_safe = fork_safe
|
23
30
|
set_tracer(tracer: tracer, service_name: service_name, access_token: access_token)
|
31
|
+
|
24
32
|
if auto_instrument
|
25
33
|
Register.available_libs.each_pair do |key, value|
|
26
34
|
value.instrument
|
@@ -28,6 +36,8 @@ module SignalFx
|
|
28
36
|
else
|
29
37
|
yield self
|
30
38
|
end
|
39
|
+
|
40
|
+
Compat.apply
|
31
41
|
end
|
32
42
|
|
33
43
|
def instrument(to_patch, **args)
|
@@ -47,8 +57,10 @@ module SignalFx
|
|
47
57
|
headers["X-SF-Token"] = access_token if access_token && !access_token.empty?
|
48
58
|
|
49
59
|
encoder = Jaeger::Client::Encoders::ThriftEncoder.new(service_name: service_name)
|
60
|
+
@http_sender = SignalFx::Tracing::HttpSenderWithFlag.new(url: @ingest_url, headers: headers, encoder: encoder)
|
61
|
+
reporter = create_reporter(@http_sender)
|
50
62
|
|
51
|
-
|
63
|
+
sampler = Jaeger::Client::Samplers::Const.new(true)
|
52
64
|
|
53
65
|
injectors = {
|
54
66
|
OpenTracing::FORMAT_RACK => [Jaeger::Client::Injectors::B3RackCodec]
|
@@ -57,16 +69,30 @@ module SignalFx
|
|
57
69
|
OpenTracing::FORMAT_RACK => [Jaeger::Client::Extractors::B3RackCodec]
|
58
70
|
}
|
59
71
|
|
60
|
-
@tracer =
|
61
|
-
sender: http_sender,
|
62
|
-
injectors: injectors,
|
63
|
-
extractors: extractors,
|
64
|
-
flush_interval: 1)
|
72
|
+
@tracer = SignalFx::Tracing::Tracer.new(reporter: reporter, sampler: sampler, injectors: injectors, extractors: extractors)
|
65
73
|
OpenTracing.global_tracer = @tracer
|
66
74
|
else
|
67
75
|
@tracer = tracer
|
68
76
|
end
|
69
77
|
end
|
78
|
+
|
79
|
+
# This method will either use the default reporter, which will not check
|
80
|
+
# for the sender thread, or if fork_safe is true then it will create the
|
81
|
+
# self-reviving reporter. The main use for this is
|
82
|
+
# when the process with the tracer gets forked or goes through some
|
83
|
+
# other process that kills child threads.
|
84
|
+
def create_reporter(sender)
|
85
|
+
if @fork_safe
|
86
|
+
SignalFx::Tracing::AutoRevivingAsyncReporter.new(sender, 1)
|
87
|
+
else
|
88
|
+
Jaeger::Client::AsyncReporter.create(sender: sender, flush_interval: 1)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# at the moment this just sets a new reporter in the tracer
|
93
|
+
def revive
|
94
|
+
@tracer.set_reporter(create_reporter(@http_sender)) if @tracer.respond_to? :set_reporter
|
95
|
+
end
|
70
96
|
end
|
71
97
|
end
|
72
98
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SignalFx
|
2
|
+
module Tracing
|
3
|
+
module Compat
|
4
|
+
def self.apply
|
5
|
+
@compat.each { |mod| mod.apply } if @compat
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.add_compat(mod)
|
9
|
+
@compat = [] unless @compat
|
10
|
+
@compat.push(mod)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'signalfx/tracing/compat/phusion_passenger'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SignalFx
|
2
|
+
module Tracing
|
3
|
+
module Compat
|
4
|
+
module PhusionPassenger
|
5
|
+
def self.apply
|
6
|
+
# register a hook for newly spawned processes
|
7
|
+
if defined? ::PhusionPassenger
|
8
|
+
::PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
9
|
+
if forked
|
10
|
+
SignalFx::Tracing::Instrumenter.revive
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
add_compat PhusionPassenger
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'jaeger/client/async_reporter'
|
2
|
+
|
3
|
+
# The Jaeger client's AsyncReporter creates a thread to handle sending spans on
|
4
|
+
# a flush interval. However, when a forking web server like Passenger forks a
|
5
|
+
# process that includes the tracer, the sender thread is lost.
|
6
|
+
#
|
7
|
+
# This checks for the thread's before pushing in a span to the buffer.
|
8
|
+
# If it doesn't exist, it tells the instrumenter module to crate a new reporter.
|
9
|
+
#
|
10
|
+
# If you have control over hooking into fork events, signalfx/tracing/async_reporter
|
11
|
+
# and reviving it should be preferred to avoid an unnecessary check with every
|
12
|
+
# reported span.
|
13
|
+
|
14
|
+
module SignalFx
|
15
|
+
module Tracing
|
16
|
+
class AutoRevivingAsyncReporter < ::Jaeger::Client::AsyncReporter
|
17
|
+
def initialize(sender, flush_interval)
|
18
|
+
@flush_interval = flush_interval
|
19
|
+
@poll_thread = Thread.new do
|
20
|
+
loop do
|
21
|
+
flush
|
22
|
+
sleep(@flush_interval)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
super(sender)
|
27
|
+
end
|
28
|
+
|
29
|
+
def report(span)
|
30
|
+
::SignalFx::Tracing::Instrumenter.revive if !@poll_thread
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'jaeger/client/tracer'
|
2
|
+
|
3
|
+
# The default jaeger tracer doesn't expose @reporter, and attr_accessor can't
|
4
|
+
# be added after the fact in a child class. So this just adds an old-fashioned
|
5
|
+
# setter for @reporter.
|
6
|
+
|
7
|
+
module SignalFx
|
8
|
+
module Tracing
|
9
|
+
class Tracer < ::Jaeger::Client::Tracer
|
10
|
+
def set_reporter(reporter)
|
11
|
+
@reporter = reporter
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signalfx-tracing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ashwin Chandrasekar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -220,6 +220,8 @@ files:
|
|
220
220
|
- bin/console
|
221
221
|
- bin/setup
|
222
222
|
- lib/signalfx/tracing.rb
|
223
|
+
- lib/signalfx/tracing/compat.rb
|
224
|
+
- lib/signalfx/tracing/compat/phusion_passenger.rb
|
223
225
|
- lib/signalfx/tracing/http_sender.rb
|
224
226
|
- lib/signalfx/tracing/instrumentation/active_record.rb
|
225
227
|
- lib/signalfx/tracing/instrumentation/elasticsearch.rb
|
@@ -233,6 +235,8 @@ files:
|
|
233
235
|
- lib/signalfx/tracing/instrumentation/restclient.rb
|
234
236
|
- lib/signalfx/tracing/instrumentation/sinatra.rb
|
235
237
|
- lib/signalfx/tracing/register.rb
|
238
|
+
- lib/signalfx/tracing/reporter/auto_reviving_async_reporter.rb
|
239
|
+
- lib/signalfx/tracing/tracer.rb
|
236
240
|
- lib/signalfx/tracing/version.rb
|
237
241
|
- signalfx-tracing.gemspec
|
238
242
|
homepage: https://github.com/signalfx/signalfx-ruby-tracing
|