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
|
@@ -16,7 +16,7 @@ module Datadog
|
|
|
16
16
|
|
|
17
17
|
def initialize(app, options = {})
|
|
18
18
|
super(app)
|
|
19
|
-
@options =
|
|
19
|
+
@options = options
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def call(env)
|
|
@@ -33,7 +33,7 @@ module Datadog
|
|
|
33
33
|
|
|
34
34
|
private
|
|
35
35
|
|
|
36
|
-
attr_reader :app
|
|
36
|
+
attr_reader :app
|
|
37
37
|
|
|
38
38
|
def annotate!(span, env, options)
|
|
39
39
|
span.resource = resource_name(env)
|
|
@@ -69,7 +69,9 @@ module Datadog
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def build_request_options!(env)
|
|
72
|
-
datadog_configuration
|
|
72
|
+
datadog_configuration.options_hash # integration level settings
|
|
73
|
+
.merge(datadog_configuration(env[:url].host).options_hash) # per-host override
|
|
74
|
+
.merge(@options) # middleware instance override
|
|
73
75
|
end
|
|
74
76
|
|
|
75
77
|
def datadog_configuration(host = :default)
|
|
@@ -31,7 +31,7 @@ module Datadog
|
|
|
31
31
|
get_option(:service_name),
|
|
32
32
|
app: Ext::APP,
|
|
33
33
|
app_type: Datadog::Ext::AppTypes::WEB,
|
|
34
|
-
tracer: get_option(:tracer)
|
|
34
|
+
tracer: -> { get_option(:tracer) }
|
|
35
35
|
).onto(::Faraday)
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -41,8 +41,20 @@ module Datadog
|
|
|
41
41
|
|
|
42
42
|
def add_default_middleware!
|
|
43
43
|
if target_version >= Gem::Version.new('1.0.0')
|
|
44
|
+
# Patch the default connection (e.g. +Faraday.get+)
|
|
45
|
+
::Faraday.default_connection.use(:ddtrace)
|
|
46
|
+
|
|
47
|
+
# Patch new connection instances (e.g. +Faraday.new+)
|
|
44
48
|
::Faraday::Connection.send(:prepend, Connection)
|
|
45
49
|
else
|
|
50
|
+
# Patch the default connection (e.g. +Faraday.get+)
|
|
51
|
+
#
|
|
52
|
+
# We insert our middleware before the 'adapter', which is
|
|
53
|
+
# always the last handler.
|
|
54
|
+
idx = ::Faraday.default_connection.builder.handlers.size - 1
|
|
55
|
+
::Faraday.default_connection.builder.insert(idx, Middleware)
|
|
56
|
+
|
|
57
|
+
# Patch new connection instances (e.g. +Faraday.new+)
|
|
46
58
|
::Faraday::RackBuilder.send(:prepend, RackBuilder)
|
|
47
59
|
end
|
|
48
60
|
end
|
|
@@ -61,10 +73,6 @@ module Datadog
|
|
|
61
73
|
Upgrade to the configuration API using the migration guide here:
|
|
62
74
|
https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
|
|
63
75
|
|
|
64
|
-
def tracer=(tracer)
|
|
65
|
-
Datadog.configuration[:faraday][:tracer] = tracer
|
|
66
|
-
end
|
|
67
|
-
|
|
68
76
|
def service_name=(service_name)
|
|
69
77
|
Datadog.configuration[:faraday][:service_name] = service_name
|
|
70
78
|
end
|
|
@@ -8,17 +8,21 @@ module Datadog
|
|
|
8
8
|
module Configuration
|
|
9
9
|
# Custom settings for the Grape integration
|
|
10
10
|
class Settings < Contrib::Configuration::Settings
|
|
11
|
+
option :enabled do |o|
|
|
12
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
13
|
+
o.lazy
|
|
14
|
+
end
|
|
15
|
+
|
|
11
16
|
option :analytics_enabled do |o|
|
|
12
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
17
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
13
18
|
o.lazy
|
|
14
19
|
end
|
|
15
20
|
|
|
16
21
|
option :analytics_sample_rate do |o|
|
|
17
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
22
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
18
23
|
o.lazy
|
|
19
24
|
end
|
|
20
25
|
|
|
21
|
-
option :enabled, default: true
|
|
22
26
|
option :service_name, default: Ext::SERVICE_NAME
|
|
23
27
|
end
|
|
24
28
|
end
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# Grape integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'grape'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_GRAPE_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRAPE_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_GRAPE_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRAPE_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRAPE_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
SERVICE_NAME = 'grape'.freeze
|
|
10
13
|
SPAN_ENDPOINT_RENDER = 'grape.endpoint_render'.freeze
|
|
11
14
|
SPAN_ENDPOINT_RUN = 'grape.endpoint_run'.freeze
|
|
@@ -8,13 +8,18 @@ module Datadog
|
|
|
8
8
|
module Configuration
|
|
9
9
|
# Custom settings for the GraphQL integration
|
|
10
10
|
class Settings < Contrib::Configuration::Settings
|
|
11
|
+
option :enabled do |o|
|
|
12
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
13
|
+
o.lazy
|
|
14
|
+
end
|
|
15
|
+
|
|
11
16
|
option :analytics_enabled do |o|
|
|
12
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
17
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
13
18
|
o.lazy
|
|
14
19
|
end
|
|
15
20
|
|
|
16
21
|
option :analytics_sample_rate do |o|
|
|
17
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
22
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
18
23
|
o.lazy
|
|
19
24
|
end
|
|
20
25
|
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# GraphQL integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'ruby-graphql'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_GRAPHQL_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRAPHQL_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_GRAPHQL_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRAPHQL_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRAPHQL_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
SERVICE_NAME = 'ruby-graphql'.freeze
|
|
10
13
|
end
|
|
11
14
|
end
|
|
@@ -22,7 +22,6 @@ module Datadog
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def patch_schema!(schema)
|
|
25
|
-
tracer = get_option(:tracer)
|
|
26
25
|
service_name = get_option(:service_name)
|
|
27
26
|
analytics_enabled = Contrib::Analytics.enabled?(get_option(:analytics_enabled))
|
|
28
27
|
analytics_sample_rate = get_option(:analytics_sample_rate)
|
|
@@ -30,7 +29,9 @@ module Datadog
|
|
|
30
29
|
if schema.respond_to?(:use)
|
|
31
30
|
schema.use(
|
|
32
31
|
::GraphQL::Tracing::DataDogTracing,
|
|
33
|
-
tracer
|
|
32
|
+
# By default, Tracing::DataDogTracing indirectly delegates the tracer instance
|
|
33
|
+
# to +Datadog.tracer+. If we provide a tracer argument here it will be eagerly cached,
|
|
34
|
+
# and Tracing::DataDogTracing will send traces to a stale tracer instance.
|
|
34
35
|
service: service_name,
|
|
35
36
|
analytics_enabled: analytics_enabled,
|
|
36
37
|
analytics_sample_rate: analytics_sample_rate
|
|
@@ -39,7 +40,9 @@ module Datadog
|
|
|
39
40
|
schema.define do
|
|
40
41
|
use(
|
|
41
42
|
::GraphQL::Tracing::DataDogTracing,
|
|
42
|
-
tracer
|
|
43
|
+
# By default, Tracing::DataDogTracing indirectly delegates the tracer instance
|
|
44
|
+
# to +Datadog.tracer+. If we provide a tracer argument here it will be eagerly cached,
|
|
45
|
+
# and Tracing::DataDogTracing will send traces to a stale tracer instance.
|
|
43
46
|
service: service_name,
|
|
44
47
|
analytics_enabled: analytics_enabled,
|
|
45
48
|
analytics_sample_rate: analytics_sample_rate
|
|
@@ -7,13 +7,18 @@ module Datadog
|
|
|
7
7
|
module Configuration
|
|
8
8
|
# Custom settings for the gRPC 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
|
|
|
@@ -30,9 +30,7 @@ module Datadog
|
|
|
30
30
|
private
|
|
31
31
|
|
|
32
32
|
def annotate!(span, metadata)
|
|
33
|
-
metadata
|
|
34
|
-
span.set_tag(header, value)
|
|
35
|
-
end
|
|
33
|
+
span.set_tags(metadata)
|
|
36
34
|
|
|
37
35
|
# Set analytics sample rate
|
|
38
36
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# gRPC integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'grpc'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_GRPC_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRPC_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_GRPC_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRPC_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRPC_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
SERVICE_NAME = 'grpc'.freeze
|
|
10
13
|
SPAN_CLIENT = 'grpc.client'.freeze
|
|
11
14
|
SPAN_SERVICE = 'grpc.service'.freeze
|
|
@@ -29,7 +29,7 @@ module Datadog
|
|
|
29
29
|
get_option(:service_name),
|
|
30
30
|
app: Ext::APP,
|
|
31
31
|
app_type: Datadog::Ext::AppTypes::WEB,
|
|
32
|
-
tracer: get_option(:tracer)
|
|
32
|
+
tracer: -> { get_option(:tracer) }
|
|
33
33
|
).onto(::GRPC)
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -52,10 +52,6 @@ module Datadog
|
|
|
52
52
|
Upgrade to the configuration API using the migration guide here:
|
|
53
53
|
https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
|
|
54
54
|
|
|
55
|
-
def tracer=(tracer)
|
|
56
|
-
Datadog.configuration[:grpc][:tracer] = tracer
|
|
57
|
-
end
|
|
58
|
-
|
|
59
55
|
def service_name=(service_name)
|
|
60
56
|
Datadog.configuration[:grpc][:service_name] = service_name
|
|
61
57
|
end
|
|
@@ -7,13 +7,18 @@ module Datadog
|
|
|
7
7
|
module Configuration
|
|
8
8
|
# Custom settings for the HTTP 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
|
|
|
@@ -4,8 +4,11 @@ module Datadog
|
|
|
4
4
|
# HTTP integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'net/http'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_HTTP_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTP_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTP_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
SERVICE_NAME = 'net/http'.freeze
|
|
10
13
|
SPAN_REQUEST = 'http.request'.freeze
|
|
11
14
|
end
|
|
@@ -111,9 +111,12 @@ module Datadog
|
|
|
111
111
|
service = config[:service_name]
|
|
112
112
|
tracer = config[:tracer]
|
|
113
113
|
|
|
114
|
-
@datadog_pin ||=
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
@datadog_pin ||= Datadog::Pin.new(
|
|
115
|
+
service,
|
|
116
|
+
app: Ext::APP,
|
|
117
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
118
|
+
tracer: -> { config[:tracer] }
|
|
119
|
+
)
|
|
117
120
|
|
|
118
121
|
# this shockingly poor code exists to solve the case where someone
|
|
119
122
|
# calls datadog_pin on this object before running a request, which
|
|
@@ -136,10 +139,12 @@ module Datadog
|
|
|
136
139
|
def default_datadog_pin
|
|
137
140
|
config = Datadog.configuration[:http]
|
|
138
141
|
service = config[:service_name]
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
@default_datadog_pin ||= Datadog::Pin.new(
|
|
143
|
+
service,
|
|
144
|
+
app: Ext::APP,
|
|
145
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
146
|
+
tracer: -> { config[:tracer] }
|
|
147
|
+
)
|
|
143
148
|
end
|
|
144
149
|
|
|
145
150
|
private
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
2
|
+
require 'ddtrace/contrib/httprb/ext'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module Httprb
|
|
7
|
+
module Configuration
|
|
8
|
+
# Custom settings for the Httprb integration
|
|
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
|
+
|
|
15
|
+
option :analytics_enabled do |o|
|
|
16
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
|
|
17
|
+
o.lazy
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
option :analytics_sample_rate do |o|
|
|
21
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
22
|
+
o.lazy
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
option :distributed_tracing, default: true
|
|
26
|
+
option :service_name, default: Ext::SERVICE_NAME
|
|
27
|
+
option :split_by_domain, default: false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Contrib
|
|
3
|
+
module Httprb
|
|
4
|
+
# Httprb integration constants
|
|
5
|
+
module Ext
|
|
6
|
+
APP = 'httprb'.freeze
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_HTTPRB_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPRB_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTPRB_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EHTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
|
|
12
|
+
SERVICE_NAME = 'httprb'.freeze
|
|
13
|
+
SPAN_REQUEST = 'httprb.request'.freeze
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
require 'ddtrace/ext/app_types'
|
|
2
|
+
require 'ddtrace/ext/http'
|
|
3
|
+
require 'ddtrace/ext/net'
|
|
4
|
+
require 'ddtrace/ext/distributed'
|
|
5
|
+
require 'ddtrace/contrib/analytics'
|
|
6
|
+
require 'ddtrace/propagation/http_propagator'
|
|
7
|
+
require 'ddtrace/contrib/http_annotation_helper'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Contrib
|
|
11
|
+
module Httprb
|
|
12
|
+
# Instrumentation for Httprb
|
|
13
|
+
module Instrumentation
|
|
14
|
+
def self.included(base)
|
|
15
|
+
base.send(:prepend, InstanceMethods)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Instance methods for configuration
|
|
19
|
+
# rubocop:disable Metrics/ModuleLength
|
|
20
|
+
module InstanceMethods
|
|
21
|
+
include Datadog::Contrib::HttpAnnotationHelper
|
|
22
|
+
|
|
23
|
+
def perform(req, options)
|
|
24
|
+
host = req.uri.host if req.respond_to?(:uri) && req.uri
|
|
25
|
+
request_options = datadog_configuration(host)
|
|
26
|
+
pin = datadog_pin(request_options)
|
|
27
|
+
|
|
28
|
+
return super(req, options) unless pin && pin.tracer
|
|
29
|
+
|
|
30
|
+
pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
|
|
31
|
+
begin
|
|
32
|
+
request_options[:service_name] = pin.service_name
|
|
33
|
+
span.service = service_name(host, request_options)
|
|
34
|
+
span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
|
|
35
|
+
|
|
36
|
+
if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
|
|
37
|
+
Datadog::HTTPPropagator.inject!(span.context, req)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Add additional request specific tags to the span.
|
|
41
|
+
annotate_span_with_request!(span, req, request_options)
|
|
42
|
+
rescue StandardError => e
|
|
43
|
+
logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
|
|
44
|
+
ensure
|
|
45
|
+
res = super(req, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Add additional response specific tags to the span.
|
|
49
|
+
annotate_span_with_response!(span, res)
|
|
50
|
+
|
|
51
|
+
res
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def annotate_span_with_request!(span, req, req_options)
|
|
58
|
+
if req.verb && req.verb.is_a?(String) || req.verb.is_a?(Symbol)
|
|
59
|
+
http_method = req.verb.to_s.upcase
|
|
60
|
+
span.resource = http_method
|
|
61
|
+
span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
|
|
62
|
+
else
|
|
63
|
+
logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing request verb")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if req.uri
|
|
67
|
+
uri = req.uri
|
|
68
|
+
span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
|
|
69
|
+
span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
|
|
70
|
+
span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
|
|
71
|
+
else
|
|
72
|
+
logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
set_analytics_sample_rate(span, req_options)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def annotate_span_with_response!(span, response)
|
|
79
|
+
return unless response && response.code
|
|
80
|
+
|
|
81
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
|
|
82
|
+
|
|
83
|
+
case response.code.to_i
|
|
84
|
+
when 400...599
|
|
85
|
+
# https://github.com/DataDog/dd-trace-rb/issues/1116
|
|
86
|
+
# parsing the response body message will alter downstream application behavior
|
|
87
|
+
span.set_error(["Error #{response.code}", 'Error'])
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def annotate_span_with_error!(span, error)
|
|
92
|
+
span.set_error(error)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def datadog_pin(config = Datadog.configuration[:httprb])
|
|
96
|
+
service = config[:service_name]
|
|
97
|
+
tracer = config[:tracer]
|
|
98
|
+
|
|
99
|
+
@datadog_pin ||= begin
|
|
100
|
+
Datadog::Pin.new(
|
|
101
|
+
service,
|
|
102
|
+
app: Ext::APP,
|
|
103
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
104
|
+
tracer: -> { config[:tracer] }
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
|
|
109
|
+
@datadog_pin.service = service
|
|
110
|
+
end
|
|
111
|
+
if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
|
|
112
|
+
@datadog_pin.tracer = tracer
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
@datadog_pin
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def default_datadog_pin
|
|
119
|
+
config = Datadog.configuration[:httprb]
|
|
120
|
+
service = config[:service_name]
|
|
121
|
+
|
|
122
|
+
@default_datadog_pin ||= begin
|
|
123
|
+
Datadog::Pin.new(
|
|
124
|
+
service,
|
|
125
|
+
app: Ext::APP,
|
|
126
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
127
|
+
tracer: -> { config[:tracer] }
|
|
128
|
+
)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def datadog_configuration(host = :default)
|
|
133
|
+
Datadog.configuration[:httprb, host]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def analytics_enabled?(request_options)
|
|
137
|
+
Contrib::Analytics.enabled?(request_options[:analytics_enabled])
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def logger
|
|
141
|
+
Datadog.logger
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def should_skip_distributed_tracing?(pin)
|
|
145
|
+
if pin.config && pin.config.key?(:distributed_tracing)
|
|
146
|
+
return !pin.config[:distributed_tracing]
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
!Datadog.configuration[:httprb][:distributed_tracing]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def set_analytics_sample_rate(span, request_options)
|
|
153
|
+
return unless analytics_enabled?(request_options)
|
|
154
|
+
Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|