ddtrace 1.4.1 → 1.6.1
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/CHANGELOG.md +144 -1
- data/LICENSE-3rdparty.csv +1 -0
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +9 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +17 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +38 -2
- data/ext/ddtrace_profiling_native_extension/clock_id.h +1 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +1 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +517 -42
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +208 -30
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +156 -46
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +11 -2
- data/ext/ddtrace_profiling_native_extension/extconf.rb +11 -1
- data/ext/ddtrace_profiling_native_extension/http_transport.c +83 -64
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +4 -4
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +3 -4
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +59 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +10 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -1
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +4 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +45 -29
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +7 -7
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +1169 -275
- data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
- data/lib/datadog/appsec/assets/waf_rules/strict.json +278 -88
- data/lib/datadog/appsec/configuration/settings.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +25 -20
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +11 -11
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +11 -11
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +11 -11
- data/lib/datadog/appsec/contrib/rack/request.rb +3 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +46 -19
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +7 -6
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +11 -11
- data/lib/datadog/appsec/contrib/rails/request.rb +3 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +14 -12
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +11 -11
- data/lib/datadog/appsec/event.rb +6 -10
- data/lib/datadog/appsec/instrumentation/gateway.rb +16 -2
- data/lib/datadog/appsec/processor.rb +18 -2
- data/lib/datadog/ci/ext/environment.rb +16 -4
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +0 -3
- data/lib/datadog/core/configuration/components.rb +28 -16
- data/lib/datadog/core/configuration/settings.rb +127 -8
- data/lib/datadog/core/configuration.rb +1 -1
- data/lib/datadog/core/diagnostics/environment_logger.rb +5 -1
- data/lib/datadog/core/header_collection.rb +41 -0
- data/lib/datadog/core/telemetry/collector.rb +0 -2
- data/lib/datadog/core/utils/compression.rb +5 -1
- data/lib/datadog/core/workers/async.rb +0 -2
- data/lib/datadog/core.rb +0 -54
- data/lib/datadog/opentracer/tracer.rb +4 -6
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +12 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +5 -3
- data/lib/datadog/profiling/collectors/old_stack.rb +1 -1
- data/lib/datadog/profiling/exporter.rb +2 -4
- data/lib/datadog/profiling/http_transport.rb +1 -1
- data/lib/datadog/profiling.rb +1 -1
- data/lib/datadog/tracing/client_ip.rb +164 -0
- data/lib/datadog/tracing/configuration/ext.rb +14 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -2
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +5 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +7 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -21
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +49 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +105 -43
- data/lib/datadog/tracing/contrib/redis/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/redis/patcher.rb +40 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +12 -23
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +8 -80
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +14 -9
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/headers/datadog.rb +122 -30
- data/lib/datadog/tracing/distributed/headers/ext.rb +2 -0
- data/lib/datadog/tracing/flush.rb +57 -35
- data/lib/datadog/tracing/metadata/ext.rb +11 -9
- data/lib/datadog/tracing/metadata/tagging.rb +9 -0
- data/lib/datadog/tracing/propagation/http.rb +9 -1
- data/lib/datadog/tracing/sampling/ext.rb +31 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +46 -4
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +8 -9
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +29 -5
- data/lib/datadog/tracing/sampling/rate_limiter.rb +3 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +20 -3
- data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -3
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +9 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
- data/lib/datadog/tracing/span_operation.rb +0 -2
- data/lib/datadog/tracing/trace_digest.rb +3 -0
- data/lib/datadog/tracing/trace_operation.rb +32 -3
- data/lib/datadog/tracing/trace_segment.rb +7 -2
- data/lib/datadog/tracing/tracer.rb +34 -6
- data/lib/datadog/tracing/writer.rb +7 -0
- data/lib/ddtrace/transport/trace_formatter.rb +7 -0
- data/lib/ddtrace/transport/traces.rb +3 -1
- data/lib/ddtrace/version.rb +1 -1
- metadata +36 -18
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -118
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Contrib
|
|
6
|
+
module Hanami
|
|
7
|
+
# Hanami integration constants
|
|
8
|
+
# @public_api Changing resource names, tag names, or environment variables creates breaking changes.
|
|
9
|
+
module Ext
|
|
10
|
+
ENV_ENABLED = 'DD_TRACE_HANAMI_ENABLED'.freeze
|
|
11
|
+
|
|
12
|
+
SPAN_ACTION = 'hanami.action'.freeze
|
|
13
|
+
SPAN_ROUTING = 'hanami.routing'.freeze
|
|
14
|
+
SPAN_RENDER = 'hanami.render'.freeze
|
|
15
|
+
|
|
16
|
+
TAG_COMPONENT = 'hanami'.freeze
|
|
17
|
+
TAG_OPERATION_ACTION = 'action'.freeze
|
|
18
|
+
TAG_OPERATION_ROUTING = 'routing'.freeze
|
|
19
|
+
TAG_OPERATION_RENDER = 'render'.freeze
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
require_relative '../integration'
|
|
4
|
+
require_relative 'configuration/settings'
|
|
5
|
+
require_relative 'patcher'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Tracing
|
|
9
|
+
module Contrib
|
|
10
|
+
module Hanami
|
|
11
|
+
# Description of Hanami integration
|
|
12
|
+
class Integration
|
|
13
|
+
include Contrib::Integration
|
|
14
|
+
|
|
15
|
+
MINIMUM_VERSION = Gem::Version.new('1.0.0')
|
|
16
|
+
MAXIMUM_VERSION = Gem::Version.new('2.0.0')
|
|
17
|
+
|
|
18
|
+
register_as :hanami
|
|
19
|
+
|
|
20
|
+
def self.version
|
|
21
|
+
Gem.loaded_specs['hanami'] && Gem.loaded_specs['hanami'].version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.loaded?
|
|
25
|
+
!defined?(::Hanami).nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.compatible?
|
|
29
|
+
# Tested with version larger than 1.x, but not 2.x version
|
|
30
|
+
super && version >= MINIMUM_VERSION && version < MAXIMUM_VERSION
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def new_configuration
|
|
34
|
+
Configuration::Settings.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def patcher
|
|
38
|
+
Patcher
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
require_relative '../patcher'
|
|
4
|
+
require_relative 'action_tracer'
|
|
5
|
+
require_relative 'renderer_policy_tracing'
|
|
6
|
+
require_relative 'router_tracing'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module Tracing
|
|
10
|
+
module Contrib
|
|
11
|
+
module Hanami
|
|
12
|
+
# Patcher enables patching of Hanami
|
|
13
|
+
module Patcher
|
|
14
|
+
include Contrib::Patcher
|
|
15
|
+
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
def target_version
|
|
19
|
+
Integration.version
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def patch
|
|
23
|
+
# For auto instrumentation, `plugin` must be required before `Hanami.boot`
|
|
24
|
+
require_relative 'plugin'
|
|
25
|
+
|
|
26
|
+
::Hanami::Router.prepend(RouterTracing)
|
|
27
|
+
::Hanami::RenderingPolicy.prepend(RendererPolicyTracing)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
::Hanami.plugin do
|
|
4
|
+
Datadog.configure do |c|
|
|
5
|
+
c.tracing.instrument :rack
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
middleware.use Datadog::Tracing::Contrib::Rack::TraceMiddleware
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
::Hanami::Application.singleton_class.prepend(
|
|
12
|
+
Module.new do
|
|
13
|
+
def inherited(base)
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
base.configure do
|
|
17
|
+
controller.prepare do
|
|
18
|
+
use Datadog::Tracing::Contrib::Hanami::ActionTracer, self
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
require_relative '../../metadata/ext'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Tracing
|
|
8
|
+
module Contrib
|
|
9
|
+
module Hanami
|
|
10
|
+
# Hanami Instrumentation for `hanami.render`
|
|
11
|
+
module RendererPolicyTracing
|
|
12
|
+
def render(env, response)
|
|
13
|
+
action = env['hanami.action']
|
|
14
|
+
# env['hanami.action'] could be empty for endpoints without an action
|
|
15
|
+
#
|
|
16
|
+
# For example in config/routes.rb:
|
|
17
|
+
# get '/hello', to: ->(env) { [200, {}, ['Hello from Hanami!']] }
|
|
18
|
+
action_klass = (action && action.class) ||
|
|
19
|
+
::Hanami::Routing::Default::NullAction
|
|
20
|
+
|
|
21
|
+
Tracing.trace(
|
|
22
|
+
Ext::SPAN_RENDER,
|
|
23
|
+
service: configuration[:service_name],
|
|
24
|
+
resource: action_klass.to_s,
|
|
25
|
+
span_type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
|
|
26
|
+
) do |span_op, _trace_op|
|
|
27
|
+
span_op.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
28
|
+
span_op.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_RENDER)
|
|
29
|
+
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def configuration
|
|
35
|
+
Datadog.configuration.tracing[:hanami]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
require_relative '../../metadata/ext'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Tracing
|
|
8
|
+
module Contrib
|
|
9
|
+
module Hanami
|
|
10
|
+
# Hanami Instrumentation for `hanami.routing`
|
|
11
|
+
module RouterTracing
|
|
12
|
+
def call(env)
|
|
13
|
+
return super if Tracing.active_span && Tracing.active_span.name == Ext::SPAN_ROUTING
|
|
14
|
+
|
|
15
|
+
Tracing.trace(
|
|
16
|
+
Ext::SPAN_ROUTING,
|
|
17
|
+
service: configuration[:service_name],
|
|
18
|
+
span_type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
|
|
19
|
+
) do |span_op, trace_op|
|
|
20
|
+
begin
|
|
21
|
+
span_op.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
22
|
+
span_op.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ROUTING)
|
|
23
|
+
|
|
24
|
+
span_op.resource = nil
|
|
25
|
+
|
|
26
|
+
super
|
|
27
|
+
ensure
|
|
28
|
+
span_op.resource ||= if trace_op.resource_override?
|
|
29
|
+
trace_op.resource
|
|
30
|
+
else
|
|
31
|
+
env['REQUEST_METHOD']
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def configuration
|
|
38
|
+
Datadog.configuration.tracing[:hanami]
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -70,6 +70,8 @@ module Datadog
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def annotate_span_with_request!(span, request, request_options)
|
|
73
|
+
span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
|
|
74
|
+
|
|
73
75
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
74
76
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
|
|
75
77
|
|
|
@@ -51,6 +51,8 @@ module Datadog
|
|
|
51
51
|
private
|
|
52
52
|
|
|
53
53
|
def annotate_span_with_request!(span, req, req_options)
|
|
54
|
+
span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
|
|
55
|
+
|
|
54
56
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
55
57
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
|
|
56
58
|
|
|
@@ -51,6 +51,8 @@ module Datadog
|
|
|
51
51
|
private
|
|
52
52
|
|
|
53
53
|
def annotate_span_with_request!(span, req, req_options)
|
|
54
|
+
span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
|
|
55
|
+
|
|
54
56
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
55
57
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
|
|
56
58
|
|
|
@@ -20,6 +20,13 @@ module Datadog
|
|
|
20
20
|
TAG_ROWS = 'mongodb.rows'.freeze
|
|
21
21
|
TAG_COMPONENT = 'mongodb'.freeze
|
|
22
22
|
TAG_OPERATION_COMMAND = 'command'.freeze
|
|
23
|
+
TAG_SYSTEM = 'mongodb'.freeze
|
|
24
|
+
|
|
25
|
+
# Temporary namespace to accommodate unified tags which has naming collision, before
|
|
26
|
+
# making breaking changes
|
|
27
|
+
module DB
|
|
28
|
+
TAG_COLLECTION = 'db.mongodb.collection'.freeze
|
|
29
|
+
end
|
|
23
30
|
end
|
|
24
31
|
end
|
|
25
32
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative '../analytics'
|
|
4
4
|
require_relative 'ext'
|
|
5
|
+
require_relative '../ext'
|
|
5
6
|
require_relative 'parsers'
|
|
6
7
|
require_relative '../../metadata/ext'
|
|
7
8
|
|
|
@@ -30,6 +31,8 @@ module Datadog
|
|
|
30
31
|
query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
|
|
31
32
|
serialized_query = query.to_s
|
|
32
33
|
|
|
34
|
+
span.set_tag(Contrib::Ext::DB::TAG_SYSTEM, Ext::TAG_SYSTEM)
|
|
35
|
+
|
|
33
36
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
34
37
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_COMMAND)
|
|
35
38
|
|
|
@@ -44,6 +47,7 @@ module Datadog
|
|
|
44
47
|
# since it has been quantized and reduced
|
|
45
48
|
span.set_tag(Ext::TAG_DB, query['database'])
|
|
46
49
|
span.set_tag(Ext::TAG_COLLECTION, query['collection'])
|
|
50
|
+
span.set_tag(Ext::DB::TAG_COLLECTION, query['collection'])
|
|
47
51
|
span.set_tag(Ext::TAG_OPERATION, query['operation'])
|
|
48
52
|
span.set_tag(Ext::TAG_QUERY, serialized_query)
|
|
49
53
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, event.address.host)
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
require_relative '../../configuration/settings'
|
|
4
4
|
require_relative '../ext'
|
|
5
5
|
|
|
6
|
+
require_relative '../../propagation/sql_comment'
|
|
7
|
+
|
|
6
8
|
module Datadog
|
|
7
9
|
module Tracing
|
|
8
10
|
module Contrib
|
|
@@ -27,6 +29,16 @@ module Datadog
|
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
option :service_name, default: Ext::DEFAULT_PEER_SERVICE_NAME
|
|
32
|
+
|
|
33
|
+
option :comment_propagation do |o|
|
|
34
|
+
o.default do
|
|
35
|
+
ENV.fetch(
|
|
36
|
+
Contrib::Propagation::SqlComment::Ext::ENV_DBM_PROPAGATION_MODE,
|
|
37
|
+
Contrib::Propagation::SqlComment::Ext::DISABLED
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
o.lazy
|
|
41
|
+
end
|
|
30
42
|
end
|
|
31
43
|
end
|
|
32
44
|
end
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
require_relative '../../metadata/ext'
|
|
4
4
|
require_relative '../analytics'
|
|
5
5
|
require_relative 'ext'
|
|
6
|
+
require_relative '../ext'
|
|
7
|
+
require_relative '../propagation/sql_comment'
|
|
8
|
+
require_relative '../propagation/sql_comment/mode'
|
|
6
9
|
|
|
7
10
|
module Datadog
|
|
8
11
|
module Tracing
|
|
@@ -23,6 +26,9 @@ module Datadog
|
|
|
23
26
|
span.resource = sql
|
|
24
27
|
span.span_type = Tracing::Metadata::Ext::SQL::TYPE
|
|
25
28
|
|
|
29
|
+
span.set_tag(Contrib::Ext::DB::TAG_SYSTEM, Ext::TAG_SYSTEM)
|
|
30
|
+
span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
|
|
31
|
+
|
|
26
32
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
|
27
33
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_QUERY)
|
|
28
34
|
|
|
@@ -36,6 +42,12 @@ module Datadog
|
|
|
36
42
|
span.set_tag(Ext::TAG_DB_NAME, query_options[:database])
|
|
37
43
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, query_options[:host])
|
|
38
44
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, query_options[:port])
|
|
45
|
+
|
|
46
|
+
propagation_mode = Contrib::Propagation::SqlComment::Mode.new(comment_propagation)
|
|
47
|
+
|
|
48
|
+
Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
|
|
49
|
+
sql = Contrib::Propagation::SqlComment.prepend_comment(sql, span, propagation_mode)
|
|
50
|
+
|
|
39
51
|
super(sql, options)
|
|
40
52
|
end
|
|
41
53
|
end
|
|
@@ -53,6 +65,10 @@ module Datadog
|
|
|
53
65
|
def analytics_sample_rate
|
|
54
66
|
datadog_configuration[:analytics_sample_rate]
|
|
55
67
|
end
|
|
68
|
+
|
|
69
|
+
def comment_propagation
|
|
70
|
+
datadog_configuration[:comment_propagation]
|
|
71
|
+
end
|
|
56
72
|
end
|
|
57
73
|
end
|
|
58
74
|
end
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
require_relative '../../configuration/settings'
|
|
4
4
|
require_relative '../ext'
|
|
5
5
|
|
|
6
|
+
require_relative '../../propagation/sql_comment/ext'
|
|
7
|
+
|
|
6
8
|
module Datadog
|
|
7
9
|
module Tracing
|
|
8
10
|
module Contrib
|
|
@@ -27,6 +29,16 @@ module Datadog
|
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
option :service_name, default: Ext::DEFAULT_PEER_SERVICE_NAME
|
|
32
|
+
|
|
33
|
+
option :comment_propagation do |o|
|
|
34
|
+
o.default do
|
|
35
|
+
ENV.fetch(
|
|
36
|
+
Contrib::Propagation::SqlComment::Ext::ENV_DBM_PROPAGATION_MODE,
|
|
37
|
+
Contrib::Propagation::SqlComment::Ext::DISABLED
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
o.lazy
|
|
41
|
+
end
|
|
30
42
|
end
|
|
31
43
|
end
|
|
32
44
|
end
|
|
@@ -11,7 +11,6 @@ module Datadog
|
|
|
11
11
|
ENV_ANALYTICS_ENABLED = 'DD_TRACE_PG_ANALYTICS_ENABLED'.freeze
|
|
12
12
|
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_PG_ANALYTICS_SAMPLE_RATE'.freeze
|
|
13
13
|
DEFAULT_PEER_SERVICE_NAME = 'pg'.freeze
|
|
14
|
-
SPAN_SYSTEM = 'postgresql'.freeze
|
|
15
14
|
SPAN_EXEC = 'pg.exec'.freeze
|
|
16
15
|
SPAN_EXEC_PARAMS = 'pg.exec.params'.freeze
|
|
17
16
|
SPAN_EXEC_PREPARED = 'pg.exec.prepared'.freeze
|
|
@@ -24,6 +23,8 @@ module Datadog
|
|
|
24
23
|
TAG_DB_NAME = 'pg.db.name'.freeze
|
|
25
24
|
TAG_COMPONENT = 'pg'.freeze
|
|
26
25
|
TAG_OPERATION_QUERY = 'query'.freeze
|
|
26
|
+
|
|
27
|
+
TAG_SYSTEM = 'postgresql'.freeze
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
end
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative '../../metadata/ext'
|
|
4
4
|
require_relative '../analytics'
|
|
5
|
+
require_relative '../ext'
|
|
5
6
|
require_relative 'ext'
|
|
6
7
|
|
|
8
|
+
require_relative '../propagation/sql_comment'
|
|
9
|
+
require_relative '../propagation/sql_comment/mode'
|
|
10
|
+
|
|
7
11
|
module Datadog
|
|
8
12
|
module Tracing
|
|
9
13
|
module Contrib
|
|
@@ -17,68 +21,77 @@ module Datadog
|
|
|
17
21
|
# PG::Connection patch methods
|
|
18
22
|
module InstanceMethods
|
|
19
23
|
def exec(sql, *args)
|
|
20
|
-
trace(Ext::SPAN_EXEC,
|
|
21
|
-
super(
|
|
24
|
+
trace(Ext::SPAN_EXEC, sql: sql) do |sql_statement|
|
|
25
|
+
super(sql_statement, *args)
|
|
22
26
|
end
|
|
23
27
|
end
|
|
24
28
|
|
|
25
29
|
def exec_params(sql, params, *args)
|
|
26
|
-
trace(Ext::SPAN_EXEC_PARAMS,
|
|
27
|
-
super(
|
|
30
|
+
trace(Ext::SPAN_EXEC_PARAMS, sql: sql) do |sql_statement|
|
|
31
|
+
super(sql_statement, params, *args)
|
|
28
32
|
end
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
def exec_prepared(statement_name, params, *args)
|
|
32
|
-
trace(Ext::SPAN_EXEC_PREPARED,
|
|
36
|
+
trace(Ext::SPAN_EXEC_PREPARED, statement_name: statement_name) do
|
|
33
37
|
super(statement_name, params, *args)
|
|
34
38
|
end
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
def async_exec(sql, *args)
|
|
38
|
-
trace(Ext::SPAN_ASYNC_EXEC,
|
|
39
|
-
super(
|
|
42
|
+
trace(Ext::SPAN_ASYNC_EXEC, sql: sql) do |sql_statement|
|
|
43
|
+
super(sql_statement, *args)
|
|
40
44
|
end
|
|
41
45
|
end
|
|
42
46
|
|
|
43
47
|
def async_exec_params(sql, params, *args)
|
|
44
|
-
trace(Ext::SPAN_ASYNC_EXEC_PARAMS,
|
|
45
|
-
super(
|
|
48
|
+
trace(Ext::SPAN_ASYNC_EXEC_PARAMS, sql: sql) do |sql_statement|
|
|
49
|
+
super(sql_statement, params, *args)
|
|
46
50
|
end
|
|
47
51
|
end
|
|
48
52
|
|
|
49
53
|
def async_exec_prepared(statement_name, params, *args)
|
|
50
|
-
trace(Ext::SPAN_ASYNC_EXEC_PREPARED,
|
|
54
|
+
trace(Ext::SPAN_ASYNC_EXEC_PREPARED, statement_name: statement_name) do
|
|
51
55
|
super(statement_name, params, *args)
|
|
52
56
|
end
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
def sync_exec(sql, *args)
|
|
56
|
-
trace(Ext::SPAN_SYNC_EXEC,
|
|
57
|
-
super(
|
|
60
|
+
trace(Ext::SPAN_SYNC_EXEC, sql: sql) do |sql_statement|
|
|
61
|
+
super(sql_statement, *args)
|
|
58
62
|
end
|
|
59
63
|
end
|
|
60
64
|
|
|
61
65
|
def sync_exec_params(sql, params, *args)
|
|
62
|
-
trace(Ext::SPAN_SYNC_EXEC_PARAMS,
|
|
63
|
-
super(
|
|
66
|
+
trace(Ext::SPAN_SYNC_EXEC_PARAMS, sql: sql) do |sql_statement|
|
|
67
|
+
super(sql_statement, params, *args)
|
|
64
68
|
end
|
|
65
69
|
end
|
|
66
70
|
|
|
67
71
|
def sync_exec_prepared(statement_name, params, *args)
|
|
68
|
-
trace(Ext::SPAN_SYNC_EXEC_PREPARED,
|
|
72
|
+
trace(Ext::SPAN_SYNC_EXEC_PREPARED, statement_name: statement_name) do
|
|
69
73
|
super(statement_name, params, *args)
|
|
70
74
|
end
|
|
71
75
|
end
|
|
72
76
|
|
|
73
77
|
private
|
|
74
78
|
|
|
75
|
-
def trace(name,
|
|
79
|
+
def trace(name, sql: nil, statement_name: nil)
|
|
76
80
|
service = Datadog.configuration_for(self, :service_name) || datadog_configuration[:service_name]
|
|
81
|
+
resource = statement_name || sql
|
|
82
|
+
|
|
77
83
|
Tracing.trace(name, service: service, resource: resource, type: Tracing::Metadata::Ext::SQL::TYPE) do |span|
|
|
78
84
|
annotate_span_with_query!(span, service)
|
|
79
85
|
# Set analytics sample rate
|
|
80
86
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
81
|
-
|
|
87
|
+
|
|
88
|
+
if sql
|
|
89
|
+
propagation_mode = Contrib::Propagation::SqlComment::Mode.new(comment_propagation)
|
|
90
|
+
Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
|
|
91
|
+
propagated_sql_statement = Contrib::Propagation::SqlComment.prepend_comment(sql, span, propagation_mode)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
result = yield(propagated_sql_statement)
|
|
82
95
|
annotate_span_with_result!(span, result)
|
|
83
96
|
result
|
|
84
97
|
end
|
|
@@ -95,9 +108,9 @@ module Datadog
|
|
|
95
108
|
span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, service)
|
|
96
109
|
span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, host)
|
|
97
110
|
|
|
98
|
-
span.set_tag(
|
|
99
|
-
span.set_tag(
|
|
100
|
-
span.set_tag(
|
|
111
|
+
span.set_tag(Contrib::Ext::DB::TAG_INSTANCE, db)
|
|
112
|
+
span.set_tag(Contrib::Ext::DB::TAG_USER, user)
|
|
113
|
+
span.set_tag(Contrib::Ext::DB::TAG_SYSTEM, Ext::TAG_SYSTEM)
|
|
101
114
|
|
|
102
115
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, host)
|
|
103
116
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, port)
|
|
@@ -106,7 +119,7 @@ module Datadog
|
|
|
106
119
|
end
|
|
107
120
|
|
|
108
121
|
def annotate_span_with_result!(span, result)
|
|
109
|
-
span.set_tag(
|
|
122
|
+
span.set_tag(Contrib::Ext::DB::TAG_ROW_COUNT, result.ntuples)
|
|
110
123
|
end
|
|
111
124
|
|
|
112
125
|
def datadog_configuration
|
|
@@ -120,6 +133,10 @@ module Datadog
|
|
|
120
133
|
def analytics_sample_rate
|
|
121
134
|
datadog_configuration[:analytics_sample_rate]
|
|
122
135
|
end
|
|
136
|
+
|
|
137
|
+
def comment_propagation
|
|
138
|
+
datadog_configuration[:comment_propagation]
|
|
139
|
+
end
|
|
123
140
|
end
|
|
124
141
|
end
|
|
125
142
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# typed: false
|
|
4
|
+
|
|
5
|
+
require 'erb'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Tracing
|
|
9
|
+
module Contrib
|
|
10
|
+
module Propagation
|
|
11
|
+
module SqlComment
|
|
12
|
+
# To be prepended to a sql statement.
|
|
13
|
+
class Comment
|
|
14
|
+
def initialize(hash)
|
|
15
|
+
@hash = hash
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_s
|
|
19
|
+
@string ||= begin
|
|
20
|
+
ret = String.new
|
|
21
|
+
|
|
22
|
+
@hash.each do |key, value|
|
|
23
|
+
next if value.nil?
|
|
24
|
+
|
|
25
|
+
# Url encode
|
|
26
|
+
value = ERB::Util.url_encode(value)
|
|
27
|
+
|
|
28
|
+
# Escape SQL
|
|
29
|
+
ret << "#{key}='#{value}',"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Remove the last `,`
|
|
33
|
+
ret.chop!
|
|
34
|
+
|
|
35
|
+
"/*#{ret}*/"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Contrib
|
|
6
|
+
module Propagation
|
|
7
|
+
module SqlComment
|
|
8
|
+
module Ext
|
|
9
|
+
ENV_DBM_PROPAGATION_MODE = 'DD_DBM_PROPAGATION_MODE'.freeze
|
|
10
|
+
|
|
11
|
+
# The default mode for sql comment propagation
|
|
12
|
+
DISABLED = 'disabled'.freeze
|
|
13
|
+
|
|
14
|
+
# The `service` mode propagates service configuration
|
|
15
|
+
SERVICE = 'service'.freeze
|
|
16
|
+
|
|
17
|
+
# The `full` mode propagates service configuration + trace context
|
|
18
|
+
FULL = 'full'.freeze
|
|
19
|
+
|
|
20
|
+
# The value should be `true` when `full` mode
|
|
21
|
+
TAG_DBM_TRACE_INJECTED = '_dd.dbm_trace_injected'.freeze
|
|
22
|
+
|
|
23
|
+
KEY_DATABASE_SERVICE = 'dddbs'.freeze
|
|
24
|
+
KEY_ENVIRONMENT = 'dde'.freeze
|
|
25
|
+
KEY_PARENT_SERVICE = 'ddps'.freeze
|
|
26
|
+
KEY_VERSION = 'ddpv'.freeze
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Tracing
|
|
7
|
+
module Contrib
|
|
8
|
+
module Propagation
|
|
9
|
+
# Implements sql comment propagation related contracts.
|
|
10
|
+
module SqlComment
|
|
11
|
+
Mode = Struct.new(:mode) do
|
|
12
|
+
def enabled?
|
|
13
|
+
service? || full?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def service?
|
|
17
|
+
mode == Ext::SERVICE
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def full?
|
|
21
|
+
mode == Ext::FULL
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|