fair-ddtrace 0.8.2.a
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 +7 -0
- data/.env +11 -0
- data/.gitignore +59 -0
- data/.rubocop.yml +61 -0
- data/.yardopts +5 -0
- data/Appraisals +136 -0
- data/Gemfile +3 -0
- data/LICENSE +24 -0
- data/README.md +156 -0
- data/Rakefile +176 -0
- data/circle.yml +61 -0
- data/ddtrace.gemspec +44 -0
- data/docker-compose.yml +42 -0
- data/docs/GettingStarted.md +735 -0
- data/gemfiles/contrib.gemfile +16 -0
- data/gemfiles/contrib_old.gemfile +15 -0
- data/gemfiles/rails30_postgres.gemfile +10 -0
- data/gemfiles/rails30_postgres_sidekiq.gemfile +11 -0
- data/gemfiles/rails32_mysql2.gemfile +11 -0
- data/gemfiles/rails32_postgres.gemfile +10 -0
- data/gemfiles/rails32_postgres_redis.gemfile +11 -0
- data/gemfiles/rails32_postgres_sidekiq.gemfile +11 -0
- data/gemfiles/rails4_mysql2.gemfile +9 -0
- data/gemfiles/rails4_postgres.gemfile +9 -0
- data/gemfiles/rails4_postgres_redis.gemfile +10 -0
- data/gemfiles/rails4_postgres_sidekiq.gemfile +11 -0
- data/gemfiles/rails5_mysql2.gemfile +8 -0
- data/gemfiles/rails5_postgres.gemfile +8 -0
- data/gemfiles/rails5_postgres_redis.gemfile +9 -0
- data/gemfiles/rails5_postgres_sidekiq.gemfile +10 -0
- data/lib/ddtrace.rb +73 -0
- data/lib/ddtrace/buffer.rb +52 -0
- data/lib/ddtrace/context.rb +145 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +94 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +108 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +22 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +164 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
- data/lib/ddtrace/contrib/http/patcher.rb +156 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +150 -0
- data/lib/ddtrace/contrib/rails/action_controller.rb +81 -0
- data/lib/ddtrace/contrib/rails/action_view.rb +110 -0
- data/lib/ddtrace/contrib/rails/active_record.rb +56 -0
- data/lib/ddtrace/contrib/rails/active_support.rb +113 -0
- data/lib/ddtrace/contrib/rails/core_extensions.rb +137 -0
- data/lib/ddtrace/contrib/rails/framework.rb +171 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +32 -0
- data/lib/ddtrace/contrib/rails/utils.rb +43 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +118 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +30 -0
- data/lib/ddtrace/contrib/redis/tags.rb +19 -0
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +103 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +169 -0
- data/lib/ddtrace/distributed.rb +38 -0
- data/lib/ddtrace/encoding.rb +65 -0
- data/lib/ddtrace/error.rb +37 -0
- data/lib/ddtrace/ext/app_types.rb +10 -0
- data/lib/ddtrace/ext/cache.rb +7 -0
- data/lib/ddtrace/ext/distributed.rb +10 -0
- data/lib/ddtrace/ext/errors.rb +10 -0
- data/lib/ddtrace/ext/http.rb +11 -0
- data/lib/ddtrace/ext/net.rb +8 -0
- data/lib/ddtrace/ext/redis.rb +11 -0
- data/lib/ddtrace/ext/sql.rb +8 -0
- data/lib/ddtrace/logger.rb +39 -0
- data/lib/ddtrace/monkey.rb +84 -0
- data/lib/ddtrace/pin.rb +63 -0
- data/lib/ddtrace/provider.rb +21 -0
- data/lib/ddtrace/sampler.rb +49 -0
- data/lib/ddtrace/span.rb +222 -0
- data/lib/ddtrace/tracer.rb +310 -0
- data/lib/ddtrace/transport.rb +162 -0
- data/lib/ddtrace/utils.rb +16 -0
- data/lib/ddtrace/version.rb +9 -0
- data/lib/ddtrace/workers.rb +108 -0
- data/lib/ddtrace/writer.rb +118 -0
- metadata +208 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
|
|
4
|
+
require 'ddtrace/encoding'
|
|
5
|
+
require 'ddtrace/version'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
# Transport class that handles the spans delivery to the
|
|
9
|
+
# local trace-agent. The class wraps a Net:HTTP instance
|
|
10
|
+
# so that the Transport is thread-safe.
|
|
11
|
+
class HTTPTransport
|
|
12
|
+
attr_accessor :hostname, :port
|
|
13
|
+
attr_reader :traces_endpoint, :services_endpoint
|
|
14
|
+
|
|
15
|
+
# seconds before the transport timeout
|
|
16
|
+
TIMEOUT = 1
|
|
17
|
+
|
|
18
|
+
# header containing the number of traces in a payload
|
|
19
|
+
TRACE_COUNT_HEADER = 'X-Datadog-Trace-Count'.freeze
|
|
20
|
+
RUBY_INTERPRETER = RUBY_VERSION > '1.9' ? RUBY_ENGINE + '-' + RUBY_PLATFORM : 'ruby-' + RUBY_PLATFORM
|
|
21
|
+
|
|
22
|
+
def initialize(hostname, port, options = {})
|
|
23
|
+
@hostname = hostname
|
|
24
|
+
@port = port
|
|
25
|
+
@traces_endpoint = '/v0.3/traces'.freeze
|
|
26
|
+
@services_endpoint = '/v0.3/services'.freeze
|
|
27
|
+
@compatibility_mode = false
|
|
28
|
+
@encoder = options.fetch(:encoder, Datadog::Encoding::MsgpackEncoder.new())
|
|
29
|
+
|
|
30
|
+
# overwrite the Content-type with the one chosen in the Encoder
|
|
31
|
+
@headers = options.fetch(:headers, {})
|
|
32
|
+
@headers['Content-Type'] = @encoder.content_type
|
|
33
|
+
@headers['Datadog-Meta-Lang'] = 'ruby'
|
|
34
|
+
@headers['Datadog-Meta-Lang-Version'] = RUBY_VERSION
|
|
35
|
+
@headers['Datadog-Meta-Lang-Interpreter'] = RUBY_INTERPRETER
|
|
36
|
+
@headers['Datadog-Meta-Tracer-Version'] = Datadog::VERSION::STRING
|
|
37
|
+
|
|
38
|
+
# stats
|
|
39
|
+
@mutex = Mutex.new
|
|
40
|
+
@count_success = 0
|
|
41
|
+
@count_client_error = 0
|
|
42
|
+
@count_server_error = 0
|
|
43
|
+
@count_internal_error = 0
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# route the send to the right endpoint
|
|
47
|
+
def send(endpoint, data)
|
|
48
|
+
case endpoint
|
|
49
|
+
when :services
|
|
50
|
+
payload = @encoder.encode_services(data)
|
|
51
|
+
status_code = post(@services_endpoint, payload)
|
|
52
|
+
when :traces
|
|
53
|
+
count = data.length
|
|
54
|
+
payload = @encoder.encode_traces(data)
|
|
55
|
+
status_code = post(@traces_endpoint, payload, count)
|
|
56
|
+
else
|
|
57
|
+
Datadog::Tracer.log.error("Unsupported endpoint: #{endpoint}")
|
|
58
|
+
return nil
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
return status_code unless downgrade?(status_code) && !@compatibility_mode
|
|
62
|
+
|
|
63
|
+
# the API endpoint is not available so we should downgrade the connection and re-try the call
|
|
64
|
+
downgrade!
|
|
65
|
+
send(endpoint, data)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# send data to the trace-agent; the method is thread-safe
|
|
69
|
+
def post(url, data, count = nil)
|
|
70
|
+
Datadog::Tracer.log.debug("Sending data from process: #{Process.pid}")
|
|
71
|
+
headers = count.nil? ? {} : { TRACE_COUNT_HEADER => count.to_s }
|
|
72
|
+
headers = headers.merge(@headers)
|
|
73
|
+
request = Net::HTTP::Post.new(url, headers)
|
|
74
|
+
request.body = data
|
|
75
|
+
|
|
76
|
+
response = Net::HTTP.start(@hostname, @port, read_timeout: TIMEOUT) { |http| http.request(request) }
|
|
77
|
+
handle_response(response)
|
|
78
|
+
rescue StandardError => e
|
|
79
|
+
Datadog::Tracer.log.error(e.message)
|
|
80
|
+
500
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Downgrade the connection to a compatibility version of the HTTPTransport;
|
|
84
|
+
# this method should target a stable API that works whatever is the agent
|
|
85
|
+
# or the tracing client versions.
|
|
86
|
+
def downgrade!
|
|
87
|
+
@compatibility_mode = true
|
|
88
|
+
@traces_endpoint = '/v0.2/traces'.freeze
|
|
89
|
+
@services_endpoint = '/v0.2/services'.freeze
|
|
90
|
+
@encoder = Datadog::Encoding::JSONEncoder.new()
|
|
91
|
+
@headers['Content-Type'] = @encoder.content_type
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def informational?(code)
|
|
95
|
+
code.between?(100, 199)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def success?(code)
|
|
99
|
+
code.between?(200, 299)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def redirect?(code)
|
|
103
|
+
code.between?(300, 399)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def client_error?(code)
|
|
107
|
+
code.between?(400, 499)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def server_error?(code)
|
|
111
|
+
code.between?(500, 599)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# receiving a 404 means that we're targeting an endpoint that is not available
|
|
115
|
+
# in the trace agent. Usually this means that we've an up-to-date tracing client,
|
|
116
|
+
# while running an obsolete agent.
|
|
117
|
+
# receiving a 415 means that we're using an unsupported content-type with an existing
|
|
118
|
+
# endpoint. Usually this means that we're using a newer encoder with a previous
|
|
119
|
+
# endpoint. In both cases, we're going to downgrade the transporter encoder so that
|
|
120
|
+
# it will target a stable API.
|
|
121
|
+
def downgrade?(code)
|
|
122
|
+
code == 404 || code == 415
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# handles the server response; here you can log the trace-agent response
|
|
126
|
+
# or do something more complex to recover from a possible error. This
|
|
127
|
+
# function is handled within the HTTP mutex.synchronize so it's thread-safe.
|
|
128
|
+
def handle_response(response)
|
|
129
|
+
status_code = response.code.to_i
|
|
130
|
+
|
|
131
|
+
if success?(status_code)
|
|
132
|
+
Datadog::Tracer.log.debug('Payload correctly sent to the trace agent.')
|
|
133
|
+
@mutex.synchronize { @count_success += 1 }
|
|
134
|
+
elsif downgrade?(status_code)
|
|
135
|
+
Datadog::Tracer.log.debug("calling the endpoint but received #{status_code}; downgrading the API")
|
|
136
|
+
elsif client_error?(status_code)
|
|
137
|
+
Datadog::Tracer.log.error("Client error: #{response.message}")
|
|
138
|
+
@mutex.synchronize { @count_client_error += 1 }
|
|
139
|
+
elsif server_error?(status_code)
|
|
140
|
+
Datadog::Tracer.log.error("Server error: #{response.message}")
|
|
141
|
+
@mutex.synchronize { @count_server_error += 1 }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
status_code
|
|
145
|
+
rescue StandardError => e
|
|
146
|
+
Datadog::Tracer.log.error(e.message)
|
|
147
|
+
@mutex.synchronize { @count_internal_error += 1 }
|
|
148
|
+
500
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def stats
|
|
152
|
+
@mutex.synchronize do
|
|
153
|
+
{
|
|
154
|
+
success: @count_success,
|
|
155
|
+
client_error: @count_client_error,
|
|
156
|
+
server_error: @count_server_error,
|
|
157
|
+
internal_error: @count_internal_error
|
|
158
|
+
}
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
# Utils contains low-level utilities, typically to provide pseudo-random trace IDs.
|
|
5
|
+
module Utils
|
|
6
|
+
# We use a custom random number generator because we want no interference
|
|
7
|
+
# with the default one. Using the default prng, we could break code that
|
|
8
|
+
# would rely on srand/rand sequences.
|
|
9
|
+
@rnd = Random.new
|
|
10
|
+
|
|
11
|
+
# Return a span id
|
|
12
|
+
def self.next_id
|
|
13
|
+
@rnd.rand(Datadog::Span::MAX_ID)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'time'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/buffer'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Workers
|
|
7
|
+
# Asynchronous worker that executes a +Send()+ operation after given
|
|
8
|
+
# seconds. Under the hood, it uses +Concurrent::TimerTask+ so that the thread
|
|
9
|
+
# will perform a task at regular intervals. The thread can be stopped
|
|
10
|
+
# with the +stop()+ method and can start with the +start()+ method.
|
|
11
|
+
class AsyncTransport
|
|
12
|
+
def initialize(span_interval, service_interval, transport, buff_size, trace_task, service_task)
|
|
13
|
+
@trace_task = trace_task
|
|
14
|
+
@service_task = service_task
|
|
15
|
+
@span_interval = span_interval
|
|
16
|
+
@service_interval = service_interval
|
|
17
|
+
@trace_buffer = TraceBuffer.new(buff_size)
|
|
18
|
+
@service_buffer = TraceBuffer.new(buff_size)
|
|
19
|
+
@transport = transport
|
|
20
|
+
|
|
21
|
+
@worker = nil
|
|
22
|
+
@run = false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Callback function that process traces and executes the +send_traces()+ method.
|
|
26
|
+
def callback_traces
|
|
27
|
+
return if @trace_buffer.empty?
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
traces = @trace_buffer.pop()
|
|
31
|
+
@trace_task.call(traces, @transport)
|
|
32
|
+
rescue StandardError => e
|
|
33
|
+
# ensures that the thread will not die because of an exception.
|
|
34
|
+
# TODO[manu]: findout the reason and reschedule the send if it's not
|
|
35
|
+
# a fatal exception
|
|
36
|
+
Datadog::Tracer.log.error("Error during traces flush: dropped #{traces.length} items. Cause: #{e}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Callback function that process traces and executes the +send_services()+ method.
|
|
41
|
+
def callback_services
|
|
42
|
+
return if @service_buffer.empty?
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
services = @service_buffer.pop()
|
|
46
|
+
# pick up the latest services hash (this is a FIFO list)
|
|
47
|
+
# that is different from what we sent before.
|
|
48
|
+
different = services.inject(false) { |acc, elem| elem != @last_flushed_services ? elem : acc }
|
|
49
|
+
if different
|
|
50
|
+
if @service_task.call(different, @transport)
|
|
51
|
+
@last_flushed_services = different.clone
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
Datadog::Tracer.log.debug('No new different services, skipping flush.')
|
|
55
|
+
end
|
|
56
|
+
rescue StandardError => e
|
|
57
|
+
# ensures that the thread will not die because of an exception.
|
|
58
|
+
# TODO[manu]: findout the reason and reschedule the send if it's not
|
|
59
|
+
# a fatal exception
|
|
60
|
+
Datadog::Tracer.log.error("Error during services flush: dropped #{services.length} items. Cause: #{e}")
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Start the timer execution.
|
|
65
|
+
def start
|
|
66
|
+
return if @run
|
|
67
|
+
@run = true
|
|
68
|
+
@worker = Thread.new() do
|
|
69
|
+
Datadog::Tracer.log.debug("Starting thread in the process: #{Process.pid}")
|
|
70
|
+
@last_flushed_services = nil
|
|
71
|
+
next_send_services = Time.now
|
|
72
|
+
|
|
73
|
+
# this loop assumes spans are flushed more often than services
|
|
74
|
+
while @run
|
|
75
|
+
callback_traces
|
|
76
|
+
if Time.now >= next_send_services
|
|
77
|
+
next_send_services = Time.now + @service_interval
|
|
78
|
+
callback_services
|
|
79
|
+
end
|
|
80
|
+
sleep(@span_interval)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Stop the timer execution. Tasks already in the queue will be executed.
|
|
86
|
+
def stop
|
|
87
|
+
@run = false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Block until executor shutdown is complete or until timeout seconds have passed.
|
|
91
|
+
def join
|
|
92
|
+
@worker.join(10)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Enqueue an item in the trace internal buffer. This operation is thread-safe
|
|
96
|
+
# because uses the +TraceBuffer+ data structure.
|
|
97
|
+
def enqueue_trace(trace)
|
|
98
|
+
@trace_buffer.push(trace)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Enqueue an item in the service internal buffer. This operation is thread-safe.
|
|
102
|
+
def enqueue_service(service)
|
|
103
|
+
return if service == {} # no use to send this, not worth it
|
|
104
|
+
@service_buffer.push(service)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'ddtrace/transport'
|
|
2
|
+
require 'ddtrace/encoding'
|
|
3
|
+
require 'ddtrace/workers'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Traces and services writer that periodically sends data to the trace-agent
|
|
7
|
+
class Writer
|
|
8
|
+
attr_reader :transport
|
|
9
|
+
|
|
10
|
+
HOSTNAME = 'localhost'.freeze
|
|
11
|
+
PORT = '8126'.freeze
|
|
12
|
+
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
# writer and transport parameters
|
|
15
|
+
@buff_size = options.fetch(:buffer_size, 100)
|
|
16
|
+
@span_interval = options.fetch(:spans_interval, 1)
|
|
17
|
+
@service_interval = options.fetch(:services_interval, 120)
|
|
18
|
+
|
|
19
|
+
# transport and buffers
|
|
20
|
+
@transport = options.fetch(:transport, Datadog::HTTPTransport.new(HOSTNAME, PORT))
|
|
21
|
+
@services = {}
|
|
22
|
+
|
|
23
|
+
# handles the thread creation after an eventual fork
|
|
24
|
+
@mutex_after_fork = Mutex.new
|
|
25
|
+
@pid = nil
|
|
26
|
+
|
|
27
|
+
@traces_flushed = 0
|
|
28
|
+
@services_flushed = 0
|
|
29
|
+
|
|
30
|
+
# one worker for both services and traces, each have their own queues
|
|
31
|
+
@worker = nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# spawns two different workers for spans and services;
|
|
35
|
+
# they share the same transport which is thread-safe
|
|
36
|
+
def start
|
|
37
|
+
@trace_handler = ->(items, transport) { send_spans(items, transport) }
|
|
38
|
+
@service_handler = ->(items, transport) { send_services(items, transport) }
|
|
39
|
+
@worker = Datadog::Workers::AsyncTransport.new(@span_interval,
|
|
40
|
+
@service_interval,
|
|
41
|
+
@transport,
|
|
42
|
+
@buff_size,
|
|
43
|
+
@trace_handler,
|
|
44
|
+
@service_handler)
|
|
45
|
+
|
|
46
|
+
@worker.start()
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# stops both workers for spans and services.
|
|
50
|
+
def stop
|
|
51
|
+
@worker.stop()
|
|
52
|
+
@worker = nil
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# flush spans to the trace-agent, handles spans only
|
|
56
|
+
def send_spans(traces, transport)
|
|
57
|
+
return true if traces.empty?
|
|
58
|
+
|
|
59
|
+
code = transport.send(:traces, traces)
|
|
60
|
+
|
|
61
|
+
if transport.server_error? code # requeue on server error, skip on success or client error
|
|
62
|
+
traces[0..@buff_size].each do |trace|
|
|
63
|
+
@worker.enqueue_trace trace
|
|
64
|
+
end
|
|
65
|
+
return false
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@traces_flushed += traces.length()
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# flush services to the trace-agent, handles services only
|
|
73
|
+
def send_services(services, transport)
|
|
74
|
+
return true if services.empty?
|
|
75
|
+
|
|
76
|
+
code = transport.send(:services, services)
|
|
77
|
+
if transport.server_error? code # requeue on server error, skip on success or client error
|
|
78
|
+
@worker.enqueue_service services
|
|
79
|
+
return false
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
@services_flushed += 1
|
|
83
|
+
true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# enqueue the trace for submission to the API
|
|
87
|
+
def write(trace, services)
|
|
88
|
+
# In multiprocess environments, the main process initializes the +Writer+ instance and if
|
|
89
|
+
# the process forks (i.e. a web server like Unicorn or Puma with multiple workers) the new
|
|
90
|
+
# processes will share the same +Writer+ until the first write (COW). Because of that,
|
|
91
|
+
# each process owns a different copy of the +@buffer+ after each write and so the
|
|
92
|
+
# +AsyncTransport+ will not send data to the trace agent.
|
|
93
|
+
#
|
|
94
|
+
# This check ensures that if a process doesn't own the current +Writer+, async workers
|
|
95
|
+
# will be initialized again (but only once for each process).
|
|
96
|
+
pid = Process.pid
|
|
97
|
+
@mutex_after_fork.synchronize do
|
|
98
|
+
if pid != @pid
|
|
99
|
+
@pid = pid
|
|
100
|
+
# we should start threads because the worker doesn't own this
|
|
101
|
+
start()
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
@worker.enqueue_trace(trace)
|
|
106
|
+
@worker.enqueue_service(services)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# stats returns a dictionary of stats about the writer.
|
|
110
|
+
def stats
|
|
111
|
+
{
|
|
112
|
+
traces_flushed: @traces_flushed,
|
|
113
|
+
services_flushed: @services_flushed,
|
|
114
|
+
transport: @transport.stats
|
|
115
|
+
}
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: fair-ddtrace
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.8.2.a
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Fair
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2018-10-11 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: msgpack
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '10.5'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '10.5'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rubocop
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.47'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.47'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: minitest
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 5.10.1
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 5.10.1
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: appraisal
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '2.1'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '2.1'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: yard
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0.9'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0.9'
|
|
97
|
+
description: |
|
|
98
|
+
ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
|
|
99
|
+
as they flow across web servers, databases and microservices so that developers
|
|
100
|
+
have great visiblity into bottlenecks and troublesome requests.
|
|
101
|
+
Find the original version at: https://github.com/DataDog/dd-trace-rb
|
|
102
|
+
email:
|
|
103
|
+
- catherinec@fair.com
|
|
104
|
+
executables: []
|
|
105
|
+
extensions: []
|
|
106
|
+
extra_rdoc_files: []
|
|
107
|
+
files:
|
|
108
|
+
- ".env"
|
|
109
|
+
- ".gitignore"
|
|
110
|
+
- ".rubocop.yml"
|
|
111
|
+
- ".yardopts"
|
|
112
|
+
- Appraisals
|
|
113
|
+
- Gemfile
|
|
114
|
+
- LICENSE
|
|
115
|
+
- README.md
|
|
116
|
+
- Rakefile
|
|
117
|
+
- circle.yml
|
|
118
|
+
- ddtrace.gemspec
|
|
119
|
+
- docker-compose.yml
|
|
120
|
+
- docs/GettingStarted.md
|
|
121
|
+
- gemfiles/contrib.gemfile
|
|
122
|
+
- gemfiles/contrib_old.gemfile
|
|
123
|
+
- gemfiles/rails30_postgres.gemfile
|
|
124
|
+
- gemfiles/rails30_postgres_sidekiq.gemfile
|
|
125
|
+
- gemfiles/rails32_mysql2.gemfile
|
|
126
|
+
- gemfiles/rails32_postgres.gemfile
|
|
127
|
+
- gemfiles/rails32_postgres_redis.gemfile
|
|
128
|
+
- gemfiles/rails32_postgres_sidekiq.gemfile
|
|
129
|
+
- gemfiles/rails4_mysql2.gemfile
|
|
130
|
+
- gemfiles/rails4_postgres.gemfile
|
|
131
|
+
- gemfiles/rails4_postgres_redis.gemfile
|
|
132
|
+
- gemfiles/rails4_postgres_sidekiq.gemfile
|
|
133
|
+
- gemfiles/rails5_mysql2.gemfile
|
|
134
|
+
- gemfiles/rails5_postgres.gemfile
|
|
135
|
+
- gemfiles/rails5_postgres_redis.gemfile
|
|
136
|
+
- gemfiles/rails5_postgres_sidekiq.gemfile
|
|
137
|
+
- lib/ddtrace.rb
|
|
138
|
+
- lib/ddtrace/buffer.rb
|
|
139
|
+
- lib/ddtrace/context.rb
|
|
140
|
+
- lib/ddtrace/contrib/active_record/patcher.rb
|
|
141
|
+
- lib/ddtrace/contrib/elasticsearch/patcher.rb
|
|
142
|
+
- lib/ddtrace/contrib/elasticsearch/quantize.rb
|
|
143
|
+
- lib/ddtrace/contrib/grape/endpoint.rb
|
|
144
|
+
- lib/ddtrace/contrib/grape/patcher.rb
|
|
145
|
+
- lib/ddtrace/contrib/http/patcher.rb
|
|
146
|
+
- lib/ddtrace/contrib/rack/middlewares.rb
|
|
147
|
+
- lib/ddtrace/contrib/rails/action_controller.rb
|
|
148
|
+
- lib/ddtrace/contrib/rails/action_view.rb
|
|
149
|
+
- lib/ddtrace/contrib/rails/active_record.rb
|
|
150
|
+
- lib/ddtrace/contrib/rails/active_support.rb
|
|
151
|
+
- lib/ddtrace/contrib/rails/core_extensions.rb
|
|
152
|
+
- lib/ddtrace/contrib/rails/framework.rb
|
|
153
|
+
- lib/ddtrace/contrib/rails/middlewares.rb
|
|
154
|
+
- lib/ddtrace/contrib/rails/utils.rb
|
|
155
|
+
- lib/ddtrace/contrib/redis/patcher.rb
|
|
156
|
+
- lib/ddtrace/contrib/redis/quantize.rb
|
|
157
|
+
- lib/ddtrace/contrib/redis/tags.rb
|
|
158
|
+
- lib/ddtrace/contrib/sidekiq/tracer.rb
|
|
159
|
+
- lib/ddtrace/contrib/sinatra/tracer.rb
|
|
160
|
+
- lib/ddtrace/distributed.rb
|
|
161
|
+
- lib/ddtrace/encoding.rb
|
|
162
|
+
- lib/ddtrace/error.rb
|
|
163
|
+
- lib/ddtrace/ext/app_types.rb
|
|
164
|
+
- lib/ddtrace/ext/cache.rb
|
|
165
|
+
- lib/ddtrace/ext/distributed.rb
|
|
166
|
+
- lib/ddtrace/ext/errors.rb
|
|
167
|
+
- lib/ddtrace/ext/http.rb
|
|
168
|
+
- lib/ddtrace/ext/net.rb
|
|
169
|
+
- lib/ddtrace/ext/redis.rb
|
|
170
|
+
- lib/ddtrace/ext/sql.rb
|
|
171
|
+
- lib/ddtrace/logger.rb
|
|
172
|
+
- lib/ddtrace/monkey.rb
|
|
173
|
+
- lib/ddtrace/pin.rb
|
|
174
|
+
- lib/ddtrace/provider.rb
|
|
175
|
+
- lib/ddtrace/sampler.rb
|
|
176
|
+
- lib/ddtrace/span.rb
|
|
177
|
+
- lib/ddtrace/tracer.rb
|
|
178
|
+
- lib/ddtrace/transport.rb
|
|
179
|
+
- lib/ddtrace/utils.rb
|
|
180
|
+
- lib/ddtrace/version.rb
|
|
181
|
+
- lib/ddtrace/workers.rb
|
|
182
|
+
- lib/ddtrace/writer.rb
|
|
183
|
+
homepage: https://github.com/wearefair/dd-trace-rb
|
|
184
|
+
licenses:
|
|
185
|
+
- BSD-3-Clause
|
|
186
|
+
metadata:
|
|
187
|
+
allowed_push_host: https://rubygems.org
|
|
188
|
+
post_install_message:
|
|
189
|
+
rdoc_options: []
|
|
190
|
+
require_paths:
|
|
191
|
+
- lib
|
|
192
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
|
+
requirements:
|
|
194
|
+
- - ">="
|
|
195
|
+
- !ruby/object:Gem::Version
|
|
196
|
+
version: 1.9.1
|
|
197
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
198
|
+
requirements:
|
|
199
|
+
- - ">"
|
|
200
|
+
- !ruby/object:Gem::Version
|
|
201
|
+
version: 1.3.1
|
|
202
|
+
requirements: []
|
|
203
|
+
rubyforge_project:
|
|
204
|
+
rubygems_version: 2.6.14.1
|
|
205
|
+
signing_key:
|
|
206
|
+
specification_version: 4
|
|
207
|
+
summary: Fair fork of Datadog tracing code for your Ruby applications
|
|
208
|
+
test_files: []
|