ddtrace 0.36.0 → 0.41.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/.simplecov +38 -0
- data/Appraisals +131 -6
- data/CHANGELOG.md +198 -1
- data/Rakefile +504 -467
- data/ddtrace.gemspec +7 -0
- data/docker-compose.yml +2 -2
- data/docs/DevelopmentGuide.md +16 -0
- data/docs/GettingStarted.md +192 -111
- data/lib/ddtrace.rb +4 -0
- data/lib/ddtrace/buffer.rb +154 -43
- 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/pin_setup.rb +3 -2
- data/lib/ddtrace/configuration/settings.rb +32 -4
- 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/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 +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/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/instrumentation.rb +4 -0
- 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 +5 -2
- 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 +13 -5
- 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/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 +5 -3
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
- 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 +16 -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 +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/instrumentation.rb +1 -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 +5 -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/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 +10 -12
- data/lib/ddtrace/contrib/rails/ext.rb +6 -2
- data/lib/ddtrace/contrib/rails/framework.rb +14 -21
- 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/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/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 +4 -2
- 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/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/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/pin.rb +25 -2
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/propagation/grpc_propagator.rb +2 -2
- 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 +18 -12
- 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 +138 -2
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -111,9 +115,12 @@ module Datadog
|
|
|
111
115
|
service = config[:service_name]
|
|
112
116
|
tracer = config[:tracer]
|
|
113
117
|
|
|
114
|
-
@datadog_pin ||=
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
@datadog_pin ||= Datadog::Pin.new(
|
|
119
|
+
service,
|
|
120
|
+
app: Ext::APP,
|
|
121
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
122
|
+
tracer: -> { config[:tracer] }
|
|
123
|
+
)
|
|
117
124
|
|
|
118
125
|
# this shockingly poor code exists to solve the case where someone
|
|
119
126
|
# calls datadog_pin on this object before running a request, which
|
|
@@ -136,10 +143,12 @@ module Datadog
|
|
|
136
143
|
def default_datadog_pin
|
|
137
144
|
config = Datadog.configuration[:http]
|
|
138
145
|
service = config[:service_name]
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
146
|
+
@default_datadog_pin ||= Datadog::Pin.new(
|
|
147
|
+
service,
|
|
148
|
+
app: Ext::APP,
|
|
149
|
+
app_type: Datadog::Ext::AppTypes::WEB,
|
|
150
|
+
tracer: -> { config[:tracer] }
|
|
151
|
+
)
|
|
143
152
|
end
|
|
144
153
|
|
|
145
154
|
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,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
|