datadog 2.17.0 → 2.37.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 +686 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +344 -126
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
- data/ext/datadog_profiling_native_extension/collectors_stack.c +314 -91
- data/ext/datadog_profiling_native_extension/collectors_stack.h +26 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +680 -352
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +18 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
- data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +48 -34
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
- data/ext/datadog_profiling_native_extension/heap_recorder.c +455 -430
- data/ext/datadog_profiling_native_extension/heap_recorder.h +16 -7
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +18 -15
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -10
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +73 -69
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -4
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +64 -59
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +20 -16
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +253 -131
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
- data/ext/libdatadog_api/crashtracker.c +16 -15
- data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
- data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
- data/ext/libdatadog_api/ddsketch.c +102 -0
- data/ext/libdatadog_api/di.c +203 -0
- data/ext/libdatadog_api/extconf.rb +21 -25
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/helpers.h +27 -0
- data/ext/libdatadog_api/init.c +13 -1
- data/ext/libdatadog_api/library_config.c +88 -37
- data/ext/libdatadog_api/library_config.h +6 -0
- data/ext/libdatadog_api/process_discovery.c +25 -24
- data/ext/libdatadog_extconf_helpers.rb +107 -14
- data/lib/datadog/ai_guard/api_client.rb +84 -0
- data/lib/datadog/ai_guard/autoload.rb +10 -0
- data/lib/datadog/ai_guard/component.rb +44 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration.rb +115 -0
- data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
- data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
- data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
- data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
- data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +108 -0
- data/lib/datadog/ai_guard/ext.rb +29 -0
- data/lib/datadog/ai_guard.rb +181 -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 +66 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +104 -0
- data/lib/datadog/appsec/api_security/sampler.rb +62 -0
- data/lib/datadog/appsec/api_security.rb +14 -0
- data/lib/datadog/appsec/assets/blocked.html +10 -1
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +37 -64
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +77 -16
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +4 -2
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -13
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -13
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +47 -13
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +80 -62
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +35 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +47 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +52 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +29 -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/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +63 -10
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -21
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/counter_sampler.rb +25 -0
- data/lib/datadog/appsec/default_header_tags.rb +52 -0
- data/lib/datadog/appsec/event.rb +14 -47
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +17 -1
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/metrics/collector.rb +47 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +21 -4
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +47 -0
- data/lib/datadog/appsec/metrics.rb +5 -4
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
- data/lib/datadog/appsec/remote.rb +51 -76
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
- data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
- data/lib/datadog/appsec/route_normalizer.rb +80 -0
- data/lib/datadog/appsec/security_engine/engine.rb +197 -0
- data/lib/datadog/appsec/security_engine/result.rb +45 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +36 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec/utils/http/body.rb +38 -0
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
- data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
- data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
- data/lib/datadog/appsec.rb +10 -17
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -47
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +192 -20
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +109 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +95 -65
- data/lib/datadog/core/configuration/option_definition.rb +42 -23
- data/lib/datadog/core/configuration/options.rb +57 -18
- data/lib/datadog/core/configuration/settings.rb +160 -25
- data/lib/datadog/core/configuration/stable_config.rb +11 -2
- data/lib/datadog/core/configuration/supported_configurations.rb +413 -0
- data/lib/datadog/core/configuration.rb +4 -4
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +73 -21
- data/lib/datadog/core/crashtracking/tag_builder.rb +9 -21
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/core/environment/agent_info.rb +65 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +13 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/identity.rb +40 -4
- data/lib/datadog/core/environment/process.rb +122 -0
- data/lib/datadog/core/environment/socket.rb +13 -0
- data/lib/datadog/core/environment/variable_helpers.rb +3 -3
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/knuth_sampler.rb +57 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +7 -7
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +51 -21
- data/lib/datadog/core/rate_limiter.rb +11 -1
- data/lib/datadog/core/remote/client/capabilities.rb +49 -6
- data/lib/datadog/core/remote/client.rb +15 -7
- data/lib/datadog/core/remote/component.rb +64 -36
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +13 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +9 -36
- data/lib/datadog/core/remote/transport/http/config.rb +15 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +52 -0
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +65 -17
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -3
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +203 -89
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +2 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +5 -2
- data/lib/datadog/core/telemetry/logging.rb +22 -4
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -5
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
- data/lib/datadog/core/telemetry/worker.rb +108 -32
- data/lib/datadog/core/transport/ext.rb +3 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +11 -7
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http/response.rb +4 -0
- data/lib/datadog/core/transport/http.rb +24 -19
- data/lib/datadog/core/transport/parcel.rb +61 -9
- data/lib/datadog/core/transport/response.rb +16 -2
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +1 -1
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
- data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
- data/lib/datadog/core/utils/fnv.rb +26 -0
- data/lib/datadog/core/utils/forking.rb +3 -1
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -14
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
- data/lib/datadog/core/utils/time.rb +1 -1
- data/lib/datadog/core/utils.rb +10 -1
- data/lib/datadog/core/workers/async.rb +11 -2
- data/lib/datadog/core/workers/interval_loop.rb +51 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +96 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +11 -2
- data/lib/datadog/data_streams/configuration.rb +50 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +511 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
- data/lib/datadog/data_streams/transport/http.rb +36 -0
- data/lib/datadog/data_streams/transport/stats.rb +39 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/base.rb +15 -7
- data/lib/datadog/di/boot.rb +11 -1
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +143 -48
- data/lib/datadog/di/configuration.rb +235 -2
- data/lib/datadog/di/context.rb +76 -0
- data/lib/datadog/di/contrib/active_record.rb +34 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +44 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +620 -132
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +78 -15
- data/lib/datadog/di/probe_builder.rb +42 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +87 -0
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +285 -100
- data/lib/datadog/di/probe_notifier_worker.rb +120 -36
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/proc_responder.rb +36 -0
- data/lib/datadog/di/redactor.rb +24 -2
- data/lib/datadog/di/remote.rb +258 -95
- data/lib/datadog/di/serializer.rb +297 -20
- data/lib/datadog/di/transport/diagnostics.rb +12 -42
- data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
- data/lib/datadog/di/transport/http/input.rb +12 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +121 -39
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +203 -10
- data/lib/datadog/error_tracking/collector.rb +2 -1
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/error_tracking/configuration.rb +55 -2
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +253 -0
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/identity.rb +17 -11
- data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
- data/lib/datadog/open_feature/component.rb +100 -0
- data/lib/datadog/open_feature/configuration.rb +37 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +16 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +101 -0
- data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
- data/lib/datadog/open_feature/native_evaluator.rb +60 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +191 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +121 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +66 -2
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +13 -7
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +12 -9
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +83 -15
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -3
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -4
- data/lib/datadog/profiling/collectors/info.rb +59 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -5
- data/lib/datadog/profiling/component.rb +73 -49
- data/lib/datadog/profiling/exporter.rb +48 -13
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
- data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
- data/lib/datadog/profiling/ext.rb +2 -15
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +24 -11
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -12
- data/lib/datadog/profiling/scheduler.rb +12 -10
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +5 -13
- data/lib/datadog/profiling/tag_builder.rb +42 -38
- data/lib/datadog/profiling/tasks/exec.rb +10 -5
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +4 -2
- data/lib/datadog/profiling.rb +8 -11
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +10 -1
- data/lib/datadog/symbol_database/component.rb +734 -0
- data/lib/datadog/symbol_database/configuration.rb +73 -0
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +1110 -0
- data/lib/datadog/symbol_database/file_hash.rb +48 -0
- data/lib/datadog/symbol_database/logger.rb +43 -0
- data/lib/datadog/symbol_database/remote.rb +180 -0
- data/lib/datadog/symbol_database/scope.rb +102 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
- data/lib/datadog/symbol_database/service_version.rb +66 -0
- data/lib/datadog/symbol_database/symbol.rb +69 -0
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
- data/lib/datadog/symbol_database/transport/http.rb +45 -0
- data/lib/datadog/symbol_database/transport.rb +54 -0
- data/lib/datadog/symbol_database/uploader.rb +230 -0
- data/lib/datadog/symbol_database.rb +71 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +10 -10
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +25 -5
- data/lib/datadog/tracing/configuration/settings.rb +125 -11
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +29 -11
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +47 -12
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- 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_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +7 -10
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +16 -16
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +15 -12
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -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 +8 -10
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- 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 +3 -3
- 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 +22 -7
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- 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 +47 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +7 -8
- data/lib/datadog/tracing/contrib/ethon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -9
- data/lib/datadog/tracing/contrib/ext.rb +6 -4
- data/lib/datadog/tracing/contrib/extensions.rb +28 -11
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +7 -9
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +18 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -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 +105 -63
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -10
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- 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 +2 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +10 -11
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +9 -13
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -10
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -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/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +24 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +39 -8
- data/lib/datadog/tracing/contrib/karafka.rb +1 -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 +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +6 -6
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +11 -14
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +64 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -6
- 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 +9 -11
- 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/ext.rb +13 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +25 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -6
- 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/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +55 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +83 -44
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +126 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/rails/runner.rb +64 -40
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +10 -8
- 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 +2 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +6 -4
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- 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 +2 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -9
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -3
- 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 +6 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -6
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +8 -4
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +40 -39
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +15 -13
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
- data/lib/datadog/tracing/contrib.rb +9 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +12 -4
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +133 -12
- data/lib/datadog/tracing/distributed/datadog.rb +17 -16
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -26
- 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 +39 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +107 -78
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +6 -6
- 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 +2 -2
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -2
- data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +77 -48
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +3 -3
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +2 -2
- data/lib/datadog/tracing/span_event.rb +12 -12
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +63 -19
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +28 -23
- data/lib/datadog/tracing/trace_operation.rb +209 -98
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +113 -52
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +4 -52
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +11 -14
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +14 -82
- data/lib/datadog/tracing/workers.rb +4 -3
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +14 -0
- metadata +201 -40
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -321
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
- data/lib/datadog/appsec/configuration/settings.rb +0 -342
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/configuration/settings.rb +0 -212
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../stats'
|
|
4
|
+
require_relative '../../../core/transport/http/api/endpoint'
|
|
5
|
+
require_relative '../../../core/transport/http/response'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module DataStreams
|
|
9
|
+
module Transport
|
|
10
|
+
module HTTP
|
|
11
|
+
# HTTP transport behavior for Data Streams stats
|
|
12
|
+
module Stats
|
|
13
|
+
# Response from HTTP transport for DSM stats
|
|
14
|
+
class Response
|
|
15
|
+
include Datadog::Core::Transport::HTTP::Response
|
|
16
|
+
|
|
17
|
+
def initialize(http_response)
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module API
|
|
23
|
+
# Endpoint for submitting DSM stats data
|
|
24
|
+
class Endpoint < Core::Transport::HTTP::API::Endpoint
|
|
25
|
+
def initialize(path)
|
|
26
|
+
super(:post, path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def call(env, &block)
|
|
30
|
+
# Build request
|
|
31
|
+
env.verb = verb
|
|
32
|
+
env.path = path
|
|
33
|
+
env.body = env.request.parcel.data
|
|
34
|
+
if (content_type = env.request.parcel.content_type)
|
|
35
|
+
env.headers['content-type'] = content_type
|
|
36
|
+
end
|
|
37
|
+
if (content_encoding = env.request.parcel.content_encoding)
|
|
38
|
+
env.headers['content-encoding'] = content_encoding
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Send request
|
|
42
|
+
http_response = yield(env)
|
|
43
|
+
|
|
44
|
+
# Build response
|
|
45
|
+
Response.new(http_response)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def encoder
|
|
49
|
+
# DSM handles encoding in the transport layer
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../core/transport/http'
|
|
4
|
+
require_relative 'http/stats'
|
|
5
|
+
require_relative 'stats'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module DataStreams
|
|
9
|
+
module Transport
|
|
10
|
+
# HTTP transport for Data Streams Monitoring
|
|
11
|
+
module HTTP
|
|
12
|
+
V01 = Stats::API::Endpoint.new(
|
|
13
|
+
'/v0.1/pipeline_stats'
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
# Builds a new Transport::HTTP::Client with default settings
|
|
19
|
+
def default(
|
|
20
|
+
agent_settings:,
|
|
21
|
+
logger:
|
|
22
|
+
)
|
|
23
|
+
Core::Transport::HTTP.build(
|
|
24
|
+
agent_settings: agent_settings,
|
|
25
|
+
logger: logger,
|
|
26
|
+
) do |transport|
|
|
27
|
+
transport.api 'v0.1', V01, default: true
|
|
28
|
+
|
|
29
|
+
# Call block to apply any customization, if provided
|
|
30
|
+
yield(transport) if block_given?
|
|
31
|
+
end.to_transport(Transport::Stats::Transport)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'msgpack'
|
|
4
|
+
require 'zlib'
|
|
5
|
+
require_relative '../../core/transport/parcel'
|
|
6
|
+
require_relative '../../core/transport/request'
|
|
7
|
+
require_relative '../../core/transport/transport'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module DataStreams
|
|
11
|
+
module Transport
|
|
12
|
+
module Stats
|
|
13
|
+
# Request for DSM stats
|
|
14
|
+
class Request < Datadog::Core::Transport::Request
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Transport for Data Streams Monitoring stats
|
|
18
|
+
class Transport < Core::Transport::Transport
|
|
19
|
+
def send_stats(payload)
|
|
20
|
+
# MessagePack encode and gzip compress the payload
|
|
21
|
+
msgpack_data = MessagePack.pack(payload)
|
|
22
|
+
compressed_data = Zlib.gzip(msgpack_data)
|
|
23
|
+
|
|
24
|
+
# Create parcel and request
|
|
25
|
+
parcel = Core::Transport::Parcel.new(
|
|
26
|
+
compressed_data,
|
|
27
|
+
content_type: 'application/msgpack',
|
|
28
|
+
content_encoding: 'gzip',
|
|
29
|
+
)
|
|
30
|
+
request = Request.new(parcel)
|
|
31
|
+
|
|
32
|
+
# Send to agent
|
|
33
|
+
client.send_request(:stats, request)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'data_streams/processor'
|
|
4
|
+
require_relative 'data_streams/pathway_context'
|
|
5
|
+
require_relative 'data_streams/configuration'
|
|
6
|
+
require_relative 'data_streams/extensions'
|
|
7
|
+
require_relative 'core/utils/time'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
# Datadog Data Streams Monitoring public API.
|
|
11
|
+
#
|
|
12
|
+
# The Datadog team ensures that public methods in this module
|
|
13
|
+
# only receive backwards compatible changes, and breaking changes
|
|
14
|
+
# will only occur in new major versions releases.
|
|
15
|
+
# @public_api
|
|
16
|
+
module DataStreams
|
|
17
|
+
class << self
|
|
18
|
+
# Set a produce checkpoint for Data Streams Monitoring
|
|
19
|
+
#
|
|
20
|
+
# @param type [String] The type of the checkpoint (e.g., 'kafka', 'kinesis', 'sns')
|
|
21
|
+
# @param destination [String] The destination (e.g., topic, exchange, stream name)
|
|
22
|
+
# @param auto_instrumentation [Boolean] Whether this checkpoint was set by auto-instrumentation (default: false)
|
|
23
|
+
# @param tags [Hash] Additional tags to include
|
|
24
|
+
# @yield [key, value] Block to inject context into carrier
|
|
25
|
+
# @return [String, nil] Base64 encoded pathway context or nil if disabled
|
|
26
|
+
# @public_api
|
|
27
|
+
def set_produce_checkpoint(type:, destination:, auto_instrumentation: false, tags: {}, &block)
|
|
28
|
+
processor&.set_produce_checkpoint(
|
|
29
|
+
type: type,
|
|
30
|
+
destination: destination,
|
|
31
|
+
manual_checkpoint: !auto_instrumentation,
|
|
32
|
+
tags: tags,
|
|
33
|
+
&block
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Set a consume checkpoint for Data Streams Monitoring
|
|
38
|
+
#
|
|
39
|
+
# @param type [String] The type of the checkpoint (e.g., 'kafka', 'kinesis', 'sns')
|
|
40
|
+
# @param source [String] The source (e.g., topic, exchange, stream name)
|
|
41
|
+
# @param auto_instrumentation [Boolean] Whether this checkpoint was set by auto-instrumentation (default: false)
|
|
42
|
+
# @param tags [Hash] Additional tags to include
|
|
43
|
+
# @yield [key] Block to extract context from carrier
|
|
44
|
+
# @return [String, nil] Base64 encoded pathway context or nil if disabled
|
|
45
|
+
# @public_api
|
|
46
|
+
def set_consume_checkpoint(type:, source:, auto_instrumentation: false, tags: {}, &block)
|
|
47
|
+
processor&.set_consume_checkpoint(
|
|
48
|
+
type: type,
|
|
49
|
+
source: source,
|
|
50
|
+
manual_checkpoint: !auto_instrumentation,
|
|
51
|
+
tags: tags,
|
|
52
|
+
&block
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Track Kafka produce offset for lag monitoring
|
|
57
|
+
#
|
|
58
|
+
# @param topic [String] The Kafka topic name
|
|
59
|
+
# @param partition [Integer] The partition number
|
|
60
|
+
# @param offset [Integer] The offset of the produced message
|
|
61
|
+
# @return [Boolean, nil] true if tracking succeeded, nil if disabled
|
|
62
|
+
# @!visibility private
|
|
63
|
+
def track_kafka_produce(topic, partition, offset)
|
|
64
|
+
processor&.track_kafka_produce(topic, partition, offset, Core::Utils::Time.now)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Track Kafka message consumption for consumer lag monitoring
|
|
68
|
+
#
|
|
69
|
+
# @param topic [String] The Kafka topic name
|
|
70
|
+
# @param partition [Integer] The partition number
|
|
71
|
+
# @param offset [Integer] The offset of the consumed message
|
|
72
|
+
# @return [Boolean, nil] true if tracking succeeded, nil if disabled
|
|
73
|
+
# @!visibility private
|
|
74
|
+
def track_kafka_consume(topic, partition, offset)
|
|
75
|
+
processor&.track_kafka_consume(topic, partition, offset, Core::Utils::Time.now)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Check if Data Streams Monitoring is enabled and available
|
|
79
|
+
#
|
|
80
|
+
# @return [Boolean] true if the processor is available
|
|
81
|
+
# @public_api
|
|
82
|
+
def enabled?
|
|
83
|
+
!processor.nil?
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def processor
|
|
89
|
+
components.data_streams
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def components
|
|
93
|
+
Datadog.send(:components)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Expose Data Streams to global shared objects
|
|
98
|
+
Extensions.activate!
|
|
99
|
+
end
|
|
100
|
+
end
|
data/lib/datadog/di/base.rb
CHANGED
|
@@ -8,8 +8,12 @@
|
|
|
8
8
|
# are loaded, and also none of the rest of datadog library which also
|
|
9
9
|
# has contrib code in other products.
|
|
10
10
|
|
|
11
|
+
require_relative 'fatal_exceptions'
|
|
11
12
|
require_relative 'code_tracker'
|
|
12
13
|
|
|
14
|
+
# Needed since this file can be loaded without core
|
|
15
|
+
require_relative '../ruby_version'
|
|
16
|
+
|
|
13
17
|
module Datadog
|
|
14
18
|
# Namespace for Datadog dynamic instrumentation.
|
|
15
19
|
#
|
|
@@ -17,6 +21,10 @@ module Datadog
|
|
|
17
21
|
module DI
|
|
18
22
|
LOCK = Mutex.new
|
|
19
23
|
|
|
24
|
+
# Initialized eagerly to avoid "instance variable not initialized"
|
|
25
|
+
# warning on Ruby 2.6/2.7 and to simplify the type to non-nullable.
|
|
26
|
+
@current_components = []
|
|
27
|
+
|
|
20
28
|
class << self
|
|
21
29
|
attr_reader :code_tracker
|
|
22
30
|
|
|
@@ -40,20 +48,21 @@ module Datadog
|
|
|
40
48
|
# DI code.
|
|
41
49
|
def activate_tracking
|
|
42
50
|
# :script_compiled trace point was added in Ruby 2.6.
|
|
43
|
-
return unless
|
|
51
|
+
return unless RubyVersion.is?('>= 2.6')
|
|
44
52
|
|
|
45
53
|
begin
|
|
46
54
|
# Activate code tracking by default because line trace points will not work
|
|
47
55
|
# without it.
|
|
48
56
|
Datadog::DI.activate_tracking!
|
|
49
|
-
rescue => exc
|
|
57
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
58
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
50
59
|
if defined?(Datadog.logger)
|
|
51
|
-
Datadog.logger.warn { "di: Failed to activate code tracking for DI: #{exc.class}: #{exc}" }
|
|
60
|
+
Datadog.logger.warn { "di: Failed to activate code tracking for DI: #{exc.class}: #{exc.message}" }
|
|
52
61
|
else
|
|
53
62
|
# We do not have Datadog logger potentially because DI code tracker is
|
|
54
63
|
# being loaded early in application boot process and the rest of datadog
|
|
55
64
|
# wasn't loaded yet. Output to standard error.
|
|
56
|
-
warn("datadog: di: Failed to activate code tracking for DI: #{exc.class}: #{exc}")
|
|
65
|
+
warn("datadog: di: Failed to activate code tracking for DI: #{exc.class}: #{exc.message}")
|
|
57
66
|
end
|
|
58
67
|
end
|
|
59
68
|
end
|
|
@@ -88,7 +97,7 @@ module Datadog
|
|
|
88
97
|
# Datadog.components from the code tracker.
|
|
89
98
|
def current_component
|
|
90
99
|
LOCK.synchronize do
|
|
91
|
-
@current_components
|
|
100
|
+
@current_components.last
|
|
92
101
|
end
|
|
93
102
|
end
|
|
94
103
|
|
|
@@ -100,14 +109,13 @@ module Datadog
|
|
|
100
109
|
# guaranteed to not end up with no component when one is running.
|
|
101
110
|
def add_current_component(component)
|
|
102
111
|
LOCK.synchronize do
|
|
103
|
-
@current_components ||= []
|
|
104
112
|
@current_components << component
|
|
105
113
|
end
|
|
106
114
|
end
|
|
107
115
|
|
|
108
116
|
def remove_current_component(component)
|
|
109
117
|
LOCK.synchronize do
|
|
110
|
-
@current_components
|
|
118
|
+
@current_components.delete(component)
|
|
111
119
|
end
|
|
112
120
|
end
|
|
113
121
|
end
|
data/lib/datadog/di/boot.rb
CHANGED
|
@@ -5,18 +5,21 @@ require_relative 'base'
|
|
|
5
5
|
require_relative 'error'
|
|
6
6
|
require_relative 'code_tracker'
|
|
7
7
|
require_relative 'component'
|
|
8
|
+
require_relative 'context'
|
|
8
9
|
require_relative 'instrumenter'
|
|
9
10
|
require_relative 'probe'
|
|
10
11
|
require_relative 'probe_builder'
|
|
11
12
|
require_relative 'probe_manager'
|
|
12
13
|
require_relative 'probe_notification_builder'
|
|
13
14
|
require_relative 'probe_notifier_worker'
|
|
15
|
+
require_relative 'probe_repository'
|
|
14
16
|
require_relative 'redactor'
|
|
15
17
|
require_relative 'serializer'
|
|
16
18
|
require_relative 'transport/http'
|
|
17
19
|
require_relative 'utils'
|
|
18
20
|
|
|
19
|
-
if %w[1 true yes].include?(
|
|
21
|
+
if %w[1 true yes].include?(Datadog::DATADOG_ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED'])
|
|
22
|
+
|
|
20
23
|
# For initial release of Dynamic Instrumentation, activate code tracking
|
|
21
24
|
# only if DI is explicitly requested in the environment.
|
|
22
25
|
# Code tracking is required for line probes to work; see the comments
|
|
@@ -32,3 +35,10 @@ end
|
|
|
32
35
|
require_relative 'contrib'
|
|
33
36
|
|
|
34
37
|
Datadog::DI::Contrib.load_now_or_later
|
|
38
|
+
|
|
39
|
+
if %w[1 true yes].include?(Datadog::DATADOG_ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED'])
|
|
40
|
+
if Datadog::DATADOG_ENV['DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE']
|
|
41
|
+
require_relative 'probe_file_loader'
|
|
42
|
+
Datadog::DI::ProbeFileLoader.load_now_or_later
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# rubocop:disable Lint/AssignmentInCondition
|
|
4
4
|
|
|
5
5
|
require_relative 'error'
|
|
6
|
+
require_relative 'fatal_exceptions'
|
|
6
7
|
|
|
7
8
|
module Datadog
|
|
8
9
|
module DI
|
|
@@ -22,11 +23,115 @@ module Datadog
|
|
|
22
23
|
class CodeTracker
|
|
23
24
|
def initialize
|
|
24
25
|
@registry = {}
|
|
26
|
+
@per_method_registry = {}
|
|
25
27
|
@trace_point_lock = Mutex.new
|
|
26
28
|
@registry_lock = Mutex.new
|
|
27
29
|
@compiled_trace_point = nil
|
|
28
30
|
end
|
|
29
31
|
|
|
32
|
+
# Populates the registry with iseqs for files that were loaded
|
|
33
|
+
# before code tracking started.
|
|
34
|
+
#
|
|
35
|
+
# Uses the all_iseqs C extension to walk the Ruby object space and
|
|
36
|
+
# find instruction sequences for already-loaded code. Whole-file
|
|
37
|
+
# iseqs are stored in the main registry; per-method/block/class
|
|
38
|
+
# iseqs are stored in per_method_registry as fallback for files
|
|
39
|
+
# whose whole-file iseq was GC'd.
|
|
40
|
+
#
|
|
41
|
+
# See docs/DynamicInstrumentationDevelopment.md "Iseq Lifecycle and GC"
|
|
42
|
+
# for which iseq types survive GC and implications for backfill.
|
|
43
|
+
#
|
|
44
|
+
# Whole-file detection uses two strategies:
|
|
45
|
+
# - Ruby 3.1+: DI.iseq_type (wraps rb_iseq_type) returns :top for
|
|
46
|
+
# require/load and :main for the entry script. This is precise.
|
|
47
|
+
# - Ruby < 3.1: falls back to first_lineno == 0, which is true for
|
|
48
|
+
# whole-file iseqs from require/load (INT2FIX(0) in Ruby's
|
|
49
|
+
# rb_iseq_new_top and rb_iseq_new_main) and false for
|
|
50
|
+
# method/block/class definitions (first_lineno >= 1).
|
|
51
|
+
# InstructionSequence.compile passes first_lineno = 1 by default,
|
|
52
|
+
# so eval'd code is not matched. Both strategies produce the same
|
|
53
|
+
# result in practice.
|
|
54
|
+
#
|
|
55
|
+
# Does not overwrite iseqs already in the registry (from
|
|
56
|
+
# :script_compiled), since those are guaranteed to be whole-file
|
|
57
|
+
# iseqs and are authoritative.
|
|
58
|
+
#
|
|
59
|
+
# @return [void]
|
|
60
|
+
def backfill_registry
|
|
61
|
+
iseqs = DI.file_iseqs
|
|
62
|
+
have_iseq_type = DI.respond_to?(:iseq_type)
|
|
63
|
+
registry_lock.synchronize do
|
|
64
|
+
iseqs.each do |iseq|
|
|
65
|
+
path = iseq.absolute_path
|
|
66
|
+
next unless path
|
|
67
|
+
|
|
68
|
+
whole_file = if have_iseq_type
|
|
69
|
+
type = DI.iseq_type(iseq)
|
|
70
|
+
# Require first_lineno == 0 to exclude compile_file/compile
|
|
71
|
+
# iseqs. These are :top type but have first_lineno == 1 and
|
|
72
|
+
# produce iseq objects distinct from require-produced iseqs.
|
|
73
|
+
# Targeted TracePoints are bound to the specific iseq object
|
|
74
|
+
# — a probe on a compile_file iseq silently never fires when
|
|
75
|
+
# the require-produced code runs.
|
|
76
|
+
(type == :top || type == :main) && iseq.first_lineno == 0
|
|
77
|
+
else
|
|
78
|
+
iseq.first_lineno == 0
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if whole_file
|
|
82
|
+
# Ruby 3.2.9+ creates dummy profiler iseqs during require/load
|
|
83
|
+
# (rb_iseq_alloc_with_dummy_path in iseq.c). These have type
|
|
84
|
+
# :top, first_lineno == 0, and the same absolute_path as the
|
|
85
|
+
# real iseq — but iseq_size == 0 (no bytecode). A targeted
|
|
86
|
+
# TracePoint on a dummy iseq can't find child iseqs and raises
|
|
87
|
+
# ArgumentError "can not enable any hooks". Filter them out:
|
|
88
|
+
# a real top-level iseq always has at least one trace event.
|
|
89
|
+
next if iseq.trace_points.empty?
|
|
90
|
+
|
|
91
|
+
# Do not overwrite entries from :script_compiled — those are
|
|
92
|
+
# captured at load time and are authoritative.
|
|
93
|
+
next if registry.key?(path)
|
|
94
|
+
|
|
95
|
+
registry[path] = iseq
|
|
96
|
+
else
|
|
97
|
+
# Skip top-level script iseqs (:top/:main) produced by
|
|
98
|
+
# RubyVM::InstructionSequence.compile_file and .compile
|
|
99
|
+
# (compile source to bytecode without executing it).
|
|
100
|
+
# These represent the file body,
|
|
101
|
+
# not a method or block. They pass the first_lineno check
|
|
102
|
+
# (lineno != 0) but a targeted TracePoint bound to one
|
|
103
|
+
# of these never fires for method-level code — the
|
|
104
|
+
# user's probe silently produces no snapshots.
|
|
105
|
+
#
|
|
106
|
+
# On Ruby < 3.1 (no iseq_type), we cannot distinguish
|
|
107
|
+
# these from method iseqs, so they leak into
|
|
108
|
+
# per_method_registry. If iseq_for_line selects a leaked
|
|
109
|
+
# top-level iseq instead of the real method iseq, the
|
|
110
|
+
# probe installs but silently never fires — same failure
|
|
111
|
+
# as above. This requires the application to call
|
|
112
|
+
# compile_file and hold the result, which is rare outside
|
|
113
|
+
# tooling like bootsnap (which discards it).
|
|
114
|
+
next if have_iseq_type && (type == :top || type == :main)
|
|
115
|
+
|
|
116
|
+
# Store per-method/block/class iseqs as fallback for files
|
|
117
|
+
# whose whole-file iseq was GC'd. These can be used to
|
|
118
|
+
# target line probes on lines within their range.
|
|
119
|
+
(per_method_registry[path] ||= []) << iseq
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
nil
|
|
124
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
125
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
126
|
+
# Backfill is best-effort — if it fails, line probes on
|
|
127
|
+
# pre-loaded code won't work but everything else is unaffected.
|
|
128
|
+
if component = DI.current_component
|
|
129
|
+
component.logger.debug { "di: backfill_registry failed: #{exc.class}: #{exc.message}" }
|
|
130
|
+
component.telemetry&.report(exc, description: "backfill_registry failed")
|
|
131
|
+
end
|
|
132
|
+
nil
|
|
133
|
+
end
|
|
134
|
+
|
|
30
135
|
# Starts tracking loaded code.
|
|
31
136
|
#
|
|
32
137
|
# This method should generally be called early in application boot
|
|
@@ -88,13 +193,14 @@ module Datadog
|
|
|
88
193
|
# Since this method normally is called from customer applications,
|
|
89
194
|
# rescue any exceptions that might not be handled to not break said
|
|
90
195
|
# customer applications.
|
|
91
|
-
rescue => exc
|
|
196
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
197
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
92
198
|
# Code tracker may be loaded without the rest of DI,
|
|
93
199
|
# in which case DI.component will not yet be defined,
|
|
94
200
|
# but we will have DI.current_component (set to nil).
|
|
95
201
|
if component = DI.current_component
|
|
96
202
|
raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
97
|
-
component.logger.debug { "di: unhandled exception in script_compiled trace point: #{exc.class}: #{exc}" }
|
|
203
|
+
component.logger.debug { "di: unhandled exception in script_compiled trace point: #{exc.class}: #{exc.message}" }
|
|
98
204
|
component.telemetry&.report(exc, description: "Unhandled exception in script_compiled trace point")
|
|
99
205
|
# TODO test this path
|
|
100
206
|
else
|
|
@@ -104,6 +210,12 @@ module Datadog
|
|
|
104
210
|
# TODO test this path
|
|
105
211
|
end
|
|
106
212
|
end
|
|
213
|
+
|
|
214
|
+
# Backfill the registry with iseqs for files that were loaded
|
|
215
|
+
# before tracking started. This must happen after the trace
|
|
216
|
+
# point is enabled so that any files loaded concurrently are
|
|
217
|
+
# captured by the trace point (backfill won't overwrite them).
|
|
218
|
+
backfill_registry
|
|
107
219
|
end
|
|
108
220
|
end
|
|
109
221
|
|
|
@@ -140,23 +252,79 @@ module Datadog
|
|
|
140
252
|
exact = registry[suffix]
|
|
141
253
|
return [suffix, exact] if exact
|
|
142
254
|
|
|
143
|
-
|
|
144
|
-
loop
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
255
|
+
# Normalize Windows-style backslash separators (DEBUG-5111) upfront
|
|
256
|
+
# so the suffix-shortening loop's "/+" regex can strip leading
|
|
257
|
+
# components on probes whose sourceFile uses backslashes.
|
|
258
|
+
suffix = Utils.normalize_windows_separators(suffix)
|
|
259
|
+
|
|
260
|
+
# Per the design comment in utils.rb, attempt case-sensitive
|
|
261
|
+
# matching first (steps 5-6) and only fall back to case-insensitive
|
|
262
|
+
# matching (steps 7-8) when no case-sensitive match is found.
|
|
263
|
+
[false, true].each do |case_insensitive|
|
|
264
|
+
working_suffix = suffix.dup
|
|
265
|
+
loop do
|
|
266
|
+
inexact = []
|
|
267
|
+
registry.each do |path, iseq|
|
|
268
|
+
if Utils.path_matches_suffix?(path, working_suffix, case_insensitive: case_insensitive)
|
|
269
|
+
inexact << [path, iseq]
|
|
270
|
+
end
|
|
149
271
|
end
|
|
272
|
+
if inexact.length > 1
|
|
273
|
+
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix"
|
|
274
|
+
end
|
|
275
|
+
if inexact.any?
|
|
276
|
+
return inexact.first
|
|
277
|
+
end
|
|
278
|
+
break unless working_suffix.include?('/')
|
|
279
|
+
working_suffix.sub!(%r{.*/+}, '')
|
|
150
280
|
end
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
281
|
+
end
|
|
282
|
+
nil
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# Returns a [path, iseq] pair for a line probe target, or nil.
|
|
287
|
+
#
|
|
288
|
+
# First checks the whole-file iseq registry (via iseqs_for_path_suffix).
|
|
289
|
+
# If no whole-file iseq exists, searches the per-method iseq registry
|
|
290
|
+
# for an iseq whose trace_points include the target line.
|
|
291
|
+
#
|
|
292
|
+
# @param suffix [String] file path or suffix to match
|
|
293
|
+
# @param line [Integer] target line number
|
|
294
|
+
# @return [Array(String, RubyVM::InstructionSequence), nil]
|
|
295
|
+
def iseq_for_line(suffix, line)
|
|
296
|
+
# Try whole-file iseq first — it always covers all lines.
|
|
297
|
+
result = iseqs_for_path_suffix(suffix)
|
|
298
|
+
return result if result
|
|
299
|
+
|
|
300
|
+
# Fall back to per-method iseqs.
|
|
301
|
+
registry_lock.synchronize do
|
|
302
|
+
# Resolve the path using the per-method registry keys.
|
|
303
|
+
path = resolve_path_suffix(suffix, per_method_registry.keys)
|
|
304
|
+
return nil unless path
|
|
305
|
+
|
|
306
|
+
iseqs = per_method_registry[path]
|
|
307
|
+
return nil unless iseqs
|
|
308
|
+
|
|
309
|
+
# Only match event types the instrumenter subscribes to
|
|
310
|
+
# (:line, :return, :b_return — see hook_line). Lines that
|
|
311
|
+
# only carry :call (e.g. a `def` line within the defined
|
|
312
|
+
# method's own iseq, not the enclosing scope) have no
|
|
313
|
+
# subscribed event at that position; TracePoint#enable
|
|
314
|
+
# raises because it cannot bind an enabled event there.
|
|
315
|
+
matches = iseqs.select do |iseq|
|
|
316
|
+
iseq.trace_points.any? do |tp_line, event|
|
|
317
|
+
tp_line == line && (event == :line || event == :return || event == :b_return)
|
|
156
318
|
end
|
|
157
|
-
return nil unless suffix.include?('/')
|
|
158
|
-
suffix.sub!(%r{.*/+}, '')
|
|
159
319
|
end
|
|
320
|
+
# When multiple iseqs contain the target line (e.g. a method
|
|
321
|
+
# and an inline block sharing the same line), picking one
|
|
322
|
+
# would silently miss executions in the other context.
|
|
323
|
+
# Raise so the probe is recorded as failed with a clear error.
|
|
324
|
+
if matches.length > 1
|
|
325
|
+
raise Error::MultiplePathsMatch, "Multiple code locations match line #{line}"
|
|
326
|
+
end
|
|
327
|
+
matches.first ? [path, matches.first] : nil
|
|
160
328
|
end
|
|
161
329
|
end
|
|
162
330
|
|
|
@@ -186,6 +354,7 @@ module Datadog
|
|
|
186
354
|
def clear
|
|
187
355
|
registry_lock.synchronize do
|
|
188
356
|
registry.clear
|
|
357
|
+
per_method_registry.clear
|
|
189
358
|
end
|
|
190
359
|
end
|
|
191
360
|
|
|
@@ -195,8 +364,41 @@ module Datadog
|
|
|
195
364
|
# objects representing compiled code of those files.
|
|
196
365
|
attr_reader :registry
|
|
197
366
|
|
|
367
|
+
# Mapping from paths to arrays of per-method/block/class iseqs.
|
|
368
|
+
# Used as fallback when the whole-file iseq has been GC'd.
|
|
369
|
+
attr_reader :per_method_registry
|
|
370
|
+
|
|
198
371
|
attr_reader :trace_point_lock
|
|
199
372
|
attr_reader :registry_lock
|
|
373
|
+
|
|
374
|
+
# Resolves a path suffix against a set of known paths.
|
|
375
|
+
# Returns the matching path or nil.
|
|
376
|
+
#
|
|
377
|
+
# Must be called within registry_lock.
|
|
378
|
+
def resolve_path_suffix(suffix, paths)
|
|
379
|
+
# Exact match.
|
|
380
|
+
return suffix if paths.include?(suffix)
|
|
381
|
+
|
|
382
|
+
# Normalize Windows-style backslash separators (DEBUG-5111) upfront
|
|
383
|
+
# so the suffix-shortening loop's "/+" regex can strip leading
|
|
384
|
+
# components on probes whose sourceFile uses backslashes.
|
|
385
|
+
suffix = Utils.normalize_windows_separators(suffix)
|
|
386
|
+
|
|
387
|
+
# Suffix match. Per the design comment in utils.rb, attempt
|
|
388
|
+
# case-sensitive matching first (steps 5-6) and only fall back to
|
|
389
|
+
# case-insensitive (steps 7-8) when no case-sensitive match is found.
|
|
390
|
+
[false, true].each do |case_insensitive|
|
|
391
|
+
working_suffix = suffix.dup
|
|
392
|
+
loop do
|
|
393
|
+
matches = paths.select { |p| Utils.path_matches_suffix?(p, working_suffix, case_insensitive: case_insensitive) }
|
|
394
|
+
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix" if matches.length > 1
|
|
395
|
+
return matches.first if matches.any?
|
|
396
|
+
break unless working_suffix.include?('/')
|
|
397
|
+
working_suffix.sub!(%r{.*/+}, '')
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
nil
|
|
401
|
+
end
|
|
200
402
|
end
|
|
201
403
|
end
|
|
202
404
|
end
|