datadog 2.2.0 → 2.4.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/CHANGELOG.md +87 -2
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +9 -1
- data/ext/datadog_profiling_loader/extconf.rb +14 -26
- data/ext/datadog_profiling_native_extension/clock_id.h +1 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -2
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +1 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +257 -69
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +53 -28
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +34 -4
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +4 -0
- data/ext/datadog_profiling_native_extension/collectors_stack.c +136 -81
- data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +661 -48
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +10 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +83 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +53 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +91 -69
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +50 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +75 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +54 -12
- data/ext/datadog_profiling_native_extension/heap_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/helpers.h +6 -17
- data/ext/datadog_profiling_native_extension/http_transport.c +41 -9
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +0 -86
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +2 -23
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +61 -172
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +116 -139
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +20 -11
- data/ext/datadog_profiling_native_extension/profiling.c +1 -3
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +0 -33
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +1 -26
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +14 -2
- data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -0
- data/ext/datadog_profiling_native_extension/time_helpers.c +0 -15
- data/ext/datadog_profiling_native_extension/time_helpers.h +36 -6
- data/ext/{datadog_profiling_native_extension → libdatadog_api}/crashtracker.c +37 -22
- data/ext/libdatadog_api/datadog_ruby_common.c +83 -0
- data/ext/libdatadog_api/datadog_ruby_common.h +53 -0
- data/ext/libdatadog_api/extconf.rb +108 -0
- data/ext/libdatadog_api/macos_development.md +26 -0
- data/ext/libdatadog_extconf_helpers.rb +130 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +2184 -108
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1430 -2
- data/lib/datadog/appsec/component.rb +29 -8
- data/lib/datadog/appsec/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +1 -0
- data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +21 -0
- data/lib/datadog/appsec/contrib/devise/patcher.rb +12 -2
- data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +35 -0
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +109 -0
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +71 -0
- data/lib/datadog/appsec/contrib/graphql/integration.rb +54 -0
- data/lib/datadog/appsec/contrib/graphql/patcher.rb +37 -0
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +59 -0
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +3 -6
- data/lib/datadog/appsec/event.rb +1 -1
- data/lib/datadog/appsec/processor/actions.rb +1 -1
- data/lib/datadog/appsec/processor/rule_loader.rb +3 -1
- data/lib/datadog/appsec/processor/rule_merger.rb +33 -15
- data/lib/datadog/appsec/processor.rb +36 -37
- data/lib/datadog/appsec/rate_limiter.rb +25 -40
- data/lib/datadog/appsec/remote.rb +7 -3
- data/lib/datadog/appsec/response.rb +15 -1
- data/lib/datadog/appsec.rb +3 -2
- data/lib/datadog/core/configuration/components.rb +18 -15
- data/lib/datadog/core/configuration/settings.rb +135 -9
- data/lib/datadog/core/crashtracking/agent_base_url.rb +21 -0
- data/lib/datadog/core/crashtracking/component.rb +111 -0
- data/lib/datadog/core/crashtracking/tag_builder.rb +39 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +8 -11
- data/lib/datadog/core/environment/execution.rb +5 -5
- data/lib/datadog/core/metrics/client.rb +7 -0
- data/lib/datadog/core/rate_limiter.rb +183 -0
- data/lib/datadog/core/remote/client/capabilities.rb +4 -3
- data/lib/datadog/core/remote/component.rb +4 -2
- data/lib/datadog/core/remote/negotiation.rb +4 -4
- data/lib/datadog/core/remote/tie.rb +2 -0
- data/lib/datadog/core/runtime/metrics.rb +1 -1
- data/lib/datadog/core/telemetry/component.rb +51 -2
- data/lib/datadog/core/telemetry/emitter.rb +9 -11
- data/lib/datadog/core/telemetry/event.rb +37 -1
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +10 -12
- data/lib/datadog/core/telemetry/http/ext.rb +3 -0
- data/lib/datadog/core/telemetry/http/transport.rb +38 -9
- data/lib/datadog/core/telemetry/logger.rb +51 -0
- data/lib/datadog/core/telemetry/logging.rb +71 -0
- data/lib/datadog/core/telemetry/request.rb +13 -1
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +102 -0
- data/lib/datadog/core/utils/time.rb +12 -0
- data/lib/datadog/di/code_tracker.rb +168 -0
- data/lib/datadog/di/configuration/settings.rb +163 -0
- data/lib/datadog/di/configuration.rb +11 -0
- data/lib/datadog/di/error.rb +31 -0
- data/lib/datadog/di/extensions.rb +16 -0
- data/lib/datadog/di/probe.rb +133 -0
- data/lib/datadog/di/probe_builder.rb +41 -0
- data/lib/datadog/di/redactor.rb +188 -0
- data/lib/datadog/di/serializer.rb +193 -0
- data/lib/datadog/di.rb +14 -0
- data/lib/datadog/kit/appsec/events.rb +2 -4
- data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +10 -0
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +23 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +7 -7
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +28 -26
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +11 -13
- data/lib/datadog/profiling/collectors/info.rb +15 -6
- data/lib/datadog/profiling/collectors/thread_context.rb +30 -2
- data/lib/datadog/profiling/component.rb +89 -95
- data/lib/datadog/profiling/exporter.rb +3 -3
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -3
- data/lib/datadog/profiling/ext.rb +21 -21
- data/lib/datadog/profiling/flush.rb +1 -1
- data/lib/datadog/profiling/http_transport.rb +14 -7
- data/lib/datadog/profiling/load_native_extension.rb +5 -5
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +5 -8
- data/lib/datadog/profiling/scheduler.rb +33 -25
- data/lib/datadog/profiling/stack_recorder.rb +3 -0
- data/lib/datadog/profiling/tag_builder.rb +2 -2
- data/lib/datadog/profiling/tasks/exec.rb +5 -5
- data/lib/datadog/profiling/tasks/setup.rb +16 -35
- data/lib/datadog/profiling.rb +4 -5
- data/lib/datadog/single_step_instrument.rb +12 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +78 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -0
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +3 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/ext.rb +14 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -0
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +19 -0
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +9 -12
- data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +14 -10
- data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +10 -4
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +18 -15
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -5
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +1 -14
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +1 -14
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +15 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +17 -13
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -6
- data/lib/datadog/tracing/contrib/patcher.rb +2 -1
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/presto/patcher.rb +1 -13
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +5 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +22 -10
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +27 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +4 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +3 -2
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -1
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +14 -16
- data/lib/datadog/tracing/distributed/propagation.rb +7 -0
- data/lib/datadog/tracing/metadata/errors.rb +9 -1
- data/lib/datadog/tracing/metadata/ext.rb +6 -0
- data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
- data/lib/datadog/tracing/remote.rb +5 -2
- data/lib/datadog/tracing/sampling/matcher.rb +6 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/rule.rb +2 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +9 -5
- data/lib/datadog/tracing/sampling/span/ext.rb +1 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +2 -2
- data/lib/datadog/tracing/span.rb +9 -2
- data/lib/datadog/tracing/span_event.rb +41 -0
- data/lib/datadog/tracing/span_operation.rb +6 -2
- data/lib/datadog/tracing/trace_operation.rb +26 -2
- data/lib/datadog/tracing/tracer.rb +14 -12
- data/lib/datadog/tracing/transport/http/client.rb +1 -0
- data/lib/datadog/tracing/transport/io/client.rb +1 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +1 -1
- data/lib/datadog/tracing/workers.rb +1 -1
- data/lib/datadog/version.rb +1 -1
- metadata +46 -11
- data/lib/datadog/profiling/crashtracker.rb +0 -91
- data/lib/datadog/profiling/ext/forking.rb +0 -98
- data/lib/datadog/tracing/sampling/rate_limiter.rb +0 -185
@@ -93,11 +93,16 @@ module Datadog
|
|
93
93
|
span.resource = "#{method} #{quantized_url}"
|
94
94
|
Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
|
95
95
|
rescue StandardError => e
|
96
|
+
# TODO: Refactor the code to streamline the execution without ensure
|
96
97
|
Datadog.logger.error(e.message)
|
98
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
97
99
|
ensure
|
98
100
|
# the call is still executed
|
99
101
|
response = super
|
100
|
-
|
102
|
+
|
103
|
+
if response && response.respond_to?(:status)
|
104
|
+
span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, response.status)
|
105
|
+
end
|
101
106
|
end
|
102
107
|
end
|
103
108
|
response
|
@@ -7,7 +7,21 @@ module Datadog
|
|
7
7
|
module Ext
|
8
8
|
# @public_api
|
9
9
|
module DB
|
10
|
+
# Name of the database. This is *not* the database hostname.
|
11
|
+
#
|
12
|
+
# For databases which support such a concept, the default schema/database/namespace
|
13
|
+
# as configured in the connection string.
|
14
|
+
#
|
15
|
+
# If the tracer is already tracking changes to the default schema/database throughout the lifetime of
|
16
|
+
# the session (i.e. the client executes USE {NEW_SCHEMA} and now the default schema has changed from what
|
17
|
+
# was set upon connection initialization), then ideally this attribute reflects the “current” value.
|
18
|
+
# If the tracer is not already tracking changes then just leaving it to the default value set upon
|
19
|
+
# initialization is OK.
|
20
|
+
#
|
21
|
+
# This is the equivalent of OTel’s `db.namespace`
|
22
|
+
# @see https://opentelemetry.io/docs/specs/semconv/database/database-spans/#common-attributes
|
10
23
|
TAG_INSTANCE = 'db.instance'
|
24
|
+
|
11
25
|
TAG_USER = 'db.user'
|
12
26
|
TAG_SYSTEM = 'db.system'
|
13
27
|
TAG_STATEMENT = 'db.statement'
|
@@ -7,6 +7,7 @@ require_relative '../http'
|
|
7
7
|
require_relative '../analytics'
|
8
8
|
require_relative 'ext'
|
9
9
|
require_relative '../http_annotation_helper'
|
10
|
+
require_relative '../../../core/telemetry/logger'
|
10
11
|
|
11
12
|
module Datadog
|
12
13
|
module Tracing
|
@@ -37,6 +38,7 @@ module Datadog
|
|
37
38
|
|
38
39
|
attr_reader :app
|
39
40
|
|
41
|
+
# rubocop:disable Metrics/AbcSize
|
40
42
|
def annotate!(span, env, options)
|
41
43
|
span.resource = resource_name(env)
|
42
44
|
span.service = service_name(env[:url].host, options)
|
@@ -75,7 +77,11 @@ module Datadog
|
|
75
77
|
)
|
76
78
|
|
77
79
|
Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
|
80
|
+
rescue StandardError => e
|
81
|
+
Datadog.logger.error(e.message)
|
82
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
78
83
|
end
|
84
|
+
# rubocop:enable Metrics/AbcSize
|
79
85
|
|
80
86
|
def handle_response(span, env, options)
|
81
87
|
span.set_error(["Error #{env[:status]}", env[:body]]) if options[:error_status_codes].include? env[:status]
|
@@ -85,6 +91,9 @@ module Datadog
|
|
85
91
|
span.set_tags(
|
86
92
|
Datadog.configuration.tracing.header_tags.response_tags(env[:response_headers])
|
87
93
|
)
|
94
|
+
rescue StandardError => e
|
95
|
+
Datadog.logger.error(e.message)
|
96
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
88
97
|
end
|
89
98
|
|
90
99
|
def propagate!(trace, span, env)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../../../core'
|
4
|
+
require_relative '../../../core/telemetry/logger'
|
4
5
|
require_relative '../../metadata/ext'
|
5
6
|
require_relative '../analytics'
|
6
7
|
require_relative '../rack/ext'
|
@@ -41,6 +42,7 @@ module Datadog
|
|
41
42
|
|
42
43
|
# collect endpoint details
|
43
44
|
endpoint = payload.fetch(:endpoint)
|
45
|
+
env = payload.fetch(:env)
|
44
46
|
api_view = api_view(endpoint.options[:for])
|
45
47
|
request_method = endpoint.options.fetch(:method).first
|
46
48
|
path = endpoint_expand_path(endpoint)
|
@@ -61,9 +63,22 @@ module Datadog
|
|
61
63
|
span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
|
62
64
|
span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ENDPOINT_RUN)
|
63
65
|
|
66
|
+
if (grape_route = env['grape.routing_args']) && grape_route[:route_info]
|
67
|
+
trace.set_tag(
|
68
|
+
Tracing::Metadata::Ext::HTTP::TAG_ROUTE,
|
69
|
+
# here we are removing the format from the path:
|
70
|
+
# e.g. /path/to/resource(.json) => /path/to/resource
|
71
|
+
# e.g. /path/to/resource(.:format) => /path/to/resource
|
72
|
+
grape_route[:route_info].path&.gsub(/\(\.:?\w+\)\z/, '')
|
73
|
+
)
|
74
|
+
|
75
|
+
trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH, env['SCRIPT_NAME'])
|
76
|
+
end
|
77
|
+
|
64
78
|
Thread.current[KEY_RUN] = true
|
65
79
|
rescue StandardError => e
|
66
80
|
Datadog.logger.error(e.message)
|
81
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
67
82
|
end
|
68
83
|
|
69
84
|
def endpoint_run(name, start, finish, id, payload)
|
@@ -107,6 +122,7 @@ module Datadog
|
|
107
122
|
end
|
108
123
|
rescue StandardError => e
|
109
124
|
Datadog.logger.error(e.message)
|
125
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
110
126
|
end
|
111
127
|
|
112
128
|
# Status code resolution is tied to the exception handling
|
@@ -150,6 +166,7 @@ module Datadog
|
|
150
166
|
Thread.current[KEY_RENDER] = true
|
151
167
|
rescue StandardError => e
|
152
168
|
Datadog.logger.error(e.message)
|
169
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
153
170
|
end
|
154
171
|
|
155
172
|
def endpoint_render(name, start, finish, id, payload)
|
@@ -174,6 +191,7 @@ module Datadog
|
|
174
191
|
end
|
175
192
|
rescue StandardError => e
|
176
193
|
Datadog.logger.error(e.message)
|
194
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
177
195
|
end
|
178
196
|
|
179
197
|
def endpoint_run_filters(name, start, finish, id, payload)
|
@@ -212,6 +230,7 @@ module Datadog
|
|
212
230
|
end
|
213
231
|
rescue StandardError => e
|
214
232
|
Datadog.logger.error(e.message)
|
233
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
215
234
|
end
|
216
235
|
|
217
236
|
private
|
@@ -21,13 +21,18 @@ module Datadog
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def patch
|
24
|
+
# DEV-3.0: We should remove as many patching options as possible, given the alternatives do not
|
25
|
+
# DEV-3.0: provide any benefit to the recommended `with_unified_tracer` patching method.
|
26
|
+
# DEV-3.0: `with_deprecated_tracer` is likely safe to remove.
|
27
|
+
# DEV-3.0: `with_unified_tracer: false` should be removed if possible.
|
28
|
+
# DEV-3.0: `with_unified_tracer: true` should be the default and hopefully not even necessary as an option.
|
24
29
|
if configuration[:with_deprecated_tracer]
|
25
|
-
TracingPatcher.patch!(schemas
|
30
|
+
TracingPatcher.patch!(schemas)
|
26
31
|
elsif Integration.trace_supported?
|
27
32
|
if configuration[:with_unified_tracer]
|
28
|
-
UnifiedTracePatcher.patch!(schemas
|
33
|
+
UnifiedTracePatcher.patch!(schemas)
|
29
34
|
else
|
30
|
-
TracePatcher.patch!(schemas
|
35
|
+
TracePatcher.patch!(schemas)
|
31
36
|
end
|
32
37
|
else
|
33
38
|
Datadog.logger.warn(
|
@@ -35,18 +40,10 @@ module Datadog
|
|
35
40
|
'or Datadog::Tracing::Contrib::GraphQL::UnifiedTrace.'\
|
36
41
|
'Falling back to GraphQL::Tracing::DataDogTracing.'
|
37
42
|
)
|
38
|
-
TracingPatcher.patch!(schemas
|
43
|
+
TracingPatcher.patch!(schemas)
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
42
|
-
def trace_options
|
43
|
-
{
|
44
|
-
service: configuration[:service_name],
|
45
|
-
analytics_enabled: Contrib::Analytics.enabled?(configuration[:analytics_enabled]),
|
46
|
-
analytics_sample_rate: configuration[:analytics_sample_rate]
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
47
|
def configuration
|
51
48
|
Datadog.configuration.tracing[:graphql]
|
52
49
|
end
|
@@ -8,12 +8,12 @@ module Datadog
|
|
8
8
|
module TracePatcher
|
9
9
|
module_function
|
10
10
|
|
11
|
-
def patch!(schemas
|
11
|
+
def patch!(schemas)
|
12
12
|
if schemas.empty?
|
13
|
-
::GraphQL::Schema.trace_with(::GraphQL::Tracing::DataDogTrace
|
13
|
+
::GraphQL::Schema.trace_with(::GraphQL::Tracing::DataDogTrace)
|
14
14
|
else
|
15
15
|
schemas.each do |schema|
|
16
|
-
schema.trace_with(::GraphQL::Tracing::DataDogTrace
|
16
|
+
schema.trace_with(::GraphQL::Tracing::DataDogTrace)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -8,13 +8,13 @@ module Datadog
|
|
8
8
|
module TracingPatcher
|
9
9
|
module_function
|
10
10
|
|
11
|
-
def patch!(schemas
|
11
|
+
def patch!(schemas)
|
12
12
|
if schemas.empty?
|
13
|
-
::GraphQL::Schema.tracer(::GraphQL::Tracing::DataDogTracing.new
|
13
|
+
::GraphQL::Schema.tracer(::GraphQL::Tracing::DataDogTracing.new)
|
14
14
|
else
|
15
15
|
schemas.each do |schema|
|
16
16
|
if schema.respond_to? :use
|
17
|
-
schema.use(::GraphQL::Tracing::DataDogTracing
|
17
|
+
schema.use(::GraphQL::Tracing::DataDogTracing)
|
18
18
|
else
|
19
19
|
Datadog.logger.warn("Unable to patch #{schema}: Please migrate to class-based schema.")
|
20
20
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'graphql
|
3
|
+
require 'graphql'
|
4
4
|
|
5
5
|
module Datadog
|
6
6
|
module Tracing
|
@@ -11,14 +11,7 @@ module Datadog
|
|
11
11
|
# which is required to use features such as API Catalog.
|
12
12
|
# DEV-3.0: This tracer should be the default one in the next major version.
|
13
13
|
module UnifiedTrace
|
14
|
-
|
15
|
-
# @param analytics_sample_rate [Float] Deprecated
|
16
|
-
# @param service [String|nil] The service name to be set on the spans
|
17
|
-
def initialize(*args, analytics_enabled: false, analytics_sample_rate: 1.0, service: nil, **kwargs)
|
18
|
-
@analytics_enabled = analytics_enabled
|
19
|
-
@analytics_sample_rate = analytics_sample_rate
|
20
|
-
|
21
|
-
@service_name = service
|
14
|
+
def initialize(*args, **kwargs)
|
22
15
|
@has_prepare_span = respond_to?(:prepare_span)
|
23
16
|
super
|
24
17
|
end
|
@@ -139,7 +132,18 @@ module Datadog
|
|
139
132
|
private
|
140
133
|
|
141
134
|
def trace(callable, trace_key, resource, **kwargs)
|
142
|
-
|
135
|
+
config = Datadog.configuration.tracing[:graphql]
|
136
|
+
|
137
|
+
Tracing.trace(
|
138
|
+
"graphql.#{trace_key}",
|
139
|
+
type: 'graphql',
|
140
|
+
resource: resource,
|
141
|
+
service: config[:service_name]
|
142
|
+
) do |span|
|
143
|
+
if Contrib::Analytics.enabled?(config[:analytics_enabled])
|
144
|
+
Contrib::Analytics.set_sample_rate(span, config[:analytics_sample_rate])
|
145
|
+
end
|
146
|
+
|
143
147
|
yield(span) if block_given?
|
144
148
|
|
145
149
|
prepare_span(trace_key, kwargs, span) if @has_prepare_span
|
@@ -1,5 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
if Gem.loaded_specs['graphql'] && Gem.loaded_specs['graphql'].version >= Gem::Version.new('2.0.19')
|
4
|
+
require_relative 'unified_trace'
|
5
|
+
end
|
6
|
+
|
3
7
|
module Datadog
|
4
8
|
module Tracing
|
5
9
|
module Contrib
|
@@ -8,13 +12,15 @@ module Datadog
|
|
8
12
|
module UnifiedTracePatcher
|
9
13
|
module_function
|
10
14
|
|
11
|
-
|
12
|
-
|
15
|
+
# TODO: `GraphQL::Schema.trace_with` and `YOUR_SCHEMA.trace_with` don't mix.
|
16
|
+
# TODO: They create duplicate spans when combined.
|
17
|
+
# TODO: We should measure how frequently users use `YOUR_SCHEMA.trace_with`, and hopefully we can remove it.
|
18
|
+
def patch!(schemas)
|
13
19
|
if schemas.empty?
|
14
|
-
::GraphQL::Schema.trace_with(UnifiedTrace
|
20
|
+
::GraphQL::Schema.trace_with(UnifiedTrace)
|
15
21
|
else
|
16
22
|
schemas.each do |schema|
|
17
|
-
schema.trace_with(UnifiedTrace
|
23
|
+
schema.trace_with(UnifiedTrace)
|
18
24
|
end
|
19
25
|
end
|
20
26
|
end
|
@@ -6,6 +6,7 @@ require_relative '../../metadata/ext'
|
|
6
6
|
require_relative '../analytics'
|
7
7
|
require_relative '../http_annotation_helper'
|
8
8
|
require_relative '../utils/quantization/http'
|
9
|
+
require_relative '../../../core/telemetry/logger'
|
9
10
|
|
10
11
|
module Datadog
|
11
12
|
module Tracing
|
@@ -30,23 +31,19 @@ module Datadog
|
|
30
31
|
return super(req, body, &block) if Contrib::HTTP.should_skip_tracing?(req)
|
31
32
|
|
32
33
|
Tracing.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span, trace|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
Contrib::HTTP.inject(trace, req)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Add additional request specific tags to the span.
|
43
|
-
annotate_span_with_request!(span, req, request_options)
|
44
|
-
rescue StandardError => e
|
45
|
-
Datadog.logger.error("error preparing span for http request: #{e}")
|
46
|
-
ensure
|
47
|
-
response = super(req, body, &block)
|
34
|
+
span.service = service_name(host, request_options, client_config)
|
35
|
+
span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
|
36
|
+
span.resource = req.method
|
37
|
+
|
38
|
+
if Tracing.enabled? && !Contrib::HTTP.should_skip_distributed_tracing?(client_config)
|
39
|
+
Contrib::HTTP.inject(trace, req)
|
48
40
|
end
|
49
41
|
|
42
|
+
# Add additional request specific tags to the span.
|
43
|
+
annotate_span_with_request!(span, req, request_options)
|
44
|
+
|
45
|
+
response = super(req, body, &block)
|
46
|
+
|
50
47
|
# Add additional response specific tags to the span.
|
51
48
|
annotate_span_with_response!(span, response, request_options)
|
52
49
|
|
@@ -91,6 +88,9 @@ module Datadog
|
|
91
88
|
)
|
92
89
|
|
93
90
|
Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
|
91
|
+
rescue StandardError => e
|
92
|
+
Datadog.logger.error("error preparing span from http request: #{e}")
|
93
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
94
94
|
end
|
95
95
|
|
96
96
|
def annotate_span_with_response!(span, response, request_options)
|
@@ -103,6 +103,9 @@ module Datadog
|
|
103
103
|
span.set_tags(
|
104
104
|
Datadog.configuration.tracing.header_tags.response_tags(response)
|
105
105
|
)
|
106
|
+
rescue StandardError => e
|
107
|
+
Datadog.logger.error("error preparing span from http response: #{e}")
|
108
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
106
109
|
end
|
107
110
|
|
108
111
|
def annotate_span_with_error!(span, error)
|
@@ -4,6 +4,7 @@ require_relative '../../metadata/ext'
|
|
4
4
|
require_relative '../http'
|
5
5
|
require_relative '../analytics'
|
6
6
|
require_relative '../http_annotation_helper'
|
7
|
+
require_relative '../../../core/telemetry/logger'
|
7
8
|
|
8
9
|
module Datadog
|
9
10
|
module Tracing
|
@@ -36,7 +37,8 @@ module Datadog
|
|
36
37
|
# Add additional request specific tags to the span.
|
37
38
|
annotate_span_with_request!(span, req, request_options)
|
38
39
|
rescue StandardError => e
|
39
|
-
logger.error("error preparing span for httpclient request: #{e}, Source: #{e.backtrace}")
|
40
|
+
Datadog.logger.error("error preparing span for httpclient request: #{e}, Source: #{e.backtrace}")
|
41
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
40
42
|
ensure
|
41
43
|
res = super
|
42
44
|
end
|
@@ -100,6 +102,9 @@ module Datadog
|
|
100
102
|
span.set_tags(
|
101
103
|
Datadog.configuration.tracing.header_tags.response_tags(response.header)
|
102
104
|
)
|
105
|
+
rescue StandardError => e
|
106
|
+
Datadog.logger.error("error preparing span from httpclient response: #{e}, Source: #{e.backtrace}")
|
107
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
103
108
|
end
|
104
109
|
|
105
110
|
def annotate_span_with_error!(span, error)
|
@@ -114,10 +119,6 @@ module Datadog
|
|
114
119
|
Contrib::Analytics.enabled?(request_options[:analytics_enabled])
|
115
120
|
end
|
116
121
|
|
117
|
-
def logger
|
118
|
-
Datadog.logger
|
119
|
-
end
|
120
|
-
|
121
122
|
def should_skip_distributed_tracing?(client_config)
|
122
123
|
return !client_config[:distributed_tracing] if client_config && client_config.key?(:distributed_tracing)
|
123
124
|
|
@@ -13,27 +13,14 @@ module Datadog
|
|
13
13
|
module Patcher
|
14
14
|
include Contrib::Patcher
|
15
15
|
|
16
|
-
PATCH_ONLY_ONCE = Core::Utils::OnlyOnce.new
|
17
|
-
|
18
16
|
module_function
|
19
17
|
|
20
|
-
def patched?
|
21
|
-
PATCH_ONLY_ONCE.ran?
|
22
|
-
end
|
23
|
-
|
24
18
|
def target_version
|
25
19
|
Integration.version
|
26
20
|
end
|
27
21
|
|
28
|
-
# patch applies our patch
|
29
22
|
def patch
|
30
|
-
|
31
|
-
begin
|
32
|
-
::HTTPClient.include(Instrumentation)
|
33
|
-
rescue StandardError => e
|
34
|
-
Datadog.logger.error("Unable to apply httpclient integration: #{e}")
|
35
|
-
end
|
36
|
-
end
|
23
|
+
::HTTPClient.include(Instrumentation)
|
37
24
|
end
|
38
25
|
end
|
39
26
|
end
|
@@ -4,6 +4,7 @@ require_relative '../../metadata/ext'
|
|
4
4
|
require_relative '../http'
|
5
5
|
require_relative '../analytics'
|
6
6
|
require_relative '../http_annotation_helper'
|
7
|
+
require_relative '../../../core/telemetry/logger'
|
7
8
|
|
8
9
|
module Datadog
|
9
10
|
module Tracing
|
@@ -35,6 +36,7 @@ module Datadog
|
|
35
36
|
annotate_span_with_request!(span, req, request_options)
|
36
37
|
rescue StandardError => e
|
37
38
|
logger.error("error preparing span for http.rb request: #{e}, Source: #{e.backtrace}")
|
39
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
38
40
|
ensure
|
39
41
|
res = super(req, options)
|
40
42
|
end
|
@@ -108,6 +110,9 @@ module Datadog
|
|
108
110
|
span.set_tags(
|
109
111
|
Datadog.configuration.tracing.header_tags.response_tags(response.headers)
|
110
112
|
)
|
113
|
+
rescue StandardError => e
|
114
|
+
logger.error("error preparing span from http.rb response: #{e}, Source: #{e.backtrace}")
|
115
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
111
116
|
end
|
112
117
|
|
113
118
|
def annotate_span_with_error!(span, error)
|
@@ -13,27 +13,14 @@ module Datadog
|
|
13
13
|
module Patcher
|
14
14
|
include Contrib::Patcher
|
15
15
|
|
16
|
-
PATCH_ONLY_ONCE = Core::Utils::OnlyOnce.new
|
17
|
-
|
18
16
|
module_function
|
19
17
|
|
20
|
-
def patched?
|
21
|
-
PATCH_ONLY_ONCE.ran?
|
22
|
-
end
|
23
|
-
|
24
18
|
def target_version
|
25
19
|
Integration.version
|
26
20
|
end
|
27
21
|
|
28
|
-
# patch applies our patch
|
29
22
|
def patch
|
30
|
-
|
31
|
-
begin
|
32
|
-
::HTTP::Client.include(Instrumentation)
|
33
|
-
rescue StandardError => e
|
34
|
-
Datadog.logger.error("Unable to apply httprb integration: #{e}")
|
35
|
-
end
|
36
|
-
end
|
23
|
+
::HTTP::Client.include(Instrumentation)
|
37
24
|
end
|
38
25
|
end
|
39
26
|
end
|
@@ -20,6 +20,21 @@ module Datadog
|
|
20
20
|
|
21
21
|
# patch applies our patch
|
22
22
|
def patch
|
23
|
+
# ActiveSupport::TaggedLogging is the default Rails logger since Rails 5
|
24
|
+
if defined?(::ActiveSupport::TaggedLogging::Formatter) &&
|
25
|
+
::Lograge::LogSubscribers::ActionController
|
26
|
+
.logger&.formatter.is_a?(::ActiveSupport::TaggedLogging::Formatter)
|
27
|
+
Datadog.logger.warn(
|
28
|
+
'Lograge and ActiveSupport::TaggedLogging (the default Rails log formatter) are not compatible: ' \
|
29
|
+
'Lograge does not account for Rails log tags, creating polluted logs and breaking log formatting. ' \
|
30
|
+
'Traces and Logs correlation may not work. ' \
|
31
|
+
'Either: 1. Disable tagged logging in your Rails configuration ' \
|
32
|
+
'`config.logger = ActiveSupport::Logger.new(STDOUT); ' \
|
33
|
+
'config.active_job.logger = ActiveSupport::Logger.new(STDOUT)` ' \
|
34
|
+
'or 2. Use the `semantic_logger` gem instead of `lograge`.'
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
23
38
|
::Lograge::LogSubscribers::Base.include(Instrumentation)
|
24
39
|
end
|
25
40
|
end
|
@@ -48,6 +48,11 @@ module Datadog
|
|
48
48
|
o.default Contrib::Propagation::SqlComment::Ext::DISABLED
|
49
49
|
end
|
50
50
|
|
51
|
+
option :append_comment do |o|
|
52
|
+
o.type :bool
|
53
|
+
o.default false
|
54
|
+
end
|
55
|
+
|
51
56
|
option :peer_service do |o|
|
52
57
|
o.type :string, nilable: true
|
53
58
|
o.env Ext::ENV_PEER_SERVICE
|
@@ -50,21 +50,14 @@ module Datadog
|
|
50
50
|
# Set analytics sample rate
|
51
51
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
52
52
|
|
53
|
+
span.set_tag(Contrib::Ext::DB::TAG_INSTANCE, query_options[:database])
|
53
54
|
span.set_tag(Ext::TAG_DB_NAME, query_options[:database])
|
54
55
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, query_options[:host])
|
55
56
|
span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, query_options[:port])
|
56
57
|
|
57
58
|
Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
|
62
|
-
sql = Contrib::Propagation::SqlComment.prepend_comment(
|
63
|
-
sql,
|
64
|
-
span,
|
65
|
-
trace_op,
|
66
|
-
propagation_mode
|
67
|
-
)
|
60
|
+
sql = inject_propagation(span, sql, trace_op)
|
68
61
|
|
69
62
|
super(sql, options)
|
70
63
|
end
|
@@ -72,6 +65,21 @@ module Datadog
|
|
72
65
|
|
73
66
|
private
|
74
67
|
|
68
|
+
def inject_propagation(span, sql, trace_op)
|
69
|
+
propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
|
70
|
+
datadog_configuration[:comment_propagation],
|
71
|
+
datadog_configuration[:append_comment]
|
72
|
+
)
|
73
|
+
|
74
|
+
Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
|
75
|
+
Contrib::Propagation::SqlComment.prepend_comment(
|
76
|
+
sql,
|
77
|
+
span,
|
78
|
+
trace_op,
|
79
|
+
propagation_mode
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
75
83
|
def datadog_configuration
|
76
84
|
Datadog.configuration.tracing[:mysql2]
|
77
85
|
end
|
@@ -83,10 +91,6 @@ module Datadog
|
|
83
91
|
def analytics_sample_rate
|
84
92
|
datadog_configuration[:analytics_sample_rate]
|
85
93
|
end
|
86
|
-
|
87
|
-
def comment_propagation
|
88
|
-
datadog_configuration[:comment_propagation]
|
89
|
-
end
|
90
94
|
end
|
91
95
|
end
|
92
96
|
end
|
@@ -6,6 +6,7 @@ require_relative 'ext'
|
|
6
6
|
require_relative '../ext'
|
7
7
|
require_relative '../integration'
|
8
8
|
require_relative '../patcher'
|
9
|
+
require_relative '../../../core/telemetry/logger'
|
9
10
|
|
10
11
|
module Datadog
|
11
12
|
module Tracing
|
@@ -81,6 +82,8 @@ module Datadog
|
|
81
82
|
Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
|
82
83
|
rescue StandardError => e
|
83
84
|
Datadog.logger.error(e.message)
|
85
|
+
Datadog::Core::Telemetry::Logger.report(e)
|
86
|
+
# TODO: Refactor the code to streamline the execution without ensure
|
84
87
|
ensure
|
85
88
|
begin
|
86
89
|
response = super
|
@@ -90,12 +93,16 @@ module Datadog
|
|
90
93
|
raise
|
91
94
|
end
|
92
95
|
# Set post-response tags
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
if response
|
97
|
+
if response.respond_to?(:status)
|
98
|
+
span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, response.status)
|
99
|
+
end
|
100
|
+
if response.respond_to?(:headers) && (response.headers || {})['content-length']
|
101
|
+
span.set_tag(
|
102
|
+
OpenSearch::Ext::TAG_RESPONSE_CONTENT_LENGTH,
|
103
|
+
response.headers['content-length'].to_i
|
104
|
+
)
|
105
|
+
end
|
99
106
|
end
|
100
107
|
end
|
101
108
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../../core/utils/only_once'
|
4
|
+
require_relative '../../core/telemetry/logger'
|
4
5
|
|
5
6
|
module Datadog
|
6
7
|
module Tracing
|
@@ -49,8 +50,8 @@ module Datadog
|
|
49
50
|
# Processes patching errors. This default implementation logs the error and reports relevant metrics.
|
50
51
|
# @param e [Exception]
|
51
52
|
def on_patch_error(e)
|
52
|
-
# Log the error
|
53
53
|
Datadog.logger.error("Failed to apply #{patch_name} patch. Cause: #{e} Location: #{Array(e.backtrace).first}")
|
54
|
+
Datadog::Core::Telemetry::Logger.report(e, description: "Failed to apply #{patch_name} patch")
|
54
55
|
|
55
56
|
@patch_error_result = {
|
56
57
|
type: e.class.name,
|
@@ -52,6 +52,11 @@ module Datadog
|
|
52
52
|
o.default Contrib::Propagation::SqlComment::Ext::DISABLED
|
53
53
|
end
|
54
54
|
|
55
|
+
option :append_comment do |o|
|
56
|
+
o.type :bool
|
57
|
+
o.default false
|
58
|
+
end
|
59
|
+
|
55
60
|
option :peer_service do |o|
|
56
61
|
o.type :string, nilable: true
|
57
62
|
o.env Ext::ENV_PEER_SERVICE
|