datadog 2.20.0 → 2.26.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 +212 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +93 -23
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +21 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +9 -4
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +1 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
- data/ext/libdatadog_api/ddsketch.c +106 -0
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/init.c +5 -0
- data/ext/libdatadog_api/library_config.c +34 -25
- data/ext/libdatadog_api/process_discovery.c +24 -18
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/ai_guard/api_client.rb +82 -0
- data/lib/datadog/ai_guard/component.rb +42 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration/settings.rb +98 -0
- data/lib/datadog/ai_guard/configuration.rb +11 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +34 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +81 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +43 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +72 -0
- data/lib/datadog/ai_guard/ext.rb +16 -0
- data/lib/datadog/ai_guard.rb +153 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +26 -5
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- data/lib/datadog/appsec/assets/blocked.html +8 -0
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
- data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/compressed_json.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +9 -0
- data/lib/datadog/appsec/context.rb +2 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +3 -2
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +3 -1
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -4
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +7 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +3 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +10 -4
- data/lib/datadog/appsec/event.rb +12 -14
- data/lib/datadog/appsec/metrics/collector.rb +19 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +2 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -4
- data/lib/datadog/appsec/remote.rb +34 -25
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/security_engine/engine.rb +3 -3
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +19 -9
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -4
- data/lib/datadog/core/configuration/components.rb +59 -11
- data/lib/datadog/core/configuration/config_helper.rb +100 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +38 -43
- data/lib/datadog/core/configuration/option_definition.rb +4 -11
- data/lib/datadog/core/configuration/options.rb +9 -10
- data/lib/datadog/core/configuration/settings.rb +38 -9
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +373 -0
- data/lib/datadog/core/configuration.rb +2 -2
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +7 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/process.rb +87 -0
- data/lib/datadog/core/environment/variable_helpers.rb +3 -3
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/metrics/client.rb +2 -2
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +2 -4
- data/lib/datadog/core/process_discovery.rb +48 -23
- data/lib/datadog/core/rate_limiter.rb +9 -1
- data/lib/datadog/core/remote/client/capabilities.rb +7 -0
- data/lib/datadog/core/remote/client.rb +14 -6
- data/lib/datadog/core/remote/component.rb +10 -10
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +1 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +4 -25
- data/lib/datadog/core/remote/transport/http/config.rb +10 -50
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -1
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +69 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +89 -51
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +2 -2
- data/lib/datadog/core/telemetry/logging.rb +2 -8
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -3
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +3 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -11
- data/lib/datadog/core/telemetry/worker.rb +88 -32
- data/lib/datadog/core/transport/ext.rb +2 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +9 -5
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http.rb +22 -19
- data/lib/datadog/core/transport/response.rb +15 -1
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/array.rb +29 -0
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/time.rb +1 -1
- data/lib/datadog/core/utils.rb +2 -0
- data/lib/datadog/core/workers/async.rb +10 -1
- data/lib/datadog/core/workers/interval_loop.rb +44 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +100 -1
- data/lib/datadog/core.rb +2 -0
- data/lib/datadog/data_streams/configuration/settings.rb +49 -0
- data/lib/datadog/data_streams/configuration.rb +11 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +509 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +52 -0
- data/lib/datadog/data_streams/transport/http.rb +40 -0
- data/lib/datadog/data_streams/transport/stats.rb +46 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/boot.rb +7 -3
- data/lib/datadog/di/component.rb +14 -16
- data/lib/datadog/di/context.rb +70 -0
- data/lib/datadog/di/contrib/active_record.rb +30 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +34 -0
- data/lib/datadog/di/instrumenter.rb +189 -55
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +55 -15
- data/lib/datadog/di/probe_builder.rb +41 -2
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +1 -1
- data/lib/datadog/di/probe_manager.rb +50 -35
- data/lib/datadog/di/probe_notification_builder.rb +121 -70
- data/lib/datadog/di/probe_notifier_worker.rb +5 -5
- data/lib/datadog/di/proc_responder.rb +32 -0
- data/lib/datadog/di/remote.rb +89 -84
- data/lib/datadog/di/serializer.rb +151 -7
- data/lib/datadog/di/transport/diagnostics.rb +8 -36
- data/lib/datadog/di/transport/http/diagnostics.rb +1 -33
- data/lib/datadog/di/transport/http/input.rb +1 -33
- data/lib/datadog/di/transport/http.rb +32 -17
- data/lib/datadog/di/transport/input.rb +67 -34
- data/lib/datadog/di.rb +61 -5
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +2 -3
- data/lib/datadog/open_feature/component.rb +60 -0
- data/lib/datadog/open_feature/configuration.rb +27 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +14 -0
- data/lib/datadog/open_feature/native_evaluator.rb +38 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +141 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +70 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
- data/lib/datadog/opentelemetry/configuration/settings.rb +159 -0
- data/lib/datadog/opentelemetry/metrics.rb +117 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +26 -2
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +35 -0
- data/lib/datadog/opentelemetry.rb +3 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +41 -7
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -2
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +6 -5
- data/lib/datadog/profiling/component.rb +12 -11
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +18 -0
- data/lib/datadog/profiling/ext.rb +2 -1
- data/lib/datadog/profiling/http_transport.rb +5 -2
- data/lib/datadog/profiling/profiler.rb +4 -0
- data/lib/datadog/profiling/tag_builder.rb +36 -3
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling.rb +1 -2
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/tracing/component.rb +6 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +9 -3
- data/lib/datadog/tracing/configuration/settings.rb +89 -10
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/component.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/extensions.rb +10 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -43
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +59 -27
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
- data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +9 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +41 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +3 -2
- data/lib/datadog/tracing/metadata/ext.rb +9 -1
- data/lib/datadog/tracing/remote.rb +1 -9
- data/lib/datadog/tracing/sampling/priority_sampler.rb +3 -1
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +20 -9
- data/lib/datadog/tracing/trace_operation.rb +44 -6
- data/lib/datadog/tracing/tracer.rb +42 -16
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
- data/lib/datadog/tracing/transport/traces.rb +9 -71
- data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
- data/lib/datadog/tracing/writer.rb +1 -0
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +3 -0
- metadata +110 -24
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../distributed/fetcher'
|
|
4
|
+
require_relative '../../../distributed/propagation'
|
|
5
|
+
require_relative '../../../distributed/b3_multi'
|
|
6
|
+
require_relative '../../../distributed/b3_single'
|
|
7
|
+
require_relative '../../../distributed/datadog'
|
|
8
|
+
require_relative '../../../distributed/none'
|
|
9
|
+
require_relative '../../../distributed/trace_context'
|
|
10
|
+
require_relative '../../../configuration/ext'
|
|
11
|
+
|
|
12
|
+
module Datadog
|
|
13
|
+
module Tracing
|
|
14
|
+
module Contrib
|
|
15
|
+
module WaterDrop
|
|
16
|
+
module Distributed
|
|
17
|
+
# Extracts and injects propagation through Kafka message headers.
|
|
18
|
+
class Propagation < Tracing::Distributed::Propagation
|
|
19
|
+
def initialize(
|
|
20
|
+
propagation_style_inject:,
|
|
21
|
+
propagation_style_extract:,
|
|
22
|
+
propagation_extract_first:
|
|
23
|
+
)
|
|
24
|
+
super(
|
|
25
|
+
propagation_styles: {
|
|
26
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_MULTI_HEADER =>
|
|
27
|
+
Tracing::Distributed::B3Multi.new(fetcher: Tracing::Distributed::Fetcher),
|
|
28
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER =>
|
|
29
|
+
Tracing::Distributed::B3Single.new(fetcher: Tracing::Distributed::Fetcher),
|
|
30
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG =>
|
|
31
|
+
Tracing::Distributed::Datadog.new(fetcher: Tracing::Distributed::Fetcher),
|
|
32
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT =>
|
|
33
|
+
Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher),
|
|
34
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
|
|
35
|
+
Tracing::Distributed::Baggage.new(fetcher: Tracing::Distributed::Fetcher),
|
|
36
|
+
Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
|
|
37
|
+
},
|
|
38
|
+
propagation_style_inject: propagation_style_inject,
|
|
39
|
+
propagation_style_extract: propagation_style_extract,
|
|
40
|
+
propagation_extract_first: propagation_extract_first
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Contrib
|
|
6
|
+
module WaterDrop
|
|
7
|
+
module Ext
|
|
8
|
+
ENV_ENABLED = 'DD_TRACE_WATERDROP_ENABLED'
|
|
9
|
+
|
|
10
|
+
SPAN_PRODUCER = 'karafka.produce'
|
|
11
|
+
|
|
12
|
+
TAG_PRODUCER = 'kafka.producer'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
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 WaterDrop
|
|
11
|
+
# Description of WaterDrop integration
|
|
12
|
+
class Integration
|
|
13
|
+
include Contrib::Integration
|
|
14
|
+
|
|
15
|
+
# WaterDrop added class-level instrumentation in version 2.8.8.rc1
|
|
16
|
+
MINIMUM_VERSION = Gem::Version.new('2.8.8.rc1')
|
|
17
|
+
|
|
18
|
+
register_as :waterdrop, auto_patch: false
|
|
19
|
+
|
|
20
|
+
def self.version
|
|
21
|
+
Gem.loaded_specs['waterdrop']&.version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.loaded?
|
|
25
|
+
!defined?(::WaterDrop).nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.compatible?
|
|
29
|
+
super && version >= MINIMUM_VERSION
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def new_configuration
|
|
33
|
+
Configuration::Settings.new
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def patcher
|
|
37
|
+
Patcher
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Tracing
|
|
7
|
+
module Contrib
|
|
8
|
+
module WaterDrop
|
|
9
|
+
# Middleware to propagate tracing context in messages produced by WaterDrop
|
|
10
|
+
module Middleware
|
|
11
|
+
class << self
|
|
12
|
+
def call(message)
|
|
13
|
+
trace_op = Datadog::Tracing.active_trace
|
|
14
|
+
|
|
15
|
+
if trace_op && Datadog::Tracing::Distributed::PropagationPolicy.enabled?(
|
|
16
|
+
global_config: configuration,
|
|
17
|
+
trace: trace_op
|
|
18
|
+
)
|
|
19
|
+
WaterDrop.inject(trace_op.to_digest, message[:headers] ||= {})
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if Datadog::DataStreams.enabled?
|
|
23
|
+
Datadog::DataStreams.set_produce_checkpoint(
|
|
24
|
+
type: 'kafka',
|
|
25
|
+
destination: message[:topic],
|
|
26
|
+
auto_instrumentation: true
|
|
27
|
+
) do |key, value|
|
|
28
|
+
message[:headers] ||= {}
|
|
29
|
+
message[:headers][key] = value
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
message
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def configuration
|
|
39
|
+
Datadog.configuration.tracing[:waterdrop]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../patcher'
|
|
4
|
+
require_relative 'ext'
|
|
5
|
+
require_relative 'distributed/propagation'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Tracing
|
|
9
|
+
module Contrib
|
|
10
|
+
module WaterDrop
|
|
11
|
+
# Patcher enables patching of 'waterdrop' module.
|
|
12
|
+
module Patcher
|
|
13
|
+
include Contrib::Patcher
|
|
14
|
+
|
|
15
|
+
module_function
|
|
16
|
+
|
|
17
|
+
def target_version
|
|
18
|
+
Integration.version
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def patch
|
|
22
|
+
require_relative 'producer'
|
|
23
|
+
require_relative 'middleware'
|
|
24
|
+
|
|
25
|
+
::WaterDrop::Producer.prepend(Producer)
|
|
26
|
+
::WaterDrop.instrumentation.subscribe('producer.configured') do |event|
|
|
27
|
+
producer = event[:producer]
|
|
28
|
+
add_middleware(producer)
|
|
29
|
+
|
|
30
|
+
if Datadog.configuration.data_streams.enabled
|
|
31
|
+
producer.monitor.subscribe('message.acknowledged') do |ack_event|
|
|
32
|
+
if Datadog::DataStreams.enabled?
|
|
33
|
+
payload = ack_event.payload
|
|
34
|
+
Datadog::DataStreams.track_kafka_produce(payload[:topic], payload[:partition], payload[:offset])
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_middleware(producer)
|
|
42
|
+
included_middlewares = producer.middleware.instance_variable_get(:@steps)
|
|
43
|
+
producer.middleware.append(Middleware) unless included_middlewares.include?(Middleware)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Tracing
|
|
7
|
+
module Contrib
|
|
8
|
+
module WaterDrop
|
|
9
|
+
# Producer integration for WaterDrop
|
|
10
|
+
module Producer
|
|
11
|
+
%i[
|
|
12
|
+
produce_many_sync
|
|
13
|
+
produce_many_async
|
|
14
|
+
produce_sync
|
|
15
|
+
produce_async
|
|
16
|
+
].each do |method|
|
|
17
|
+
define_method(method) do |messages|
|
|
18
|
+
Datadog::Tracing.trace(Ext::SPAN_PRODUCER, resource: "waterdrop.#{__method__}") do
|
|
19
|
+
extract_span_tags(messages)
|
|
20
|
+
super(messages)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def extract_span_tags(messages)
|
|
28
|
+
messages = [messages] if messages.is_a?(Hash)
|
|
29
|
+
span = Datadog::Tracing.active_span
|
|
30
|
+
return unless span
|
|
31
|
+
|
|
32
|
+
topics = []
|
|
33
|
+
partitions = []
|
|
34
|
+
messages.each do |message|
|
|
35
|
+
topics << message[:topic]
|
|
36
|
+
partitions << message[:partition] if message.key?(:partition)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
span.set_tag(Ext::TAG_PRODUCER, id)
|
|
40
|
+
span.set_tag(Contrib::Karafka::Ext::TAG_MESSAGE_COUNT, messages.size)
|
|
41
|
+
span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Contrib::Karafka::Ext::TAG_SYSTEM)
|
|
42
|
+
|
|
43
|
+
span.set_tag(Contrib::Ext::Messaging::TAG_DESTINATION, topics.uniq.sort.join(','))
|
|
44
|
+
span.set_tag(Contrib::Karafka::Ext::TAG_PARTITION, partitions.uniq.sort.join(',')) if partitions.any?
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'component'
|
|
4
|
+
require_relative 'waterdrop/integration'
|
|
5
|
+
require_relative 'waterdrop/distributed/propagation'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Tracing
|
|
9
|
+
module Contrib
|
|
10
|
+
# `WaterDrop` integration public API
|
|
11
|
+
module WaterDrop
|
|
12
|
+
def self.inject(digest, data)
|
|
13
|
+
raise 'Please invoke Datadog.configure at least once before calling this method' unless @propagation
|
|
14
|
+
|
|
15
|
+
# Steep: https://github.com/soutaro/steep/issues/477
|
|
16
|
+
# @type ivar @propagation: WaterDrop::Distributed::Propagation
|
|
17
|
+
@propagation.inject!(digest, data)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.extract(data)
|
|
21
|
+
raise 'Please invoke Datadog.configure at least once before calling this method' unless @propagation
|
|
22
|
+
|
|
23
|
+
# Steep: https://github.com/soutaro/steep/issues/477
|
|
24
|
+
# @type ivar @propagation: WaterDrop::Distributed::Propagation
|
|
25
|
+
@propagation.extract(data)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
Contrib::Component.register('waterdrop') do |config|
|
|
29
|
+
tracing = config.tracing
|
|
30
|
+
tracing.propagation_style
|
|
31
|
+
|
|
32
|
+
@propagation = WaterDrop::Distributed::Propagation.new(
|
|
33
|
+
propagation_style_inject: tracing.propagation_style_inject,
|
|
34
|
+
propagation_style_extract: tracing.propagation_style_extract,
|
|
35
|
+
propagation_extract_first: tracing.propagation_extract_first
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -55,6 +55,7 @@ require_relative 'contrib/httpclient/integration'
|
|
|
55
55
|
require_relative 'contrib/httprb/integration'
|
|
56
56
|
require_relative 'contrib/integration'
|
|
57
57
|
require_relative 'contrib/kafka/integration'
|
|
58
|
+
require_relative 'contrib/waterdrop'
|
|
58
59
|
require_relative 'contrib/karafka'
|
|
59
60
|
require_relative 'contrib/lograge/integration'
|
|
60
61
|
require_relative 'contrib/mongodb/integration'
|
|
@@ -175,8 +175,9 @@ module Datadog
|
|
|
175
175
|
|
|
176
176
|
tags = {}
|
|
177
177
|
|
|
178
|
-
baggage_tag_keys.each do |key, _|
|
|
179
|
-
|
|
178
|
+
baggage_tag_keys.each do |key, _|
|
|
179
|
+
# Steep: https://github.com/soutaro/steep/issues/2031
|
|
180
|
+
value = baggage[key] # steep:ignore ArgumentTypeMismatch
|
|
180
181
|
next if value.nil? || value.empty?
|
|
181
182
|
|
|
182
183
|
tags["baggage.#{key}"] = value
|
|
@@ -82,12 +82,20 @@ module Datadog
|
|
|
82
82
|
TAG_MSG = 'error.message'
|
|
83
83
|
TAG_STACK = 'error.stack'
|
|
84
84
|
TAG_TYPE = 'error.type'
|
|
85
|
+
|
|
86
|
+
# From https://opentelemetry.io/docs/specs/semconv/registry/attributes/exception/#exception-stacktrace
|
|
87
|
+
ATTRIBUTE_MESSAGE = 'exception.message'
|
|
88
|
+
ATTRIBUTE_STACKTRACE = 'exception.stacktrace'
|
|
89
|
+
ATTRIBUTE_TYPE = 'exception.type'
|
|
90
|
+
|
|
91
|
+
# From https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/#exception-event
|
|
92
|
+
EVENT_NAME = 'exception'
|
|
85
93
|
end
|
|
86
94
|
|
|
87
95
|
# @public_api
|
|
88
96
|
module HTTP
|
|
89
|
-
ERROR_RANGE = (500...600).freeze
|
|
90
97
|
TAG_BASE_URL = 'http.base_url'
|
|
98
|
+
TAG_ENDPOINT = 'http.endpoint'
|
|
91
99
|
TAG_METHOD = 'http.method'
|
|
92
100
|
TAG_STATUS_CODE = 'http.status_code'
|
|
93
101
|
TAG_USER_AGENT = 'http.useragent'
|
|
@@ -7,8 +7,6 @@ module Datadog
|
|
|
7
7
|
module Tracing
|
|
8
8
|
# Remote configuration declaration
|
|
9
9
|
module Remote
|
|
10
|
-
class ReadError < StandardError; end
|
|
11
|
-
|
|
12
10
|
class << self
|
|
13
11
|
PRODUCT = 'APM_TRACING'
|
|
14
12
|
|
|
@@ -71,13 +69,7 @@ module Datadog
|
|
|
71
69
|
private
|
|
72
70
|
|
|
73
71
|
def parse_content(content)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
content.data.rewind
|
|
77
|
-
|
|
78
|
-
raise ReadError, 'EOF reached' if data.nil?
|
|
79
|
-
|
|
80
|
-
JSON.parse(data)
|
|
72
|
+
JSON.parse(content.data)
|
|
81
73
|
end
|
|
82
74
|
end
|
|
83
75
|
end
|
|
@@ -60,7 +60,9 @@ module Datadog
|
|
|
60
60
|
ensure
|
|
61
61
|
if trace.sampling_priority && trace.sampling_priority > 0
|
|
62
62
|
# Don't modify decision if priority was set upstream.
|
|
63
|
-
|
|
63
|
+
# Steep: https://github.com/soutaro/steep/issues/1971
|
|
64
|
+
if !distributed_sampling_priority && # steep:ignore FallbackAny
|
|
65
|
+
!trace.has_tag?(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
64
66
|
# If no sampling priority being assigned at this point, a custom
|
|
65
67
|
# sampler implementation is configured: this means the user has
|
|
66
68
|
# full control over the sampling decision.
|
data/lib/datadog/tracing/span.rb
CHANGED
|
@@ -69,8 +69,8 @@ module Datadog
|
|
|
69
69
|
|
|
70
70
|
private
|
|
71
71
|
|
|
72
|
-
MIN_INT64_SIGNED = -2
|
|
73
|
-
MAX_INT64_SIGNED = 2 <<
|
|
72
|
+
MIN_INT64_SIGNED = -2 << 62
|
|
73
|
+
MAX_INT64_SIGNED = (2 << 62) - 1
|
|
74
74
|
|
|
75
75
|
# Checks the attributes hash to ensure it only contains serializable values.
|
|
76
76
|
# Invalid values are removed from the hash.
|
|
@@ -164,7 +164,9 @@ module Datadog
|
|
|
164
164
|
# block is application code that we don't want to hinder.
|
|
165
165
|
# * We don't yield during a fatal error, as the application is likely trying to
|
|
166
166
|
# end its execution (either due to a system error or graceful shutdown).
|
|
167
|
-
|
|
167
|
+
# @type var e: Exception?
|
|
168
|
+
# Steep: https://github.com/soutaro/steep/issues/919
|
|
169
|
+
return_value = yield(self) unless e && !e.is_a?(StandardError) # steep:ignore FallbackAny
|
|
168
170
|
end
|
|
169
171
|
# rubocop:disable Lint/RescueException
|
|
170
172
|
# Here we really want to catch *any* exception, not only StandardError,
|
|
@@ -214,9 +216,6 @@ module Datadog
|
|
|
214
216
|
end
|
|
215
217
|
|
|
216
218
|
# Mark the span stopped at the current time
|
|
217
|
-
#
|
|
218
|
-
# steep:ignore:start
|
|
219
|
-
# Steep issue fixed in https://github.com/soutaro/steep/pull/1467
|
|
220
219
|
def stop(stop_time = nil, exception: nil)
|
|
221
220
|
# A span should not be stopped twice. Note that this is not thread-safe,
|
|
222
221
|
# stop is called from multiple threads, a given span might be stopped
|
|
@@ -239,7 +238,6 @@ module Datadog
|
|
|
239
238
|
|
|
240
239
|
self
|
|
241
240
|
end
|
|
242
|
-
# steep:ignore:end
|
|
243
241
|
|
|
244
242
|
# Return whether the duration is started or not
|
|
245
243
|
def started?
|
|
@@ -287,8 +285,14 @@ module Datadog
|
|
|
287
285
|
end
|
|
288
286
|
|
|
289
287
|
def duration
|
|
288
|
+
# Steep: https://github.com/soutaro/steep/issues/477
|
|
289
|
+
# @type ivar @duration_end: Time
|
|
290
|
+
# @type ivar @duration_start: Time
|
|
290
291
|
return @duration_end - @duration_start if @duration_start && @duration_end
|
|
291
292
|
|
|
293
|
+
# Steep: https://github.com/soutaro/steep/issues/477
|
|
294
|
+
# @type ivar @end_time: Time
|
|
295
|
+
# @type ivar @start_time: Time
|
|
292
296
|
@end_time - @start_time if @start_time && @end_time
|
|
293
297
|
end
|
|
294
298
|
|
|
@@ -316,7 +320,9 @@ module Datadog
|
|
|
316
320
|
'exception.stacktrace' => exc.backtrace,
|
|
317
321
|
}
|
|
318
322
|
|
|
319
|
-
|
|
323
|
+
# Steep: Caused by wrong declaration, should be the same parameters as `merge`
|
|
324
|
+
# https://github.com/ruby/rbs/blob/3d0fb3a7fdde60af7120e875fe3bd7237b5b6a88/core/hash.rbs#L1468
|
|
325
|
+
@span_events << SpanEvent.new('exception', attributes: event_attributes.merge!(attributes)) # steep:ignore ArgumentTypeMismatch
|
|
320
326
|
end
|
|
321
327
|
|
|
322
328
|
# Return a string representation of the span.
|
|
@@ -387,7 +393,8 @@ module Datadog
|
|
|
387
393
|
class Events
|
|
388
394
|
include Tracing::Events
|
|
389
395
|
|
|
390
|
-
|
|
396
|
+
# Steep: https://github.com/soutaro/steep/issues/335
|
|
397
|
+
DEFAULT_ON_ERROR = proc { |span_op, error| span_op&.set_error(error) } # steep:ignore IncompatibleAssignment
|
|
391
398
|
|
|
392
399
|
attr_reader \
|
|
393
400
|
:logger,
|
|
@@ -395,7 +402,7 @@ module Datadog
|
|
|
395
402
|
:after_stop,
|
|
396
403
|
:before_start
|
|
397
404
|
|
|
398
|
-
def initialize(logger: Datadog.logger
|
|
405
|
+
def initialize(logger: Datadog.logger)
|
|
399
406
|
@logger = logger
|
|
400
407
|
@after_finish = AfterFinish.new
|
|
401
408
|
@after_stop = AfterStop.new
|
|
@@ -464,7 +471,7 @@ module Datadog
|
|
|
464
471
|
@handler.call(*args)
|
|
465
472
|
rescue => e
|
|
466
473
|
logger.debug do
|
|
467
|
-
"Error in on_error handler '#{@
|
|
474
|
+
"Error in on_error handler '#{@handler}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
|
|
468
475
|
end
|
|
469
476
|
end
|
|
470
477
|
|
|
@@ -548,6 +555,10 @@ module Datadog
|
|
|
548
555
|
# Used for serialization
|
|
549
556
|
# @return [Integer] in nanoseconds since Epoch
|
|
550
557
|
def start_time_nano
|
|
558
|
+
return 0 if @start_time.nil?
|
|
559
|
+
|
|
560
|
+
# Steep: https://github.com/soutaro/steep/issues/477
|
|
561
|
+
# @type ivar @start_time: Time
|
|
551
562
|
@start_time.to_i * 1000000000 + @start_time.nsec
|
|
552
563
|
end
|
|
553
564
|
|
|
@@ -55,6 +55,12 @@ module Datadog
|
|
|
55
55
|
:sampled,
|
|
56
56
|
:service
|
|
57
57
|
|
|
58
|
+
# Creates a new TraceOperation.
|
|
59
|
+
#
|
|
60
|
+
# @param auto_finish [Boolean] when true, automatically finishes the trace when the local root span finishes.
|
|
61
|
+
# When false, the trace remains unfinished until {#finish!} is called.
|
|
62
|
+
# This is useful when this {TraceOperation} represents the continuation of a remote {TraceDigest},
|
|
63
|
+
# in which case local root spans in this {TraceOperation} are children of the {TraceDigest}'s last active span.
|
|
58
64
|
def initialize(
|
|
59
65
|
logger: Datadog.logger,
|
|
60
66
|
agent_sample_rate: nil,
|
|
@@ -80,7 +86,8 @@ module Datadog
|
|
|
80
86
|
trace_state_unknown_fields: nil,
|
|
81
87
|
remote_parent: false,
|
|
82
88
|
tracer: nil, # DEV-3.0: deprecated, remove in 3.0
|
|
83
|
-
baggage: nil
|
|
89
|
+
baggage: nil,
|
|
90
|
+
auto_finish: true
|
|
84
91
|
)
|
|
85
92
|
@logger = logger
|
|
86
93
|
|
|
@@ -119,6 +126,7 @@ module Datadog
|
|
|
119
126
|
@events = events || Events.new
|
|
120
127
|
@finished = false
|
|
121
128
|
@spans = []
|
|
129
|
+
@auto_finish = !!auto_finish
|
|
122
130
|
end
|
|
123
131
|
|
|
124
132
|
def full?
|
|
@@ -318,6 +326,29 @@ module Datadog
|
|
|
318
326
|
build_trace(spans, !finished)
|
|
319
327
|
end
|
|
320
328
|
|
|
329
|
+
# When automatic context management is disabled (@auto_finish is false),
|
|
330
|
+
# this method finishes the trace, marking it as completed.
|
|
331
|
+
#
|
|
332
|
+
# The trace will **not** automatically finish when its local root span
|
|
333
|
+
# when @auto_finish is false, thus calling this method is mandatory
|
|
334
|
+
# in such scenario.
|
|
335
|
+
#
|
|
336
|
+
# Unfinished spans are discarded.
|
|
337
|
+
#
|
|
338
|
+
# This method is idempotent and safe to call after the trace is finished.
|
|
339
|
+
# It is also a no-op when @auto_finish is true, to prevent misuse.
|
|
340
|
+
#
|
|
341
|
+
# @!visibility private
|
|
342
|
+
def finish!
|
|
343
|
+
return if @auto_finish || finished?
|
|
344
|
+
|
|
345
|
+
@finished = true
|
|
346
|
+
@active_span = nil
|
|
347
|
+
@active_span_count = 0
|
|
348
|
+
|
|
349
|
+
events.trace_finished.publish(self)
|
|
350
|
+
end
|
|
351
|
+
|
|
321
352
|
# Returns a set of trace headers used for continuing traces.
|
|
322
353
|
# Used for propagation across execution contexts.
|
|
323
354
|
# Data should reflect the active state of the trace.
|
|
@@ -460,7 +491,7 @@ module Datadog
|
|
|
460
491
|
|
|
461
492
|
@active_span = span_op
|
|
462
493
|
|
|
463
|
-
|
|
494
|
+
set_local_root_span!(span_op)
|
|
464
495
|
end
|
|
465
496
|
|
|
466
497
|
def deactivate_span!(span_op)
|
|
@@ -483,6 +514,12 @@ module Datadog
|
|
|
483
514
|
logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
|
484
515
|
end
|
|
485
516
|
|
|
517
|
+
# For traces with automatic context management (auto_finish),
|
|
518
|
+
# when the local root span finishes, the trace also finishes.
|
|
519
|
+
# The trace cannot receive new spans after finished.
|
|
520
|
+
#
|
|
521
|
+
# Without auto_finish, the trace can still receive spans
|
|
522
|
+
# until explicitly finished.
|
|
486
523
|
def finish_span(span, span_op, parent)
|
|
487
524
|
# Save finished span & root span
|
|
488
525
|
@spans << span unless span.nil?
|
|
@@ -490,8 +527,9 @@ module Datadog
|
|
|
490
527
|
# Deactivate the span, re-activate parent.
|
|
491
528
|
deactivate_span!(span_op)
|
|
492
529
|
|
|
493
|
-
#
|
|
494
|
-
|
|
530
|
+
# Finish if the local root span is finished and automatic
|
|
531
|
+
# context management is enabled.
|
|
532
|
+
@finished = true if span_op == root_span && @auto_finish
|
|
495
533
|
|
|
496
534
|
# Update active span count
|
|
497
535
|
@active_span_count -= 1
|
|
@@ -505,8 +543,8 @@ module Datadog
|
|
|
505
543
|
logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
|
506
544
|
end
|
|
507
545
|
|
|
508
|
-
# Track the root
|
|
509
|
-
def
|
|
546
|
+
# Track the root {SpanOperation} object from the current execution context.
|
|
547
|
+
def set_local_root_span!(span)
|
|
510
548
|
return if span.nil? || root_span
|
|
511
549
|
|
|
512
550
|
@root_span = span
|