ddtrace 1.4.1 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|