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,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'configuration'
|
|
4
|
+
require_relative '../core/configuration'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module ErrorTracking
|
|
8
|
+
# Extends Datadog tracing with ErrorTracking features
|
|
9
|
+
module Extensions
|
|
10
|
+
# Inject Error Tracking into global objects.
|
|
11
|
+
def self.activate!
|
|
12
|
+
Core::Configuration::Settings.extend(Configuration::Settings)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module ErrorTracking
|
|
5
|
+
# Based on configuration, the TracePoint listening to :rescue or :raise
|
|
6
|
+
# may report more handled errors than we want to report. Therefore we need
|
|
7
|
+
# a function to filter the events. As the filter function both depends
|
|
8
|
+
# on configuration and is called numerous time, we generate it during
|
|
9
|
+
# during the initialization of the feature to have the best performance
|
|
10
|
+
# possible.
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
module Filters
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def get_gem_name(file_path)
|
|
17
|
+
regex = %r{gems/([^/]+)-\d}
|
|
18
|
+
regex_match = regex.match(file_path)
|
|
19
|
+
return unless regex_match
|
|
20
|
+
|
|
21
|
+
gem_name = regex_match[1]
|
|
22
|
+
|
|
23
|
+
begin
|
|
24
|
+
Gem::Specification.find_by_name(gem_name) # steep:ignore
|
|
25
|
+
rescue Gem::MissingSpecError
|
|
26
|
+
nil
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def user_code?(file_path)
|
|
31
|
+
!get_gem_name(file_path)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def datadog_code?(file_path)
|
|
35
|
+
file_path.include?('lib/datadog/')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def third_party_code?(file_path)
|
|
39
|
+
gem_name = get_gem_name(file_path)
|
|
40
|
+
gem_name && gem_name != "datadog"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def file_included?(file_path, instrumented_files)
|
|
44
|
+
instrumented_files.include?(file_path)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Generate the proc used in the TracePoint
|
|
48
|
+
def generate_filter(to_instrument_scope, handled_errors_include = nil)
|
|
49
|
+
case to_instrument_scope
|
|
50
|
+
# If DD_ERROR_TRACKING_HANDLED_ERRORS is set
|
|
51
|
+
when 'all'
|
|
52
|
+
proc { |file_path| !datadog_code?(file_path) }
|
|
53
|
+
when 'user'
|
|
54
|
+
# If DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE is set
|
|
55
|
+
if handled_errors_include
|
|
56
|
+
proc { |file_path|
|
|
57
|
+
user_code?(file_path) || file_included?(file_path, handled_errors_include)
|
|
58
|
+
}
|
|
59
|
+
else
|
|
60
|
+
proc { |file_path| user_code?(file_path) }
|
|
61
|
+
end
|
|
62
|
+
when 'third_party'
|
|
63
|
+
if handled_errors_include
|
|
64
|
+
proc { |file_path|
|
|
65
|
+
third_party_code?(file_path) || file_included?(file_path, handled_errors_include)
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
proc { |file_path| third_party_code?(file_path) }
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
# If only DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE is set
|
|
72
|
+
proc { |file_path| file_included?(file_path, handled_errors_include) }
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'error_tracking/collector'
|
|
4
|
+
require_relative 'error_tracking/component'
|
|
5
|
+
require_relative 'error_tracking/configuration'
|
|
6
|
+
require_relative 'error_tracking/ext'
|
|
7
|
+
require_relative 'error_tracking/extensions'
|
|
8
|
+
require_relative 'error_tracking/filters'
|
|
9
|
+
|
|
10
|
+
module Datadog
|
|
11
|
+
# Namespace for Datadog ErrorTracking.
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
module ErrorTracking
|
|
15
|
+
# Expose ErrorTracking to global shared objects
|
|
16
|
+
Extensions.activate!
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../identity'
|
|
4
|
+
require_relative '../../../appsec/trace_keeper'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Kit
|
|
8
|
+
module AppSec
|
|
9
|
+
module Events
|
|
10
|
+
# The second version of Business Logic Events SDK
|
|
11
|
+
module V2
|
|
12
|
+
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
|
13
|
+
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
|
14
|
+
TELEMETRY_METRICS_NAMESPACE = 'appsec'
|
|
15
|
+
TELEMETRY_METRICS_SDK_EVENT = 'sdk.event'
|
|
16
|
+
TELEMETRY_METRICS_SDK_VERSION = 'v2'
|
|
17
|
+
TELEMETRY_METRICS_EVENTS_INTO_TYPES = {
|
|
18
|
+
LOGIN_SUCCESS_EVENT => 'login_success',
|
|
19
|
+
LOGIN_FAILURE_EVENT => 'login_failure'
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# Attach user login success information to the service entry span
|
|
24
|
+
# and trigger AppSec event processing.
|
|
25
|
+
#
|
|
26
|
+
# @param login [String] The user login (e.g., username or email).
|
|
27
|
+
# @param user_or_id [String, Hash<Symbol, String>] (optional) If a
|
|
28
|
+
# String, considered as a user ID, if a Hash, considered as a user
|
|
29
|
+
# attributes. The Hash must include `:id` as a key.
|
|
30
|
+
# @param metadata [Hash<Symbol, String>] Additional flat free-form
|
|
31
|
+
# metadata to attach to the event.
|
|
32
|
+
#
|
|
33
|
+
# @example Login only
|
|
34
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_success('alice@example.com')
|
|
35
|
+
#
|
|
36
|
+
# @example Login and user attributes
|
|
37
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_success(
|
|
38
|
+
# 'alice@example.com',
|
|
39
|
+
# { id: 'user-123', email: 'alice@example.com', name: 'Alice' },
|
|
40
|
+
# ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
|
|
41
|
+
# )
|
|
42
|
+
#
|
|
43
|
+
# @return [void]
|
|
44
|
+
def track_user_login_success(login, user_or_id = nil, metadata = {})
|
|
45
|
+
trace = service_entry_trace
|
|
46
|
+
span = service_entry_span
|
|
47
|
+
|
|
48
|
+
if trace.nil? || span.nil?
|
|
49
|
+
return Datadog.logger.warn(
|
|
50
|
+
'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
55
|
+
raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
|
|
56
|
+
|
|
57
|
+
user_attributes = build_user_attributes(user_or_id, login)
|
|
58
|
+
|
|
59
|
+
set_span_tags(span, metadata, namespace: LOGIN_SUCCESS_EVENT)
|
|
60
|
+
set_span_tags(span, user_attributes, namespace: "#{LOGIN_SUCCESS_EVENT}.usr")
|
|
61
|
+
span.set_tag('appsec.events.users.login.success.track', 'true')
|
|
62
|
+
span.set_tag('_dd.appsec.events.users.login.success.sdk', 'true')
|
|
63
|
+
|
|
64
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
65
|
+
|
|
66
|
+
record_event_telemetry_metric(LOGIN_SUCCESS_EVENT)
|
|
67
|
+
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_SUCCESS_EVENT)
|
|
68
|
+
|
|
69
|
+
# NOTE: Guard-clause will not work with Steep typechecking
|
|
70
|
+
return Kit::Identity.set_user(trace, span, **user_attributes) if user_attributes.key?(:id) # steep:ignore
|
|
71
|
+
|
|
72
|
+
# NOTE: This is a fallback for the case when we don't have an ID,
|
|
73
|
+
# but need to trigger WAF.
|
|
74
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
|
|
75
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Attach user login failure information to the service entry span
|
|
79
|
+
# and trigger AppSec event processing.
|
|
80
|
+
#
|
|
81
|
+
# @param login [String] The user login (e.g., username or email).
|
|
82
|
+
# @param user_exists [Boolean] Whether the user exists in the system.
|
|
83
|
+
# @param metadata [Hash<Symbol, String>] Additional flat free-form
|
|
84
|
+
# metadata to attach to the event.
|
|
85
|
+
#
|
|
86
|
+
# @example Login only
|
|
87
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_failure('alice@example.com')
|
|
88
|
+
#
|
|
89
|
+
# @example With user existence and metadata
|
|
90
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_failure(
|
|
91
|
+
# 'alice@example.com',
|
|
92
|
+
# true,
|
|
93
|
+
# ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
|
|
94
|
+
# )
|
|
95
|
+
#
|
|
96
|
+
# @return [void]
|
|
97
|
+
def track_user_login_failure(login, user_exists = false, metadata = {})
|
|
98
|
+
trace = service_entry_trace
|
|
99
|
+
span = service_entry_span
|
|
100
|
+
|
|
101
|
+
if trace.nil? || span.nil?
|
|
102
|
+
return Datadog.logger.warn(
|
|
103
|
+
'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
|
|
104
|
+
)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
108
|
+
raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
|
|
109
|
+
|
|
110
|
+
unless user_exists.is_a?(TrueClass) || user_exists.is_a?(FalseClass)
|
|
111
|
+
raise TypeError, '`user_exists` argument must be a boolean'
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
set_span_tags(span, metadata, namespace: LOGIN_FAILURE_EVENT)
|
|
115
|
+
span.set_tag('appsec.events.users.login.failure.track', 'true')
|
|
116
|
+
span.set_tag('_dd.appsec.events.users.login.failure.sdk', 'true')
|
|
117
|
+
span.set_tag('appsec.events.users.login.failure.usr.login', login)
|
|
118
|
+
span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists.to_s)
|
|
119
|
+
|
|
120
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
121
|
+
|
|
122
|
+
record_event_telemetry_metric(LOGIN_FAILURE_EVENT)
|
|
123
|
+
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_FAILURE_EVENT)
|
|
124
|
+
|
|
125
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
|
|
126
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
private
|
|
130
|
+
|
|
131
|
+
# NOTE: Current tracer implementation does not provide a way to
|
|
132
|
+
# get the service entry span. This is a shortcut we take now.
|
|
133
|
+
def service_entry_trace
|
|
134
|
+
return Datadog::Tracing.active_trace unless Datadog::AppSec.active_context
|
|
135
|
+
|
|
136
|
+
Datadog::AppSec.active_context&.trace
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# NOTE: Current tracer implementation does not provide a way to
|
|
140
|
+
# get the service entry span. This is a shortcut we take now.
|
|
141
|
+
def service_entry_span
|
|
142
|
+
return Datadog::Tracing.active_span unless Datadog::AppSec.active_context
|
|
143
|
+
|
|
144
|
+
Datadog::AppSec.active_context&.span
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def build_user_attributes(user_or_id, login)
|
|
148
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
149
|
+
|
|
150
|
+
case user_or_id
|
|
151
|
+
when nil
|
|
152
|
+
{login: login}
|
|
153
|
+
when String
|
|
154
|
+
{login: login, id: user_or_id}
|
|
155
|
+
when Hash
|
|
156
|
+
raise ArgumentError, 'missing required user key `:id`' unless user_or_id.key?(:id)
|
|
157
|
+
raise TypeError, 'user key `:id` must be a String' unless user_or_id[:id].is_a?(String)
|
|
158
|
+
|
|
159
|
+
user_or_id.merge(login: login)
|
|
160
|
+
else
|
|
161
|
+
raise TypeError, '`user_or_id` argument must be either String or Hash'
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def set_span_tags(span, tags, namespace:)
|
|
166
|
+
tags.each do |name, value|
|
|
167
|
+
next if value.nil?
|
|
168
|
+
|
|
169
|
+
span.set_tag("appsec.events.#{namespace}.#{name}", value)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# TODO: In case if we need to introduce telemetry metrics to the SDK v1
|
|
174
|
+
# or highly increase the number of metrics, this method should be
|
|
175
|
+
# extracted into a proper module.
|
|
176
|
+
def record_event_telemetry_metric(event)
|
|
177
|
+
telemetry = ::Datadog.send(:components, allow_initialization: false)&.telemetry
|
|
178
|
+
|
|
179
|
+
if telemetry.nil?
|
|
180
|
+
return Datadog.logger.debug(
|
|
181
|
+
'Kit::AppSec: Telemetry component is unavailable. Skip recording SDK metrics'
|
|
182
|
+
)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
tags = {
|
|
186
|
+
event_type: TELEMETRY_METRICS_EVENTS_INTO_TYPES[event],
|
|
187
|
+
sdk_version: TELEMETRY_METRICS_SDK_VERSION
|
|
188
|
+
}
|
|
189
|
+
telemetry.inc(TELEMETRY_METRICS_NAMESPACE, TELEMETRY_METRICS_SDK_EVENT, 1, tags: tags)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative '../identity'
|
|
4
|
+
require_relative '../../appsec/trace_keeper'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module Kit
|
|
@@ -10,6 +11,7 @@ module Datadog
|
|
|
10
11
|
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
|
11
12
|
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
|
12
13
|
SIGNUP_EVENT = 'users.signup'
|
|
14
|
+
USER_LOGIN_KEYS = ['usr.login', :"usr.login"].freeze
|
|
13
15
|
|
|
14
16
|
class << self
|
|
15
17
|
# Attach login success event information to the trace
|
|
@@ -30,11 +32,15 @@ module Datadog
|
|
|
30
32
|
set_trace_and_span_context('track_login_success', trace, span) do |active_trace, active_span|
|
|
31
33
|
user_options = user.dup
|
|
32
34
|
user_id = user_options.delete(:id)
|
|
35
|
+
user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
|
|
33
36
|
|
|
34
37
|
raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
|
|
35
38
|
|
|
39
|
+
others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
|
|
40
|
+
others[:"usr.login"] = user_login
|
|
36
41
|
track(LOGIN_SUCCESS_EVENT, active_trace, active_span, **others)
|
|
37
42
|
|
|
43
|
+
user_options[:login] = user_login
|
|
38
44
|
Kit::Identity.set_user(active_trace, active_span, id: user_id, **user_options)
|
|
39
45
|
end
|
|
40
46
|
end
|
|
@@ -55,6 +61,7 @@ module Datadog
|
|
|
55
61
|
# event information to attach to the trace.
|
|
56
62
|
def track_login_failure(trace = nil, span = nil, user_exists:, user_id: nil, **others)
|
|
57
63
|
set_trace_and_span_context('track_login_failure', trace, span) do |active_trace, active_span|
|
|
64
|
+
others[:"usr.login"] = user_id if user_id && !others.key?(:"usr.login") && !others.key?('usr.login')
|
|
58
65
|
track(LOGIN_FAILURE_EVENT, active_trace, active_span, **others)
|
|
59
66
|
|
|
60
67
|
active_span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
|
|
@@ -80,11 +87,15 @@ module Datadog
|
|
|
80
87
|
set_trace_and_span_context('track_signup', trace, span) do |active_trace, active_span|
|
|
81
88
|
user_options = user.dup
|
|
82
89
|
user_id = user_options.delete(:id)
|
|
90
|
+
user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
|
|
83
91
|
|
|
84
92
|
raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
|
|
85
93
|
|
|
94
|
+
others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
|
|
95
|
+
others[:"usr.login"] = user_login
|
|
86
96
|
track(SIGNUP_EVENT, active_trace, active_span, **others)
|
|
87
97
|
|
|
98
|
+
user_options[:login] = user_login
|
|
88
99
|
Kit::Identity.set_user(trace, id: user_id, **user_options)
|
|
89
100
|
end
|
|
90
101
|
end
|
|
@@ -116,7 +127,7 @@ module Datadog
|
|
|
116
127
|
span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
|
|
117
128
|
end
|
|
118
129
|
|
|
119
|
-
|
|
130
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
120
131
|
else
|
|
121
132
|
set_trace_and_span_context('track', trace, span) do |active_trace, active_span|
|
|
122
133
|
active_span.set_tag("appsec.events.#{event}.track", 'true')
|
|
@@ -128,9 +139,11 @@ module Datadog
|
|
|
128
139
|
active_span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
|
|
129
140
|
end
|
|
130
141
|
|
|
131
|
-
|
|
142
|
+
::Datadog::AppSec::TraceKeeper.keep!(active_trace)
|
|
132
143
|
end
|
|
133
144
|
end
|
|
145
|
+
|
|
146
|
+
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', event)
|
|
134
147
|
end
|
|
135
148
|
|
|
136
149
|
private
|
|
@@ -142,11 +155,11 @@ module Datadog
|
|
|
142
155
|
end
|
|
143
156
|
|
|
144
157
|
trace ||= Datadog::Tracing.active_trace
|
|
145
|
-
span ||=
|
|
158
|
+
span ||= trace&.active_span || Datadog::Tracing.active_span
|
|
146
159
|
|
|
147
160
|
unless trace && span
|
|
148
161
|
Datadog.logger.debug(
|
|
149
|
-
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
|
|
162
|
+
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
|
|
150
163
|
' to track this events'
|
|
151
164
|
)
|
|
152
165
|
return
|
data/lib/datadog/kit/identity.rb
CHANGED
|
@@ -33,6 +33,7 @@ module Datadog
|
|
|
33
33
|
# @param others [Hash<Symbol, String>] Additional free-form
|
|
34
34
|
# user information to attach to the trace.
|
|
35
35
|
#
|
|
36
|
+
# rubocop:disable Metrics/AbcSize
|
|
36
37
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
37
38
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
38
39
|
def set_user(
|
|
@@ -42,12 +43,12 @@ module Datadog
|
|
|
42
43
|
|
|
43
44
|
# enforce types
|
|
44
45
|
|
|
45
|
-
raise TypeError, ':id must be a String'
|
|
46
|
-
raise TypeError, ':email must be a String'
|
|
47
|
-
raise TypeError, ':name must be a String'
|
|
46
|
+
raise TypeError, ':id must be a String' unless id.is_a?(String)
|
|
47
|
+
raise TypeError, ':email must be a String' unless email.nil? || email.is_a?(String)
|
|
48
|
+
raise TypeError, ':name must be a String' unless name.nil? || name.is_a?(String)
|
|
48
49
|
raise TypeError, ':session_id must be a String' unless session_id.nil? || session_id.is_a?(String)
|
|
49
|
-
raise TypeError, ':role must be a String'
|
|
50
|
-
raise TypeError, ':scope must be a String'
|
|
50
|
+
raise TypeError, ':role must be a String' unless role.nil? || role.is_a?(String)
|
|
51
|
+
raise TypeError, ':scope must be a String' unless scope.nil? || scope.is_a?(String)
|
|
51
52
|
|
|
52
53
|
others.each do |k, v|
|
|
53
54
|
raise TypeError, "#{k.inspect} must be a String" unless v.nil? || v.is_a?(String)
|
|
@@ -56,27 +57,33 @@ module Datadog
|
|
|
56
57
|
set_trace_and_span_context('set_user', trace, span) do |_active_trace, active_span|
|
|
57
58
|
# set tags once data is known consistent
|
|
58
59
|
active_span.set_tag('usr.id', id)
|
|
59
|
-
active_span.set_tag('usr.email', email)
|
|
60
|
-
active_span.set_tag('usr.name', name)
|
|
60
|
+
active_span.set_tag('usr.email', email) unless email.nil?
|
|
61
|
+
active_span.set_tag('usr.name', name) unless name.nil?
|
|
61
62
|
active_span.set_tag('usr.session_id', session_id) unless session_id.nil?
|
|
62
|
-
active_span.set_tag('usr.role', role)
|
|
63
|
-
active_span.set_tag('usr.scope', scope)
|
|
63
|
+
active_span.set_tag('usr.role', role) unless role.nil?
|
|
64
|
+
active_span.set_tag('usr.scope', scope) unless scope.nil?
|
|
64
65
|
|
|
65
66
|
others.each do |k, v|
|
|
66
67
|
active_span.set_tag("usr.#{k}", v) unless v.nil?
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
if Datadog::AppSec.active_context
|
|
70
|
-
user
|
|
71
|
+
active_span.set_tag('_dd.appsec.user.collection_mode', 'sdk')
|
|
72
|
+
|
|
73
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(id, others[:login], session_id)
|
|
71
74
|
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
72
75
|
end
|
|
73
76
|
end
|
|
74
77
|
end
|
|
78
|
+
# rubocop:enable Metrics/AbcSize
|
|
75
79
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
76
80
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
77
81
|
|
|
78
82
|
private
|
|
79
83
|
|
|
84
|
+
# rubocop:disable Metrics/AbcSize
|
|
85
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
86
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
80
87
|
def set_trace_and_span_context(method, trace = nil, span = nil)
|
|
81
88
|
if (appsec_context = Datadog::AppSec.active_context)
|
|
82
89
|
trace = appsec_context.trace
|
|
@@ -84,11 +91,11 @@ module Datadog
|
|
|
84
91
|
end
|
|
85
92
|
|
|
86
93
|
trace ||= Datadog::Tracing.active_trace
|
|
87
|
-
span ||= trace
|
|
94
|
+
span ||= trace&.active_span || Datadog::Tracing.active_span
|
|
88
95
|
|
|
89
96
|
unless trace && span
|
|
90
97
|
Datadog.logger.debug(
|
|
91
|
-
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
|
|
98
|
+
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
|
|
92
99
|
' to track this events'
|
|
93
100
|
)
|
|
94
101
|
return
|
|
@@ -98,6 +105,9 @@ module Datadog
|
|
|
98
105
|
|
|
99
106
|
yield(trace, span)
|
|
100
107
|
end
|
|
108
|
+
# rubocop:enable Metrics/AbcSize
|
|
109
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
110
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
101
111
|
end
|
|
102
112
|
end
|
|
103
113
|
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'trace/span'
|
|
4
|
+
require_relative '../../tracing/trace_operation'
|
|
5
|
+
require_relative '../trace'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module OpenTelemetry
|
|
9
|
+
module API
|
|
10
|
+
# The Baggage module provides an implementation of the OpenTelemetry Baggage API.
|
|
11
|
+
#
|
|
12
|
+
# Baggage is a set of name/value pairs describing user-defined properties that can be
|
|
13
|
+
# propagated through a distributed trace. This implementation follows the W3C Baggage
|
|
14
|
+
# specification and the OpenTelemetry Baggage API.
|
|
15
|
+
#
|
|
16
|
+
# @see https://www.w3.org/TR/baggage/
|
|
17
|
+
# @see https://opentelemetry.io/docs/specs/otel/baggage/api/
|
|
18
|
+
module Baggage
|
|
19
|
+
def initialize(trace: nil)
|
|
20
|
+
@trace = trace
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Returns a new context with empty baggage
|
|
24
|
+
#
|
|
25
|
+
# @param [optional Context] context Context to clear baggage from. Defaults
|
|
26
|
+
# to ::OpenTelemetry::Context.current
|
|
27
|
+
# @return [Context]
|
|
28
|
+
def clear(context: ::OpenTelemetry::Context.current)
|
|
29
|
+
context.ensure_trace.baggage.clear
|
|
30
|
+
context
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns the corresponding value for key
|
|
34
|
+
#
|
|
35
|
+
# @param [String] key The lookup key
|
|
36
|
+
# @param [optional Context] context The context from which to retrieve
|
|
37
|
+
# the key. Defaults to ::OpenTelemetry::Context.current
|
|
38
|
+
# @return [String, nil]
|
|
39
|
+
def value(key, context: ::OpenTelemetry::Context.current)
|
|
40
|
+
trace = context.ensure_trace
|
|
41
|
+
return nil if trace.nil?
|
|
42
|
+
|
|
43
|
+
trace.baggage && trace.baggage[key]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns all baggage values
|
|
47
|
+
#
|
|
48
|
+
# @param [optional Context] context The context from which to retrieve
|
|
49
|
+
# the baggage. Defaults to ::OpenTelemetry::Context.current
|
|
50
|
+
# @return [Hash<String, String>]
|
|
51
|
+
def values(context: ::OpenTelemetry::Context.current)
|
|
52
|
+
trace = context.ensure_trace
|
|
53
|
+
return {} if trace.nil?
|
|
54
|
+
|
|
55
|
+
trace.baggage ? trace.baggage.dup : {}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns a new context with new key-value pair
|
|
59
|
+
#
|
|
60
|
+
# @param [String] key The key to store this value under
|
|
61
|
+
# @param [String] value String value to be stored under key
|
|
62
|
+
# @param [optional String] metadata This is here to store properties
|
|
63
|
+
# received from other W3C Baggage implementations but is not exposed in
|
|
64
|
+
# OpenTelemetry. This is considered private API and not for use by
|
|
65
|
+
# end-users.
|
|
66
|
+
# @param [optional Context] context The context to update with new
|
|
67
|
+
# value. Defaults to ::OpenTelemetry::Context.current
|
|
68
|
+
# @return [Context]
|
|
69
|
+
def set_value(key, value, metadata: nil, context: ::OpenTelemetry::Context.current)
|
|
70
|
+
# Delegate to the context to set the value because an active trace is not guaranteed
|
|
71
|
+
# set_values handles this logic
|
|
72
|
+
context.set_values({::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY) => {key => value}})
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Returns a new context with value at key removed
|
|
76
|
+
#
|
|
77
|
+
# @param [String] key The key to remove
|
|
78
|
+
# @param [optional Context] context The context to remove baggage
|
|
79
|
+
# from. Defaults to ::OpenTelemetry::Context.current
|
|
80
|
+
# @return [Context]
|
|
81
|
+
def remove_value(key, context: ::OpenTelemetry::Context.current)
|
|
82
|
+
# Delegate to the context to remove the value because an active trace is not guaranteed
|
|
83
|
+
# set_values handles this logic
|
|
84
|
+
context.set_values({Context::BAGGAGE_REMOVE_KEY => key})
|
|
85
|
+
end
|
|
86
|
+
::OpenTelemetry::Baggage.singleton_class.prepend(self)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenTelemetry
|
|
5
|
+
module API
|
|
6
|
+
module Baggage
|
|
7
|
+
def initialize: (?trace: Datadog::Tracing::TraceOperation?) -> void
|
|
8
|
+
|
|
9
|
+
# Returns a new context with empty baggage
|
|
10
|
+
def clear: (?context: OpenTelemetry::Context) -> OpenTelemetry::Context
|
|
11
|
+
|
|
12
|
+
# Returns the corresponding value for key
|
|
13
|
+
def value: (String key, ?context: OpenTelemetry::Context) -> String?
|
|
14
|
+
|
|
15
|
+
# Returns all baggage values
|
|
16
|
+
def values: (?context: OpenTelemetry::Context) -> Hash[String, String]
|
|
17
|
+
|
|
18
|
+
# Returns a new context with key-value pair
|
|
19
|
+
def set_value: (String key, String value, ?metadata: String?, ?context: OpenTelemetry::Context) -> OpenTelemetry::Context
|
|
20
|
+
|
|
21
|
+
# Returns a new context with value at key removed
|
|
22
|
+
def remove_value: (String key, ?context: OpenTelemetry::Context) -> OpenTelemetry::Context
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -21,11 +21,13 @@ module Datadog
|
|
|
21
21
|
module Context
|
|
22
22
|
CURRENT_SPAN_KEY = ::OpenTelemetry::Trace.const_get(:CURRENT_SPAN_KEY)
|
|
23
23
|
private_constant :CURRENT_SPAN_KEY
|
|
24
|
+
BAGGAGE_REMOVE_KEY = Object.new # sentinel object to indicate the deletion of a value in baggage
|
|
24
25
|
|
|
25
|
-
def initialize(entries, trace: nil)
|
|
26
|
+
def initialize(entries, trace: nil, baggage: nil)
|
|
26
27
|
@trace = trace || ::Datadog::Tracing.send(:tracer).send(:start_trace)
|
|
27
28
|
@trace.otel_values.merge!(entries) if entries
|
|
28
29
|
@trace.otel_context ||= self
|
|
30
|
+
@trace.baggage = baggage if baggage
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
# Because Context can be reused, we have to make sure we have
|
|
@@ -48,7 +50,8 @@ module Datadog
|
|
|
48
50
|
@trace.otel_value(key)
|
|
49
51
|
end
|
|
50
52
|
|
|
51
|
-
alias
|
|
53
|
+
# `alias` performed to match {::OpenTelemetry::Context} aliasing upstream
|
|
54
|
+
alias [] value # rubocop:disable Style/Alias
|
|
52
55
|
|
|
53
56
|
# Returns a new Context where entries contains the newly added key and value
|
|
54
57
|
#
|
|
@@ -78,9 +81,21 @@ module Datadog
|
|
|
78
81
|
)
|
|
79
82
|
end
|
|
80
83
|
|
|
81
|
-
existing_values = @trace
|
|
84
|
+
existing_values = @trace&.otel_values || {}
|
|
85
|
+
existing_baggage = @trace&.baggage || {}
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
# Retrieve the baggage removal sentinel and remove it from the values hash
|
|
88
|
+
existing_baggage.delete(values[BAGGAGE_REMOVE_KEY]) if values.key?(BAGGAGE_REMOVE_KEY)
|
|
89
|
+
|
|
90
|
+
# If the values hash contains a BAGGAGE_KEY, merge its contents with existing baggage
|
|
91
|
+
# Otherwise, keep the existing baggage unchanged
|
|
92
|
+
new_baggage = if values.key?(::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY))
|
|
93
|
+
existing_baggage.merge(values[::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY)])
|
|
94
|
+
else
|
|
95
|
+
existing_baggage
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
::OpenTelemetry::Context.new(existing_values.merge(values), trace: trace, baggage: new_baggage)
|
|
84
99
|
end
|
|
85
100
|
|
|
86
101
|
# The Datadog {TraceOperation} associated with this {Context}.
|
|
@@ -111,7 +126,7 @@ module Datadog
|
|
|
111
126
|
previous_trace = Tracing.active_trace
|
|
112
127
|
continue_trace!(context)
|
|
113
128
|
|
|
114
|
-
stack.push(previous_trace
|
|
129
|
+
stack.push(previous_trace&.otel_context || ::OpenTelemetry::Context::ROOT)
|
|
115
130
|
stack.size
|
|
116
131
|
end
|
|
117
132
|
|
|
@@ -154,7 +169,7 @@ module Datadog
|
|
|
154
169
|
|
|
155
170
|
def continue_trace!(context, &block)
|
|
156
171
|
call_context = Tracing.send(:tracer).send(:call_context)
|
|
157
|
-
if context
|
|
172
|
+
if context&.trace
|
|
158
173
|
call_context.activate!(context.ensure_trace, &block)
|
|
159
174
|
else
|
|
160
175
|
call_context.activate!(nil)
|