ddtrace 0.40.0 → 0.45.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 +148 -130
- data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
- data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
- data/.github/workflows/create-next-milestone.yml +20 -0
- data/.simplecov +3 -0
- data/Appraisals +414 -135
- data/CHANGELOG.md +1112 -342
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +4 -2
- data/README.md +1 -0
- data/Rakefile +231 -29
- data/ddtrace.gemspec +8 -8
- data/docker-compose.yml +30 -0
- data/docs/DevelopmentGuide.md +12 -2
- data/docs/GettingStarted.md +187 -16
- data/lib/ddtrace.rb +10 -0
- data/lib/ddtrace/auto_instrument.rb +3 -0
- data/lib/ddtrace/auto_instrument_base.rb +6 -0
- data/lib/ddtrace/buffer.rb +259 -52
- data/lib/ddtrace/configuration.rb +19 -0
- data/lib/ddtrace/configuration/options.rb +3 -1
- data/lib/ddtrace/configuration/settings.rb +9 -3
- data/lib/ddtrace/context.rb +18 -0
- data/lib/ddtrace/context_provider.rb +17 -5
- data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_view/event.rb +0 -4
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +67 -21
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +10 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +6 -1
- data/lib/ddtrace/contrib/aws/patcher.rb +0 -1
- data/lib/ddtrace/contrib/aws/services.rb +1 -0
- data/lib/ddtrace/contrib/configurable.rb +2 -0
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +6 -5
- data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +38 -0
- data/lib/ddtrace/contrib/cucumber/ext.rb +19 -0
- data/lib/ddtrace/contrib/cucumber/formatter.rb +104 -0
- data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
- data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
- data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +2 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +39 -15
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +10 -7
- data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +11 -1
- data/lib/ddtrace/contrib/extensions.rb +27 -1
- data/lib/ddtrace/contrib/faraday/middleware.rb +4 -0
- data/lib/ddtrace/contrib/faraday/patcher.rb +1 -1
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +53 -18
- data/lib/ddtrace/contrib/grape/ext.rb +1 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +6 -2
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +152 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +35 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +6 -3
- data/lib/ddtrace/contrib/kafka/event.rb +1 -1
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +4 -0
- data/lib/ddtrace/contrib/patchable.rb +18 -7
- data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
- data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
- data/lib/ddtrace/contrib/qless/ext.rb +20 -0
- data/lib/ddtrace/contrib/qless/integration.rb +38 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
- data/lib/ddtrace/contrib/qless/qless_job.rb +72 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +32 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/que/tracer.rb +2 -1
- data/lib/ddtrace/contrib/racecar/event.rb +4 -0
- data/lib/ddtrace/contrib/rack/integration.rb +7 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +1 -1
- data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +19 -5
- data/lib/ddtrace/contrib/rails/utils.rb +4 -0
- data/lib/ddtrace/contrib/rake/integration.rb +1 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +3 -1
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/redis/ext.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +20 -3
- data/lib/ddtrace/contrib/redis/quantize.rb +27 -0
- data/lib/ddtrace/contrib/redis/tags.rb +9 -1
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/resque/integration.rb +1 -1
- data/lib/ddtrace/contrib/resque/resque_job.rb +1 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +4 -0
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +38 -0
- data/lib/ddtrace/contrib/rspec/example.rb +61 -0
- data/lib/ddtrace/contrib/rspec/example_group.rb +61 -0
- data/lib/ddtrace/contrib/rspec/ext.rb +19 -0
- data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
- data/lib/ddtrace/contrib/rspec/patcher.rb +25 -0
- 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 +1 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +16 -5
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -1
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +4 -1
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +2 -2
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -20
- data/lib/ddtrace/contrib/status_code_matcher.rb +67 -0
- data/lib/ddtrace/ext/app_types.rb +1 -0
- data/lib/ddtrace/ext/ci.rb +297 -0
- data/lib/ddtrace/ext/distributed.rb +8 -2
- data/lib/ddtrace/ext/git.rb +11 -0
- data/lib/ddtrace/ext/integration.rb +8 -0
- data/lib/ddtrace/ext/runtime.rb +2 -0
- data/lib/ddtrace/ext/test.rb +24 -0
- data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
- data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
- data/lib/ddtrace/propagation/http_propagator.rb +17 -2
- data/lib/ddtrace/runtime/identity.rb +4 -5
- data/lib/ddtrace/runtime/metrics.rb +6 -2
- data/lib/ddtrace/sampler.rb +2 -2
- data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
- data/lib/ddtrace/span.rb +152 -27
- data/lib/ddtrace/tracer.rb +25 -13
- data/lib/ddtrace/transport/http/adapters/net.rb +8 -2
- data/lib/ddtrace/transport/http/statistics.rb +14 -1
- data/lib/ddtrace/transport/traces.rb +7 -2
- data/lib/ddtrace/utils.rb +16 -13
- data/lib/ddtrace/utils/forking.rb +52 -0
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
- data/lib/ddtrace/writer.rb +19 -1
- metadata +111 -19
|
@@ -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
|
|
@@ -32,6 +33,9 @@ module Datadog
|
|
|
32
33
|
def annotate!(span, metadata)
|
|
33
34
|
span.set_tags(metadata)
|
|
34
35
|
|
|
36
|
+
# Tag as an external peer service
|
|
37
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
38
|
+
|
|
35
39
|
# Set analytics sample rate
|
|
36
40
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
37
41
|
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -114,7 +118,7 @@ module Datadog
|
|
|
114
118
|
@datadog_pin ||= Datadog::Pin.new(
|
|
115
119
|
service,
|
|
116
120
|
app: Ext::APP,
|
|
117
|
-
app_type: Datadog::Ext::
|
|
121
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
118
122
|
tracer: -> { config[:tracer] }
|
|
119
123
|
)
|
|
120
124
|
|
|
@@ -142,7 +146,7 @@ module Datadog
|
|
|
142
146
|
@default_datadog_pin ||= Datadog::Pin.new(
|
|
143
147
|
service,
|
|
144
148
|
app: Ext::APP,
|
|
145
|
-
app_type: Datadog::Ext::
|
|
149
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
146
150
|
tracer: -> { config[:tracer] }
|
|
147
151
|
)
|
|
148
152
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
2
|
+
require 'ddtrace/contrib/httpclient/ext'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module Httpclient
|
|
7
|
+
module Configuration
|
|
8
|
+
# Custom settings for the Httpclient 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 Httpclient
|
|
4
|
+
# Httpclient integration constants
|
|
5
|
+
module Ext
|
|
6
|
+
APP = 'httpclient'.freeze
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_HTTPCLIENT_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPCLIENT_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTPCLIENT_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTPCLIENT_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTPCLIENT_ANALYTICS_SAMPLE_RATE'.freeze
|
|
12
|
+
SERVICE_NAME = 'httpclient'.freeze
|
|
13
|
+
SPAN_REQUEST = 'httpclient.request'.freeze
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
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 Httpclient
|
|
12
|
+
# Instrumentation for Httpclient
|
|
13
|
+
module Instrumentation
|
|
14
|
+
def self.included(base)
|
|
15
|
+
base.send(:prepend, InstanceMethods)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Instance methods for configuration
|
|
19
|
+
module InstanceMethods
|
|
20
|
+
include Datadog::Contrib::HttpAnnotationHelper
|
|
21
|
+
|
|
22
|
+
def do_get_block(req, proxy, conn, &block)
|
|
23
|
+
host = req.header.request_uri.host
|
|
24
|
+
request_options = datadog_configuration(host)
|
|
25
|
+
pin = datadog_pin(request_options)
|
|
26
|
+
|
|
27
|
+
return super unless pin && pin.tracer
|
|
28
|
+
|
|
29
|
+
pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
|
|
30
|
+
begin
|
|
31
|
+
request_options[:service_name] = pin.service_name
|
|
32
|
+
span.service = service_name(host, request_options)
|
|
33
|
+
span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
|
|
34
|
+
|
|
35
|
+
if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
|
|
36
|
+
Datadog::HTTPPropagator.inject!(span.context, req.header)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Add additional request specific tags to the span.
|
|
40
|
+
annotate_span_with_request!(span, req, request_options)
|
|
41
|
+
rescue StandardError => e
|
|
42
|
+
logger.error("error preparing span for httpclient request: #{e}, Source: #{e.backtrace}")
|
|
43
|
+
ensure
|
|
44
|
+
res = super
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Add additional response specific tags to the span.
|
|
48
|
+
annotate_span_with_response!(span, res)
|
|
49
|
+
|
|
50
|
+
res
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def annotate_span_with_request!(span, req, req_options)
|
|
57
|
+
http_method = req.header.request_method.upcase
|
|
58
|
+
uri = req.header.request_uri
|
|
59
|
+
|
|
60
|
+
span.resource = http_method
|
|
61
|
+
span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
|
|
62
|
+
span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
|
|
63
|
+
span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
|
|
64
|
+
span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
|
|
65
|
+
|
|
66
|
+
# Tag as an external peer service
|
|
67
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
68
|
+
|
|
69
|
+
set_analytics_sample_rate(span, req_options)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def annotate_span_with_response!(span, response)
|
|
73
|
+
return unless response && response.status
|
|
74
|
+
|
|
75
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
|
|
76
|
+
|
|
77
|
+
case response.status.to_i
|
|
78
|
+
when 400...599
|
|
79
|
+
span.set_error(["Error #{response.status}", response.body])
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def annotate_span_with_error!(span, error)
|
|
84
|
+
span.set_error(error)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def datadog_pin(config = Datadog.configuration[:httprb])
|
|
88
|
+
service = config[:service_name]
|
|
89
|
+
tracer = config[:tracer]
|
|
90
|
+
|
|
91
|
+
@datadog_pin ||= begin
|
|
92
|
+
Datadog::Pin.new(
|
|
93
|
+
service,
|
|
94
|
+
app: Ext::APP,
|
|
95
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
96
|
+
tracer: -> { config[:tracer] }
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
|
|
101
|
+
@datadog_pin.service = service
|
|
102
|
+
end
|
|
103
|
+
if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
|
|
104
|
+
@datadog_pin.tracer = tracer
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
@datadog_pin
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def default_datadog_pin
|
|
111
|
+
config = Datadog.configuration[:httpclient]
|
|
112
|
+
service = config[:service_name]
|
|
113
|
+
|
|
114
|
+
@default_datadog_pin ||= begin
|
|
115
|
+
Datadog::Pin.new(
|
|
116
|
+
service,
|
|
117
|
+
app: Ext::APP,
|
|
118
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
119
|
+
tracer: -> { config[:tracer] }
|
|
120
|
+
)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def datadog_configuration(host = :default)
|
|
125
|
+
Datadog.configuration[:httpclient, host]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def analytics_enabled?(request_options)
|
|
129
|
+
Contrib::Analytics.enabled?(request_options[:analytics_enabled])
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def logger
|
|
133
|
+
Datadog.logger
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def should_skip_distributed_tracing?(pin)
|
|
137
|
+
if pin.config && pin.config.key?(:distributed_tracing)
|
|
138
|
+
return !pin.config[:distributed_tracing]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
!Datadog.configuration[:httpclient][:distributed_tracing]
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def set_analytics_sample_rate(span, request_options)
|
|
145
|
+
return unless analytics_enabled?(request_options)
|
|
146
|
+
Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'ddtrace/contrib/integration'
|
|
2
|
+
require 'ddtrace/contrib/httpclient/configuration/settings'
|
|
3
|
+
require 'ddtrace/contrib/configuration/resolvers/pattern_resolver'
|
|
4
|
+
require 'ddtrace/contrib/httpclient/patcher'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Contrib
|
|
8
|
+
module Httpclient
|
|
9
|
+
# Description of Httpclient integration
|
|
10
|
+
class Integration
|
|
11
|
+
include Contrib::Integration
|
|
12
|
+
|
|
13
|
+
MINIMUM_VERSION = Gem::Version.new('2.2.0')
|
|
14
|
+
|
|
15
|
+
register_as :httpclient
|
|
16
|
+
|
|
17
|
+
def self.version
|
|
18
|
+
Gem.loaded_specs['httpclient'] && Gem.loaded_specs['httpclient'].version
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.loaded?
|
|
22
|
+
!defined?(::HTTPClient).nil?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.compatible?
|
|
26
|
+
super && version >= MINIMUM_VERSION
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def default_configuration
|
|
30
|
+
Configuration::Settings.new
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def patcher
|
|
34
|
+
Patcher
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def resolver
|
|
38
|
+
@resolver ||= Contrib::Configuration::Resolvers::PatternResolver.new
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'ddtrace/contrib/patcher'
|
|
2
|
+
require 'ddtrace/contrib/httpclient/instrumentation'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
# Datadog Httpclient integration.
|
|
7
|
+
module Httpclient
|
|
8
|
+
# Patcher enables patching of 'httpclient' module.
|
|
9
|
+
module Patcher
|
|
10
|
+
include Contrib::Patcher
|
|
11
|
+
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
def patched?
|
|
15
|
+
done?(:httpclient)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def target_version
|
|
19
|
+
Integration.version
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# patch applies our patch
|
|
23
|
+
def patch
|
|
24
|
+
do_once(:httpclient) do
|
|
25
|
+
begin
|
|
26
|
+
::HTTPClient.send(:include, Instrumentation)
|
|
27
|
+
rescue StandardError => e
|
|
28
|
+
Datadog::Logger.error("Unable to apply httpclient integration: #{e}")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -40,7 +40,7 @@ module Datadog
|
|
|
40
40
|
# Add additional request specific tags to the span.
|
|
41
41
|
annotate_span_with_request!(span, req, request_options)
|
|
42
42
|
rescue StandardError => e
|
|
43
|
-
logger.error("error preparing span for http.rb request: #{e},
|
|
43
|
+
logger.error("error preparing span for http.rb request: #{e}, Source: #{e.backtrace}")
|
|
44
44
|
ensure
|
|
45
45
|
res = super(req, options)
|
|
46
46
|
end
|
|
@@ -72,6 +72,9 @@ module Datadog
|
|
|
72
72
|
logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri")
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
# Tag as an external peer service
|
|
76
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
77
|
+
|
|
75
78
|
set_analytics_sample_rate(span, req_options)
|
|
76
79
|
end
|
|
77
80
|
|
|
@@ -100,7 +103,7 @@ module Datadog
|
|
|
100
103
|
Datadog::Pin.new(
|
|
101
104
|
service,
|
|
102
105
|
app: Ext::APP,
|
|
103
|
-
app_type: Datadog::Ext::
|
|
106
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
104
107
|
tracer: -> { config[:tracer] }
|
|
105
108
|
)
|
|
106
109
|
end
|
|
@@ -123,7 +126,7 @@ module Datadog
|
|
|
123
126
|
Datadog::Pin.new(
|
|
124
127
|
service,
|
|
125
128
|
app: Ext::APP,
|
|
126
|
-
app_type: Datadog::Ext::
|
|
129
|
+
app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
|
|
127
130
|
tracer: -> { config[:tracer] }
|
|
128
131
|
)
|
|
129
132
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/contrib/analytics'
|
|
2
2
|
require 'ddtrace/contrib/mongodb/ext'
|
|
3
3
|
require 'ddtrace/contrib/mongodb/parsers'
|
|
4
|
+
require 'ddtrace/ext/integration'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module Contrib
|
|
@@ -24,6 +25,9 @@ module Datadog
|
|
|
24
25
|
query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
|
|
25
26
|
serialized_query = query.to_s
|
|
26
27
|
|
|
28
|
+
# Tag as an external peer service
|
|
29
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
30
|
+
|
|
27
31
|
# Set analytics sample rate
|
|
28
32
|
if analytics_enabled?
|
|
29
33
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'ddtrace/ext/app_types'
|
|
2
|
+
require 'ddtrace/ext/integration'
|
|
2
3
|
require 'ddtrace/ext/net'
|
|
3
4
|
require 'ddtrace/ext/sql'
|
|
4
5
|
require 'ddtrace/contrib/analytics'
|
|
@@ -21,6 +22,9 @@ module Datadog
|
|
|
21
22
|
span.service = datadog_pin.service
|
|
22
23
|
span.span_type = Datadog::Ext::SQL::TYPE
|
|
23
24
|
|
|
25
|
+
# Tag as an external peer service
|
|
26
|
+
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
27
|
+
|
|
24
28
|
# Set analytics sample rate
|
|
25
29
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
26
30
|
|