ddtrace 0.37.0 → 0.42.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 +56 -0
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +1 -0
- data/.simplecov +38 -0
- data/Appraisals +186 -11
- data/CHANGELOG.md +188 -1
- data/CONTRIBUTING.md +1 -1
- data/Rakefile +518 -482
- data/ddtrace.gemspec +3 -0
- data/docker-compose.yml +2 -2
- data/docs/DevelopmentGuide.md +26 -0
- data/docs/GettingStarted.md +188 -78
- data/lib/ddtrace.rb +4 -0
- data/lib/ddtrace/buffer.rb +259 -52
- data/lib/ddtrace/configuration.rb +39 -5
- data/lib/ddtrace/configuration/components.rb +4 -7
- data/lib/ddtrace/configuration/options.rb +3 -1
- data/lib/ddtrace/configuration/settings.rb +32 -4
- data/lib/ddtrace/context_provider.rb +6 -5
- 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/events/sql.rb +4 -0
- data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
- 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/subscription.rb +3 -3
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/aws/ext.rb +5 -2
- data/lib/ddtrace/contrib/aws/instrumentation.rb +4 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +1 -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/instrumentation.rb +4 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +8 -2
- data/lib/ddtrace/contrib/delayed_job/ext.rb +7 -2
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +37 -15
- 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 +4 -0
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
- data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/excon/ext.rb +5 -2
- data/lib/ddtrace/contrib/excon/middleware.rb +4 -0
- data/lib/ddtrace/contrib/extensions.rb +11 -1
- 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 +9 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +12 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/grape/endpoint.rb +6 -4
- data/lib/ddtrace/contrib/grape/ext.rb +5 -2
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +6 -4
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
- data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
- 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 +4 -0
- 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 +163 -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/subscribers.rb +4 -0
- 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 +4 -0
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/presto/ext.rb +5 -2
- data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
- 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/event.rb +4 -0
- 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 +12 -2
- data/lib/ddtrace/contrib/rails/ext.rb +6 -2
- 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 +26 -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/tags.rb +4 -0
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/resque/ext.rb +5 -2
- data/lib/ddtrace/contrib/resque/integration.rb +1 -1
- 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 +6 -2
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sequel/database.rb +3 -1
- data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
- data/lib/ddtrace/contrib/sequel/ext.rb +6 -2
- data/lib/ddtrace/contrib/sequel/utils.rb +35 -6
- 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/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/integration.rb +8 -0
- data/lib/ddtrace/ext/runtime.rb +1 -0
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/logger.rb +1 -1
- data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
- data/lib/ddtrace/runtime/metrics.rb +24 -6
- data/lib/ddtrace/sampler.rb +4 -2
- data/lib/ddtrace/span.rb +162 -27
- data/lib/ddtrace/tracer.rb +24 -18
- data/lib/ddtrace/transport/http.rb +15 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +16 -2
- 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/http/statistics.rb +14 -1
- data/lib/ddtrace/transport/response.rb +11 -0
- data/lib/ddtrace/transport/traces.rb +7 -2
- data/lib/ddtrace/utils.rb +7 -3
- data/lib/ddtrace/version.rb +1 -1
- 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 +81 -2
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/que/tracer'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Que
|
|
8
|
+
# Patcher enables patching of 'que' 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
|
+
::Que.job_middleware.push(Que::Tracer.new)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/contrib/analytics'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Que
|
|
8
|
+
# Tracer is a Que's server-side middleware which traces executed jobs
|
|
9
|
+
class Tracer
|
|
10
|
+
def call(job)
|
|
11
|
+
trace_options = {
|
|
12
|
+
service: configuration[:service_name],
|
|
13
|
+
span_type: Datadog::Ext::AppTypes::WORKER
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
tracer.trace(Ext::SPAN_JOB, trace_options) do |request_span|
|
|
17
|
+
request_span.resource = job.class.name.to_s
|
|
18
|
+
request_span.set_tag(Ext::TAG_JOB_QUEUE, job.que_attrs[:queue])
|
|
19
|
+
request_span.set_tag(Ext::TAG_JOB_ID, job.que_attrs[:id])
|
|
20
|
+
request_span.set_tag(Ext::TAG_JOB_PRIORITY, job.que_attrs[:priority])
|
|
21
|
+
request_span.set_tag(Ext::TAG_JOB_ERROR_COUNT, job.que_attrs[:error_count])
|
|
22
|
+
request_span.set_tag(Ext::TAG_JOB_RUN_AT, job.que_attrs[:run_at])
|
|
23
|
+
request_span.set_tag(Ext::TAG_JOB_EXPIRED_AT, job.que_attrs[:expired_at])
|
|
24
|
+
request_span.set_tag(Ext::TAG_JOB_FINISHED_AT, job.que_attrs[:finished_at])
|
|
25
|
+
request_span.set_tag(Ext::TAG_JOB_ARGS, job.que_attrs[:args]) if configuration[:tag_args]
|
|
26
|
+
request_span.set_tag(Ext::TAG_JOB_DATA, job.que_attrs[:data]) if configuration[:tag_data]
|
|
27
|
+
|
|
28
|
+
set_sample_rate(request_span)
|
|
29
|
+
Contrib::Analytics.set_measured(request_span)
|
|
30
|
+
|
|
31
|
+
yield
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def set_sample_rate(request_span)
|
|
38
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
39
|
+
Contrib::Analytics.set_sample_rate(
|
|
40
|
+
request_span,
|
|
41
|
+
configuration[:analytics_sample_rate]
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def tracer
|
|
47
|
+
configuration[:tracer]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def configuration
|
|
51
|
+
Datadog.configuration[Datadog::Contrib::Que::Ext::APP.to_sym]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -7,13 +7,18 @@ module Datadog
|
|
|
7
7
|
module Configuration
|
|
8
8
|
# Custom settings for the Racecar integration
|
|
9
9
|
class Settings < Contrib::Configuration::Settings
|
|
10
|
+
option :enabled do |o|
|
|
11
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
12
|
+
o.lazy
|
|
13
|
+
end
|
|
14
|
+
|
|
10
15
|
option :analytics_enabled do |o|
|
|
11
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
|
|
16
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
|
|
12
17
|
o.lazy
|
|
13
18
|
end
|
|
14
19
|
|
|
15
20
|
option :analytics_sample_rate do |o|
|
|
16
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
21
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
17
22
|
o.lazy
|
|
18
23
|
end
|
|
19
24
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/contrib/analytics'
|
|
2
2
|
require 'ddtrace/contrib/active_support/notifications/event'
|
|
3
3
|
require 'ddtrace/contrib/racecar/ext'
|
|
4
|
+
require 'ddtrace/ext/integration'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module Contrib
|
|
@@ -37,6 +38,9 @@ module Datadog
|
|
|
37
38
|
span.service = configuration[:service_name]
|
|
38
39
|
span.resource = payload[:consumer_class]
|
|
39
40
|
|
|
41
|
+
# Tag as an external peer service
|
|
42
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
43
|
+
|
|
40
44
|
# Set analytics sample rate
|
|
41
45
|
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
42
46
|
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'ddtrace/contrib/racecar/events/batch'
|
|
2
2
|
require 'ddtrace/contrib/racecar/events/message'
|
|
3
|
+
require 'ddtrace/contrib/racecar/events/consume'
|
|
3
4
|
|
|
4
5
|
module Datadog
|
|
5
6
|
module Contrib
|
|
@@ -7,6 +8,7 @@ module Datadog
|
|
|
7
8
|
# Defines collection of instrumented Racecar events
|
|
8
9
|
module Events
|
|
9
10
|
ALL = [
|
|
11
|
+
Events::Consume,
|
|
10
12
|
Events::Batch,
|
|
11
13
|
Events::Message
|
|
12
14
|
].freeze
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'ddtrace/contrib/racecar/ext'
|
|
2
|
+
require 'ddtrace/contrib/racecar/event'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module Racecar
|
|
7
|
+
module Events
|
|
8
|
+
# Defines instrumentation for main_loop.racecar event
|
|
9
|
+
module Consume
|
|
10
|
+
include Racecar::Event
|
|
11
|
+
|
|
12
|
+
EVENT_NAME = 'main_loop.racecar'.freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def event_name
|
|
17
|
+
self::EVENT_NAME
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def span_name
|
|
21
|
+
Ext::SPAN_CONSUME
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -4,9 +4,13 @@ module Datadog
|
|
|
4
4
|
# Racecar integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'racecar'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_RACECAR_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACECAR_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_RACECAR_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACECAR_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RACECAR_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
SERVICE_NAME = 'racecar'.freeze
|
|
13
|
+
SPAN_CONSUME = 'racecar.consume'.freeze
|
|
10
14
|
SPAN_BATCH = 'racecar.batch'.freeze
|
|
11
15
|
SPAN_MESSAGE = 'racecar.message'.freeze
|
|
12
16
|
TAG_CONSUMER = 'kafka.consumer'.freeze
|
|
@@ -14,13 +14,18 @@ module Datadog
|
|
|
14
14
|
]
|
|
15
15
|
}.freeze
|
|
16
16
|
|
|
17
|
+
option :enabled do |o|
|
|
18
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
19
|
+
o.lazy
|
|
20
|
+
end
|
|
21
|
+
|
|
17
22
|
option :analytics_enabled do |o|
|
|
18
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
23
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
19
24
|
o.lazy
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
option :analytics_sample_rate do |o|
|
|
23
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
28
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
24
29
|
o.lazy
|
|
25
30
|
end
|
|
26
31
|
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# Rack integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'rack'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_RACK_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACK_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_RACK_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACK_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RACK_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
RACK_ENV_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
|
|
10
13
|
SERVICE_NAME = 'rack'.freeze
|
|
11
14
|
SPAN_HTTP_SERVER_QUEUE = 'http_server.queue'.freeze
|
|
@@ -4,6 +4,8 @@ require 'ddtrace/propagation/http_propagator'
|
|
|
4
4
|
require 'ddtrace/contrib/analytics'
|
|
5
5
|
require 'ddtrace/contrib/rack/ext'
|
|
6
6
|
require 'ddtrace/contrib/rack/request_queue'
|
|
7
|
+
require 'ddtrace/environment'
|
|
8
|
+
require 'date'
|
|
7
9
|
|
|
8
10
|
module Datadog
|
|
9
11
|
module Contrib
|
|
@@ -98,23 +100,26 @@ module Datadog
|
|
|
98
100
|
request_span.set_error(e) unless request_span.nil?
|
|
99
101
|
raise e
|
|
100
102
|
ensure
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
103
|
+
if request_span
|
|
104
|
+
# Rack is a really low level interface and it doesn't provide any
|
|
105
|
+
# advanced functionality like routers. Because of that, we assume that
|
|
106
|
+
# the underlying framework or application has more knowledge about
|
|
107
|
+
# the result for this request; `resource` and `tags` are expected to
|
|
108
|
+
# be set in another level but if they're missing, reasonable defaults
|
|
109
|
+
# are used.
|
|
110
|
+
set_request_tags!(request_span, env, status, headers, response, original_env || env)
|
|
111
|
+
|
|
112
|
+
# ensure the request_span is finished and the context reset;
|
|
113
|
+
# this assumes that the Rack middleware creates a root span
|
|
114
|
+
request_span.finish
|
|
115
|
+
end
|
|
116
|
+
|
|
112
117
|
frontend_span.finish unless frontend_span.nil?
|
|
113
118
|
|
|
114
119
|
# TODO: Remove this once we change how context propagation works. This
|
|
115
120
|
# ensures we clean thread-local variables on each HTTP request avoiding
|
|
116
121
|
# memory leaks.
|
|
117
|
-
tracer.provider.context = Datadog::Context.new
|
|
122
|
+
tracer.provider.context = Datadog::Context.new if tracer
|
|
118
123
|
end
|
|
119
124
|
|
|
120
125
|
def resource_name_for(env, status)
|
|
@@ -19,8 +19,13 @@ module Datadog
|
|
|
19
19
|
analytics_sample_rate
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
option :enabled do |o|
|
|
23
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
24
|
+
o.lazy
|
|
25
|
+
end
|
|
26
|
+
|
|
22
27
|
option :analytics_enabled do |o|
|
|
23
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
28
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
24
29
|
o.lazy
|
|
25
30
|
o.on_set do |value|
|
|
26
31
|
# Update ActionPack analytics too
|
|
@@ -29,7 +34,7 @@ module Datadog
|
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
option :analytics_sample_rate do |o|
|
|
32
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
37
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
33
38
|
o.lazy
|
|
34
39
|
o.on_set do |value|
|
|
35
40
|
# Update ActionPack analytics too
|
|
@@ -76,6 +81,11 @@ module Datadog
|
|
|
76
81
|
Datadog.configuration[:action_view][:template_base_path] = value
|
|
77
82
|
end
|
|
78
83
|
end
|
|
84
|
+
|
|
85
|
+
option :log_injection do |o|
|
|
86
|
+
o.default { env_to_bool(Ext::ENV_LOGS_INJECTION_ENABLED, false) }
|
|
87
|
+
o.lazy
|
|
88
|
+
end
|
|
79
89
|
end
|
|
80
90
|
end
|
|
81
91
|
end
|
|
@@ -4,9 +4,13 @@ module Datadog
|
|
|
4
4
|
# Rails integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'rails'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_RAILS_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_RAILS_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
ENV_DISABLE = 'DISABLE_DATADOG_RAILS'.freeze
|
|
13
|
+
ENV_LOGS_INJECTION_ENABLED = 'DD_LOGS_INJECTION'.freeze
|
|
10
14
|
end
|
|
11
15
|
end
|
|
12
16
|
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Contrib
|
|
3
|
+
# Instrument Rails.
|
|
4
|
+
module Rails
|
|
5
|
+
# Rails log injection helper methods
|
|
6
|
+
module LogInjection
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
def add_lograge_logger(app)
|
|
10
|
+
# custom_options defaults to nil and can be either a hash or a lambda which returns a hash
|
|
11
|
+
# https://github.com/roidrage/lograge/blob/1729eab7956bb95c5992e4adab251e4f93ff9280/lib/lograge.rb#L28
|
|
12
|
+
if (custom_options = app.config.lograge.custom_options).nil?
|
|
13
|
+
# if it's not set, we set to a lambda that returns DD tracing context
|
|
14
|
+
app.config.lograge.custom_options = lambda do |_event|
|
|
15
|
+
# Retrieves trace information for current thread
|
|
16
|
+
correlation = Datadog.tracer.active_correlation
|
|
17
|
+
|
|
18
|
+
datadog_trace_log_hash(correlation)
|
|
19
|
+
end
|
|
20
|
+
# check if lambda, if so then define a new lambda which invokes the original lambda and
|
|
21
|
+
# merges the returned hash with the the DD tracing context hash.
|
|
22
|
+
elsif custom_options.respond_to?(:call)
|
|
23
|
+
app.config.lograge.custom_options = lambda do |event|
|
|
24
|
+
# invoke original lambda
|
|
25
|
+
result = custom_options.call(event)
|
|
26
|
+
# Retrieves trace information for current thread
|
|
27
|
+
correlation = Datadog.tracer.active_correlation
|
|
28
|
+
# merge original lambda with datadog context
|
|
29
|
+
result.merge(datadog_trace_log_hash(correlation))
|
|
30
|
+
end
|
|
31
|
+
# otherwise if it's just a static hash, we have to wrap that hash in a lambda to retrieve
|
|
32
|
+
# the DD tracing context, then merge the tracing context with the original static hash.
|
|
33
|
+
# don't modify if custom_options is not an accepted format.
|
|
34
|
+
elsif custom_options.is_a?(Hash)
|
|
35
|
+
app.config.lograge.custom_options = lambda do |_event|
|
|
36
|
+
# Retrieves trace information for current thread
|
|
37
|
+
correlation = Datadog.tracer.active_correlation
|
|
38
|
+
|
|
39
|
+
# merge original lambda with datadog context
|
|
40
|
+
custom_options.merge(datadog_trace_log_hash(correlation))
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
rescue StandardError => e
|
|
44
|
+
# TODO: can we use Datadog.logger at this point?
|
|
45
|
+
Datadog.logger.warn("Unable to add Datadog Trace context to Lograge: #{e.message}")
|
|
46
|
+
false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_as_tagged_logging_logger(app)
|
|
50
|
+
# we want to check if the current logger is a tagger logger instance
|
|
51
|
+
# log_tags defaults to nil so we have to set as an array if nothing exists yet
|
|
52
|
+
if (log_tags = app.config.log_tags).nil?
|
|
53
|
+
app.config.log_tags = [proc { Datadog.tracer.active_correlation.to_s }]
|
|
54
|
+
# if existing log_tags configuration exists, append to the end of the array
|
|
55
|
+
elsif log_tags.is_a?(Array)
|
|
56
|
+
app.config.log_tags << proc { Datadog.tracer.active_correlation.to_s }
|
|
57
|
+
end
|
|
58
|
+
rescue StandardError => e
|
|
59
|
+
# TODO: can we use Datadog.logger at this point?
|
|
60
|
+
Datadog.logger.warn("Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.message}")
|
|
61
|
+
false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def datadog_trace_log_hash(correlation)
|
|
65
|
+
{
|
|
66
|
+
# Adds IDs as tags to log output
|
|
67
|
+
dd: {
|
|
68
|
+
# To preserve precision during JSON serialization, use strings for large numbers
|
|
69
|
+
trace_id: correlation.trace_id.to_s,
|
|
70
|
+
span_id: correlation.span_id.to_s,
|
|
71
|
+
env: correlation.env.to_s,
|
|
72
|
+
service: correlation.service.to_s,
|
|
73
|
+
version: correlation.version.to_s
|
|
74
|
+
},
|
|
75
|
+
ddsource: ['ruby']
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -24,11 +24,16 @@ module Datadog
|
|
|
24
24
|
rescue Exception => e
|
|
25
25
|
tracer = Datadog.configuration[:rails][:tracer]
|
|
26
26
|
span = tracer.active_span
|
|
27
|
-
|
|
27
|
+
if !span.nil? && ActionPack::Utils.exception_is_error?(e)
|
|
28
28
|
# Only set error if it's supposed to be flagged as such
|
|
29
29
|
# e.g. we don't want to flag 404s.
|
|
30
30
|
# You can add custom errors via `config.action_dispatch.rescue_responses`
|
|
31
|
-
span.set_error(e)
|
|
31
|
+
span.set_error(e)
|
|
32
|
+
|
|
33
|
+
# Some exception gets handled by Rails middleware before it can be set on Rack middleware
|
|
34
|
+
# The rack span is the root span of the request and should make sure it has the full exception
|
|
35
|
+
# set on it.
|
|
36
|
+
env[:datadog_rack_request_span].set_error(e) if env[:datadog_rack_request_span]
|
|
32
37
|
end
|
|
33
38
|
raise e
|
|
34
39
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/contrib/rails/utils'
|
|
2
2
|
require 'ddtrace/contrib/rails/framework'
|
|
3
3
|
require 'ddtrace/contrib/rails/middlewares'
|
|
4
|
+
require 'ddtrace/contrib/rails/log_injection'
|
|
4
5
|
require 'ddtrace/contrib/rack/middlewares'
|
|
5
6
|
|
|
6
7
|
module Datadog
|
|
@@ -33,6 +34,7 @@ module Datadog
|
|
|
33
34
|
# Otherwise the middleware stack will be frozen.
|
|
34
35
|
# Sometimes we don't want to activate middleware e.g. OpenTracing, etc.
|
|
35
36
|
add_middleware(app) if Datadog.configuration[:rails][:middleware]
|
|
37
|
+
add_logger(app) if Datadog.configuration[:rails][:log_injection]
|
|
36
38
|
end
|
|
37
39
|
end
|
|
38
40
|
|
|
@@ -50,6 +52,30 @@ module Datadog
|
|
|
50
52
|
)
|
|
51
53
|
end
|
|
52
54
|
|
|
55
|
+
def add_logger(app)
|
|
56
|
+
# check if lograge key exists
|
|
57
|
+
# Note: Rails executes initializers sequentially based on alphabetical order,
|
|
58
|
+
# and lograge config could occur after dd config.
|
|
59
|
+
# Checking for `app.config.lograge.enabled` may yield a false negative.
|
|
60
|
+
# Instead we should naively add custom options if `config.lograge` exists from the lograge Railtie,
|
|
61
|
+
# since the custom options get ignored without lograge explicitly being enabled.
|
|
62
|
+
# See: https://github.com/roidrage/lograge/blob/1729eab7956bb95c5992e4adab251e4f93ff9280/lib/lograge/railtie.rb#L7-L12
|
|
63
|
+
if app.config.respond_to?(:lograge)
|
|
64
|
+
Datadog::Contrib::Rails::LogInjection.add_lograge_logger(app)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# if lograge isn't set, check if tagged logged is enabled.
|
|
68
|
+
# if so, add proc that injects trace identifiers for tagged logging.
|
|
69
|
+
if (logger = app.config.logger) &&
|
|
70
|
+
defined?(::ActiveSupport::TaggedLogging) &&
|
|
71
|
+
logger.is_a?(::ActiveSupport::TaggedLogging)
|
|
72
|
+
|
|
73
|
+
Datadog::Contrib::Rails::LogInjection.add_as_tagged_logging_logger(app)
|
|
74
|
+
else
|
|
75
|
+
Datadog.logger.warn("Unable to enable Datadog Trace context, Logger #{logger} is not supported")
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
53
79
|
def patch_after_intialize
|
|
54
80
|
::ActiveSupport.on_load(:after_initialize) do
|
|
55
81
|
Datadog::Contrib::Rails::Patcher.after_intialize(self)
|