ddtrace 0.52.0 → 0.54.2
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 +174 -11
- data/ddtrace.gemspec +6 -3
- data/docs/DevelopmentGuide.md +1 -6
- data/docs/GettingStarted.md +109 -18
- data/docs/ProfilingDevelopment.md +2 -2
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
- data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +177 -8
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +6 -1
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +2 -2
- data/lib/datadog/ci/ext/environment.rb +64 -22
- data/lib/datadog/ci/ext/test.rb +1 -0
- data/lib/datadog/ci/test.rb +5 -1
- data/lib/datadog/contrib.rb +2 -0
- data/lib/datadog/core/environment/vm_cache.rb +46 -0
- data/lib/ddtrace/buffer.rb +28 -16
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +131 -53
- data/lib/ddtrace/configuration/components.rb +1 -1
- data/lib/ddtrace/configuration/settings.rb +13 -3
- data/lib/ddtrace/context.rb +10 -2
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +46 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
- data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
- data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
- data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
- data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
- data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
- data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/active_job/event.rb +54 -0
- data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
- data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events.rb +39 -0
- data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
- data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
- data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
- data/lib/ddtrace/contrib/auto_instrument.rb +0 -1
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +2 -2
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/mongodb/integration.rb +5 -0
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +0 -1
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +7 -0
- data/lib/ddtrace/contrib/rails/framework.rb +24 -1
- data/lib/ddtrace/contrib/rails/patcher.rb +19 -10
- data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +2 -84
- data/lib/ddtrace/contrib/registerable.rb +0 -1
- data/lib/ddtrace/contrib/resque/integration.rb +1 -5
- data/lib/ddtrace/contrib/sidekiq/ext.rb +3 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +10 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +26 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +2 -1
- data/lib/ddtrace/contrib/sinatra/tracer.rb +15 -2
- data/lib/ddtrace/ext/git.rb +12 -0
- data/lib/ddtrace/ext/priority.rb +6 -4
- data/lib/ddtrace/ext/profiling.rb +8 -11
- data/lib/ddtrace/ext/runtime.rb +3 -0
- data/lib/ddtrace/ext/transport.rb +11 -0
- data/lib/ddtrace/metrics.rb +2 -2
- data/lib/ddtrace/profiling/collectors/stack.rb +112 -72
- data/lib/ddtrace/profiling/encoding/profile.rb +10 -2
- data/lib/ddtrace/profiling/events/stack.rb +13 -13
- data/lib/ddtrace/profiling/native_extension.rb +23 -1
- data/lib/ddtrace/profiling/pprof/builder.rb +8 -2
- data/lib/ddtrace/profiling/pprof/converter.rb +22 -9
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +32 -9
- data/lib/ddtrace/profiling/pprof/template.rb +2 -2
- data/lib/ddtrace/profiling/scheduler.rb +20 -4
- data/lib/ddtrace/profiling/tasks/setup.rb +21 -13
- data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +10 -9
- data/lib/ddtrace/profiling/trace_identifiers/helper.rb +5 -5
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +8 -15
- data/lib/ddtrace/profiling/transport/http.rb +8 -17
- data/lib/ddtrace/profiling.rb +0 -2
- data/lib/ddtrace/runtime/metrics.rb +14 -0
- data/lib/ddtrace/sampler.rb +18 -8
- data/lib/ddtrace/sampling/rule_sampler.rb +13 -1
- data/lib/ddtrace/span.rb +7 -19
- data/lib/ddtrace/tracer.rb +1 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +13 -3
- data/lib/ddtrace/transport/http/adapters/test.rb +4 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +23 -12
- data/lib/ddtrace/transport/http/builder.rb +13 -6
- data/lib/ddtrace/transport/http.rb +5 -11
- data/lib/ddtrace/utils/time.rb +11 -6
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/workers/{loop.rb → interval_loop.rb} +0 -16
- data/lib/ddtrace/workers/polling.rb +1 -1
- metadata +40 -10
- data/lib/ddtrace/profiling/ext/cpu.rb +0 -67
- data/lib/ddtrace/profiling/ext/cthread.rb +0 -156
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/patcher'
|
|
3
|
+
require 'ddtrace/contrib/active_job/ext'
|
|
4
|
+
require 'ddtrace/contrib/active_job/events'
|
|
5
|
+
require 'ddtrace/contrib/active_job/log_injection'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Contrib
|
|
9
|
+
module ActiveJob
|
|
10
|
+
# Patcher enables patching of 'active_job' module.
|
|
11
|
+
module Patcher
|
|
12
|
+
include Contrib::Patcher
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def target_version
|
|
17
|
+
Integration.version
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def patch
|
|
21
|
+
Events.subscribe!
|
|
22
|
+
inject_log_correlation if Datadog.configuration[:active_job][:log_injection]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def inject_log_correlation
|
|
26
|
+
::ActiveSupport.on_load(:active_job) do
|
|
27
|
+
include LogInjection
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -9,7 +9,7 @@ module Datadog
|
|
|
9
9
|
# DelayedJob plugin that instruments invoke_job hook
|
|
10
10
|
class Plugin < Delayed::Plugin
|
|
11
11
|
def self.instrument_invoke(job, &block)
|
|
12
|
-
return
|
|
12
|
+
return yield(job) unless tracer && tracer.enabled
|
|
13
13
|
|
|
14
14
|
tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name(job),
|
|
15
15
|
on_error: configuration[:error_handler]) do |span|
|
|
@@ -29,7 +29,7 @@ module Datadog
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def self.instrument_enqueue(job, &block)
|
|
32
|
-
return
|
|
32
|
+
return yield(job) unless tracer && tracer.enabled
|
|
33
33
|
|
|
34
34
|
tracer.trace(Ext::SPAN_ENQUEUE, service: configuration[:client_service_name], resource: job_name(job)) do |span|
|
|
35
35
|
set_sample_rate(span)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# typed: false
|
|
2
2
|
require 'ddtrace/contrib/integration'
|
|
3
|
+
require 'ddtrace/contrib/configuration/resolvers/pattern_resolver'
|
|
3
4
|
require 'ddtrace/contrib/mongodb/configuration/settings'
|
|
4
5
|
require 'ddtrace/contrib/mongodb/patcher'
|
|
5
6
|
|
|
@@ -33,6 +34,10 @@ module Datadog
|
|
|
33
34
|
def patcher
|
|
34
35
|
Patcher
|
|
35
36
|
end
|
|
37
|
+
|
|
38
|
+
def resolver
|
|
39
|
+
@resolver ||= Contrib::Configuration::Resolvers::PatternResolver.new
|
|
40
|
+
end
|
|
36
41
|
end
|
|
37
42
|
end
|
|
38
43
|
end
|
|
@@ -73,6 +73,13 @@ module Datadog
|
|
|
73
73
|
end
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
+
option :job_service do |o|
|
|
77
|
+
o.on_set do |value|
|
|
78
|
+
# Update ActiveJob service name too
|
|
79
|
+
Datadog.configuration[:active_job][:service_name] = value
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
76
83
|
option :middleware, default: true
|
|
77
84
|
option :middleware_names, default: false
|
|
78
85
|
option :template_base_path do |o|
|
|
@@ -5,6 +5,7 @@ require 'ddtrace/ext/app_types'
|
|
|
5
5
|
require 'ddtrace/contrib/active_record/integration'
|
|
6
6
|
require 'ddtrace/contrib/active_support/integration'
|
|
7
7
|
require 'ddtrace/contrib/action_cable/integration'
|
|
8
|
+
require 'ddtrace/contrib/action_mailer/integration'
|
|
8
9
|
require 'ddtrace/contrib/action_pack/integration'
|
|
9
10
|
require 'ddtrace/contrib/action_view/integration'
|
|
10
11
|
require 'ddtrace/contrib/grape/endpoint'
|
|
@@ -21,7 +22,7 @@ module Datadog
|
|
|
21
22
|
# Rails framework code, used to essentially:
|
|
22
23
|
# - handle configuration entries which are specific to Datadog tracing
|
|
23
24
|
# - instrument parts of the framework when needed
|
|
24
|
-
module Framework
|
|
25
|
+
module Framework # rubocop:disable Metrics/ModuleLength
|
|
25
26
|
# After the Rails application finishes initializing, we configure the Rails
|
|
26
27
|
# integration and all its sub-components with the application information
|
|
27
28
|
# available.
|
|
@@ -45,9 +46,11 @@ module Datadog
|
|
|
45
46
|
|
|
46
47
|
activate_rack!(datadog_config, rails_config)
|
|
47
48
|
activate_action_cable!(datadog_config, rails_config)
|
|
49
|
+
activate_action_mailer!(datadog_config, rails_config)
|
|
48
50
|
activate_active_support!(datadog_config, rails_config)
|
|
49
51
|
activate_action_pack!(datadog_config, rails_config)
|
|
50
52
|
activate_action_view!(datadog_config, rails_config)
|
|
53
|
+
activate_active_job!(datadog_config, rails_config)
|
|
51
54
|
activate_active_record!(datadog_config, rails_config)
|
|
52
55
|
activate_lograge!(datadog_config, rails_config)
|
|
53
56
|
activate_semantic_logger!(datadog_config, rails_config)
|
|
@@ -62,6 +65,7 @@ module Datadog
|
|
|
62
65
|
config[:database_service] ||= "#{config[:service_name]}-#{Contrib::ActiveRecord::Utils.adapter_name}"
|
|
63
66
|
config[:controller_service] ||= config[:service_name]
|
|
64
67
|
config[:cache_service] ||= "#{config[:service_name]}-cache"
|
|
68
|
+
config[:job_service] ||= "#{config[:service_name]}-#{Contrib::ActiveJob::Ext::SERVICE_NAME}"
|
|
65
69
|
end
|
|
66
70
|
end
|
|
67
71
|
|
|
@@ -93,6 +97,15 @@ module Datadog
|
|
|
93
97
|
)
|
|
94
98
|
end
|
|
95
99
|
|
|
100
|
+
def self.activate_action_mailer!(datadog_config, rails_config)
|
|
101
|
+
return unless defined?(::ActionMailer)
|
|
102
|
+
|
|
103
|
+
datadog_config.use(
|
|
104
|
+
:action_mailer,
|
|
105
|
+
service_name: "#{rails_config[:service_name]}-#{Contrib::ActionMailer::Ext::SERVICE_NAME}"
|
|
106
|
+
)
|
|
107
|
+
end
|
|
108
|
+
|
|
96
109
|
def self.activate_action_pack!(datadog_config, rails_config)
|
|
97
110
|
return unless defined?(::ActionPack)
|
|
98
111
|
|
|
@@ -115,6 +128,16 @@ module Datadog
|
|
|
115
128
|
)
|
|
116
129
|
end
|
|
117
130
|
|
|
131
|
+
def self.activate_active_job!(datadog_config, rails_config)
|
|
132
|
+
return unless defined?(::ActiveJob)
|
|
133
|
+
|
|
134
|
+
datadog_config.use(
|
|
135
|
+
:active_job,
|
|
136
|
+
service_name: rails_config[:job_service],
|
|
137
|
+
log_injection: rails_config[:log_injection]
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
|
|
118
141
|
def self.activate_active_record!(datadog_config, rails_config)
|
|
119
142
|
return unless defined?(::ActiveRecord)
|
|
120
143
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: ignore
|
|
2
2
|
require 'ddtrace/contrib/rails/utils'
|
|
3
3
|
require 'ddtrace/contrib/rails/framework'
|
|
4
4
|
require 'ddtrace/contrib/rails/middlewares'
|
|
@@ -45,17 +45,26 @@ module Datadog
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def add_middleware(app)
|
|
48
|
-
# Add trace middleware
|
|
48
|
+
# Add trace middleware at the top of the middleware stack,
|
|
49
|
+
# to ensure we capture the complete execution time.
|
|
49
50
|
app.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
|
|
50
51
|
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
# Some Rails middleware can swallow an application error, preventing
|
|
53
|
+
# the error propagation to the encompassing Rack span.
|
|
54
|
+
#
|
|
55
|
+
# We insert our own middleware right before these Rails middleware
|
|
56
|
+
# have a chance to swallow the error.
|
|
57
|
+
#
|
|
58
|
+
# Note: because the middleware stack is push/pop, "before" and "after" are reversed
|
|
59
|
+
# for our use case: we insert ourselves with "after" a middleware to ensure we are
|
|
60
|
+
# able to pop the request "before" it.
|
|
61
|
+
if defined?(::ActionDispatch::DebugExceptions)
|
|
62
|
+
# Rails >= 3.2
|
|
63
|
+
app.middleware.insert_after(::ActionDispatch::DebugExceptions, Datadog::Contrib::Rails::ExceptionMiddleware)
|
|
64
|
+
else
|
|
65
|
+
# Rails < 3.2
|
|
66
|
+
app.middleware.insert_after(::ActionDispatch::ShowExceptions, Datadog::Contrib::Rails::ExceptionMiddleware)
|
|
67
|
+
end
|
|
59
68
|
end
|
|
60
69
|
|
|
61
70
|
def add_logger(app)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/patcher'
|
|
3
|
+
require 'ddtrace/contrib/redis/ext'
|
|
4
|
+
require 'ddtrace/contrib/redis/configuration/resolver'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Contrib
|
|
8
|
+
module Redis
|
|
9
|
+
# Instrumentation for Redis
|
|
10
|
+
module Instrumentation
|
|
11
|
+
def self.included(base)
|
|
12
|
+
base.prepend(InstanceMethods)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# InstanceMethods - implementing instrumentation
|
|
16
|
+
module InstanceMethods
|
|
17
|
+
def call(*args, &block)
|
|
18
|
+
pin = Datadog::Pin.get_from(self)
|
|
19
|
+
return super unless pin && pin.tracer
|
|
20
|
+
|
|
21
|
+
response = nil
|
|
22
|
+
pin.tracer.trace(Datadog::Contrib::Redis::Ext::SPAN_COMMAND) do |span|
|
|
23
|
+
span.service = pin.service
|
|
24
|
+
span.span_type = Datadog::Contrib::Redis::Ext::TYPE
|
|
25
|
+
span.resource = get_command(args)
|
|
26
|
+
Datadog::Contrib::Redis::Tags.set_common_tags(self, span)
|
|
27
|
+
|
|
28
|
+
response = super
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
response
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def call_pipeline(*args, &block)
|
|
35
|
+
pin = Datadog::Pin.get_from(self)
|
|
36
|
+
return super unless pin && pin.tracer
|
|
37
|
+
|
|
38
|
+
response = nil
|
|
39
|
+
pin.tracer.trace(Datadog::Contrib::Redis::Ext::SPAN_COMMAND) do |span|
|
|
40
|
+
span.service = pin.service
|
|
41
|
+
span.span_type = Datadog::Contrib::Redis::Ext::TYPE
|
|
42
|
+
commands = get_pipeline_commands(args)
|
|
43
|
+
span.resource = commands.join("\n")
|
|
44
|
+
span.set_metric Datadog::Contrib::Redis::Ext::METRIC_PIPELINE_LEN, commands.length
|
|
45
|
+
Datadog::Contrib::Redis::Tags.set_common_tags(self, span)
|
|
46
|
+
|
|
47
|
+
response = super
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
response
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def datadog_pin
|
|
54
|
+
@datadog_pin ||= begin
|
|
55
|
+
pin = Datadog::Pin.new(
|
|
56
|
+
datadog_configuration[:service_name],
|
|
57
|
+
app: Ext::APP,
|
|
58
|
+
app_type: Datadog::Ext::AppTypes::DB,
|
|
59
|
+
tracer: -> { datadog_configuration[:tracer] }
|
|
60
|
+
)
|
|
61
|
+
pin.onto(self)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def get_command(args)
|
|
68
|
+
if datadog_configuration[:command_args]
|
|
69
|
+
Datadog::Contrib::Redis::Quantize.format_command_args(*args)
|
|
70
|
+
else
|
|
71
|
+
Datadog::Contrib::Redis::Quantize.get_verb(*args)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def get_pipeline_commands(args)
|
|
76
|
+
if datadog_configuration[:command_args]
|
|
77
|
+
args[0].commands.map { |c| Datadog::Contrib::Redis::Quantize.format_command_args(c) }
|
|
78
|
+
else
|
|
79
|
+
args[0].commands.map { |c| Datadog::Contrib::Redis::Quantize.get_verb(c) }
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def datadog_configuration
|
|
84
|
+
Datadog.configuration[:redis, options]
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -23,92 +23,10 @@ module Datadog
|
|
|
23
23
|
require 'ddtrace/ext/app_types'
|
|
24
24
|
require 'ddtrace/contrib/redis/tags'
|
|
25
25
|
require 'ddtrace/contrib/redis/quantize'
|
|
26
|
+
require 'ddtrace/contrib/redis/instrumentation'
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
::Redis::Client.include(Instrumentation)
|
|
28
29
|
end
|
|
29
|
-
|
|
30
|
-
# rubocop:disable Metrics/MethodLength
|
|
31
|
-
# rubocop:disable Metrics/BlockLength
|
|
32
|
-
# rubocop:disable Metrics/AbcSize
|
|
33
|
-
def patch_redis_client
|
|
34
|
-
::Redis::Client.class_eval do
|
|
35
|
-
alias_method :call_without_datadog, :call
|
|
36
|
-
remove_method :call
|
|
37
|
-
def call(*args, &block)
|
|
38
|
-
pin = Datadog::Pin.get_from(self)
|
|
39
|
-
return call_without_datadog(*args, &block) unless pin && pin.tracer
|
|
40
|
-
|
|
41
|
-
response = nil
|
|
42
|
-
pin.tracer.trace(Datadog::Contrib::Redis::Ext::SPAN_COMMAND) do |span|
|
|
43
|
-
span.service = pin.service
|
|
44
|
-
span.span_type = Datadog::Contrib::Redis::Ext::TYPE
|
|
45
|
-
span.resource = get_command(args)
|
|
46
|
-
Datadog::Contrib::Redis::Tags.set_common_tags(self, span)
|
|
47
|
-
|
|
48
|
-
response = call_without_datadog(*args, &block)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
response
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
alias_method :call_pipeline_without_datadog, :call_pipeline
|
|
55
|
-
remove_method :call_pipeline
|
|
56
|
-
def call_pipeline(*args, &block)
|
|
57
|
-
pin = Datadog::Pin.get_from(self)
|
|
58
|
-
return call_pipeline_without_datadog(*args, &block) unless pin && pin.tracer
|
|
59
|
-
|
|
60
|
-
response = nil
|
|
61
|
-
pin.tracer.trace(Datadog::Contrib::Redis::Ext::SPAN_COMMAND) do |span|
|
|
62
|
-
span.service = pin.service
|
|
63
|
-
span.span_type = Datadog::Contrib::Redis::Ext::TYPE
|
|
64
|
-
commands = get_pipeline_commands(args)
|
|
65
|
-
span.resource = commands.join("\n")
|
|
66
|
-
span.set_metric Datadog::Contrib::Redis::Ext::METRIC_PIPELINE_LEN, commands.length
|
|
67
|
-
Datadog::Contrib::Redis::Tags.set_common_tags(self, span)
|
|
68
|
-
|
|
69
|
-
response = call_pipeline_without_datadog(*args, &block)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
response
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def datadog_pin
|
|
76
|
-
@datadog_pin ||= begin
|
|
77
|
-
pin = Datadog::Pin.new(
|
|
78
|
-
datadog_configuration[:service_name],
|
|
79
|
-
app: Ext::APP,
|
|
80
|
-
app_type: Datadog::Ext::AppTypes::DB,
|
|
81
|
-
tracer: -> { datadog_configuration[:tracer] }
|
|
82
|
-
)
|
|
83
|
-
pin.onto(self)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
private
|
|
88
|
-
|
|
89
|
-
def get_command(args)
|
|
90
|
-
if datadog_configuration[:command_args]
|
|
91
|
-
Datadog::Contrib::Redis::Quantize.format_command_args(*args)
|
|
92
|
-
else
|
|
93
|
-
Datadog::Contrib::Redis::Quantize.get_verb(*args)
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def get_pipeline_commands(args)
|
|
98
|
-
if datadog_configuration[:command_args]
|
|
99
|
-
args[0].commands.map { |c| Datadog::Contrib::Redis::Quantize.format_command_args(c) }
|
|
100
|
-
else
|
|
101
|
-
args[0].commands.map { |c| Datadog::Contrib::Redis::Quantize.get_verb(c) }
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def datadog_configuration
|
|
106
|
-
Datadog.configuration[:redis, options]
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
# rubocop:enable Metrics/MethodLength
|
|
111
|
-
# rubocop:enable Metrics/BlockLength
|
|
112
30
|
end
|
|
113
31
|
end
|
|
114
32
|
end
|
|
@@ -11,8 +11,6 @@ module Datadog
|
|
|
11
11
|
include Contrib::Integration
|
|
12
12
|
|
|
13
13
|
MINIMUM_VERSION = Gem::Version.new('1.0')
|
|
14
|
-
# Maximum is first version it's NOT compatible with (not inclusive)
|
|
15
|
-
MAXIMUM_VERSION = Gem::Version.new('3.0')
|
|
16
14
|
|
|
17
15
|
register_as :resque, auto_patch: true
|
|
18
16
|
|
|
@@ -25,9 +23,7 @@ module Datadog
|
|
|
25
23
|
end
|
|
26
24
|
|
|
27
25
|
def self.compatible?
|
|
28
|
-
super
|
|
29
|
-
&& version >= MINIMUM_VERSION \
|
|
30
|
-
&& version < MAXIMUM_VERSION
|
|
26
|
+
super && version >= MINIMUM_VERSION
|
|
31
27
|
end
|
|
32
28
|
|
|
33
29
|
def default_configuration
|
|
@@ -15,6 +15,9 @@ module Datadog
|
|
|
15
15
|
SERVICE_NAME = 'sidekiq'.freeze
|
|
16
16
|
SPAN_PUSH = 'sidekiq.push'.freeze
|
|
17
17
|
SPAN_JOB = 'sidekiq.job'.freeze
|
|
18
|
+
SPAN_JOB_FETCH = 'sidekiq.job_fetch'.freeze
|
|
19
|
+
SPAN_HEARTBEAT = 'sidekiq.heartbeat'.freeze
|
|
20
|
+
SPAN_SCHEDULED_PUSH = 'sidekiq.scheduled_push'.freeze
|
|
18
21
|
TAG_JOB_DELAY = 'sidekiq.job.delay'.freeze
|
|
19
22
|
TAG_JOB_ID = 'sidekiq.job.id'.freeze
|
|
20
23
|
TAG_JOB_QUEUE = 'sidekiq.job.queue'.freeze
|
|
@@ -11,6 +11,7 @@ module Datadog
|
|
|
11
11
|
include Contrib::Integration
|
|
12
12
|
|
|
13
13
|
MINIMUM_VERSION = Gem::Version.new('3.5.4')
|
|
14
|
+
MINIMUM_SERVER_INTERNAL_TRACING_VERSION = Gem::Version.new('5.2.4')
|
|
14
15
|
|
|
15
16
|
register_as :sidekiq
|
|
16
17
|
|
|
@@ -26,6 +27,15 @@ module Datadog
|
|
|
26
27
|
super && version >= MINIMUM_VERSION
|
|
27
28
|
end
|
|
28
29
|
|
|
30
|
+
# Only patch server internals on v5.2.4+ because that's when loading of
|
|
31
|
+
# `Sidekiq::Launcher` stabilized. Sidekiq 4+ technically can support our
|
|
32
|
+
# patches (with minor adjustments), but in order to avoid explicitly
|
|
33
|
+
# requiring `sidekiq/launcher` ourselves (which could affect gem
|
|
34
|
+
# initialization order), we are limiting this tracing to v5.2.4+.
|
|
35
|
+
def self.compatible_with_server_internal_tracing?
|
|
36
|
+
version >= MINIMUM_SERVER_INTERNAL_TRACING_VERSION
|
|
37
|
+
end
|
|
38
|
+
|
|
29
39
|
def default_configuration
|
|
30
40
|
Configuration::Settings.new
|
|
31
41
|
end
|
|
@@ -34,8 +34,34 @@ module Datadog
|
|
|
34
34
|
config.server_middleware do |chain|
|
|
35
35
|
chain.add(Sidekiq::ServerTracer)
|
|
36
36
|
end
|
|
37
|
+
|
|
38
|
+
patch_server_internals if Integration.compatible_with_server_internal_tracing?
|
|
37
39
|
end
|
|
38
40
|
end
|
|
41
|
+
|
|
42
|
+
def patch_server_internals
|
|
43
|
+
patch_server_heartbeat
|
|
44
|
+
patch_server_job_fetch
|
|
45
|
+
patch_server_scheduled_push
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def patch_server_heartbeat
|
|
49
|
+
require 'ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat'
|
|
50
|
+
|
|
51
|
+
::Sidekiq::Launcher.prepend(ServerInternalTracer::Heartbeat)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def patch_server_job_fetch
|
|
55
|
+
require 'ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch'
|
|
56
|
+
|
|
57
|
+
::Sidekiq::Processor.prepend(ServerInternalTracer::JobFetch)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def patch_server_scheduled_push
|
|
61
|
+
require 'ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push'
|
|
62
|
+
|
|
63
|
+
::Sidekiq::Scheduled::Poller.prepend(ServerInternalTracer::ScheduledPush)
|
|
64
|
+
end
|
|
39
65
|
end
|
|
40
66
|
end
|
|
41
67
|
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module Sidekiq
|
|
6
|
+
module ServerInternalTracer
|
|
7
|
+
# Trace when a Sidekiq process has a heartbeat
|
|
8
|
+
module Heartbeat
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def ❤ # rubocop:disable Naming/AsciiIdentifiers, Naming/MethodName
|
|
12
|
+
configuration = Datadog.configuration[:sidekiq]
|
|
13
|
+
|
|
14
|
+
configuration[:tracer].trace(Ext::SPAN_HEARTBEAT) do |span|
|
|
15
|
+
span.service = configuration[:service_name]
|
|
16
|
+
span.span_type = Datadog::Ext::AppTypes::WORKER
|
|
17
|
+
|
|
18
|
+
# Set analytics sample rate
|
|
19
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
20
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module Sidekiq
|
|
6
|
+
module ServerInternalTracer
|
|
7
|
+
# Trace when Sidekiq looks for another job to work
|
|
8
|
+
module JobFetch
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def fetch
|
|
12
|
+
configuration = Datadog.configuration[:sidekiq]
|
|
13
|
+
|
|
14
|
+
configuration[:tracer].trace(Ext::SPAN_JOB_FETCH) do |span|
|
|
15
|
+
span.service = configuration[:service_name]
|
|
16
|
+
span.span_type = Datadog::Ext::AppTypes::WORKER
|
|
17
|
+
|
|
18
|
+
# Set analytics sample rate
|
|
19
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
20
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module Sidekiq
|
|
6
|
+
module ServerInternalTracer
|
|
7
|
+
# Trace when Sidekiq checks to see if there are scheduled jobs that need to be worked
|
|
8
|
+
# https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs
|
|
9
|
+
module ScheduledPush
|
|
10
|
+
def enqueue
|
|
11
|
+
configuration = Datadog.configuration[:sidekiq]
|
|
12
|
+
|
|
13
|
+
configuration[:tracer].trace(Ext::SPAN_SCHEDULED_PUSH) do |span|
|
|
14
|
+
span.service = configuration[:service_name]
|
|
15
|
+
span.span_type = Datadog::Ext::AppTypes::WORKER
|
|
16
|
+
|
|
17
|
+
# Set analytics sample rate
|
|
18
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
19
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -5,7 +5,7 @@ require 'ddtrace/ext/app_types'
|
|
|
5
5
|
require 'ddtrace/ext/errors'
|
|
6
6
|
require 'ddtrace/ext/http'
|
|
7
7
|
require 'ddtrace/propagation/http_propagator'
|
|
8
|
-
|
|
8
|
+
require 'ddtrace/utils/only_once'
|
|
9
9
|
require 'ddtrace/contrib/sinatra/ext'
|
|
10
10
|
require 'ddtrace/contrib/sinatra/tracer_middleware'
|
|
11
11
|
require 'ddtrace/contrib/sinatra/env'
|
|
@@ -77,6 +77,9 @@ module Datadog
|
|
|
77
77
|
|
|
78
78
|
# Method overrides for Sinatra::Base
|
|
79
79
|
module Base
|
|
80
|
+
MISSING_REQUEST_SPAN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
|
|
81
|
+
private_constant :MISSING_REQUEST_SPAN_ONLY_ONCE
|
|
82
|
+
|
|
80
83
|
def render(engine, data, *)
|
|
81
84
|
tracer = Datadog.configuration[:sinatra][:tracer]
|
|
82
85
|
return super unless tracer.enabled
|
|
@@ -121,8 +124,18 @@ module Datadog
|
|
|
121
124
|
else
|
|
122
125
|
Sinatra::Env.datadog_span(env, self.class)
|
|
123
126
|
end
|
|
124
|
-
if sinatra_request_span
|
|
127
|
+
if sinatra_request_span
|
|
125
128
|
sinatra_request_span.resource = span.resource
|
|
129
|
+
else
|
|
130
|
+
MISSING_REQUEST_SPAN_ONLY_ONCE.run do
|
|
131
|
+
Datadog.logger.warn do
|
|
132
|
+
'Sinatra integration is misconfigured, reported traces will be missing request metadata ' \
|
|
133
|
+
'such as path and HTTP status code. ' \
|
|
134
|
+
'Did you forget to add `register Datadog::Contrib::Sinatra::Tracer` to your ' \
|
|
135
|
+
'`Sinatra::Base` subclass? ' \
|
|
136
|
+
'See <https://docs.datadoghq.com/tracing/setup_overview/setup/ruby/#sinatra> for more details.'
|
|
137
|
+
end
|
|
138
|
+
end
|
|
126
139
|
end
|
|
127
140
|
|
|
128
141
|
Contrib::Analytics.set_measured(span)
|
data/lib/ddtrace/ext/git.rb
CHANGED
|
@@ -15,6 +15,18 @@ module Datadog
|
|
|
15
15
|
TAG_COMMIT_COMMITTER_NAME = 'git.commit.committer.name'.freeze
|
|
16
16
|
TAG_COMMIT_MESSAGE = 'git.commit.message'.freeze
|
|
17
17
|
TAG_COMMIT_SHA = 'git.commit.sha'.freeze
|
|
18
|
+
|
|
19
|
+
ENV_REPOSITORY_URL = 'DD_GIT_REPOSITORY_URL'.freeze
|
|
20
|
+
ENV_COMMIT_SHA = 'DD_GIT_COMMIT_SHA'.freeze
|
|
21
|
+
ENV_BRANCH = 'DD_GIT_BRANCH'.freeze
|
|
22
|
+
ENV_TAG = 'DD_GIT_TAG'.freeze
|
|
23
|
+
ENV_COMMIT_MESSAGE = 'DD_GIT_COMMIT_MESSAGE'.freeze
|
|
24
|
+
ENV_COMMIT_AUTHOR_NAME = 'DD_GIT_COMMIT_AUTHOR_NAME'.freeze
|
|
25
|
+
ENV_COMMIT_AUTHOR_EMAIL = 'DD_GIT_COMMIT_AUTHOR_EMAIL'.freeze
|
|
26
|
+
ENV_COMMIT_AUTHOR_DATE = 'DD_GIT_COMMIT_AUTHOR_DATE'.freeze
|
|
27
|
+
ENV_COMMIT_COMMITTER_NAME = 'DD_GIT_COMMIT_COMMITTER_NAME'.freeze
|
|
28
|
+
ENV_COMMIT_COMMITTER_EMAIL = 'DD_GIT_COMMIT_COMMITTER_EMAIL'.freeze
|
|
29
|
+
ENV_COMMIT_COMMITTER_DATE = 'DD_GIT_COMMIT_COMMITTER_DATE'.freeze
|
|
18
30
|
end
|
|
19
31
|
end
|
|
20
32
|
end
|