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
|
@@ -1,31 +1,46 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative '../../core/encoding'
|
|
4
|
+
require_relative '../../core/transport/http'
|
|
3
5
|
require_relative 'diagnostics'
|
|
4
6
|
require_relative 'input'
|
|
5
|
-
require_relative 'http/api'
|
|
6
|
-
require_relative '../../core/transport/http'
|
|
7
7
|
|
|
8
8
|
module Datadog
|
|
9
9
|
module DI
|
|
10
10
|
module Transport
|
|
11
11
|
# Namespace for HTTP transport components
|
|
12
12
|
module HTTP
|
|
13
|
-
|
|
13
|
+
DIAGNOSTICS = Diagnostics::API::Endpoint.new(
|
|
14
|
+
'/debugger/v1/diagnostics',
|
|
15
|
+
Core::Encoding::JSONEncoder,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
INPUT = Input::API::Endpoint.new(
|
|
19
|
+
'/debugger/v2/input',
|
|
20
|
+
Core::Encoding::JSONEncoder,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
LEGACY_INPUT = Input::API::Endpoint.new(
|
|
24
|
+
# We used to use /debugger/v1/input, but now input
|
|
25
|
+
# payloads should be going to the diagnostics endpoint
|
|
26
|
+
# which I gather performs data redaction.
|
|
27
|
+
'/debugger/v1/diagnostics',
|
|
28
|
+
Core::Encoding::JSONEncoder,
|
|
29
|
+
)
|
|
14
30
|
|
|
15
31
|
# Builds a new Transport::HTTP::Client with default settings
|
|
16
32
|
# Pass a block to override any settings.
|
|
17
|
-
def diagnostics(
|
|
33
|
+
def self.diagnostics(
|
|
18
34
|
agent_settings:,
|
|
19
35
|
logger:,
|
|
20
|
-
api_version: nil,
|
|
21
36
|
headers: nil
|
|
22
37
|
)
|
|
23
|
-
Core::Transport::HTTP.build(
|
|
38
|
+
Core::Transport::HTTP.build(
|
|
24
39
|
logger: logger,
|
|
25
|
-
agent_settings: agent_settings,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
transport.api
|
|
40
|
+
agent_settings: agent_settings,
|
|
41
|
+
headers: headers,
|
|
42
|
+
) do |transport|
|
|
43
|
+
transport.api 'diagnostics', DIAGNOSTICS
|
|
29
44
|
|
|
30
45
|
# Call block to apply any customization, if provided
|
|
31
46
|
yield(transport) if block_given?
|
|
@@ -34,22 +49,31 @@ module Datadog
|
|
|
34
49
|
|
|
35
50
|
# Builds a new Transport::HTTP::Client with default settings
|
|
36
51
|
# Pass a block to override any settings.
|
|
37
|
-
def input(
|
|
52
|
+
def self.input(
|
|
38
53
|
agent_settings:,
|
|
39
54
|
logger:,
|
|
40
|
-
|
|
41
|
-
|
|
55
|
+
headers: nil,
|
|
56
|
+
telemetry: nil
|
|
42
57
|
)
|
|
43
|
-
Core::Transport::HTTP.build(
|
|
58
|
+
builder = Core::Transport::HTTP.build(
|
|
44
59
|
logger: logger,
|
|
45
|
-
agent_settings: agent_settings,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
transport.api
|
|
60
|
+
agent_settings: agent_settings,
|
|
61
|
+
headers: headers,
|
|
62
|
+
) do |transport|
|
|
63
|
+
transport.api 'input', INPUT, fallback: 'legacy_input', default: true
|
|
64
|
+
transport.api 'legacy_input', LEGACY_INPUT
|
|
49
65
|
|
|
50
66
|
# Call block to apply any customization, if provided
|
|
51
67
|
yield(transport) if block_given?
|
|
52
|
-
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Create transport with telemetry
|
|
71
|
+
DI::Transport::Input::Transport.new(
|
|
72
|
+
builder.to_api_instances,
|
|
73
|
+
builder.default_api,
|
|
74
|
+
logger: logger,
|
|
75
|
+
telemetry: telemetry
|
|
76
|
+
)
|
|
53
77
|
end
|
|
54
78
|
end
|
|
55
79
|
end
|
|
@@ -1,59 +1,141 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative '../../core/chunker'
|
|
4
|
+
require_relative '../../core/encoding'
|
|
5
|
+
require_relative '../../core/tag_builder'
|
|
3
6
|
require_relative '../../core/transport/parcel'
|
|
4
|
-
require_relative '
|
|
7
|
+
require_relative '../../core/transport/request'
|
|
8
|
+
require_relative '../../core/transport/transport'
|
|
9
|
+
require_relative '../error'
|
|
10
|
+
require_relative '../fatal_exceptions'
|
|
11
|
+
require_relative 'http/input'
|
|
5
12
|
|
|
6
13
|
module Datadog
|
|
7
14
|
module DI
|
|
8
15
|
module Transport
|
|
9
16
|
module Input
|
|
10
|
-
class EncodedParcel
|
|
11
|
-
include Datadog::Core::Transport::Parcel
|
|
12
|
-
end
|
|
13
|
-
|
|
14
17
|
class Request < Datadog::Core::Transport::Request
|
|
15
|
-
|
|
18
|
+
attr_reader :serialized_tags
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
def initialize(parcel, serialized_tags)
|
|
21
|
+
super(parcel)
|
|
22
|
+
|
|
23
|
+
@serialized_tags = serialized_tags
|
|
24
|
+
end
|
|
25
|
+
end
|
|
19
26
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@logger = logger
|
|
27
|
+
class Transport < Core::Transport::Transport
|
|
28
|
+
attr_reader :telemetry
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
def initialize(apis, default_api, logger:, telemetry: nil)
|
|
31
|
+
super(apis, default_api, logger: logger)
|
|
32
|
+
@telemetry = telemetry
|
|
25
33
|
end
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
# The limit on an individual snapshot payload, aka "log line",
|
|
36
|
+
# is 1 MB.
|
|
37
|
+
#
|
|
38
|
+
# TODO There is an RFC for snapshot pruning that should be
|
|
39
|
+
# implemented to reduce the size of snapshots to be below this
|
|
40
|
+
# limit, so that we can send a portion of the captured data
|
|
41
|
+
# rather than dropping the snapshot entirely.
|
|
42
|
+
MAX_SERIALIZED_SNAPSHOT_SIZE = 1024 * 1024
|
|
43
|
+
|
|
44
|
+
# The maximum chunk (batch) size that intake permits is 5 MB.
|
|
45
|
+
#
|
|
46
|
+
# Two bytes are for the [ and ] of JSON array syntax.
|
|
47
|
+
MAX_CHUNK_SIZE = 5 * 1024 * 1024 - 2
|
|
48
|
+
|
|
49
|
+
# Try to send smaller payloads to avoid large network requests.
|
|
50
|
+
# If a payload is larger than default chunk size but is under the
|
|
51
|
+
# max chunk size, it will still get sent out.
|
|
52
|
+
DEFAULT_CHUNK_SIZE = 2 * 1024 * 1024
|
|
53
|
+
|
|
54
|
+
# Sends snapshot payloads to the agent.
|
|
55
|
+
#
|
|
56
|
+
# Each snapshot is serialized individually. If serialization fails
|
|
57
|
+
# for a snapshot (e.g., due to binary data from custom serializers),
|
|
58
|
+
# the on_serialization_error callback is invoked with the probe ID
|
|
59
|
+
# and exception, allowing the caller to disable the affected probe.
|
|
60
|
+
# Successfully serialized snapshots are still sent.
|
|
61
|
+
#
|
|
62
|
+
# Large snapshots (> 1MB) are dropped. Batches are split into chunks
|
|
63
|
+
# of ~2MB each to avoid large network requests.
|
|
64
|
+
#
|
|
65
|
+
# @param payload [Array<Hash>] Array of snapshot payloads
|
|
66
|
+
# @param tags [Hash] Tags to send with the snapshots
|
|
67
|
+
# @param on_serialization_error [Proc] Called with (probe_id, exception)
|
|
68
|
+
# when a snapshot fails to serialize.
|
|
69
|
+
def send_input(payload, tags, on_serialization_error:)
|
|
70
|
+
serialized_tags = Core::TagBuilder.serialize_tags(tags)
|
|
71
|
+
|
|
72
|
+
# Serialize each snapshot individually to isolate failures
|
|
73
|
+
encoded_snapshots = []
|
|
74
|
+
payload.each do |snapshot|
|
|
75
|
+
encoded = encoder.encode(snapshot)
|
|
76
|
+
if encoded.length > MAX_SERIALIZED_SNAPSHOT_SIZE
|
|
77
|
+
logger.debug { "di: dropping too big snapshot" }
|
|
78
|
+
next
|
|
79
|
+
end
|
|
80
|
+
encoded_snapshots << encoded
|
|
81
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
82
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
83
|
+
# Serialization failed for this snapshot - report via callback
|
|
84
|
+
# This catches JSON::GeneratorError, Encoding errors, TypeError, etc.
|
|
85
|
+
probe_id = snapshot.dig(:debugger, :snapshot, :probe, :id)
|
|
86
|
+
logger.debug { "di: JSON encoding failed for snapshot (probe #{probe_id}): #{exc.class}: #{exc.message}" }
|
|
87
|
+
telemetry&.report(exc, description: "JSON encoding failed for snapshot")
|
|
88
|
+
|
|
89
|
+
if probe_id
|
|
90
|
+
begin
|
|
91
|
+
on_serialization_error.call(probe_id, exc)
|
|
92
|
+
rescue Exception => callback_exc # standard:disable Lint/RescueException
|
|
93
|
+
Datadog::DI.reraise_if_fatal(callback_exc)
|
|
94
|
+
logger.debug { "di: error in serialization error callback for probe #{probe_id}: #{callback_exc.class}: #{callback_exc.message}" }
|
|
95
|
+
telemetry&.report(callback_exc, description: "Error in serialization error callback")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
return payload if encoded_snapshots.empty?
|
|
101
|
+
|
|
102
|
+
Datadog::Core::Chunker.chunk_by_size(
|
|
103
|
+
encoded_snapshots, DEFAULT_CHUNK_SIZE,
|
|
104
|
+
).each do |chunk|
|
|
105
|
+
# We drop snapshots that are too big earlier.
|
|
106
|
+
# The limit on chunked payload length here is greater
|
|
107
|
+
# than the limit on snapshot size, therefore no chunks
|
|
108
|
+
# can exceed limits here.
|
|
109
|
+
chunked_payload = encoder.join(chunk)
|
|
110
|
+
|
|
111
|
+
# We need to rescue exceptions for each chunk so that
|
|
112
|
+
# subsequent chunks are attempted to be sent.
|
|
113
|
+
begin
|
|
114
|
+
send_input_chunk(chunked_payload, serialized_tags)
|
|
115
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
116
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
117
|
+
logger.debug { "di: failed to send snapshot chunk: #{exc.class}: #{exc.message} (at #{exc.backtrace&.first})" }
|
|
118
|
+
telemetry&.report(exc, description: "Error sending snapshot chunk")
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
payload
|
|
29
123
|
end
|
|
30
124
|
|
|
31
|
-
def
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# these response objects?
|
|
41
|
-
raise Error::AgentCommunicationError, "send_input failed: #{begin
|
|
42
|
-
response.code
|
|
43
|
-
rescue
|
|
44
|
-
"???"
|
|
45
|
-
end}: #{response.payload}"
|
|
125
|
+
def send_input_chunk(chunked_payload, serialized_tags)
|
|
126
|
+
parcel = Core::Transport::Parcel.new(chunked_payload, content_type: encoder.content_type)
|
|
127
|
+
request = Request.new(parcel, serialized_tags)
|
|
128
|
+
|
|
129
|
+
client.send_request(:input, request).tap do |response|
|
|
130
|
+
if downgrade?(response)
|
|
131
|
+
downgrade!
|
|
132
|
+
return send_input_chunk(chunked_payload, serialized_tags)
|
|
133
|
+
end
|
|
46
134
|
end
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
# agent URI for example.
|
|
52
|
-
# If we ever implement retries for network errors, we should distinguish
|
|
53
|
-
# actual network errors from non-network errors that are raised by
|
|
54
|
-
# transport code.
|
|
55
|
-
rescue => exc
|
|
56
|
-
raise Error::AgentCommunicationError, "send_input failed: #{exc.class}: #{exc}"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def encoder
|
|
138
|
+
Core::Encoding::JSONEncoder
|
|
57
139
|
end
|
|
58
140
|
end
|
|
59
141
|
end
|
data/lib/datadog/di/utils.rb
CHANGED
|
@@ -82,15 +82,31 @@ module Datadog
|
|
|
82
82
|
# we just strip leading directory components from the "probe path"
|
|
83
83
|
# until we get a match via a "suffix of the suffix".
|
|
84
84
|
|
|
85
|
+
# Returns +path+ with Windows-style backslash separators translated to
|
|
86
|
+
# forward slashes (DEBUG-5111). Used to normalize probe source paths
|
|
87
|
+
# that originate from IDE tooling running on Windows.
|
|
88
|
+
module_function def normalize_windows_separators(path)
|
|
89
|
+
path.tr('\\', '/')
|
|
90
|
+
end
|
|
91
|
+
|
|
85
92
|
# Returns whether the provided +path+ matches the user-designated
|
|
86
93
|
# file suffix (of a line probe).
|
|
87
94
|
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
95
|
+
# Backslash separators in +suffix+ are translated to forward slashes
|
|
96
|
+
# (DEBUG-5111) so paths typed by IDE tooling on Windows can match.
|
|
97
|
+
# Case-insensitive matching (DEBUG-5107) is opt-in via
|
|
98
|
+
# +case_insensitive: true+; callers that orchestrate matching against a
|
|
99
|
+
# set of known paths perform case-sensitive comparisons first and only
|
|
100
|
+
# fall back to case-insensitive when no case-sensitive match is found
|
|
101
|
+
# (see the design comment above, steps 5-8).
|
|
102
|
+
#
|
|
103
|
+
# If suffix is an absolute path (i.e., it starts with a slash, possibly
|
|
104
|
+
# after backslash normalization), the path must be identical for it to
|
|
105
|
+
# match.
|
|
90
106
|
#
|
|
91
107
|
# If suffix is not an absolute path, the path matches if its suffix is
|
|
92
108
|
# the provided suffix, at a path component boundary.
|
|
93
|
-
module_function def path_matches_suffix?(path, suffix)
|
|
109
|
+
module_function def path_matches_suffix?(path, suffix, case_insensitive: false)
|
|
94
110
|
if path.nil?
|
|
95
111
|
raise ArgumentError, "nil path passed"
|
|
96
112
|
end
|
|
@@ -98,6 +114,12 @@ module Datadog
|
|
|
98
114
|
raise ArgumentError, "nil suffix passed"
|
|
99
115
|
end
|
|
100
116
|
|
|
117
|
+
suffix = normalize_windows_separators(suffix)
|
|
118
|
+
if case_insensitive
|
|
119
|
+
path = path.downcase
|
|
120
|
+
suffix = suffix.downcase
|
|
121
|
+
end
|
|
122
|
+
|
|
101
123
|
if suffix.start_with?('/')
|
|
102
124
|
path == suffix
|
|
103
125
|
else
|
|
@@ -105,11 +127,6 @@ module Datadog
|
|
|
105
127
|
# has to be longer than the suffix. Require full component matches,
|
|
106
128
|
# meaning either the first character of the suffix is a slash
|
|
107
129
|
# or the previous character in the path is a slash.
|
|
108
|
-
# For now only check for forward slashes for Unix-like OSes;
|
|
109
|
-
# backslash is a legitimate character of a file name in Unix
|
|
110
|
-
# therefore simply permitting forward or back slash is not
|
|
111
|
-
# sufficient, we need to perform an OS check to know which
|
|
112
|
-
# path separator to use.
|
|
113
130
|
!!
|
|
114
131
|
if path.length > suffix.length && path.end_with?(suffix)
|
|
115
132
|
previous_char = path[path.length - suffix.length - 1]
|
|
@@ -125,15 +142,26 @@ module Datadog
|
|
|
125
142
|
# +spec+. Attempts all of the fuzzy matches by stripping directories
|
|
126
143
|
# from the front of +spec+. Does not consider othr known paths to
|
|
127
144
|
# identify the case of (potentially) multiple matching paths for +spec+.
|
|
145
|
+
#
|
|
146
|
+
# Matching is attempted case-sensitively first (steps 5-6 in the design
|
|
147
|
+
# comment above) and only falls back to case-insensitive (steps 7-8)
|
|
148
|
+
# when no case-sensitive match is found.
|
|
128
149
|
module_function def path_can_match_spec?(path, spec)
|
|
129
|
-
|
|
150
|
+
# Normalize Windows-style backslash separators (DEBUG-5111) so the
|
|
151
|
+
# suffix-shortening loop's "/+" regex can strip leading components.
|
|
152
|
+
spec = normalize_windows_separators(spec)
|
|
130
153
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
|
|
154
|
+
[false, true].each do |case_insensitive|
|
|
155
|
+
working_spec = spec.dup
|
|
156
|
+
return true if path_matches_suffix?(path, working_spec, case_insensitive: case_insensitive)
|
|
157
|
+
|
|
158
|
+
loop do
|
|
159
|
+
break unless working_spec.include?('/')
|
|
160
|
+
working_spec.sub!(%r{.*/+}, '')
|
|
161
|
+
return true if path_matches_suffix?(path, working_spec, case_insensitive: case_insensitive)
|
|
162
|
+
end
|
|
136
163
|
end
|
|
164
|
+
false
|
|
137
165
|
end
|
|
138
166
|
end
|
|
139
167
|
end
|
data/lib/datadog/di.rb
CHANGED
|
@@ -9,16 +9,156 @@ module Datadog
|
|
|
9
9
|
#
|
|
10
10
|
# @api private
|
|
11
11
|
module DI
|
|
12
|
+
INSTRUMENTED_COUNTERS_LOCK = Mutex.new
|
|
13
|
+
|
|
14
|
+
# Captured at load time from Exception itself (not a subclass).
|
|
15
|
+
# Used to bypass subclass overrides of backtrace_locations.
|
|
16
|
+
#
|
|
17
|
+
# This does NOT protect against monkeypatching Exception#backtrace_locations
|
|
18
|
+
# before dd-trace-rb loads — in that case we'd capture the monkeypatch.
|
|
19
|
+
# The practical threat model is customer subclasses overriding the method:
|
|
20
|
+
#
|
|
21
|
+
# class MyError < StandardError
|
|
22
|
+
# def backtrace_locations; []; end
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# The UnboundMethod bypasses subclass overrides: bind(exception).call
|
|
26
|
+
# always dispatches to the original Exception implementation.
|
|
27
|
+
#
|
|
28
|
+
# Note: if the subclass overrides #backtrace (not #backtrace_locations),
|
|
29
|
+
# MRI's setup_exception skips storing the VM backtrace entirely — both
|
|
30
|
+
# @bt and @bt_locations stay nil. In that case this UnboundMethod also
|
|
31
|
+
# returns nil. See EXCEPTION_BACKTRACE comment for details.
|
|
32
|
+
EXCEPTION_BACKTRACE_LOCATIONS = Exception.instance_method(:backtrace_locations)
|
|
33
|
+
|
|
34
|
+
# Same UnboundMethod trick for Exception#backtrace (Array<String>).
|
|
35
|
+
# Used as a fallback when backtrace_locations returns nil — which happens
|
|
36
|
+
# when someone calls Exception#set_backtrace with an Array<String>.
|
|
37
|
+
#
|
|
38
|
+
# set_backtrace accepts Array<String> or nil. When called with strings,
|
|
39
|
+
# it replaces the VM-level backtrace: backtrace returns the new strings,
|
|
40
|
+
# but backtrace_locations returns nil because the VM cannot reconstruct
|
|
41
|
+
# Location objects from formatted strings. This occurs in exception
|
|
42
|
+
# wrapping patterns where a library catches an exception, creates a new
|
|
43
|
+
# one, and copies the original's string backtrace onto it via
|
|
44
|
+
# set_backtrace before re-raising.
|
|
45
|
+
#
|
|
46
|
+
# Ruby 3.4+ also allows set_backtrace(Array<Location>), which preserves
|
|
47
|
+
# backtrace_locations — but older Rubies and most existing code use
|
|
48
|
+
# the string form.
|
|
49
|
+
#
|
|
50
|
+
# Like EXCEPTION_BACKTRACE_LOCATIONS, this UnboundMethod bypasses
|
|
51
|
+
# subclass overrides of #backtrace: bind(exception).call dispatches
|
|
52
|
+
# to Exception#backtrace regardless of what the subclass defines.
|
|
53
|
+
#
|
|
54
|
+
# However, when a subclass overrides #backtrace, MRI's setup_exception
|
|
55
|
+
# (eval.c) calls the override via rb_get_backtrace during raise. If it
|
|
56
|
+
# gets a non-nil result, it skips storing the VM backtrace in @bt and
|
|
57
|
+
# @bt_locations entirely. So the UnboundMethod bypasses the override
|
|
58
|
+
# at dispatch but reads nil from @bt because the data was never stored.
|
|
59
|
+
#
|
|
60
|
+
# This constant is used as a fallback when backtrace_locations returns
|
|
61
|
+
# nil. In the common set_backtrace-with-strings case, no subclass
|
|
62
|
+
# override is involved and the fallback works. The only unrecoverable
|
|
63
|
+
# case: a subclass overrides #backtrace, the exception is raised
|
|
64
|
+
# normally, and set_backtrace is never called. Both @bt and
|
|
65
|
+
# @bt_locations are nil — DI reports an empty stacktrace (type and
|
|
66
|
+
# message are still reported).
|
|
67
|
+
EXCEPTION_BACKTRACE = Exception.instance_method(:backtrace)
|
|
68
|
+
|
|
12
69
|
class << self
|
|
13
70
|
def enabled?
|
|
14
71
|
Datadog.configuration.dynamic_instrumentation.enabled
|
|
15
72
|
end
|
|
16
|
-
end
|
|
17
73
|
|
|
18
|
-
|
|
19
|
-
|
|
74
|
+
# Returns a human-readable reason why dynamic instrumentation cannot run
|
|
75
|
+
# under the given settings, or nil if all build-time preconditions are met.
|
|
76
|
+
#
|
|
77
|
+
# Single source of truth for the preconditions checked in
|
|
78
|
+
# {Component.build} and reported back by {Remote.handle_rc_enablement}
|
|
79
|
+
# when an implicit enablement signal arrives but the component was not
|
|
80
|
+
# built at startup. Checks are ordered from most-actionable to
|
|
81
|
+
# platform-constraint so the most useful reason wins.
|
|
82
|
+
#
|
|
83
|
+
# The settings argument is optional so the helper can be called from
|
|
84
|
+
# contexts that don't have settings in scope (e.g. the RC handler).
|
|
85
|
+
#
|
|
86
|
+
# @param settings [Datadog::Core::Configuration::Settings]
|
|
87
|
+
# @return [String, nil] reason string or nil when supported
|
|
88
|
+
def unsupported_reason(settings = Datadog.configuration)
|
|
89
|
+
# Symmetric to the respond_to?(:remote) guard below: in unusual
|
|
90
|
+
# configurations (test doubles, partial Settings) the DI namespace
|
|
91
|
+
# may be absent. Returning a reason here lets callers — most
|
|
92
|
+
# importantly Remote.handle_rc_enablement — emit the customer-facing
|
|
93
|
+
# warn instead of raising NoMethodError on the unguarded access at
|
|
94
|
+
# line 92 (`settings.dynamic_instrumentation.internal.development`).
|
|
95
|
+
unless settings.respond_to?(:dynamic_instrumentation)
|
|
96
|
+
return "dynamic instrumentation settings are not available"
|
|
97
|
+
end
|
|
98
|
+
unless settings.respond_to?(:remote) && settings.remote.enabled
|
|
99
|
+
return "Remote Configuration is not enabled. See https://docs.datadoghq.com/agent/remote_config"
|
|
100
|
+
end
|
|
101
|
+
unless settings.dynamic_instrumentation.internal.development
|
|
102
|
+
if Datadog::Core::Environment::Execution.development?
|
|
103
|
+
return "development environment detected"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
if (reason = unsupported_platform_reason)
|
|
107
|
+
return reason
|
|
108
|
+
end
|
|
109
|
+
unless respond_to?(:exception_message)
|
|
110
|
+
return "C extension is not available"
|
|
111
|
+
end
|
|
112
|
+
nil
|
|
113
|
+
end
|
|
20
114
|
|
|
21
|
-
|
|
115
|
+
# Whether the current Ruby runtime can run dynamic instrumentation:
|
|
116
|
+
# MRI (CRuby) on Ruby 2.6 or later.
|
|
117
|
+
#
|
|
118
|
+
# @return [Boolean]
|
|
119
|
+
def supported_runtime?
|
|
120
|
+
unsupported_platform_reason.nil?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Reason the current Ruby runtime cannot run dynamic instrumentation, or
|
|
124
|
+
# nil when the platform is supported. Single source of truth for the
|
|
125
|
+
# minimum-runtime definition, shared by {unsupported_reason} (which layers
|
|
126
|
+
# the settings and C-extension checks on top) and {supported_runtime?}.
|
|
127
|
+
#
|
|
128
|
+
# @return [String, nil]
|
|
129
|
+
private def unsupported_platform_reason
|
|
130
|
+
if RUBY_ENGINE != 'ruby'
|
|
131
|
+
"MRI is required, but running on #{RUBY_ENGINE}"
|
|
132
|
+
elsif Datadog::RubyVersion.is?('< 2.6')
|
|
133
|
+
"Ruby 2.6+ is required, but running on #{RUBY_VERSION}"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Returns iseqs that correspond to loaded files (filtering out eval'd code).
|
|
138
|
+
#
|
|
139
|
+
# There are several types of iseqs returned by +all_iseqs+:
|
|
140
|
+
#
|
|
141
|
+
# 1. Eval'd code — these have a nil +absolute_path+ and are filtered out here.
|
|
142
|
+
# 2. Whole-file iseqs — have +absolute_path+ set and +first_lineno+ of 0.
|
|
143
|
+
# Only available for a subset of loaded files (the full-file iseq may be
|
|
144
|
+
# garbage collected after loading completes). Easiest to work with since
|
|
145
|
+
# we just match the file path to the probe specification.
|
|
146
|
+
# 3. Per-method iseqs — have +absolute_path+ set and +first_lineno+ > 0.
|
|
147
|
+
# Often the only iseqs available for third-party code. Require identifying
|
|
148
|
+
# the correct iseq containing the target line, which may involve examining
|
|
149
|
+
# the iseq's +trace_points+ since +define_method+ can create nested,
|
|
150
|
+
# non-contiguous line ranges.
|
|
151
|
+
#
|
|
152
|
+
# Note: the same line of code can appear in multiple iseqs (e.g. when
|
|
153
|
+
# +define_method+ is used inside a method). DI treats this as an error
|
|
154
|
+
# since a probe must resolve to exactly one code location.
|
|
155
|
+
#
|
|
156
|
+
# @return [Array<RubyVM::InstructionSequence>] iseqs with non-nil +absolute_path+
|
|
157
|
+
def file_iseqs
|
|
158
|
+
all_iseqs.select do |iseq|
|
|
159
|
+
iseq.absolute_path
|
|
160
|
+
end
|
|
161
|
+
end
|
|
22
162
|
|
|
23
163
|
# This method is called from DI Remote handler to issue DI operations
|
|
24
164
|
# to the probe manager (add or remove probes).
|
|
@@ -32,12 +172,65 @@ module Datadog
|
|
|
32
172
|
def component
|
|
33
173
|
Datadog.send(:components).dynamic_instrumentation
|
|
34
174
|
end
|
|
175
|
+
|
|
176
|
+
# Track how many outstanding instrumentations are in DI.
|
|
177
|
+
#
|
|
178
|
+
# It is hard to find the actual instrumentations - there is no
|
|
179
|
+
# method provided by Ruby to list all trace points, and we would
|
|
180
|
+
# need to manually track our instrumentation modules for method probes.
|
|
181
|
+
# Plus, tracking the modules could create active references to
|
|
182
|
+
# instrumentation, which is not desired.
|
|
183
|
+
#
|
|
184
|
+
# A simpler solution is to maintain a counter which is increased
|
|
185
|
+
# whenever a probe is installed and decreased when a probe is removed.
|
|
186
|
+
#
|
|
187
|
+
# This counter does not include pending probes - being not installed,
|
|
188
|
+
# those pose no concerns to customer applications.
|
|
189
|
+
def instrumented_count(kind = nil)
|
|
190
|
+
INSTRUMENTED_COUNTERS_LOCK.synchronize do
|
|
191
|
+
if defined?(@instrumented_count)
|
|
192
|
+
if kind
|
|
193
|
+
validate_kind!(kind)
|
|
194
|
+
@instrumented_count[kind] || 0
|
|
195
|
+
else
|
|
196
|
+
@instrumented_count.inject(0) do |sum, (_kind, count)|
|
|
197
|
+
sum + count
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
else
|
|
201
|
+
0
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def instrumented_count_inc(kind)
|
|
207
|
+
validate_kind!(kind)
|
|
208
|
+
INSTRUMENTED_COUNTERS_LOCK.synchronize do
|
|
209
|
+
@instrumented_count = Hash.new(0) unless defined?(@instrumented_count)
|
|
210
|
+
@instrumented_count[kind] += 1
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def instrumented_count_dec(kind)
|
|
215
|
+
validate_kind!(kind)
|
|
216
|
+
INSTRUMENTED_COUNTERS_LOCK.synchronize do
|
|
217
|
+
@instrumented_count = Hash.new(0) unless defined?(@instrumented_count)
|
|
218
|
+
if @instrumented_count[kind] <= 0
|
|
219
|
+
Datadog.logger.debug { "di: attempting to decrease instrumented count below zero for #{kind}" }
|
|
220
|
+
return
|
|
221
|
+
end
|
|
222
|
+
@instrumented_count[kind] -= 1
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
private def validate_kind!(kind)
|
|
227
|
+
unless %i[line method].include?(kind)
|
|
228
|
+
raise ArgumentError, "Invalid kind: #{kind}"
|
|
229
|
+
end
|
|
230
|
+
end
|
|
35
231
|
end
|
|
232
|
+
|
|
233
|
+
# Expose DI to global shared objects
|
|
234
|
+
Extensions.activate!
|
|
36
235
|
end
|
|
37
236
|
end
|
|
38
|
-
|
|
39
|
-
# Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
|
|
40
|
-
# trace point. Activate DI automatically on supported Ruby versions but
|
|
41
|
-
# always load its settings so that, for example, turning DI off when
|
|
42
|
-
# we are on Ruby 2.5 does not produce exceptions.
|
|
43
|
-
require_relative 'di/boot' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative 'ext'
|
|
4
|
+
require_relative '../ruby_version'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module ErrorTracking
|
|
@@ -52,7 +53,7 @@ module Datadog
|
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
|
|
55
|
-
if
|
|
56
|
+
if RubyVersion.is?(">= #{Ext::RUBY_VERSION_WITH_RESCUE_EVENT}")
|
|
56
57
|
# Starting from ruby3.3, as we are listening to :rescue event,
|
|
57
58
|
# we just want to remove the span event if the error was
|
|
58
59
|
# previously handled
|
|
@@ -33,7 +33,7 @@ module Datadog
|
|
|
33
33
|
if RUBY_ENGINE != 'ruby'
|
|
34
34
|
logger.warn("error tracking: cannot enable error tracking: MRI is required, but running on #{RUBY_ENGINE}")
|
|
35
35
|
false
|
|
36
|
-
elsif
|
|
36
|
+
elsif RubyVersion.is?('< 2.7')
|
|
37
37
|
logger.warn(
|
|
38
38
|
"error tracking: cannot enable error tracking: Ruby 2.7+ is required, but running
|
|
39
39
|
on #{RUBY_VERSION}"
|
|
@@ -63,7 +63,7 @@ module Datadog
|
|
|
63
63
|
# Before Ruby3.3 the TracePoint listen for :raise events.
|
|
64
64
|
# If an error is not handled, we will delete the according
|
|
65
65
|
# span event in the collector.
|
|
66
|
-
event = (
|
|
66
|
+
event = RubyVersion.is?('>= 3.3') ? :rescue : :raise
|
|
67
67
|
|
|
68
68
|
# This TracePoint is in charge of capturing the handled exceptions
|
|
69
69
|
# and of adding the corresponding span events to the collector
|