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
|
@@ -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
|
|
@@ -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
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
require 'ddtrace/ext/http'
|
|
2
3
|
require 'ddtrace/ext/errors'
|
|
3
4
|
require 'ddtrace/contrib/analytics'
|
|
@@ -95,7 +96,7 @@ module Datadog
|
|
|
95
96
|
span.set_tag(Ext::TAG_ROUTE_ENDPOINT, api_view) unless api_view.nil?
|
|
96
97
|
span.set_tag(Ext::TAG_ROUTE_PATH, path)
|
|
97
98
|
ensure
|
|
98
|
-
span.
|
|
99
|
+
span.start(start)
|
|
99
100
|
span.finish(finish)
|
|
100
101
|
end
|
|
101
102
|
rescue StandardError => e
|
|
@@ -134,7 +135,7 @@ module Datadog
|
|
|
134
135
|
|
|
135
136
|
span.set_error(payload[:exception_object]) unless payload[:exception_object].nil?
|
|
136
137
|
ensure
|
|
137
|
-
span.
|
|
138
|
+
span.start(start)
|
|
138
139
|
span.finish(finish)
|
|
139
140
|
end
|
|
140
141
|
rescue StandardError => e
|
|
@@ -153,7 +154,8 @@ module Datadog
|
|
|
153
154
|
span = tracer.trace(
|
|
154
155
|
Ext::SPAN_ENDPOINT_RUN_FILTERS,
|
|
155
156
|
service: service_name,
|
|
156
|
-
span_type: Datadog::Ext::HTTP::TYPE_INBOUND
|
|
157
|
+
span_type: Datadog::Ext::HTTP::TYPE_INBOUND,
|
|
158
|
+
start_time: start
|
|
157
159
|
)
|
|
158
160
|
|
|
159
161
|
begin
|
|
@@ -169,7 +171,7 @@ module Datadog
|
|
|
169
171
|
span.set_error(payload[:exception_object]) unless payload[:exception_object].nil?
|
|
170
172
|
span.set_tag(Ext::TAG_FILTER_TYPE, type.to_s)
|
|
171
173
|
ensure
|
|
172
|
-
span.
|
|
174
|
+
span.start(start)
|
|
173
175
|
span.finish(finish)
|
|
174
176
|
end
|
|
175
177
|
rescue StandardError => e
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'ddtrace/ext/http'
|
|
2
|
+
require 'ddtrace/ext/integration'
|
|
2
3
|
require 'ddtrace/contrib/analytics'
|
|
3
4
|
require 'ddtrace/contrib/grpc/ext'
|
|
4
5
|
|
|
@@ -7,7 +8,7 @@ module Datadog
|
|
|
7
8
|
module GRPC
|
|
8
9
|
module DatadogInterceptor
|
|
9
10
|
# The DatadogInterceptor::Client implements the tracing strategy
|
|
10
|
-
# for gRPC client-side
|
|
11
|
+
# for gRPC client-side endpoints. This middleware component will
|
|
11
12
|
# inject trace context information into gRPC metadata prior to
|
|
12
13
|
# sending the request to the server.
|
|
13
14
|
class Client < Base
|
|
@@ -30,9 +31,10 @@ module Datadog
|
|
|
30
31
|
private
|
|
31
32
|
|
|
32
33
|
def annotate!(span, metadata)
|
|
33
|
-
metadata
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
span.set_tags(metadata)
|
|
35
|
+
|
|
36
|
+
# Tag as an external peer service
|
|
37
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
36
38
|
|
|
37
39
|
# Set analytics sample rate
|
|
38
40
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'ddtrace/ext/http'
|
|
2
|
+
require 'ddtrace/ext/integration'
|
|
2
3
|
require 'ddtrace/contrib/analytics'
|
|
3
4
|
require 'ddtrace/contrib/grpc/ext'
|
|
4
5
|
|
|
@@ -46,6 +47,9 @@ module Datadog
|
|
|
46
47
|
span.set_tag(header, value)
|
|
47
48
|
end
|
|
48
49
|
|
|
50
|
+
# Tag as an external peer service
|
|
51
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
52
|
+
|
|
49
53
|
# Set analytics sample rate
|
|
50
54
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
51
55
|
|
|
@@ -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
|
|
@@ -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
|
|
@@ -2,6 +2,7 @@ require 'uri'
|
|
|
2
2
|
require 'ddtrace/pin'
|
|
3
3
|
require 'ddtrace/ext/app_types'
|
|
4
4
|
require 'ddtrace/ext/http'
|
|
5
|
+
require 'ddtrace/ext/integration'
|
|
5
6
|
require 'ddtrace/ext/net'
|
|
6
7
|
require 'ddtrace/ext/distributed'
|
|
7
8
|
require 'ddtrace/contrib/analytics'
|
|
@@ -83,6 +84,9 @@ module Datadog
|
|
|
83
84
|
span.set_tag(Datadog::Ext::NET::TARGET_HOST, host)
|
|
84
85
|
span.set_tag(Datadog::Ext::NET::TARGET_PORT, port.to_s)
|
|
85
86
|
|
|
87
|
+
# Tag as an external peer service
|
|
88
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
89
|
+
|
|
86
90
|
# Set analytics sample rate
|
|
87
91
|
set_analytics_sample_rate(span, request_options)
|
|
88
92
|
end
|
|
@@ -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,163 @@
|
|
|
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
|
+
# Tag as an external peer service
|
|
76
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
77
|
+
|
|
78
|
+
set_analytics_sample_rate(span, req_options)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def annotate_span_with_response!(span, response)
|
|
82
|
+
return unless response && response.code
|
|
83
|
+
|
|
84
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
|
|
85
|
+
|
|
86
|
+
case response.code.to_i
|
|
87
|
+
when 400...599
|
|
88
|
+
# https://github.com/DataDog/dd-trace-rb/issues/1116
|
|
89
|
+
# parsing the response body message will alter downstream application behavior
|
|
90
|
+
span.set_error(["Error #{response.code}", 'Error'])
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def annotate_span_with_error!(span, error)
|
|
95
|
+
span.set_error(error)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def datadog_pin(config = Datadog.configuration[:httprb])
|
|
99
|
+
service = config[:service_name]
|
|
100
|
+
tracer = config[:tracer]
|
|
101
|
+
|
|
102
|
+
@datadog_pin ||= begin
|
|
103
|
+
Datadog::Pin.new(
|
|
104
|
+
service,
|
|
105
|
+
app: Ext::APP,
|
|
106
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
107
|
+
tracer: -> { config[:tracer] }
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
|
|
112
|
+
@datadog_pin.service = service
|
|
113
|
+
end
|
|
114
|
+
if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
|
|
115
|
+
@datadog_pin.tracer = tracer
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
@datadog_pin
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def default_datadog_pin
|
|
122
|
+
config = Datadog.configuration[:httprb]
|
|
123
|
+
service = config[:service_name]
|
|
124
|
+
|
|
125
|
+
@default_datadog_pin ||= begin
|
|
126
|
+
Datadog::Pin.new(
|
|
127
|
+
service,
|
|
128
|
+
app: Ext::APP,
|
|
129
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
130
|
+
tracer: -> { config[:tracer] }
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def datadog_configuration(host = :default)
|
|
136
|
+
Datadog.configuration[:httprb, host]
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def analytics_enabled?(request_options)
|
|
140
|
+
Contrib::Analytics.enabled?(request_options[:analytics_enabled])
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def logger
|
|
144
|
+
Datadog.logger
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def should_skip_distributed_tracing?(pin)
|
|
148
|
+
if pin.config && pin.config.key?(:distributed_tracing)
|
|
149
|
+
return !pin.config[:distributed_tracing]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
!Datadog.configuration[:httprb][:distributed_tracing]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def set_analytics_sample_rate(span, request_options)
|
|
156
|
+
return unless analytics_enabled?(request_options)
|
|
157
|
+
Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|