datadog 2.12.0 → 2.22.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 +348 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
- data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
- 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 +10 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
- data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
- data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
- 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/ddsketch.c +106 -0
- data/ext/libdatadog_api/extconf.rb +5 -3
- data/ext/libdatadog_api/init.c +18 -0
- data/ext/libdatadog_api/library_config.c +172 -0
- data/ext/libdatadog_api/library_config.h +25 -0
- data/ext/libdatadog_api/process_discovery.c +118 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +15 -5
- 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/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/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
- data/lib/datadog/appsec/api_security/sampler.rb +59 -0
- data/lib/datadog/appsec/api_security.rb +23 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +46 -71
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +162 -30
- data/lib/datadog/appsec/context.rb +30 -7
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
- 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 +103 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -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 +11 -12
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -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 +53 -31
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/event.rb +91 -147
- data/lib/datadog/appsec/ext.rb +4 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -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/collector.rb +23 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
- data/lib/datadog/appsec/metrics.rb +1 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
- data/lib/datadog/appsec/remote.rb +43 -59
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/engine.rb +176 -0
- data/lib/datadog/appsec/security_engine/result.rb +44 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +37 -0
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +24 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +5 -15
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +69 -37
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- 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 +4 -1
- data/lib/datadog/core/configuration/option.rb +117 -77
- data/lib/datadog/core/configuration/option_definition.rb +5 -14
- data/lib/datadog/core/configuration/options.rb +15 -13
- data/lib/datadog/core/configuration/settings.rb +117 -48
- data/lib/datadog/core/configuration/stable_config.rb +32 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/ddsketch.rb +21 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- 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 -8
- data/lib/datadog/core/environment/git.rb +3 -2
- 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 +4 -4
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +29 -29
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/pin.rb +4 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +61 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +44 -35
- data/lib/datadog/core/remote/component.rb +12 -17
- 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 +14 -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 +25 -89
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/tag_builder.rb +56 -0
- data/lib/datadog/core/telemetry/component.rb +92 -52
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -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_endpoints_loaded.rb +30 -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 +287 -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 +18 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +5 -4
- data/lib/datadog/core/telemetry/logging.rb +11 -5
- 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/net.rb +17 -2
- 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 +19 -17
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http.rb +75 -0
- data/lib/datadog/core/transport/response.rb +4 -1
- 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 +25 -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/utils.rb +7 -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 +10 -0
- data/lib/datadog/di/boot.rb +43 -0
- data/lib/datadog/di/component.rb +21 -2
- data/lib/datadog/di/context.rb +70 -0
- data/lib/datadog/di/el/compiler.rb +164 -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 +25 -0
- data/lib/datadog/di/instrumenter.rb +132 -20
- data/lib/datadog/di/probe.rb +35 -15
- data/lib/datadog/di/probe_builder.rb +39 -1
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +82 -0
- data/lib/datadog/di/probe_manager.rb +3 -2
- data/lib/datadog/di/probe_notification_builder.rb +61 -67
- data/lib/datadog/di/probe_notifier_worker.rb +25 -17
- data/lib/datadog/di/remote.rb +5 -5
- data/lib/datadog/di/serializer.rb +160 -8
- 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 +18 -35
- data/lib/datadog/di/transport/http.rb +15 -77
- data/lib/datadog/di/transport/input.rb +14 -5
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +0 -34
- 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/v2.rb +196 -0
- data/lib/datadog/kit/appsec/events.rb +17 -4
- data/lib/datadog/kit/identity.rb +22 -12
- 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 +21 -6
- data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
- data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +15 -11
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/info.rb +44 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +8 -9
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +12 -7
- data/lib/datadog/profiling/ext.rb +2 -15
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +8 -62
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +9 -9
- data/lib/datadog/profiling/tag_builder.rb +7 -41
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/profiling.rb +13 -10
- data/lib/datadog/single_step_instrument.rb +9 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +7 -7
- data/lib/datadog/tracing/component.rb +21 -29
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +8 -4
- data/lib/datadog/tracing/configuration/settings.rb +50 -12
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +19 -4
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
- data/lib/datadog/tracing/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
- 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/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +12 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/component.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +6 -6
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
- data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +7 -5
- data/lib/datadog/tracing/contrib/ext.rb +4 -3
- data/lib/datadog/tracing/contrib/extensions.rb +9 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -5
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- 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/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -48
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +11 -19
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- 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/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +23 -6
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/patcher.rb +12 -11
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -6
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- 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/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
- data/lib/datadog/tracing/distributed/baggage.rb +196 -0
- data/lib/datadog/tracing/distributed/datadog.rb +8 -7
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +28 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +13 -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/tagging.rb +4 -4
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +11 -2
- data/lib/datadog/tracing/span_event.rb +11 -11
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +76 -26
- data/lib/datadog/tracing/sync_writer.rb +5 -4
- data/lib/datadog/tracing/trace_digest.rb +29 -24
- data/lib/datadog/tracing/trace_operation.rb +121 -97
- data/lib/datadog/tracing/trace_segment.rb +8 -6
- data/lib/datadog/tracing/tracer.rb +90 -43
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +6 -5
- data/lib/datadog/tracing/transport/http/traces.rb +15 -43
- data/lib/datadog/tracing/transport/http.rb +13 -75
- data/lib/datadog/tracing/transport/io/client.rb +5 -5
- data/lib/datadog/tracing/transport/io/traces.rb +4 -4
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +31 -14
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing/writer.rb +4 -4
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +1 -1
- data/lib/datadog.rb +8 -2
- metadata +115 -24
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
- 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/processor/rule_merger.rb +0 -170
- data/lib/datadog/appsec/processor.rb +0 -107
- 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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../metadata/ext'
|
|
4
|
+
require_relative '../trace_digest'
|
|
5
|
+
require_relative 'datadog_tags_codec'
|
|
6
|
+
require_relative '../utils'
|
|
7
|
+
require_relative 'helpers'
|
|
8
|
+
require 'uri'
|
|
9
|
+
|
|
10
|
+
module Datadog
|
|
11
|
+
module Tracing
|
|
12
|
+
module Distributed
|
|
13
|
+
# W3C Baggage propagator implementation.
|
|
14
|
+
# The baggage header is propagated through `baggage`.
|
|
15
|
+
# @see https://www.w3.org/TR/baggage/
|
|
16
|
+
class Baggage
|
|
17
|
+
BAGGAGE_KEY = 'baggage'
|
|
18
|
+
DD_TRACE_BAGGAGE_MAX_ITEMS = 64
|
|
19
|
+
DD_TRACE_BAGGAGE_MAX_BYTES = 8192
|
|
20
|
+
BAGGAGE_TAG_KEYS_MATCH_ALL = ['*'].freeze
|
|
21
|
+
SAFE_CHARACTERS_KEY = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'*+-.^_`|~"
|
|
22
|
+
SAFE_CHARACTERS_VALUE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'()*+-./:<>?@[]^_`{|}~"
|
|
23
|
+
|
|
24
|
+
def initialize(
|
|
25
|
+
fetcher:,
|
|
26
|
+
baggage_key: BAGGAGE_KEY,
|
|
27
|
+
baggage_tag_keys: ::Datadog.configuration.tracing.baggage_tag_keys
|
|
28
|
+
)
|
|
29
|
+
@baggage_key = baggage_key
|
|
30
|
+
@fetcher = fetcher
|
|
31
|
+
@baggage_tag_keys = baggage_tag_keys
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def inject!(digest, data)
|
|
35
|
+
return if digest.nil? || digest.baggage.nil?
|
|
36
|
+
|
|
37
|
+
baggage_items = digest.baggage.reject { |k, v| k.nil? || v.nil? }
|
|
38
|
+
return if baggage_items.empty?
|
|
39
|
+
|
|
40
|
+
begin
|
|
41
|
+
if baggage_items.size > DD_TRACE_BAGGAGE_MAX_ITEMS
|
|
42
|
+
::Datadog.logger.warn("Baggage item limit (#{DD_TRACE_BAGGAGE_MAX_ITEMS}) exceeded, dropping excess items")
|
|
43
|
+
# Record telemetry for item count truncation
|
|
44
|
+
record_telemetry_metric(
|
|
45
|
+
'context_header.truncated',
|
|
46
|
+
1,
|
|
47
|
+
{'header_style' => 'baggage', 'truncation_reason' => 'baggage_item_count_exceeded'}
|
|
48
|
+
)
|
|
49
|
+
baggage_items = baggage_items.first(DD_TRACE_BAGGAGE_MAX_ITEMS)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
encoded_items = []
|
|
53
|
+
total_size = 0
|
|
54
|
+
|
|
55
|
+
baggage_items.each do |key, value|
|
|
56
|
+
item = "#{encode_item(key, SAFE_CHARACTERS_KEY)}=#{encode_item(value, SAFE_CHARACTERS_VALUE)}"
|
|
57
|
+
item_size = item.bytesize + (encoded_items.empty? ? 0 : 1) # +1 for comma if not first item
|
|
58
|
+
if total_size + item_size > DD_TRACE_BAGGAGE_MAX_BYTES
|
|
59
|
+
::Datadog.logger.warn("Baggage header size (#{DD_TRACE_BAGGAGE_MAX_BYTES}) exceeded, dropping excess items")
|
|
60
|
+
# Record telemetry for byte count truncation
|
|
61
|
+
record_telemetry_metric(
|
|
62
|
+
'context_header.truncated',
|
|
63
|
+
1,
|
|
64
|
+
{'header_style' => 'baggage', 'truncation_reason' => 'baggage_byte_count_exceeded'}
|
|
65
|
+
)
|
|
66
|
+
break # stop adding items when size limit is reached
|
|
67
|
+
end
|
|
68
|
+
encoded_items << item
|
|
69
|
+
total_size += item_size
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# edge case where a single item is too large
|
|
73
|
+
return if encoded_items.empty?
|
|
74
|
+
|
|
75
|
+
data[@baggage_key] = encoded_items.join(',')
|
|
76
|
+
|
|
77
|
+
# Record telemetry for successful injection
|
|
78
|
+
record_telemetry_metric('context_header_style.injected', 1, {'header_style' => 'baggage'})
|
|
79
|
+
rescue => e
|
|
80
|
+
::Datadog.logger.warn("Failed to encode and inject baggage header: #{e.class}: #{e}")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def extract(data)
|
|
85
|
+
fetcher = @fetcher.new(data)
|
|
86
|
+
data = fetcher[@baggage_key]
|
|
87
|
+
return unless data
|
|
88
|
+
|
|
89
|
+
baggage = parse_baggage_header(fetcher[@baggage_key])
|
|
90
|
+
return unless baggage
|
|
91
|
+
|
|
92
|
+
# Convert selected baggage items to span tags based on configuration
|
|
93
|
+
baggage_tags = build_baggage_tags(baggage)
|
|
94
|
+
|
|
95
|
+
# Record telemetry for successful extraction only if baggage is not empty
|
|
96
|
+
unless baggage.empty?
|
|
97
|
+
record_telemetry_metric('context_header_style.extracted', 1, {'header_style' => 'baggage'})
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
TraceDigest.new(
|
|
101
|
+
baggage: baggage,
|
|
102
|
+
trace_distributed_tags: baggage_tags
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
def encode_item(item, safe_characters)
|
|
109
|
+
# Strip whitespace and URL-encode the item
|
|
110
|
+
result = URI.encode_www_form_component(item.strip)
|
|
111
|
+
# Replace '+' with '%20' for space encoding consistency with W3C spec
|
|
112
|
+
result = result.gsub('+', '%20')
|
|
113
|
+
# Selectively decode percent-encoded characters that are considered "safe" in W3C Baggage spec
|
|
114
|
+
result.gsub(/%[0-9A-F]{2}/) do |encoded|
|
|
115
|
+
if encoded.size >= 3 && encoded[1..2] =~ /\A[0-9A-F]{2}\z/
|
|
116
|
+
hex_str = encoded[1..2]
|
|
117
|
+
next encoded unless hex_str && !hex_str.empty?
|
|
118
|
+
|
|
119
|
+
# Convert hex representation back to character
|
|
120
|
+
char = [hex_str.hex].pack('C')
|
|
121
|
+
# Keep the character as-is if it's in the safe character set, otherwise keep it encoded
|
|
122
|
+
safe_characters.include?(char) ? char : encoded
|
|
123
|
+
else
|
|
124
|
+
encoded
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Parses a W3C Baggage header string into a hash of key-value pairs
|
|
130
|
+
# The header format follows the W3C Baggage specification:
|
|
131
|
+
# - Multiple baggage items are separated by commas
|
|
132
|
+
# - Each baggage item is a key-value pair separated by '='
|
|
133
|
+
# - Keys and values are URL-encoded
|
|
134
|
+
# - Returns an empty hash if the baggage header is malformed
|
|
135
|
+
#
|
|
136
|
+
# @param baggage_header [String] The W3C Baggage header string to parse
|
|
137
|
+
# @return [Hash<String, String>] A hash of decoded baggage items
|
|
138
|
+
def parse_baggage_header(baggage_header)
|
|
139
|
+
baggage = {}
|
|
140
|
+
baggages = baggage_header.split(',')
|
|
141
|
+
baggages.each do |key_value|
|
|
142
|
+
key, value = key_value.split('=', 2)
|
|
143
|
+
# If baggage is malformed, return an empty hash
|
|
144
|
+
if key.nil? || value.nil?
|
|
145
|
+
# Record telemetry for malformed header
|
|
146
|
+
record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
|
|
147
|
+
return {}
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
key = URI.decode_www_form_component(key.strip)
|
|
151
|
+
value = URI.decode_www_form_component(value.strip)
|
|
152
|
+
if key.empty? || value.empty?
|
|
153
|
+
# Record telemetry for malformed header
|
|
154
|
+
record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
|
|
155
|
+
return {}
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
baggage[key] = value
|
|
159
|
+
end
|
|
160
|
+
baggage
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Convert selected baggage items to span tags
|
|
164
|
+
# Baggage carries important contextual information (like user.id, session.id) across distributed services,
|
|
165
|
+
# but isn't searchable by default.
|
|
166
|
+
def build_baggage_tags(baggage)
|
|
167
|
+
return {} if baggage.empty?
|
|
168
|
+
|
|
169
|
+
# Get the configuration for which baggage keys should become span tags
|
|
170
|
+
baggage_tag_keys = @baggage_tag_keys
|
|
171
|
+
return {} if baggage_tag_keys.empty?
|
|
172
|
+
|
|
173
|
+
# If wildcard is specified, use all baggage keys
|
|
174
|
+
baggage_tag_keys = baggage if baggage_tag_keys == BAGGAGE_TAG_KEYS_MATCH_ALL
|
|
175
|
+
|
|
176
|
+
tags = {}
|
|
177
|
+
|
|
178
|
+
baggage_tag_keys.each do |key, _| # rubocop:disable Style/HashEachMethods
|
|
179
|
+
value = baggage[key]
|
|
180
|
+
next if value.nil? || value.empty?
|
|
181
|
+
|
|
182
|
+
tags["baggage.#{key}"] = value
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
tags
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Record telemetry metrics for baggage operations
|
|
189
|
+
def record_telemetry_metric(metric_name, value, tags)
|
|
190
|
+
telemetry = ::Datadog.send(:components).telemetry
|
|
191
|
+
telemetry.inc('instrumentation_telemetry_data.tracers', metric_name, value, tags: tags)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
@@ -55,17 +55,16 @@ module Datadog
|
|
|
55
55
|
def extract(data)
|
|
56
56
|
fetcher = @fetcher.new(data)
|
|
57
57
|
|
|
58
|
-
trace_id
|
|
58
|
+
trace_id = parse_trace_id(fetcher)
|
|
59
59
|
parent_id = parse_parent_id(fetcher)
|
|
60
60
|
|
|
61
61
|
sampling_priority = Helpers.parse_decimal_id(fetcher[@sampling_priority_key])
|
|
62
62
|
origin = fetcher[@origin_key]
|
|
63
63
|
|
|
64
64
|
# Return early if this propagation is not valid
|
|
65
|
-
# DEV: To be valid we need to have a trace id and a parent id
|
|
66
|
-
# or when it is a synthetics trace, just the trace id.
|
|
65
|
+
# DEV: To be valid we need to have a trace id and a parent id or an origin id.
|
|
67
66
|
# DEV: `Fetcher#id` will not return 0
|
|
68
|
-
return
|
|
67
|
+
return if trace_id.nil? || parent_id.nil? && origin.nil?
|
|
69
68
|
|
|
70
69
|
trace_distributed_tags = extract_tags(fetcher)
|
|
71
70
|
|
|
@@ -89,7 +88,7 @@ module Datadog
|
|
|
89
88
|
trace_id = Helpers.parse_decimal_id(fetcher_object[@trace_id_key])
|
|
90
89
|
|
|
91
90
|
return unless trace_id
|
|
92
|
-
return if trace_id <= 0 || trace_id
|
|
91
|
+
return if trace_id <= 0 || trace_id > Tracing::Utils::EXTERNAL_MAX_ID
|
|
93
92
|
|
|
94
93
|
trace_id
|
|
95
94
|
end
|
|
@@ -98,7 +97,7 @@ module Datadog
|
|
|
98
97
|
parent_id = Helpers.parse_decimal_id(fetcher_object[@parent_id_key])
|
|
99
98
|
|
|
100
99
|
return unless parent_id
|
|
101
|
-
return if parent_id <= 0 || parent_id
|
|
100
|
+
return if parent_id <= 0 || parent_id > Tracing::Utils::EXTERNAL_MAX_ID
|
|
102
101
|
|
|
103
102
|
parent_id
|
|
104
103
|
end
|
|
@@ -116,6 +115,8 @@ module Datadog
|
|
|
116
115
|
def extract_trace_id!(trace_id, tags)
|
|
117
116
|
return trace_id unless tags
|
|
118
117
|
return trace_id unless (high_order = tags.delete(Tracing::Metadata::Ext::Distributed::TAG_TID))
|
|
118
|
+
return trace_id unless high_order.size == 16
|
|
119
|
+
return trace_id unless /\A[0-9a-f]+\z/i.match?(high_order)
|
|
119
120
|
|
|
120
121
|
Tracing::Utils::TraceId.concatenate(high_order.to_i(16), trace_id)
|
|
121
122
|
end
|
|
@@ -171,7 +172,7 @@ module Datadog
|
|
|
171
172
|
|
|
172
173
|
def set_tags_propagation_error(reason:)
|
|
173
174
|
active_trace = Tracing.active_trace
|
|
174
|
-
active_trace
|
|
175
|
+
active_trace&.set_tag('_dd.propagation_error', reason)
|
|
175
176
|
nil
|
|
176
177
|
end
|
|
177
178
|
|
|
@@ -31,19 +31,17 @@ module Datadog
|
|
|
31
31
|
# @return [String] serialized tags hash
|
|
32
32
|
# @raise [EncodingError] if tags cannot be serialized to the `x-datadog-tags` format
|
|
33
33
|
def self.encode(tags)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
value = raw_value.to_s
|
|
34
|
+
tags.map do |raw_key, raw_value|
|
|
35
|
+
key = raw_key.to_s
|
|
36
|
+
value = raw_value.to_s
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
|
|
39
|
+
raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
end
|
|
41
|
+
"#{key}=#{value.strip}"
|
|
42
|
+
end.join(',')
|
|
43
|
+
rescue => e
|
|
44
|
+
raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
|
|
47
45
|
end
|
|
48
46
|
|
|
49
47
|
# Deserializes a `x-datadog-tags`-formatted String into a {Hash<String,String>}.
|
|
@@ -52,7 +50,7 @@ module Datadog
|
|
|
52
50
|
# @return [Hash<String,String>] decoded input as a hash of strings
|
|
53
51
|
# @raise [DecodingError] if string does not conform to the `x-datadog-tags` format
|
|
54
52
|
def self.decode(string)
|
|
55
|
-
result =
|
|
53
|
+
result = (string.split(',').map do |raw_tag|
|
|
56
54
|
raw_tag.split('=', 2).tap do |raw_key, raw_value|
|
|
57
55
|
key = raw_key.to_s
|
|
58
56
|
value = raw_value.to_s
|
|
@@ -62,7 +60,7 @@ module Datadog
|
|
|
62
60
|
|
|
63
61
|
value.strip!
|
|
64
62
|
end
|
|
65
|
-
end
|
|
63
|
+
end).to_h
|
|
66
64
|
|
|
67
65
|
raise DecodingError, "Invalid empty tags: #{string}" if result.empty? && !string.empty?
|
|
68
66
|
|
|
@@ -8,10 +8,12 @@ module Datadog
|
|
|
8
8
|
# @see https://github.com/open-telemetry/opentelemetry-specification/blob/255a6c52b8914a2ed7e26bb5585abecab276aafc/specification/sdk-environment-variables.md?plain=1#L88
|
|
9
9
|
class None
|
|
10
10
|
# No-op
|
|
11
|
-
def inject!(_digest, _data)
|
|
11
|
+
def inject!(_digest, _data)
|
|
12
|
+
end
|
|
12
13
|
|
|
13
14
|
# No-op
|
|
14
|
-
def extract(_data)
|
|
15
|
+
def extract(_data)
|
|
16
|
+
end
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
end
|
|
@@ -4,6 +4,7 @@ require_relative '../configuration/ext'
|
|
|
4
4
|
require_relative '../trace_digest'
|
|
5
5
|
require_relative '../trace_operation'
|
|
6
6
|
require_relative '../../core/telemetry/logger'
|
|
7
|
+
require_relative 'baggage'
|
|
7
8
|
|
|
8
9
|
module Datadog
|
|
9
10
|
module Tracing
|
|
@@ -26,9 +27,13 @@ module Datadog
|
|
|
26
27
|
)
|
|
27
28
|
@propagation_styles = propagation_styles
|
|
28
29
|
@propagation_extract_first = propagation_extract_first
|
|
29
|
-
|
|
30
30
|
@propagation_style_inject = propagation_style_inject.map { |style| propagation_styles[style] }
|
|
31
31
|
@propagation_style_extract = propagation_style_extract.map { |style| propagation_styles[style] }
|
|
32
|
+
|
|
33
|
+
# The baggage propagator is unique in that baggage should always be extracted, if present.
|
|
34
|
+
# Therefore we remove it from the `propagation_style_extract` list.
|
|
35
|
+
@baggage_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Baggage) }
|
|
36
|
+
@propagation_style_extract.delete(@baggage_propagator) if @baggage_propagator
|
|
32
37
|
end
|
|
33
38
|
|
|
34
39
|
# inject! populates the env with span ID, trace ID and sampling priority
|
|
@@ -57,9 +62,8 @@ module Datadog
|
|
|
57
62
|
end
|
|
58
63
|
|
|
59
64
|
digest = digest.to_digest if digest.respond_to?(:to_digest)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
::Datadog.logger.debug('Cannot inject distributed trace data: digest.trace_id is nil.')
|
|
65
|
+
if digest.trace_id.nil? && digest.baggage.nil?
|
|
66
|
+
::Datadog.logger.debug('Cannot inject distributed trace data: digest.trace_id and digest.baggage are both nil.')
|
|
63
67
|
return nil
|
|
64
68
|
end
|
|
65
69
|
|
|
@@ -138,12 +142,32 @@ module Datadog
|
|
|
138
142
|
"Error extracting distributed trace data. Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
139
143
|
)
|
|
140
144
|
end
|
|
145
|
+
# Handle baggage after all other styles if present
|
|
146
|
+
extracted_trace_digest = propagate_baggage(data, extracted_trace_digest) if @baggage_propagator
|
|
141
147
|
|
|
142
148
|
extracted_trace_digest
|
|
143
149
|
end
|
|
144
150
|
|
|
145
151
|
private
|
|
146
152
|
|
|
153
|
+
def propagate_baggage(data, extracted_trace_digest)
|
|
154
|
+
if extracted_trace_digest
|
|
155
|
+
# Merge with baggage if present
|
|
156
|
+
digest = @baggage_propagator.extract(data)
|
|
157
|
+
if digest
|
|
158
|
+
extracted_trace_digest.merge(
|
|
159
|
+
baggage: digest.baggage,
|
|
160
|
+
trace_distributed_tags: digest.trace_distributed_tags
|
|
161
|
+
)
|
|
162
|
+
else
|
|
163
|
+
extracted_trace_digest
|
|
164
|
+
end
|
|
165
|
+
else
|
|
166
|
+
# Baggage is the only style
|
|
167
|
+
@baggage_propagator.extract(data)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
147
171
|
def last_datadog_parent_id(headers, tracecontext_tags)
|
|
148
172
|
dd_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Datadog) }
|
|
149
173
|
if tracecontext_tags&.fetch(
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Distributed
|
|
6
|
+
# Helper method to decide when to skip distributed tracing
|
|
7
|
+
module PropagationPolicy
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Skips distributed tracing if disabled for this instrumentation
|
|
11
|
+
# or if APM is disabled unless there is an AppSec event (from upstream distributed trace or local)
|
|
12
|
+
#
|
|
13
|
+
# Both pin_config and global_config are configuration for integrations.
|
|
14
|
+
# pin_config is a Datadog::Core::Pin object, which gives the configuration of a single instance of an integration.
|
|
15
|
+
# global_config is the config for all instances of an integration.
|
|
16
|
+
def enabled?(pin_config: nil, global_config: nil, trace: nil)
|
|
17
|
+
return false unless Tracing.enabled?
|
|
18
|
+
|
|
19
|
+
unless ::Datadog.configuration.apm.tracing.enabled
|
|
20
|
+
return false if trace.nil?
|
|
21
|
+
|
|
22
|
+
trace_source = trace.get_tag(::Datadog::Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16)
|
|
23
|
+
return false if trace_source.nil?
|
|
24
|
+
|
|
25
|
+
# If AppSec is enabled and AppSec bit is set in the trace, we should not skip distributed tracing
|
|
26
|
+
# Other products that will use dd.p.ts should implement similar behavior here
|
|
27
|
+
if ::Datadog.configuration.appsec.enabled && (trace_source & ::Datadog::AppSec::Ext::PRODUCT_BIT) != 0
|
|
28
|
+
return true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
return false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
return pin_config[:distributed_tracing] if pin_config&.key?(:distributed_tracing)
|
|
35
|
+
return global_config[:distributed_tracing] if global_config
|
|
36
|
+
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -52,7 +52,7 @@ module Datadog
|
|
|
52
52
|
tags ||= {}
|
|
53
53
|
tags[Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER] = decision
|
|
54
54
|
when :drop
|
|
55
|
-
tags
|
|
55
|
+
tags&.delete(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -128,7 +128,7 @@ module Datadog
|
|
|
128
128
|
# @param parent_id [Integer] 64-bit
|
|
129
129
|
# @param trace_flags [Integer] 8-bit
|
|
130
130
|
def build_traceparent_string(trace_id, parent_id, trace_flags)
|
|
131
|
-
"00-#{format(
|
|
131
|
+
"00-#{format("%032x", trace_id)}-#{format("%016x", parent_id)}-#{format("%02x", trace_flags)}"
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
# Sets the trace flag to an existing `trace_flags`.
|
|
@@ -148,12 +148,14 @@ module Datadog
|
|
|
148
148
|
|
|
149
149
|
# @see https://www.w3.org/TR/trace-context/#tracestate-header
|
|
150
150
|
def build_tracestate(digest)
|
|
151
|
-
tracestate =
|
|
151
|
+
tracestate = +'dd='
|
|
152
152
|
tracestate << last_dd_parent_id(digest)
|
|
153
153
|
tracestate << "s:#{digest.trace_sampling_priority};" if digest.trace_sampling_priority
|
|
154
154
|
tracestate << "o:#{serialize_origin(digest.trace_origin)};" if digest.trace_origin
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
# Replacing this by safe navigation seems to have a different behaviour on Rubies <= 3.0.
|
|
157
|
+
# It cause a LocalJumpError in the CI.
|
|
158
|
+
if digest.trace_distributed_tags # rubocop:disable Style/SafeNavigation
|
|
157
159
|
digest.trace_distributed_tags.each do |name, value|
|
|
158
160
|
tag = "t.#{serialize_tag_key(name)}:#{serialize_tag_value(value)};"
|
|
159
161
|
|
|
@@ -187,7 +189,7 @@ module Datadog
|
|
|
187
189
|
# Ensure the list has at most 31 elements, as we need to prepend Datadog's
|
|
188
190
|
# entry and the limit is 32 elements total.
|
|
189
191
|
vendors = vendors[0..30]
|
|
190
|
-
"#{tracestate},#{vendors.join(
|
|
192
|
+
"#{tracestate},#{vendors.join(",")}"
|
|
191
193
|
else
|
|
192
194
|
tracestate.to_s
|
|
193
195
|
end
|
|
@@ -199,7 +201,7 @@ module Datadog
|
|
|
199
201
|
def last_dd_parent_id(digest)
|
|
200
202
|
if !digest.span_remote
|
|
201
203
|
span_id = digest.span_id || 0 # Fall back to zero (invalid) if not present
|
|
202
|
-
"p:#{format(
|
|
204
|
+
"p:#{format("%016x", span_id)};"
|
|
203
205
|
elsif digest.trace_distributed_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID)
|
|
204
206
|
"p:#{digest.trace_distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID]};"
|
|
205
207
|
else
|
|
@@ -216,10 +218,10 @@ module Datadog
|
|
|
216
218
|
# DEV: come from Datadog-controlled sources.
|
|
217
219
|
# DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
|
|
218
220
|
value = if INVALID_ORIGIN_CHARS.match?(value)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
221
|
+
value.gsub(INVALID_ORIGIN_CHARS, '_')
|
|
222
|
+
else
|
|
223
|
+
value
|
|
224
|
+
end
|
|
223
225
|
|
|
224
226
|
if REMAP_ORIGIN_CHARS.match?(value)
|
|
225
227
|
value.gsub(REMAP_ORIGIN_CHARS, '~')
|
|
@@ -253,10 +255,10 @@ module Datadog
|
|
|
253
255
|
# DEV: come from Datadog-controlled sources.
|
|
254
256
|
# DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
|
|
255
257
|
ret = if INVALID_TAG_VALUE_CHARS.match?(value)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
258
|
+
value.gsub(INVALID_TAG_VALUE_CHARS, '_')
|
|
259
|
+
else
|
|
260
|
+
value
|
|
261
|
+
end
|
|
260
262
|
|
|
261
263
|
# DEV: Checking for an unlikely '=' is faster than a no-op `tr`.
|
|
262
264
|
if ret.include?('=')
|
|
@@ -333,7 +335,11 @@ module Datadog
|
|
|
333
335
|
key, value = pair.split(':', 2)
|
|
334
336
|
case key
|
|
335
337
|
when 's'
|
|
336
|
-
sampling_priority =
|
|
338
|
+
sampling_priority = begin
|
|
339
|
+
Integer(value)
|
|
340
|
+
rescue
|
|
341
|
+
nil
|
|
342
|
+
end
|
|
337
343
|
when 'o'
|
|
338
344
|
origin = value
|
|
339
345
|
when 'p'
|
|
@@ -350,7 +356,7 @@ module Datadog
|
|
|
350
356
|
tags ||= {}
|
|
351
357
|
tags["#{Tracing::Metadata::Ext::Distributed::TAGS_PREFIX}#{key}"] = value
|
|
352
358
|
else
|
|
353
|
-
unknown_fields ||=
|
|
359
|
+
unknown_fields ||= +''
|
|
354
360
|
unknown_fields << pair
|
|
355
361
|
unknown_fields << ';'
|
|
356
362
|
end
|
|
@@ -59,13 +59,11 @@ module Datadog
|
|
|
59
59
|
|
|
60
60
|
def publish(*args)
|
|
61
61
|
subscriptions.each do |block|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"at #{Array(e.backtrace).first}"
|
|
68
|
-
end
|
|
62
|
+
block.call(*args)
|
|
63
|
+
rescue => e
|
|
64
|
+
Datadog.logger.debug do
|
|
65
|
+
"Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
|
|
66
|
+
"at #{Array(e.backtrace).first}"
|
|
69
67
|
end
|
|
70
68
|
end
|
|
71
69
|
|
|
@@ -12,7 +12,7 @@ module Datadog
|
|
|
12
12
|
case key
|
|
13
13
|
when Ext::Analytics::TAG_ENABLED
|
|
14
14
|
# If true, set rate to 1.0, otherwise set 0.0.
|
|
15
|
-
value = value == true ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
|
|
15
|
+
value = (value == true) ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
|
|
16
16
|
Tracing::Analytics.set_sample_rate(self, value)
|
|
17
17
|
when Ext::Analytics::TAG_SAMPLE_RATE
|
|
18
18
|
Tracing::Analytics.set_sample_rate(self, value)
|
|
@@ -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
|
|
|
@@ -77,6 +82,14 @@ module Datadog
|
|
|
77
82
|
TAG_MSG = 'error.message'
|
|
78
83
|
TAG_STACK = 'error.stack'
|
|
79
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'
|
|
80
93
|
end
|
|
81
94
|
|
|
82
95
|
# @public_api
|
|
@@ -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
|