ddtrace 0.35.2 → 0.40.0
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/.circleci/config.yml +59 -1
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +27 -0
- data/.rubocop.yml +4 -0
- data/.simplecov +38 -0
- data/Appraisals +139 -12
- data/CHANGELOG.md +185 -1
- data/Rakefile +524 -464
- data/ddtrace.gemspec +6 -0
- data/docker-compose.yml +37 -2
- data/docs/DevelopmentGuide.md +16 -0
- data/docs/GettingStarted.md +192 -111
- data/lib/ddtrace.rb +4 -0
- data/lib/ddtrace/configuration.rb +36 -5
- data/lib/ddtrace/configuration/components.rb +4 -7
- data/lib/ddtrace/configuration/pin_setup.rb +3 -2
- data/lib/ddtrace/configuration/settings.rb +27 -3
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/aws/ext.rb +5 -2
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +19 -0
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
- data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -2
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/excon/ext.rb +5 -2
- data/lib/ddtrace/contrib/extensions.rb +39 -5
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
- data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/grape/ext.rb +5 -2
- data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
- data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
- data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
- data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
- data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/http/ext.rb +5 -2
- data/lib/ddtrace/contrib/http/instrumentation.rb +12 -7
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/event.rb +51 -0
- data/lib/ddtrace/contrib/kafka/events.rb +44 -0
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/patcher.rb +14 -8
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/presto/ext.rb +5 -2
- data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
- data/lib/ddtrace/contrib/que/ext.rb +30 -0
- data/lib/ddtrace/contrib/que/integration.rb +42 -0
- data/lib/ddtrace/contrib/que/patcher.rb +24 -0
- data/lib/ddtrace/contrib/que/tracer.rb +56 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/racecar/events.rb +2 -0
- data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rack/ext.rb +5 -2
- data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +10 -11
- data/lib/ddtrace/contrib/rails/ext.rb +6 -2
- data/lib/ddtrace/contrib/rails/framework.rb +52 -46
- data/lib/ddtrace/contrib/rails/integration.rb +1 -1
- data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
- data/lib/ddtrace/contrib/rails/patcher.rb +15 -0
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/rake/ext.rb +5 -2
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/redis/ext.rb +5 -2
- data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/resque/ext.rb +5 -2
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sequel/database.rb +1 -1
- data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
- data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
- data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
- data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/environment.rb +17 -3
- data/lib/ddtrace/ext/diagnostics.rb +3 -0
- data/lib/ddtrace/ext/environment.rb +2 -0
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/logger.rb +1 -1
- data/lib/ddtrace/pin.rb +39 -15
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/runtime/metrics.rb +18 -4
- data/lib/ddtrace/sampler.rb +2 -0
- data/lib/ddtrace/span.rb +10 -0
- data/lib/ddtrace/tracer.rb +15 -8
- data/lib/ddtrace/transport/http.rb +15 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
- data/lib/ddtrace/transport/response.rb +11 -0
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/workers/async.rb +2 -2
- data/lib/ddtrace/workers/loop.rb +1 -1
- data/lib/ddtrace/workers/polling.rb +1 -1
- data/lib/ddtrace/workers/trace_writer.rb +3 -0
- data/lib/ddtrace/writer.rb +33 -12
- metadata +124 -4
|
@@ -5,8 +5,11 @@ module Datadog
|
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'sidekiq'.freeze
|
|
7
7
|
CLIENT_SERVICE_NAME = 'sidekiq-client'.freeze
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
ENV_ENABLED = 'DD_TRACE_SIDEKIQ_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_SIDEKIQ_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_SIDEKIQ_ANALYTICS_ENABLED'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SIDEKIQ_ANALYTICS_SAMPLE_RATE'.freeze
|
|
12
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SIDEKIQ_ANALYTICS_SAMPLE_RATE'.freeze
|
|
10
13
|
ENV_TAG_JOB_ARGS = 'DD_SIDEKIQ_TAG_JOB_ARGS'.freeze
|
|
11
14
|
SERVICE_NAME = 'sidekiq'.freeze
|
|
12
15
|
SPAN_PUSH = 'sidekiq.push'.freeze
|
|
@@ -15,6 +18,7 @@ module Datadog
|
|
|
15
18
|
TAG_JOB_ID = 'sidekiq.job.id'.freeze
|
|
16
19
|
TAG_JOB_QUEUE = 'sidekiq.job.queue'.freeze
|
|
17
20
|
TAG_JOB_RETRY = 'sidekiq.job.retry'.freeze
|
|
21
|
+
TAG_JOB_RETRY_COUNT = 'sidekiq.job.retry_count'.freeze
|
|
18
22
|
TAG_JOB_WRAPPER = 'sidekiq.job.wrapper'.freeze
|
|
19
23
|
TAG_JOB_ARGS = 'sidekiq.job.args'.freeze
|
|
20
24
|
end
|
|
@@ -15,14 +15,21 @@ module Datadog
|
|
|
15
15
|
|
|
16
16
|
def patch
|
|
17
17
|
require 'ddtrace/contrib/sidekiq/client_tracer'
|
|
18
|
+
require 'ddtrace/contrib/sidekiq/server_tracer'
|
|
19
|
+
|
|
18
20
|
::Sidekiq.configure_client do |config|
|
|
19
21
|
config.client_middleware do |chain|
|
|
20
22
|
chain.add(Sidekiq::ClientTracer)
|
|
21
23
|
end
|
|
22
24
|
end
|
|
23
25
|
|
|
24
|
-
require 'ddtrace/contrib/sidekiq/server_tracer'
|
|
25
26
|
::Sidekiq.configure_server do |config|
|
|
27
|
+
# If a job enqueues another job, make sure it has the same client
|
|
28
|
+
# middleware.
|
|
29
|
+
config.client_middleware do |chain|
|
|
30
|
+
chain.add(Sidekiq::ClientTracer)
|
|
31
|
+
end
|
|
32
|
+
|
|
26
33
|
config.server_middleware do |chain|
|
|
27
34
|
chain.add(Sidekiq::ServerTracer)
|
|
28
35
|
end
|
|
@@ -31,6 +31,7 @@ module Datadog
|
|
|
31
31
|
|
|
32
32
|
span.set_tag(Ext::TAG_JOB_ID, job['jid'])
|
|
33
33
|
span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
|
|
34
|
+
span.set_tag(Ext::TAG_JOB_RETRY_COUNT, job['retry_count'])
|
|
34
35
|
span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
|
|
35
36
|
span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
|
|
36
37
|
span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
|
|
@@ -12,13 +12,18 @@ module Datadog
|
|
|
12
12
|
response: %w[Content-Type X-Request-ID]
|
|
13
13
|
}.freeze
|
|
14
14
|
|
|
15
|
+
option :enabled do |o|
|
|
16
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
17
|
+
o.lazy
|
|
18
|
+
end
|
|
19
|
+
|
|
15
20
|
option :analytics_enabled do |o|
|
|
16
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
21
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
17
22
|
o.lazy
|
|
18
23
|
end
|
|
19
24
|
|
|
20
25
|
option :analytics_sample_rate do |o|
|
|
21
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
26
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
22
27
|
o.lazy
|
|
23
28
|
end
|
|
24
29
|
|
|
@@ -8,12 +8,13 @@ module Datadog
|
|
|
8
8
|
module Env
|
|
9
9
|
module_function
|
|
10
10
|
|
|
11
|
-
def datadog_span(env)
|
|
12
|
-
env[Ext::RACK_ENV_REQUEST_SPAN]
|
|
11
|
+
def datadog_span(env, app)
|
|
12
|
+
env[Ext::RACK_ENV_REQUEST_SPAN][app]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def set_datadog_span(env, span)
|
|
16
|
-
env[Ext::RACK_ENV_REQUEST_SPAN]
|
|
15
|
+
def set_datadog_span(env, app, span)
|
|
16
|
+
hash = (env[Ext::RACK_ENV_REQUEST_SPAN] ||= {})
|
|
17
|
+
hash[app] = span
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def request_header_tags(env, headers)
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# Sinatra integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'sinatra'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_SINATRA_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_SINATRA_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_SINATRA_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
RACK_ENV_REQUEST_SPAN = 'datadog.sinatra_request_span'.freeze
|
|
10
13
|
RACK_ENV_MIDDLEWARE_START_TIME = 'datadog.sinatra_middleware_start_time'.freeze
|
|
11
14
|
RACK_ENV_MIDDLEWARE_TRACED = 'datadog.sinatra_middleware_traced'.freeze
|
|
@@ -36,21 +36,32 @@ module Datadog
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def self.registered(app)
|
|
39
|
-
app.use TracerMiddleware
|
|
39
|
+
app.use TracerMiddleware, app_instance: app
|
|
40
40
|
|
|
41
41
|
app.after do
|
|
42
42
|
configuration = Datadog.configuration[:sinatra]
|
|
43
43
|
next unless configuration[:tracer].enabled
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
span = Sinatra::Env.datadog_span(env, app)
|
|
46
|
+
|
|
47
|
+
# TODO: `route` should *only* be populated if @datadog_route is defined.
|
|
48
|
+
# TODO: If @datadog_route is not defined, then this Sinatra app is not responsible
|
|
49
|
+
# TODO: for handling this request.
|
|
50
|
+
# TODO:
|
|
51
|
+
# TODO: This change would be BREAKING for any Sinatra app (classic or modular),
|
|
52
|
+
# TODO: as it affects the `resource` value for requests not handled by the Sinatra app.
|
|
53
|
+
# TODO: Currently we use "#{method} #{path}" in such aces, but `path` is the raw,
|
|
54
|
+
# TODO: high-cardinality HTTP path, and can contain PII.
|
|
55
|
+
# TODO:
|
|
56
|
+
# TODO: The value we should use as the `resource` when the Sinatra app is not
|
|
57
|
+
# TODO: responsible for the request is a tricky subject.
|
|
58
|
+
# TODO: The best option is a value that clearly communicates that this app did not
|
|
59
|
+
# TODO: handle this request. It's important to keep in mind that an unhandled request
|
|
60
|
+
# TODO: by this Sinatra app might still be handled by another Rack middleware (which can
|
|
61
|
+
# TODO: be a Sinatra app itself) or it might just 404 if not handled at all.
|
|
62
|
+
# TODO:
|
|
63
|
+
# TODO: A possible value for `resource` could set a high level description, e.g.
|
|
64
|
+
# TODO: `request.request_method`, given we don't have the response object available yet.
|
|
54
65
|
route = if defined?(@datadog_route)
|
|
55
66
|
@datadog_route
|
|
56
67
|
else
|
|
@@ -59,36 +70,10 @@ module Datadog
|
|
|
59
70
|
end
|
|
60
71
|
|
|
61
72
|
span.resource = "#{request.request_method} #{route}"
|
|
62
|
-
|
|
63
|
-
span.set_tag(Datadog::Ext::HTTP::URL, request.path)
|
|
64
|
-
span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
|
|
65
|
-
span.set_tag(Ext::TAG_APP_NAME, app.settings.name)
|
|
66
73
|
span.set_tag(Ext::TAG_ROUTE_PATH, route)
|
|
67
|
-
if request.script_name && !request.script_name.empty?
|
|
68
|
-
span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
|
|
72
|
-
span.set_error(env['sinatra.error']) if response.server_error?
|
|
73
|
-
|
|
74
|
-
Sinatra::Env.set_middleware_traced(env, true)
|
|
75
74
|
end
|
|
76
75
|
end
|
|
77
76
|
|
|
78
|
-
# Initializes a span for the top-most Sinatra middleware.
|
|
79
|
-
def self.create_middleware_span(env, configuration)
|
|
80
|
-
tracer = configuration[:tracer]
|
|
81
|
-
span = tracer.trace(
|
|
82
|
-
Ext::SPAN_REQUEST,
|
|
83
|
-
service: configuration[:service_name],
|
|
84
|
-
span_type: Datadog::Ext::HTTP::TYPE_INBOUND,
|
|
85
|
-
start_time: Sinatra::Env.middleware_start_time(env)
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
Sinatra::Env.set_datadog_span(env, span)
|
|
89
|
-
span
|
|
90
|
-
end
|
|
91
|
-
|
|
92
77
|
# Method overrides for Sinatra::Base
|
|
93
78
|
module Base
|
|
94
79
|
def render(engine, data, *)
|
|
@@ -114,14 +99,8 @@ module Datadog
|
|
|
114
99
|
def route_eval
|
|
115
100
|
configuration = Datadog.configuration[:sinatra]
|
|
116
101
|
tracer = configuration[:tracer]
|
|
117
|
-
|
|
118
102
|
return super unless tracer.enabled
|
|
119
103
|
|
|
120
|
-
# For initialization of Sinatra middleware span in order
|
|
121
|
-
# guarantee that the Ext::SPAN_ROUTE span being created below
|
|
122
|
-
# has the middleware span as its parent.
|
|
123
|
-
Sinatra::Tracer.create_middleware_span(env, configuration) unless Sinatra::Env.datadog_span(env)
|
|
124
|
-
|
|
125
104
|
tracer.trace(
|
|
126
105
|
Ext::SPAN_ROUTE,
|
|
127
106
|
service: configuration[:service_name],
|
|
@@ -8,10 +8,13 @@ module Datadog
|
|
|
8
8
|
module Sinatra
|
|
9
9
|
# Middleware used for automatically tagging configured headers and handle request span
|
|
10
10
|
class TracerMiddleware
|
|
11
|
-
def initialize(app)
|
|
11
|
+
def initialize(app, app_instance: nil)
|
|
12
12
|
@app = app
|
|
13
|
+
@app_instance = app_instance
|
|
13
14
|
end
|
|
14
15
|
|
|
16
|
+
# rubocop:disable Metrics/AbcSize
|
|
17
|
+
# rubocop:disable Metrics/MethodLength
|
|
15
18
|
def call(env)
|
|
16
19
|
# Set the trace context (e.g. distributed tracing)
|
|
17
20
|
if configuration[:distributed_tracing] && tracer.provider.context.trace_id.nil?
|
|
@@ -19,35 +22,59 @@ module Datadog
|
|
|
19
22
|
tracer.provider.context = context if context.trace_id
|
|
20
23
|
end
|
|
21
24
|
|
|
22
|
-
|
|
25
|
+
tracer.trace(
|
|
26
|
+
Ext::SPAN_REQUEST,
|
|
27
|
+
service: configuration[:service_name],
|
|
28
|
+
span_type: Datadog::Ext::HTTP::TYPE_INBOUND,
|
|
29
|
+
resource: env['REQUEST_METHOD']
|
|
30
|
+
) do |span|
|
|
31
|
+
begin
|
|
32
|
+
Sinatra::Env.set_datadog_span(env, @app_instance, span)
|
|
23
33
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Augment current Sinatra middleware span if we are the top-most Sinatra app on the Rack stack.
|
|
28
|
-
span = Sinatra::Env.datadog_span(env)
|
|
29
|
-
if span
|
|
30
|
-
Sinatra::Env.request_header_tags(env, configuration[:headers][:request]).each do |name, value|
|
|
31
|
-
span.set_tag(name, value) if span.get_tag(name).nil?
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
if response && (headers = response[1])
|
|
35
|
-
Sinatra::Headers.response_header_tags(headers, configuration[:headers][:response]).each do |name, value|
|
|
34
|
+
response = @app.call(env)
|
|
35
|
+
ensure
|
|
36
|
+
Sinatra::Env.request_header_tags(env, configuration[:headers][:request]).each do |name, value|
|
|
36
37
|
span.set_tag(name, value) if span.get_tag(name).nil?
|
|
37
38
|
end
|
|
38
|
-
end
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
request = ::Sinatra::Request.new(env)
|
|
41
|
+
span.set_tag(Datadog::Ext::HTTP::URL, request.path)
|
|
42
|
+
span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
|
|
43
|
+
if request.script_name && !request.script_name.empty?
|
|
44
|
+
span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
span.set_tag(Ext::TAG_APP_NAME, @app_instance.settings.name)
|
|
42
48
|
|
|
43
|
-
|
|
44
|
-
|
|
49
|
+
# TODO: This backfills the non-matching Sinatra app with a "#{method} #{path}"
|
|
50
|
+
# TODO: resource name. This shouldn't be the case, as that app has never handled
|
|
51
|
+
# TODO: the response with that resource.
|
|
52
|
+
# TODO: We should replace this backfill code with a clear `resource` that signals
|
|
53
|
+
# TODO: that this Sinatra span was *not* responsible for processing the current request.
|
|
54
|
+
rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
|
|
55
|
+
span.resource = rack_request_span.resource if rack_request_span && rack_request_span.resource
|
|
45
56
|
|
|
46
|
-
|
|
57
|
+
if response
|
|
58
|
+
if (status = response[0])
|
|
59
|
+
sinatra_response = ::Sinatra::Response.new([], status) # Build object to use status code helpers
|
|
47
60
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
61
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, sinatra_response.status)
|
|
62
|
+
span.set_error(env['sinatra.error']) if sinatra_response.server_error?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if (headers = response[1])
|
|
66
|
+
Sinatra::Headers.response_header_tags(headers, configuration[:headers][:response]).each do |name, value|
|
|
67
|
+
span.set_tag(name, value) if span.get_tag(name).nil?
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Set analytics sample rate
|
|
73
|
+
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
74
|
+
|
|
75
|
+
# Measure service stats
|
|
76
|
+
Contrib::Analytics.set_measured(span)
|
|
77
|
+
end
|
|
51
78
|
end
|
|
52
79
|
end
|
|
53
80
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Sneakers
|
|
8
|
+
module Configuration
|
|
9
|
+
# Default settings for the Shoryuken integration
|
|
10
|
+
class Settings < Datadog::Contrib::Configuration::Settings
|
|
11
|
+
option :enabled do |o|
|
|
12
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
13
|
+
o.lazy
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
option :analytics_enabled do |o|
|
|
17
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
|
|
18
|
+
o.lazy
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
option :analytics_sample_rate do |o|
|
|
22
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
23
|
+
o.lazy
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
option :service_name, default: Ext::SERVICE_NAME
|
|
27
|
+
option :tag_body, default: false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module Sneakers
|
|
6
|
+
# Sneakers integration constants
|
|
7
|
+
module Ext
|
|
8
|
+
APP = 'sneakers'.freeze
|
|
9
|
+
ENV_ENABLED = 'DD_TRACE_SNEAKERS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_SNEAKERS_ANALYTICS_ENABLED'.freeze
|
|
11
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_SNEAKERS_ANALYTICS_ENABLED'.freeze
|
|
12
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SNEAKERS_ANALYTICS_SAMPLE_RATE'.freeze
|
|
13
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SNEAKERS_ANALYTICS_SAMPLE_RATE'.freeze
|
|
14
|
+
SERVICE_NAME = 'sneakers'.freeze
|
|
15
|
+
SPAN_JOB = 'sneakers.job'.freeze
|
|
16
|
+
TAG_JOB_ROUTING_KEY = 'sneakers.routing_key'.freeze
|
|
17
|
+
TAG_JOB_QUEUE = 'sneakers.queue'.freeze
|
|
18
|
+
TAG_JOB_BODY = 'sneakers.body'.freeze
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/integration'
|
|
4
|
+
require 'ddtrace/contrib/sneakers/ext'
|
|
5
|
+
require 'ddtrace/contrib/sneakers/configuration/settings'
|
|
6
|
+
require 'ddtrace/contrib/sneakers/patcher'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module Contrib
|
|
10
|
+
module Sneakers
|
|
11
|
+
# Description of Sneakers integration
|
|
12
|
+
class Integration
|
|
13
|
+
include Datadog::Contrib::Integration
|
|
14
|
+
|
|
15
|
+
MINIMUM_VERSION = Gem::Version.new('2.12.0')
|
|
16
|
+
|
|
17
|
+
register_as :sneakers, auto_patch: true
|
|
18
|
+
|
|
19
|
+
def self.version
|
|
20
|
+
Gem.loaded_specs['sneakers'] && Gem.loaded_specs['sneakers'].version
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.loaded?
|
|
24
|
+
!defined?(::Sneakers).nil?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.compatible?
|
|
28
|
+
super && version >= MINIMUM_VERSION
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def default_configuration
|
|
32
|
+
Configuration::Settings.new
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def patcher
|
|
36
|
+
Patcher
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/sneakers/tracer'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Sneakers
|
|
8
|
+
# Patcher enables patching of 'sneakers' module.
|
|
9
|
+
module Patcher
|
|
10
|
+
include Datadog::Contrib::Patcher
|
|
11
|
+
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
def target_version
|
|
15
|
+
Integration.version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def patch
|
|
19
|
+
::Sneakers.middleware.use(Sneakers::Tracer, nil)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/analytics'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Sneakers
|
|
8
|
+
# Tracer is a Sneakers server-side middleware which traces executed jobs
|
|
9
|
+
class Tracer
|
|
10
|
+
def initialize(app, *args)
|
|
11
|
+
@app = app
|
|
12
|
+
@args = args
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call(deserialized_msg, delivery_info, metadata, handler)
|
|
16
|
+
trace_options = {
|
|
17
|
+
service: configuration[:service_name],
|
|
18
|
+
span_type: Datadog::Ext::AppTypes::WORKER
|
|
19
|
+
}
|
|
20
|
+
request_span = tracer.trace(Ext::SPAN_JOB, trace_options)
|
|
21
|
+
|
|
22
|
+
# Set analytics sample rate
|
|
23
|
+
if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
24
|
+
Datadog::Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Measure service stats
|
|
28
|
+
Contrib::Analytics.set_measured(request_span)
|
|
29
|
+
|
|
30
|
+
request_span.resource = @app.to_proc.binding.eval('self.class').to_s
|
|
31
|
+
request_span.set_tag(Ext::TAG_JOB_ROUTING_KEY, delivery_info.routing_key)
|
|
32
|
+
request_span.set_tag(Ext::TAG_JOB_QUEUE, delivery_info.consumer.queue.name)
|
|
33
|
+
|
|
34
|
+
if configuration[:tag_body]
|
|
35
|
+
request_span.set_tag(Ext::TAG_JOB_BODY, deserialized_msg)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
@app.call(deserialized_msg, delivery_info, metadata, handler)
|
|
39
|
+
rescue StandardError => e
|
|
40
|
+
request_span.set_error(e) unless request_span.nil?
|
|
41
|
+
raise e
|
|
42
|
+
ensure
|
|
43
|
+
request_span.finish if request_span
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def tracer
|
|
49
|
+
configuration[:tracer]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def configuration
|
|
53
|
+
Datadog.configuration[:sneakers]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|