datadog 2.12.1 → 2.17.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 +154 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -14
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +23 -23
- data/ext/libdatadog_api/crashtracker.c +11 -12
- data/ext/libdatadog_api/crashtracker.h +5 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +122 -0
- data/ext/libdatadog_api/library_config.h +19 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +117 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +24 -2
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
- data/lib/datadog/appsec/api_security.rb +9 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
- data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +29 -20
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +93 -28
- data/lib/datadog/appsec/context.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
- data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
- data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +19 -18
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/event.rb +96 -135
- data/lib/datadog/appsec/ext.rb +4 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
- data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
- data/lib/datadog/appsec/processor.rb +1 -1
- data/lib/datadog/appsec/remote.rb +23 -11
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/runner.rb +3 -3
- data/lib/datadog/appsec/security_event.rb +39 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +1 -1
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +50 -31
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/ext.rb +4 -0
- data/lib/datadog/core/configuration/option.rb +79 -43
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +68 -35
- data/lib/datadog/core/configuration/stable_config.rb +23 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/agent_info.rb +4 -3
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -6
- data/lib/datadog/core/environment/git.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/environment/variable_helpers.rb +1 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +20 -21
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery.rb +32 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +40 -32
- data/lib/datadog/core/remote/component.rb +6 -9
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +2 -1
- data/lib/datadog/core/remote/negotiation.rb +9 -9
- data/lib/datadog/core/remote/transport/config.rb +4 -3
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -37
- data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
- data/lib/datadog/core/remote/transport/http.rb +22 -57
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/telemetry/component.rb +78 -53
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +1 -1
- data/lib/datadog/core/telemetry/metric.rb +8 -8
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
- data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
- data/lib/datadog/core/telemetry/transport/http.rb +63 -0
- data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
- data/lib/datadog/core/telemetry/worker.rb +90 -24
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/api/instance.rb +17 -0
- data/lib/datadog/core/transport/http/api/spec.rb +17 -0
- data/lib/datadog/core/transport/http/builder.rb +18 -16
- data/lib/datadog/core/transport/http.rb +39 -2
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +29 -12
- data/lib/datadog/core/workers/interval_loop.rb +12 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/core.rb +8 -0
- data/lib/datadog/di/boot.rb +34 -0
- data/lib/datadog/di/component.rb +0 -2
- data/lib/datadog/di/probe_notification_builder.rb +1 -1
- data/lib/datadog/di/probe_notifier_worker.rb +16 -16
- data/lib/datadog/di/remote.rb +2 -0
- data/lib/datadog/di/transport/diagnostics.rb +4 -3
- data/lib/datadog/di/transport/http/api.rb +2 -12
- data/lib/datadog/di/transport/http/client.rb +4 -3
- data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
- data/lib/datadog/di/transport/http/input.rb +7 -34
- data/lib/datadog/di/transport/http.rb +14 -62
- data/lib/datadog/di/transport/input.rb +4 -3
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +5 -32
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events.rb +12 -0
- data/lib/datadog/kit/identity.rb +5 -1
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +16 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +3 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +3 -4
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +5 -59
- data/lib/datadog/profiling/scheduler.rb +8 -1
- data/lib/datadog/profiling/stack_recorder.rb +4 -4
- data/lib/datadog/profiling/tag_builder.rb +1 -5
- data/lib/datadog/profiling.rb +6 -2
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/component.rb +15 -12
- data/lib/datadog/tracing/configuration/ext.rb +7 -1
- data/lib/datadog/tracing/configuration/settings.rb +18 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +131 -0
- data/lib/datadog/tracing/distributed/datadog.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +25 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +5 -0
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- data/lib/datadog/tracing/span.rb +10 -1
- data/lib/datadog/tracing/span_event.rb +1 -1
- data/lib/datadog/tracing/span_operation.rb +46 -16
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +44 -24
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +45 -5
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +5 -4
- data/lib/datadog/tracing/transport/http/traces.rb +13 -41
- data/lib/datadog/tracing/transport/http.rb +11 -44
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +26 -9
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
- data/lib/datadog/tracing/writer.rb +2 -6
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +2 -3
- metadata +80 -19
- data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/telemetry/http/env.rb +0 -20
- data/lib/datadog/core/telemetry/http/ext.rb +0 -28
- data/lib/datadog/core/telemetry/http/response.rb +0 -70
- data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -10,17 +10,17 @@ module Datadog
|
|
10
10
|
# Adds error tagging behavior
|
11
11
|
# @public_api
|
12
12
|
module Errors
|
13
|
-
def set_error(
|
13
|
+
def set_error(error)
|
14
14
|
Datadog::Core.log_deprecation do
|
15
15
|
'Errors.set_error(..) is deprecated. ' \
|
16
16
|
'Use Errors.set_error_tags(..) instead.'
|
17
17
|
end
|
18
|
-
set_error_tags(
|
18
|
+
set_error_tags(error)
|
19
19
|
end
|
20
20
|
|
21
21
|
# Mark the span with the given error.
|
22
|
-
def set_error_tags(
|
23
|
-
e = Core::Error.build_from(
|
22
|
+
def set_error_tags(error)
|
23
|
+
e = Core::Error.build_from(error)
|
24
24
|
|
25
25
|
set_tag(Ext::Errors::TAG_TYPE, e.type) unless e.type.empty?
|
26
26
|
set_tag(Ext::Errors::TAG_MSG, e.message) unless e.message.empty?
|
@@ -31,6 +31,8 @@ module Datadog
|
|
31
31
|
# See Datadog-internal "RFC: Identifying which spans have profiling enabled " for details
|
32
32
|
TAG_PROFILING_ENABLED = '_dd.profiling.enabled'
|
33
33
|
|
34
|
+
TAG_APM_ENABLED = '_dd.apm.enabled'
|
35
|
+
|
34
36
|
# Defines constants for trace analytics
|
35
37
|
# @public_api
|
36
38
|
module Analytics
|
@@ -55,6 +57,9 @@ module Datadog
|
|
55
57
|
# @see Datadog::Tracing::Sampling::Ext::Mechanism
|
56
58
|
TAG_DECISION_MAKER = '_dd.p.dm'
|
57
59
|
|
60
|
+
# Bitmask for which product generated an event. E.g.: 2 for an AppSec event.
|
61
|
+
TAG_TRACE_SOURCE = '_dd.p.ts'
|
62
|
+
|
58
63
|
TAG_ORIGIN = '_dd.origin'
|
59
64
|
TAG_SAMPLING_PRIORITY = '_sampling_priority_v1'
|
60
65
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module Tracing
|
7
|
+
module Metadata
|
8
|
+
# This class is a data structure that is used to store
|
9
|
+
# complex metadata, such as an array of objects.
|
10
|
+
#
|
11
|
+
# It is serialized to MessagePack format when sent to the agent.
|
12
|
+
class Metastruct
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
def_delegators :@metastruct, :[], :[]=, :to_h
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@metastruct = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_msgpack(packer = nil)
|
22
|
+
# JRuby doesn't pass the packer
|
23
|
+
packer ||= MessagePack::Packer.new
|
24
|
+
|
25
|
+
packer.write(@metastruct.transform_values(&:to_msgpack))
|
26
|
+
end
|
27
|
+
|
28
|
+
def pretty_print(q)
|
29
|
+
q.seplist @metastruct.each do |key, value|
|
30
|
+
q.text "#{key} => #{value}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'metastruct'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module Tracing
|
7
|
+
module Metadata
|
8
|
+
# Adds data storage for the `meta_struct` field.
|
9
|
+
#
|
10
|
+
# This field is used to send more complex data like an array of objects
|
11
|
+
# in MessagePack format to the agent, and has no size limitations.
|
12
|
+
#
|
13
|
+
# The agent fully supports meta_struct from version v7.35.0 (April 2022).
|
14
|
+
#
|
15
|
+
# On versions older than v7.35.0, sending traces containing meta_struct
|
16
|
+
# has no unexpected side-effects; traces are sent to the backend as expected,
|
17
|
+
# while the meta_struct field is stripped.
|
18
|
+
module MetastructTagging
|
19
|
+
# Set the given key / value tag pair on the metastruct.
|
20
|
+
#
|
21
|
+
# A valid example is:
|
22
|
+
#
|
23
|
+
# span.set_metastruct_tag('_dd.stack', [])
|
24
|
+
def set_metastruct_tag(key, value)
|
25
|
+
metastruct[key] = value
|
26
|
+
end
|
27
|
+
|
28
|
+
# Return the metastruct tag value for the given key,
|
29
|
+
# returns nil if the key doesn't exist.
|
30
|
+
def get_metastruct_tag(key)
|
31
|
+
metastruct[key]
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def metastruct
|
37
|
+
@metastruct ||= Metastruct.new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'metadata/analytics'
|
4
4
|
require_relative 'metadata/tagging'
|
5
|
+
require_relative 'metadata/metastruct_tagging'
|
5
6
|
require_relative 'metadata/errors'
|
6
7
|
|
7
8
|
module Datadog
|
@@ -10,6 +11,7 @@ module Datadog
|
|
10
11
|
module Metadata
|
11
12
|
def self.included(base)
|
12
13
|
base.include(Metadata::Tagging)
|
14
|
+
base.include(Metadata::MetastructTagging)
|
13
15
|
base.include(Metadata::Errors)
|
14
16
|
|
15
17
|
# Additional extensions
|
@@ -9,6 +9,7 @@ module Datadog
|
|
9
9
|
# {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
|
10
10
|
class RateSampler < Sampler
|
11
11
|
KNUTH_FACTOR = 1111111111111111111
|
12
|
+
UINT64_MODULO = (1 << 64)
|
12
13
|
|
13
14
|
# Initialize a {Datadog::Tracing::Sampling::RateSampler}.
|
14
15
|
# This sampler keeps a random subset of the traces. Its main purpose is to
|
@@ -39,7 +40,7 @@ module Datadog
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def sample?(trace)
|
42
|
-
((trace.id * KNUTH_FACTOR) %
|
43
|
+
((trace.id * KNUTH_FACTOR) % UINT64_MODULO) <= @sampling_id_threshold
|
43
44
|
end
|
44
45
|
|
45
46
|
def sample!(trace)
|
data/lib/datadog/tracing/span.rb
CHANGED
@@ -33,6 +33,9 @@ module Datadog
|
|
33
33
|
:status,
|
34
34
|
:trace_id
|
35
35
|
|
36
|
+
attr_reader \
|
37
|
+
:metastruct
|
38
|
+
|
36
39
|
attr_writer \
|
37
40
|
:duration
|
38
41
|
|
@@ -54,6 +57,7 @@ module Datadog
|
|
54
57
|
id: nil,
|
55
58
|
meta: nil,
|
56
59
|
metrics: nil,
|
60
|
+
metastruct: nil,
|
57
61
|
parent_id: 0,
|
58
62
|
resource: name,
|
59
63
|
service: nil,
|
@@ -76,6 +80,7 @@ module Datadog
|
|
76
80
|
|
77
81
|
@meta = meta || {}
|
78
82
|
@metrics = metrics || {}
|
83
|
+
@metastruct = metastruct || {}
|
79
84
|
@status = status || 0
|
80
85
|
|
81
86
|
# start_time and end_time track wall clock. In Ruby, wall clock
|
@@ -144,6 +149,7 @@ module Datadog
|
|
144
149
|
error: @status,
|
145
150
|
meta: @meta,
|
146
151
|
metrics: @metrics,
|
152
|
+
meta_struct: @metastruct.to_h,
|
147
153
|
name: @name,
|
148
154
|
parent_id: @parent_id,
|
149
155
|
resource: @resource,
|
@@ -185,12 +191,15 @@ module Datadog
|
|
185
191
|
q.text "#{key} => #{value}"
|
186
192
|
end
|
187
193
|
end
|
188
|
-
q.group(2, 'Metrics: [',
|
194
|
+
q.group(2, 'Metrics: [', "]\n") do
|
189
195
|
q.breakable
|
190
196
|
q.seplist @metrics.each do |key, value|
|
191
197
|
q.text "#{key} => #{value}"
|
192
198
|
end
|
193
199
|
end
|
200
|
+
q.group(2, 'Metastruct: [', ']') do
|
201
|
+
metastruct.pretty_print(q)
|
202
|
+
end
|
194
203
|
end
|
195
204
|
end
|
196
205
|
|
@@ -33,7 +33,7 @@ module Datadog
|
|
33
33
|
|
34
34
|
# OpenTelemetry SDK stores span event timestamps in nanoseconds (not seconds).
|
35
35
|
# We will do the same here to avoid unnecessary conversions and inconsistencies.
|
36
|
-
@time_unix_nano = time_unix_nano || (Time.now.to_r * 1_000_000_000).to_i
|
36
|
+
@time_unix_nano = time_unix_nano || (Core::Utils::Time.now.to_r * 1_000_000_000).to_i
|
37
37
|
end
|
38
38
|
|
39
39
|
# Converts the span event into a hash to be used by with the span tag serialization
|
@@ -28,6 +28,7 @@ module Datadog
|
|
28
28
|
# Span attributes
|
29
29
|
# NOTE: In the future, we should drop the me
|
30
30
|
attr_reader \
|
31
|
+
:logger,
|
31
32
|
:end_time,
|
32
33
|
:id,
|
33
34
|
:name,
|
@@ -37,10 +38,12 @@ module Datadog
|
|
37
38
|
:start_time,
|
38
39
|
:trace_id,
|
39
40
|
:type
|
41
|
+
|
40
42
|
attr_accessor :links, :status, :span_events
|
41
43
|
|
42
44
|
def initialize(
|
43
45
|
name,
|
46
|
+
logger: Datadog.logger,
|
44
47
|
events: nil,
|
45
48
|
on_error: nil,
|
46
49
|
parent_id: 0,
|
@@ -54,6 +57,8 @@ module Datadog
|
|
54
57
|
span_events: nil,
|
55
58
|
id: nil
|
56
59
|
)
|
60
|
+
@logger = logger
|
61
|
+
|
57
62
|
# Ensure dynamically created strings are UTF-8 encoded.
|
58
63
|
#
|
59
64
|
# All strings created in Ruby land are UTF-8. The only sources of non-UTF-8 string are:
|
@@ -90,11 +95,17 @@ module Datadog
|
|
90
95
|
set_tags(tags) if tags
|
91
96
|
|
92
97
|
# Some other SpanOperation-specific behavior
|
93
|
-
@events = events || Events.new
|
98
|
+
@events = events || Events.new(logger: logger)
|
94
99
|
@span = nil
|
95
100
|
|
96
|
-
|
97
|
-
|
101
|
+
if on_error.nil?
|
102
|
+
# Nothing, default error handler is already set up.
|
103
|
+
elsif on_error.is_a?(Proc)
|
104
|
+
# Subscribe :on_error event
|
105
|
+
@events.on_error.wrap_default(&on_error)
|
106
|
+
else
|
107
|
+
logger.warn("on_error argument to SpanOperation ignored because is not a Proc: #{on_error}")
|
108
|
+
end
|
98
109
|
|
99
110
|
# Start the span with start time, if given.
|
100
111
|
start(start_time) if start_time
|
@@ -130,6 +141,10 @@ module Datadog
|
|
130
141
|
@resource = resource.nil? ? nil : Core::Utils.utf8_encode(resource) # Allow this to be explicitly set to nil
|
131
142
|
end
|
132
143
|
|
144
|
+
def get_collector_or_initialize
|
145
|
+
@collector ||= yield
|
146
|
+
end
|
147
|
+
|
133
148
|
def measure
|
134
149
|
raise ArgumentError, 'Must provide block to measure!' unless block_given?
|
135
150
|
# TODO: Should we just invoke the block and skip tracing instead?
|
@@ -143,7 +158,7 @@ module Datadog
|
|
143
158
|
begin
|
144
159
|
start
|
145
160
|
rescue StandardError => e
|
146
|
-
|
161
|
+
logger.debug { "Failed to start span: #{e}" }
|
147
162
|
ensure
|
148
163
|
# We should yield to the provided block when possible, as this
|
149
164
|
# block is application code that we don't want to hinder.
|
@@ -161,7 +176,7 @@ module Datadog
|
|
161
176
|
# Stop the span first, so timing is a more accurate.
|
162
177
|
# If the span failed to start, timing may be inaccurate,
|
163
178
|
# but this is not really a serious concern.
|
164
|
-
stop
|
179
|
+
stop(exception: e)
|
165
180
|
|
166
181
|
# Trigger the on_error event
|
167
182
|
events.on_error.publish(self, e)
|
@@ -202,7 +217,7 @@ module Datadog
|
|
202
217
|
#
|
203
218
|
# steep:ignore:start
|
204
219
|
# Steep issue fixed in https://github.com/soutaro/steep/pull/1467
|
205
|
-
def stop(stop_time = nil)
|
220
|
+
def stop(stop_time = nil, exception: nil)
|
206
221
|
# A span should not be stopped twice. Note that this is not thread-safe,
|
207
222
|
# stop is called from multiple threads, a given span might be stopped
|
208
223
|
# several times. Again, one should not do this, so this test is more a
|
@@ -220,7 +235,7 @@ module Datadog
|
|
220
235
|
@duration_end = stop_time.nil? ? duration_marker : nil
|
221
236
|
|
222
237
|
# Trigger after_stop event
|
223
|
-
events.after_stop.publish(self)
|
238
|
+
events.after_stop.publish(self, exception)
|
224
239
|
|
225
240
|
self
|
226
241
|
end
|
@@ -236,6 +251,10 @@ module Datadog
|
|
236
251
|
!@end_time.nil?
|
237
252
|
end
|
238
253
|
|
254
|
+
def root?
|
255
|
+
parent_id == 0
|
256
|
+
end
|
257
|
+
|
239
258
|
# for backwards compatibility
|
240
259
|
def start_time=(time)
|
241
260
|
time.tap { start(time) }
|
@@ -269,7 +288,8 @@ module Datadog
|
|
269
288
|
|
270
289
|
def duration
|
271
290
|
return @duration_end - @duration_start if @duration_start && @duration_end
|
272
|
-
|
291
|
+
|
292
|
+
@end_time - @start_time if @start_time && @end_time
|
273
293
|
end
|
274
294
|
|
275
295
|
def set_error(e)
|
@@ -289,6 +309,7 @@ module Datadog
|
|
289
309
|
id: @id,
|
290
310
|
meta: meta,
|
291
311
|
metrics: metrics,
|
312
|
+
metastruct: metastruct,
|
292
313
|
name: @name,
|
293
314
|
parent_id: @parent_id,
|
294
315
|
resource: @resource,
|
@@ -328,12 +349,15 @@ module Datadog
|
|
328
349
|
q.text "#{key} => #{value}"
|
329
350
|
end
|
330
351
|
end
|
331
|
-
q.group(2, 'Metrics: [',
|
352
|
+
q.group(2, 'Metrics: [', "]\n") do
|
332
353
|
q.breakable
|
333
354
|
q.seplist metrics.each do |key, value|
|
334
355
|
q.text "#{key} => #{value}"
|
335
356
|
end
|
336
357
|
end
|
358
|
+
q.group(2, 'Metastruct: [', ']') do
|
359
|
+
metastruct.pretty_print(q)
|
360
|
+
end
|
337
361
|
end
|
338
362
|
end
|
339
363
|
|
@@ -344,11 +368,13 @@ module Datadog
|
|
344
368
|
DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
|
345
369
|
|
346
370
|
attr_reader \
|
371
|
+
:logger,
|
347
372
|
:after_finish,
|
348
373
|
:after_stop,
|
349
374
|
:before_start
|
350
375
|
|
351
|
-
def initialize(on_error: nil)
|
376
|
+
def initialize(logger: Datadog.logger, on_error: nil)
|
377
|
+
@logger = logger
|
352
378
|
@after_finish = AfterFinish.new
|
353
379
|
@after_stop = AfterStop.new
|
354
380
|
@before_start = BeforeStart.new
|
@@ -357,7 +383,7 @@ module Datadog
|
|
357
383
|
# This event is lazily initialized as error paths
|
358
384
|
# are normally less common that non-error paths.
|
359
385
|
def on_error
|
360
|
-
@on_error ||= OnError.new(DEFAULT_ON_ERROR)
|
386
|
+
@on_error ||= OnError.new(DEFAULT_ON_ERROR, logger: logger)
|
361
387
|
end
|
362
388
|
|
363
389
|
# Triggered when the span is finished, regardless of error.
|
@@ -383,10 +409,13 @@ module Datadog
|
|
383
409
|
|
384
410
|
# Triggered when the span raises an error during measurement.
|
385
411
|
class OnError
|
386
|
-
def initialize(default)
|
412
|
+
def initialize(default, logger: Datadog.logger)
|
387
413
|
@handler = default
|
414
|
+
@logger = logger
|
388
415
|
end
|
389
416
|
|
417
|
+
attr_reader :logger
|
418
|
+
|
390
419
|
# Call custom error handler but fallback to default behavior on failure.
|
391
420
|
|
392
421
|
# DEV: Revisit this before full 1.0 release.
|
@@ -400,9 +429,9 @@ module Datadog
|
|
400
429
|
begin
|
401
430
|
yield(op, error)
|
402
431
|
rescue StandardError => e
|
403
|
-
|
432
|
+
logger.debug do
|
404
433
|
"Custom on_error handler #{@handler} failed, using fallback behavior. \
|
405
|
-
Cause: #{e.class
|
434
|
+
Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
|
406
435
|
end
|
407
436
|
|
408
437
|
original.call(op, error) if original
|
@@ -414,8 +443,8 @@ module Datadog
|
|
414
443
|
begin
|
415
444
|
@handler.call(*args)
|
416
445
|
rescue StandardError => e
|
417
|
-
|
418
|
-
"Error in on_error handler '#{@default}': #{e.class
|
446
|
+
logger.debug do
|
447
|
+
"Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
|
419
448
|
end
|
420
449
|
end
|
421
450
|
|
@@ -456,6 +485,7 @@ module Datadog
|
|
456
485
|
id: @id,
|
457
486
|
meta: Core::Utils::SafeDup.frozen_or_dup(meta),
|
458
487
|
metrics: Core::Utils::SafeDup.frozen_or_dup(metrics),
|
488
|
+
metastruct: Core::Utils::SafeDup.frozen_or_dup(metastruct),
|
459
489
|
parent_id: @parent_id,
|
460
490
|
resource: @resource,
|
461
491
|
service: @service,
|
@@ -32,8 +32,7 @@ module Datadog
|
|
32
32
|
@agent_settings = agent_settings
|
33
33
|
|
34
34
|
@transport = transport || begin
|
35
|
-
|
36
|
-
Transport::HTTP.default(**transport_options)
|
35
|
+
Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
|
37
36
|
end
|
38
37
|
|
39
38
|
@events = Writer::Events.new
|
@@ -80,6 +80,9 @@ module Datadog
|
|
80
80
|
# This allows later propagation to include those unknown fields, as they can represent future versions of the spec
|
81
81
|
# sending data through this service. This value ends in a trailing `;` to facilitate serialization.
|
82
82
|
# @return [String]
|
83
|
+
# @!attribute [r] baggage
|
84
|
+
# The W3C "baggage" extracted from a distributed context. This field is a hash of key/value pairs.
|
85
|
+
# @return [Hash<String,String>]
|
83
86
|
# TODO: The documentation for the last attribute above won't be rendered.
|
84
87
|
# TODO: This might be a YARD bug as adding an attribute, making it now second-last attribute, renders correctly.
|
85
88
|
attr_reader \
|
@@ -102,7 +105,8 @@ module Datadog
|
|
102
105
|
:trace_flags,
|
103
106
|
:trace_state,
|
104
107
|
:trace_state_unknown_fields,
|
105
|
-
:span_remote
|
108
|
+
:span_remote,
|
109
|
+
:baggage
|
106
110
|
|
107
111
|
def initialize(
|
108
112
|
span_id: nil,
|
@@ -124,7 +128,8 @@ module Datadog
|
|
124
128
|
trace_flags: nil,
|
125
129
|
trace_state: nil,
|
126
130
|
trace_state_unknown_fields: nil,
|
127
|
-
span_remote: true
|
131
|
+
span_remote: true,
|
132
|
+
baggage: nil
|
128
133
|
)
|
129
134
|
@span_id = span_id
|
130
135
|
@span_name = span_name && span_name.dup.freeze
|
@@ -146,6 +151,7 @@ module Datadog
|
|
146
151
|
@trace_state = trace_state && trace_state.dup.freeze
|
147
152
|
@trace_state_unknown_fields = trace_state_unknown_fields && trace_state_unknown_fields.dup.freeze
|
148
153
|
@span_remote = span_remote
|
154
|
+
@baggage = baggage && baggage.dup.freeze
|
149
155
|
freeze
|
150
156
|
end
|
151
157
|
|
@@ -177,6 +183,7 @@ module Datadog
|
|
177
183
|
trace_state: trace_state,
|
178
184
|
trace_state_unknown_fields: trace_state_unknown_fields,
|
179
185
|
span_remote: span_remote,
|
186
|
+
baggage: baggage
|
180
187
|
}.merge!(field_value_pairs)
|
181
188
|
)
|
182
189
|
end
|