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
data/lib/datadog/di/component.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'fatal_exceptions'
|
|
4
|
+
|
|
3
5
|
module Datadog
|
|
4
6
|
module DI
|
|
5
7
|
# Component for dynamic instrumentation.
|
|
@@ -15,57 +17,51 @@ module Datadog
|
|
|
15
17
|
class Component
|
|
16
18
|
class << self
|
|
17
19
|
def build(settings, agent_settings, logger, telemetry: nil)
|
|
18
|
-
return unless settings.respond_to?(:dynamic_instrumentation)
|
|
20
|
+
return unless settings.respond_to?(:dynamic_instrumentation)
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
# Explicit DD_DYNAMIC_INSTRUMENTATION_ENABLED=false: do not build the
|
|
23
|
+
# component at all. This is customer intent, not a failure — log at
|
|
24
|
+
# debug and emit no telemetry error. Capabilities#register skips the
|
|
25
|
+
# DI RC block under the same condition, so no enable signal arrives.
|
|
26
|
+
if Remote.explicitly_disabled?(settings)
|
|
27
|
+
logger.debug("di: dynamic instrumentation is explicitly disabled (DD_DYNAMIC_INSTRUMENTATION_ENABLED=false); not building component")
|
|
22
28
|
return
|
|
23
29
|
end
|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
reason = DI.unsupported_reason(settings)
|
|
32
|
+
if reason
|
|
33
|
+
# Log level mirrors customer intent: if the customer explicitly
|
|
34
|
+
# opted in via DD_DYNAMIC_INSTRUMENTATION_ENABLED, warn. Otherwise
|
|
35
|
+
# debug — with always-build, this path runs on every tracer boot
|
|
36
|
+
# for every customer, including those who never wanted DI. Spamming
|
|
37
|
+
# warnings to silent users (especially on JRuby or Ruby 2.5) would
|
|
38
|
+
# be noise. Customers who later trigger implicit enablement via the
|
|
39
|
+
# Datadog UI get a symmetric warn from Remote.handle_rc_enablement
|
|
40
|
+
# when the RC enable signal finds no component to start.
|
|
41
|
+
level = explicitly_enabled?(settings) ? :warn : :debug
|
|
42
|
+
logger.public_send(level, "di: dynamic instrumentation is disabled: #{reason}")
|
|
43
|
+
return
|
|
44
|
+
end
|
|
26
45
|
|
|
27
46
|
new(settings, agent_settings, logger, code_tracker: DI.code_tracker, telemetry: telemetry).tap do |component|
|
|
28
47
|
DI.add_current_component(component)
|
|
29
48
|
end
|
|
30
49
|
end
|
|
31
50
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Checks whether the runtime environment is supported by
|
|
49
|
-
# dynamic instrumentation. Currently we only require that, if Rails
|
|
50
|
-
# is used, that Rails environment is not development because
|
|
51
|
-
# DI does not currently support code unloading and reloading.
|
|
52
|
-
def environment_supported?(settings, logger)
|
|
53
|
-
# TODO add tests?
|
|
54
|
-
unless settings.dynamic_instrumentation.internal.development
|
|
55
|
-
if Datadog::Core::Environment::Execution.development?
|
|
56
|
-
logger.warn("di: development environment detected; not enabling dynamic instrumentation")
|
|
57
|
-
return false
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
if RUBY_ENGINE != 'ruby'
|
|
61
|
-
logger.warn("di: cannot enable dynamic instrumentation: MRI is required, but running on #{RUBY_ENGINE}")
|
|
62
|
-
return false
|
|
63
|
-
end
|
|
64
|
-
if RUBY_VERSION < '2.6'
|
|
65
|
-
logger.warn("di: cannot enable dynamic instrumentation: Ruby 2.6+ is required, but running on #{RUBY_VERSION}")
|
|
66
|
-
return false
|
|
67
|
-
end
|
|
68
|
-
true
|
|
51
|
+
# True when the customer explicitly set
|
|
52
|
+
# DD_DYNAMIC_INSTRUMENTATION_ENABLED=true (or its equivalent in code).
|
|
53
|
+
# Symmetric to {Remote.explicitly_disabled?}.
|
|
54
|
+
#
|
|
55
|
+
# Uses {Datadog::Core::Configuration::Options::InstanceMethods#using_default?}
|
|
56
|
+
# rather than `options[:enabled].default_precedence?` because the option
|
|
57
|
+
# hash is populated lazily on first access; reading the underlying option
|
|
58
|
+
# before {Component.build} touches the value would NoMethodError on nil.
|
|
59
|
+
#
|
|
60
|
+
# @param settings [Datadog::Core::Configuration::Settings]
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
def explicitly_enabled?(settings)
|
|
63
|
+
!settings.dynamic_instrumentation.using_default?(:enabled) &&
|
|
64
|
+
settings.dynamic_instrumentation.enabled
|
|
69
65
|
end
|
|
70
66
|
end
|
|
71
67
|
|
|
@@ -79,10 +75,24 @@ module Datadog
|
|
|
79
75
|
@redactor = Redactor.new(settings)
|
|
80
76
|
@serializer = Serializer.new(settings, redactor, telemetry: telemetry)
|
|
81
77
|
@instrumenter = Instrumenter.new(settings, serializer, logger, code_tracker: code_tracker, telemetry: telemetry)
|
|
82
|
-
@
|
|
78
|
+
@probe_repository = ProbeRepository.new
|
|
83
79
|
@probe_notification_builder = ProbeNotificationBuilder.new(settings, serializer)
|
|
84
|
-
@
|
|
85
|
-
|
|
80
|
+
@probe_notifier_worker = ProbeNotifierWorker.new(
|
|
81
|
+
settings, logger,
|
|
82
|
+
agent_settings: agent_settings,
|
|
83
|
+
probe_repository: probe_repository,
|
|
84
|
+
probe_notification_builder: probe_notification_builder,
|
|
85
|
+
telemetry: telemetry,
|
|
86
|
+
)
|
|
87
|
+
@probe_manager = ProbeManager.new(
|
|
88
|
+
settings, instrumenter, probe_notification_builder, probe_notifier_worker, logger, probe_repository,
|
|
89
|
+
telemetry: telemetry,
|
|
90
|
+
)
|
|
91
|
+
# @started transitions are serialized by @lifecycle_mutex so that
|
|
92
|
+
# concurrent RC callbacks (which run on the remote-config thread)
|
|
93
|
+
# cannot race a foreground start! with a background stop!.
|
|
94
|
+
@lifecycle_mutex = Mutex.new
|
|
95
|
+
@started = false
|
|
86
96
|
end
|
|
87
97
|
|
|
88
98
|
attr_reader :settings
|
|
@@ -91,15 +101,68 @@ module Datadog
|
|
|
91
101
|
attr_reader :telemetry
|
|
92
102
|
attr_reader :code_tracker
|
|
93
103
|
attr_reader :instrumenter
|
|
104
|
+
attr_reader :probe_repository
|
|
94
105
|
attr_reader :probe_notifier_worker
|
|
95
106
|
attr_reader :probe_notification_builder
|
|
96
107
|
attr_reader :probe_manager
|
|
97
108
|
attr_reader :redactor
|
|
98
109
|
attr_reader :serializer
|
|
99
110
|
|
|
100
|
-
#
|
|
111
|
+
# Starts the DI component: begins accepting probes and
|
|
112
|
+
# processing snapshots.
|
|
113
|
+
#
|
|
114
|
+
# Starts the probe notifier worker thread before enabling the
|
|
115
|
+
# definition trace point, so any future status emission from a
|
|
116
|
+
# trace-point-driven installation has a worker to drain it.
|
|
117
|
+
# Today {ProbeManager#reopen} re-hooks without emitting statuses, so
|
|
118
|
+
# the order is defensive rather than load-bearing. No-op if already
|
|
119
|
+
# started. Serialized by @lifecycle_mutex.
|
|
120
|
+
#
|
|
121
|
+
# @return [void]
|
|
122
|
+
def start!
|
|
123
|
+
@lifecycle_mutex.synchronize do
|
|
124
|
+
return if @started
|
|
125
|
+
|
|
126
|
+
probe_notifier_worker.start
|
|
127
|
+
probe_manager.reopen
|
|
128
|
+
@started = true
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Stops the DI component: removes all probes and stops
|
|
133
|
+
# background threads.
|
|
134
|
+
#
|
|
135
|
+
# The component remains alive and can be restarted with {#start!}.
|
|
136
|
+
# Does not clear out the code tracker.
|
|
137
|
+
# No-op if already stopped. Serialized by @lifecycle_mutex.
|
|
138
|
+
#
|
|
139
|
+
# @return [void]
|
|
140
|
+
def stop!
|
|
141
|
+
@lifecycle_mutex.synchronize do
|
|
142
|
+
return unless @started
|
|
143
|
+
|
|
144
|
+
probe_manager.stop
|
|
145
|
+
probe_notifier_worker.stop
|
|
146
|
+
@started = false
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Whether the component is currently started.
|
|
151
|
+
#
|
|
152
|
+
# Read by remote config dispatch to decide whether to apply probe
|
|
153
|
+
# changes (changes received while stopped are dropped, since the
|
|
154
|
+
# next start! will reconcile from the latest RC state).
|
|
155
|
+
#
|
|
156
|
+
# @return [Boolean] true if start! has been called and stop! has not
|
|
157
|
+
def started?
|
|
158
|
+
@started
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Shuts down dynamic instrumentation permanently.
|
|
101
162
|
#
|
|
102
163
|
# Removes all code hooks and stops background threads.
|
|
164
|
+
# Called by Components#shutdown! during component destruction.
|
|
165
|
+
# Unlike {#stop!}, this is not reversible.
|
|
103
166
|
#
|
|
104
167
|
# Does not clear out the code tracker, because it's only populated
|
|
105
168
|
# by code when code is compiled and therefore, if the code tracker
|
|
@@ -108,9 +171,41 @@ module Datadog
|
|
|
108
171
|
def shutdown!(replacement = nil)
|
|
109
172
|
DI.remove_current_component(self)
|
|
110
173
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
174
|
+
# Hold the lifecycle mutex so all transitions of @started are
|
|
175
|
+
# serialized — start! / stop! / shutdown! cannot interleave with
|
|
176
|
+
# one another. Without the mutex an in-flight stop! from an RC
|
|
177
|
+
# callback could complete after shutdown!'s probe_manager.close,
|
|
178
|
+
# producing an inconsistent state.
|
|
179
|
+
@lifecycle_mutex.synchronize do
|
|
180
|
+
@started = false
|
|
181
|
+
probe_manager.clear_hooks
|
|
182
|
+
probe_manager.close
|
|
183
|
+
probe_notifier_worker.stop
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def parse_probe_spec_and_notify(probe_spec)
|
|
188
|
+
probe = ProbeBuilder.build_from_remote_config(probe_spec)
|
|
189
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
190
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
191
|
+
begin
|
|
192
|
+
probe = Struct.new(:id).new(
|
|
193
|
+
probe_spec['id'],
|
|
194
|
+
)
|
|
195
|
+
payload = probe_notification_builder.build_errored(probe, exc)
|
|
196
|
+
probe_notifier_worker.add_status(payload)
|
|
197
|
+
rescue Exception => nested_exc # standard:disable Lint/RescueException
|
|
198
|
+
Datadog::DI.reraise_if_fatal(nested_exc)
|
|
199
|
+
logger.debug { "di: failed to build error notification: #{nested_exc.class}: #{nested_exc.message}" }
|
|
200
|
+
telemetry&.report(nested_exc, description: 'Error building probe error notification')
|
|
201
|
+
raise
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
raise
|
|
205
|
+
else
|
|
206
|
+
payload = probe_notification_builder.build_received(probe)
|
|
207
|
+
probe_notifier_worker.add_status(payload, probe: probe)
|
|
208
|
+
probe
|
|
114
209
|
end
|
|
115
210
|
end
|
|
116
211
|
end
|
|
@@ -4,8 +4,241 @@ module Datadog
|
|
|
4
4
|
module DI
|
|
5
5
|
# Configuration for DI
|
|
6
6
|
module Configuration
|
|
7
|
+
# Settings
|
|
8
|
+
module Settings
|
|
9
|
+
def self.extended(base)
|
|
10
|
+
base = base.singleton_class unless base.is_a?(Class)
|
|
11
|
+
add_settings!(base)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.add_settings!(base)
|
|
15
|
+
base.class_eval do
|
|
16
|
+
settings :dynamic_instrumentation do
|
|
17
|
+
option :enabled do |o|
|
|
18
|
+
o.type :bool
|
|
19
|
+
# The environment variable has an "internal" prefix so that
|
|
20
|
+
# any customers that have the "proper" environment variable
|
|
21
|
+
# turned on (i.e. DD_DYNAMIC_INSTRUMENTATION_ENABLED)
|
|
22
|
+
# do not enable Ruby DI until the latter is ready for
|
|
23
|
+
# customer testing.
|
|
24
|
+
o.env "DD_DYNAMIC_INSTRUMENTATION_ENABLED"
|
|
25
|
+
o.default false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# An array of variable and key names to redact in addition to
|
|
29
|
+
# the built-in list of identifiers.
|
|
30
|
+
#
|
|
31
|
+
# The names will be normalized by removing the following
|
|
32
|
+
# symbols: _, -, @, $, and then matched to the complete
|
|
33
|
+
# variable or key name while ignoring the case.
|
|
34
|
+
# For example, specifying pass_word will match password and
|
|
35
|
+
# PASSWORD, and specifying PASSWORD will match pass_word.
|
|
36
|
+
# Note that, while the at sign (@) is used in Ruby to refer
|
|
37
|
+
# to instance variables, it does not have any significance
|
|
38
|
+
# for this setting (and is removed before matching identifiers).
|
|
39
|
+
option :redacted_identifiers do |o|
|
|
40
|
+
o.env "DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS"
|
|
41
|
+
o.env_parser do |value|
|
|
42
|
+
value&.split(",")&.map(&:strip)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
o.type :array
|
|
46
|
+
o.default []
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# An array of variable and key names to exclude from the
|
|
50
|
+
# built-in redaction list.
|
|
51
|
+
#
|
|
52
|
+
# This allows users to capture values of variables that would
|
|
53
|
+
# otherwise be redacted by the default identifier list.
|
|
54
|
+
# For example, if an application has a "session" variable
|
|
55
|
+
# that does not contain sensitive data, "session" can be added
|
|
56
|
+
# to this list to exclude it from redaction.
|
|
57
|
+
#
|
|
58
|
+
# The names will be normalized the same way as redacted_identifiers,
|
|
59
|
+
# by removing the following symbols: _, -, @, $, and then matched
|
|
60
|
+
# against the complete variable or key name while ignoring the case.
|
|
61
|
+
option :redaction_excluded_identifiers do |o|
|
|
62
|
+
o.env "DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS"
|
|
63
|
+
o.env_parser do |value|
|
|
64
|
+
value&.split(",")&.map(&:strip)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
o.type :array
|
|
68
|
+
o.default []
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# An array of class names, values of which will be redacted from
|
|
72
|
+
# dynamic instrumentation snapshots. Example: FooClass.
|
|
73
|
+
# If a name is suffixed by '*', it becomes a wildcard and
|
|
74
|
+
# instances of any class whose name begins with the specified
|
|
75
|
+
# prefix will be redacted (example: Foo*).
|
|
76
|
+
#
|
|
77
|
+
# The names must all be fully-qualified, if any prefix of a
|
|
78
|
+
# class name is configured to be redacted, the value will be
|
|
79
|
+
# subject to redaction. For example, if Foo* is in the
|
|
80
|
+
# redacted class name list, instances of Foo, FooBar,
|
|
81
|
+
# Foo::Bar are all subject to redaction, but Bar::Foo will
|
|
82
|
+
# not be subject to redaction.
|
|
83
|
+
#
|
|
84
|
+
# Leading double-colon is permitted but has no effect,
|
|
85
|
+
# because the names are always considered to be fully-qualified.
|
|
86
|
+
# For example, adding ::Foo to the list will redact instances
|
|
87
|
+
# of Foo.
|
|
88
|
+
#
|
|
89
|
+
# Trailing colons should not be used because they will trigger
|
|
90
|
+
# exact match behavior but Ruby class names do not have
|
|
91
|
+
# trailing colons. For example, Foo:: will not cause anything
|
|
92
|
+
# to be redacted. Use Foo::* to redact all classes under
|
|
93
|
+
# the Foo module.
|
|
94
|
+
option :redacted_type_names do |o|
|
|
95
|
+
o.env "DD_DYNAMIC_INSTRUMENTATION_REDACTED_TYPES"
|
|
96
|
+
o.env_parser do |value|
|
|
97
|
+
value&.split(",")&.map(&:strip)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
o.type :array
|
|
101
|
+
o.default []
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Maximum number of object or collection traversals that
|
|
105
|
+
# will be permitted when serializing captured values.
|
|
106
|
+
option :max_capture_depth do |o|
|
|
107
|
+
o.type :int
|
|
108
|
+
o.default 3
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Maximum number of collection (Array and Hash) elements
|
|
112
|
+
# that will be captured. Arrays and hashes that have more
|
|
113
|
+
# elements will be truncated to this many elements.
|
|
114
|
+
option :max_capture_collection_size do |o|
|
|
115
|
+
o.type :int
|
|
116
|
+
o.default 100
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Strings longer than this length will be truncated to this
|
|
120
|
+
# length in dynamic instrumentation snapshots.
|
|
121
|
+
#
|
|
122
|
+
# Note that while all values are stringified during
|
|
123
|
+
# serialization, only values which are originally instances
|
|
124
|
+
# of the String class are subject to this length limit.
|
|
125
|
+
option :max_capture_string_length do |o|
|
|
126
|
+
o.type :int
|
|
127
|
+
o.default 255
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Maximim number of attributes that will be captured for
|
|
131
|
+
# a single non-primitive value.
|
|
132
|
+
option :max_capture_attribute_count do |o|
|
|
133
|
+
o.type :int
|
|
134
|
+
o.default 20
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Settings in the 'internal' group are for internal Datadog
|
|
138
|
+
# use only, and are needed to test dynamic instrumentation or
|
|
139
|
+
# experiment with features not released to customers.
|
|
140
|
+
settings :internal do
|
|
141
|
+
# This option instructs dynamic instrumentation to use
|
|
142
|
+
# untargeted trace points when installing line probes and
|
|
143
|
+
# code tracking is not active.
|
|
144
|
+
# WARNING: untargeted trace points carry a massive performance
|
|
145
|
+
# penalty for the entire file in which a line probe is placed.
|
|
146
|
+
#
|
|
147
|
+
# If this option is set to false, which is the default,
|
|
148
|
+
# dynamic instrumentation will add probes that reference
|
|
149
|
+
# unknown files to the list of pending probes, and when
|
|
150
|
+
# the respective files are loaded, the line probes will be
|
|
151
|
+
# installed using targeted trace points. If the file in
|
|
152
|
+
# question is already loaded when the probe is received
|
|
153
|
+
# (for example, it is in a third-party library loaded during
|
|
154
|
+
# application boot), and code tracking was not active when
|
|
155
|
+
# the file was loaded, such files will not be instrumentable
|
|
156
|
+
# via line probes.
|
|
157
|
+
#
|
|
158
|
+
# If this option is set to true, dynamic instrumentation will
|
|
159
|
+
# install untargeted trace points for all line probes,
|
|
160
|
+
# regardless of whether the referenced file is loaded.
|
|
161
|
+
# This permits instrumenting code which was loaded prior to
|
|
162
|
+
# code tracking being activated and instrumenting lines when
|
|
163
|
+
# code tracking is not activated at all. However, untargeted
|
|
164
|
+
# trace points are extremely slow and will greatly degrade
|
|
165
|
+
# performance of *all* code executed while they are installed,
|
|
166
|
+
# not just the instrumentation target.
|
|
167
|
+
option :untargeted_trace_points do |o|
|
|
168
|
+
o.type :bool
|
|
169
|
+
o.default false
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# If true, all of the catch-all rescue blocks in DI
|
|
173
|
+
# will propagate the exceptions onward.
|
|
174
|
+
# WARNING: for internal Datadog use only - this will break
|
|
175
|
+
# the DI product and potentially the library in general in
|
|
176
|
+
# a multitude of ways, cause resource leakage, permanent
|
|
177
|
+
# performance decreases, etc.
|
|
178
|
+
option :propagate_all_exceptions do |o|
|
|
179
|
+
o.type :bool
|
|
180
|
+
o.default false
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Minimum interval, in seconds, between probe status and
|
|
184
|
+
# snapshot submissions to the agent. Probe notifier worker will
|
|
185
|
+
# batch together payloads submitted during each interval.
|
|
186
|
+
# A longer interval reduces the overhead imposed by dynamic
|
|
187
|
+
# instrumentation on the application, but also increases the
|
|
188
|
+
# time when application code cannot run (when the batches are
|
|
189
|
+
# being sent out by the probe notifier worker) and creates a
|
|
190
|
+
# possibility of dropping payloads if the queue gets too long.
|
|
191
|
+
option :min_send_interval do |o|
|
|
192
|
+
o.type :float
|
|
193
|
+
o.default 3
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# Number of snapshots that can be stored in the probe
|
|
197
|
+
# notifier worker queue. Larger capacity runs the risk of
|
|
198
|
+
# creating snapshots that exceed the agent's request size
|
|
199
|
+
# limit. Smaller capacity increases the risk of dropping
|
|
200
|
+
# snapshots.
|
|
201
|
+
option :snapshot_queue_capacity do |o|
|
|
202
|
+
o.type :int
|
|
203
|
+
o.default 100
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Enable dynamic instrumentation in development environments.
|
|
207
|
+
# Currently DI does not fully implement support for code
|
|
208
|
+
# unloading and reloading, and is not supported in
|
|
209
|
+
# non-production environments.
|
|
210
|
+
option :development do |o|
|
|
211
|
+
o.type :bool
|
|
212
|
+
o.default false
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Enable logging of dynamic instrumentation activity.
|
|
216
|
+
# This is quite verbose.
|
|
217
|
+
option :trace_logging do |o|
|
|
218
|
+
o.type :bool
|
|
219
|
+
o.default false
|
|
220
|
+
|
|
221
|
+
# Use the same environment variable as the rest of
|
|
222
|
+
# dd-trace-rb logging for now. Could change to a
|
|
223
|
+
# dedicated environment variable in the future but
|
|
224
|
+
# will likely need a way to turn on remote config
|
|
225
|
+
# debugging (since DI uses RC for configuration).
|
|
226
|
+
o.env 'DD_TRACE_DEBUG'
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# If the CPU time consumed by the thread performing instrumentation
|
|
230
|
+
# exceeds this amount, the offending probe will be automatically disabled.
|
|
231
|
+
# Set to nil to disable the circuit breaker.
|
|
232
|
+
# Set to zero to disable every probe after it executes once.
|
|
233
|
+
option :max_processing_time do |o|
|
|
234
|
+
o.type :float
|
|
235
|
+
o.default 0.5
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
7
242
|
end
|
|
8
243
|
end
|
|
9
244
|
end
|
|
10
|
-
|
|
11
|
-
require_relative "configuration/settings"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module DI
|
|
5
|
+
# Contains local and instance variables used when evaluating
|
|
6
|
+
# expressions in DI Expression Language.
|
|
7
|
+
#
|
|
8
|
+
# @api private
|
|
9
|
+
class Context
|
|
10
|
+
def initialize(probe:, settings:, serializer:, locals: nil,
|
|
11
|
+
# In Ruby everything is a method, therefore we should always have
|
|
12
|
+
# a target self. However, if we are not capturing a snapshot,
|
|
13
|
+
# there is no need to pass in the target self.
|
|
14
|
+
target_self: nil,
|
|
15
|
+
path: nil, caller_locations: nil,
|
|
16
|
+
serialized_entry_args: nil,
|
|
17
|
+
return_value: nil, duration: nil, exception: nil)
|
|
18
|
+
@probe = probe
|
|
19
|
+
@settings = settings
|
|
20
|
+
@serializer = serializer
|
|
21
|
+
@locals = locals
|
|
22
|
+
@target_self = target_self
|
|
23
|
+
@path = path
|
|
24
|
+
@caller_locations = caller_locations
|
|
25
|
+
@serialized_entry_args = serialized_entry_args
|
|
26
|
+
@return_value = return_value
|
|
27
|
+
@duration = duration
|
|
28
|
+
@exception = exception
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
attr_reader :probe
|
|
32
|
+
attr_reader :settings
|
|
33
|
+
attr_reader :serializer
|
|
34
|
+
attr_reader :locals
|
|
35
|
+
attr_reader :target_self
|
|
36
|
+
|
|
37
|
+
# Actual path of the instrumented file.
|
|
38
|
+
attr_reader :path
|
|
39
|
+
|
|
40
|
+
# TODO check how many stack frames we should be keeping/sending,
|
|
41
|
+
# this should be all frames for enriched probes and no frames for
|
|
42
|
+
# non-enriched probes?
|
|
43
|
+
attr_reader :caller_locations
|
|
44
|
+
|
|
45
|
+
attr_reader :serialized_entry_args
|
|
46
|
+
|
|
47
|
+
# Return value for the method, for a method probe
|
|
48
|
+
attr_reader :return_value
|
|
49
|
+
|
|
50
|
+
# How long the method took to execute, for a method probe
|
|
51
|
+
attr_reader :duration
|
|
52
|
+
|
|
53
|
+
# Exception raised by the method, if any, for a method probe
|
|
54
|
+
attr_reader :exception
|
|
55
|
+
|
|
56
|
+
def serialized_locals
|
|
57
|
+
# TODO cache?
|
|
58
|
+
locals && serializer.serialize_vars(locals,
|
|
59
|
+
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
|
60
|
+
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def fetch(var_name)
|
|
64
|
+
unless locals
|
|
65
|
+
# TODO return "undefined" instead?
|
|
66
|
+
return nil
|
|
67
|
+
end
|
|
68
|
+
locals[var_name.to_sym]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def fetch_ivar(var_name)
|
|
72
|
+
target_self.instance_variable_get(var_name)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -1,12 +1,41 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
Datadog::DI::Serializer.register(
|
|
4
|
-
#
|
|
5
|
-
#
|
|
3
|
+
Datadog::DI::Serializer.register(
|
|
4
|
+
# This serializer uses a dynamic condition to determine its applicability
|
|
5
|
+
# to a particular value. A simpler case could have been a serializer for
|
|
6
|
+
# a particular class, but in this case any ActiveRecord model is covered
|
|
7
|
+
# and they all have different classes.
|
|
8
|
+
#
|
|
9
|
+
# An alternative could have been to make DI specifically provide lookup
|
|
10
|
+
# logic for "instances of classes derived from X", but a condition Proc
|
|
11
|
+
# is more universal.
|
|
12
|
+
condition: lambda { |value| ActiveRecord::Base === value }
|
|
13
|
+
) do |serializer, value, name:, depth:|
|
|
14
|
+
# +serializer+ is an instance of DI::Serializer.
|
|
15
|
+
# Use it to perform the serialization to primitive values.
|
|
16
|
+
#
|
|
17
|
+
# +value+ is the value to serialize. It should match the condition
|
|
18
|
+
# provided above, meaning it would be an ActiveRecord::Base instance.
|
|
19
|
+
#
|
|
20
|
+
# +name+ is the name of the (local/instance) variable being serialized.
|
|
21
|
+
# The name is used by DI for redaction (upstream of serialization logic),
|
|
22
|
+
# and could potentially be used for redaction here also.
|
|
23
|
+
#
|
|
24
|
+
# +depth+ is the remaining depth for serializing collections and objects.
|
|
25
|
+
# It should always be an integer.
|
|
26
|
+
# Pass it through to +serialize_value+ when the structure you produce
|
|
27
|
+
# represents +value+ directly (a transparent wrapper); +serialize_value+
|
|
28
|
+
# decrements depth itself when it recurses into Array/Hash/object entries.
|
|
29
|
+
# Decrement +depth+ only if your wrapper introduces real additional
|
|
30
|
+
# nesting levels in the output.
|
|
31
|
+
# This serializer could also potentially do its own depth limiting.
|
|
32
|
+
#
|
|
33
|
+
# Steep: steep thinks all of the arguments are nil here
|
|
34
|
+
# Looks like it cannot handle kwargs in lambdas
|
|
35
|
+
# @type var depth: Integer
|
|
6
36
|
value_to_serialize = {
|
|
7
37
|
attributes: value.attributes,
|
|
8
38
|
new_record: value.new_record?,
|
|
9
39
|
}
|
|
10
|
-
serializer.serialize_value(value_to_serialize, depth: depth
|
|
11
|
-
# steep:ignore:end
|
|
40
|
+
serializer.serialize_value(value_to_serialize, depth: depth, type: value.class)
|
|
12
41
|
end
|