datadog 2.21.0 → 2.38.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 +574 -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 +301 -82
- 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 +63 -32
- data/ext/datadog_profiling_native_extension/collectors_stack.h +7 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +728 -436
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
- 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 +41 -37
- 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 +252 -103
- data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +3 -22
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +0 -5
- 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 +40 -43
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -0
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +63 -46
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +17 -5
- 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 +110 -85
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
- 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 +18 -24
- 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 +34 -25
- data/ext/libdatadog_api/process_discovery.c +19 -13
- data/ext/libdatadog_extconf_helpers.rb +94 -11
- 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 +38 -9
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- 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 +359 -4
- data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +16 -9
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +51 -13
- 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 +2 -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 -12
- 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 -12
- 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 +52 -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 +48 -33
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +40 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +26 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +38 -0
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -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 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +43 -13
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +1 -1
- 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 +13 -31
- data/lib/datadog/appsec/ext.rb +3 -0
- 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 +43 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +20 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -1
- data/lib/datadog/appsec/metrics.rb +5 -5
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/remote.rb +44 -29
- 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 +26 -5
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +20 -10
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/trace_keeper.rb +18 -6
- 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 +6 -3
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +185 -17
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +11 -2
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option.rb +32 -6
- data/lib/datadog/core/configuration/option_definition.rb +42 -14
- data/lib/datadog/core/configuration/options.rb +49 -12
- data/lib/datadog/core/configuration/settings.rb +115 -16
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +379 -300
- data/lib/datadog/core/configuration.rb +3 -3
- 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 +6 -0
- data/lib/datadog/core/ddsketch.rb +19 -0
- 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 -0
- 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/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 +59 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +6 -6
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery.rb +21 -18
- 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 +1 -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/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +59 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -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 +177 -171
- 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 +4 -2
- data/lib/datadog/core/telemetry/logging.rb +17 -5
- 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/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +10 -6
- data/lib/datadog/core/transport/http/client.rb +80 -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 +2 -2
- 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 -21
- 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 +6 -2
- data/lib/datadog/core/utils.rb +3 -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 +10 -3
- 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 +7 -2
- data/lib/datadog/di/capture_expression.rb +21 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
- data/lib/datadog/di/capture_limits.rb +41 -0
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +139 -51
- data/lib/datadog/di/configuration.rb +241 -2
- data/lib/datadog/di/context.rb +82 -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 +623 -147
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +122 -14
- data/lib/datadog/di/probe_builder.rb +124 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +12 -7
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +321 -90
- data/lib/datadog/di/probe_notifier_worker.rb +112 -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 -93
- data/lib/datadog/di/serializer.rb +310 -29
- 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 +2 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +112 -38
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +204 -4
- 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 +60 -3
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- 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 +1 -1
- 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 +65 -1
- 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 +9 -3
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +71 -12
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -4
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -5
- data/lib/datadog/profiling/collectors/info.rb +18 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +10 -5
- data/lib/datadog/profiling/component.rb +82 -40
- data/lib/datadog/profiling/exporter.rb +41 -12
- 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 +0 -2
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +21 -8
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -14
- data/lib/datadog/profiling/scheduler.rb +10 -9
- data/lib/datadog/profiling/stack_recorder.rb +0 -8
- data/lib/datadog/profiling/tag_builder.rb +37 -3
- data/lib/datadog/profiling/tasks/exec.rb +8 -3
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling.rb +1 -3
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +2 -2
- 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/buffer.rb +3 -3
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +22 -0
- data/lib/datadog/tracing/configuration/settings.rb +96 -4
- 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_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -7
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +28 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -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 +5 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -5
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -5
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/configurable.rb +18 -3
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.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/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- 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 +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/extensions.rb +19 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +10 -7
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- 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/unified_trace.rb +75 -44
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -7
- 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.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +4 -8
- 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 +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +7 -7
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
- 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/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 +11 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -8
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +15 -18
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +6 -8
- 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 +24 -0
- 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/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
- 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_tagging.rb +23 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +62 -27
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +119 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +3 -1
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +7 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -7
- 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 +1 -0
- 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 +3 -2
- 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/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +4 -1
- 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/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +4 -2
- 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 +4 -2
- data/lib/datadog/tracing/distributed/baggage.rb +64 -8
- data/lib/datadog/tracing/distributed/datadog.rb +13 -11
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -14
- data/lib/datadog/tracing/distributed/propagation.rb +35 -3
- data/lib/datadog/tracing/distributed/trace_context.rb +85 -62
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -0
- 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 +54 -25
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +34 -10
- data/lib/datadog/tracing/sync_writer.rb +0 -1
- data/lib/datadog/tracing/trace_digest.rb +7 -0
- data/lib/datadog/tracing/trace_operation.rb +123 -16
- data/lib/datadog/tracing/tracer.rb +82 -23
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +6 -9
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +13 -81
- data/lib/datadog/tracing/workers.rb +2 -1
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -1
- metadata +185 -36
- 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/configuration/settings.rb +0 -400
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- 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,19 +1,36 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# rubocop:disable Lint/AssignmentInCondition
|
|
4
|
+
|
|
5
|
+
require_relative 'fatal_exceptions'
|
|
6
|
+
require_relative 'capture_expression_evaluator'
|
|
7
|
+
|
|
3
8
|
module Datadog
|
|
4
9
|
module DI
|
|
5
10
|
# Builds probe status notification and snapshot payloads.
|
|
6
11
|
#
|
|
7
12
|
# @api private
|
|
8
13
|
class ProbeNotificationBuilder
|
|
9
|
-
def initialize(settings, serializer)
|
|
14
|
+
def initialize(settings, serializer, logger, telemetry: nil)
|
|
10
15
|
@settings = settings
|
|
11
16
|
@serializer = serializer
|
|
17
|
+
@logger = logger
|
|
18
|
+
@telemetry = telemetry
|
|
19
|
+
@capture_expression_evaluator = CaptureExpressionEvaluator.new(
|
|
20
|
+
settings: settings, serializer: serializer, logger: logger, telemetry: telemetry,
|
|
21
|
+
)
|
|
12
22
|
end
|
|
13
23
|
|
|
14
24
|
attr_reader :settings
|
|
25
|
+
|
|
15
26
|
attr_reader :serializer
|
|
16
27
|
|
|
28
|
+
attr_reader :logger
|
|
29
|
+
|
|
30
|
+
attr_reader :telemetry
|
|
31
|
+
|
|
32
|
+
attr_reader :capture_expression_evaluator
|
|
33
|
+
|
|
17
34
|
def build_received(probe)
|
|
18
35
|
build_status(probe,
|
|
19
36
|
message: "Probe #{probe.id} has been received correctly",
|
|
@@ -35,83 +52,273 @@ module Datadog
|
|
|
35
52
|
def build_errored(probe, exc)
|
|
36
53
|
build_status(probe,
|
|
37
54
|
message: "Instrumentation for probe #{probe.id} failed: #{exc}",
|
|
55
|
+
status: 'ERROR',
|
|
56
|
+
exception: exc)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def build_disabled(probe, duration)
|
|
60
|
+
build_status(probe,
|
|
61
|
+
message: "Probe #{probe.id} was disabled because it consumed #{duration} seconds of CPU time in DI processing",
|
|
38
62
|
status: 'ERROR',)
|
|
39
63
|
end
|
|
40
64
|
|
|
41
65
|
# Duration is in seconds.
|
|
42
66
|
# path is the actual path of the instrumented file.
|
|
43
|
-
def build_executed(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
caller_locations: caller_locations,
|
|
55
|
-
args: args, kwargs: kwargs,
|
|
56
|
-
target_self: target_self,
|
|
57
|
-
serialized_entry_args: serialized_entry_args)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def build_snapshot(probe, rv: nil, serialized_locals: nil, path: nil,
|
|
61
|
-
# In Ruby everything is a method, therefore we should always have
|
|
62
|
-
# a target self. However, if we are not capturing a snapshot,
|
|
63
|
-
# there is no need to pass in the target self.
|
|
64
|
-
target_self: nil,
|
|
65
|
-
duration: nil, caller_locations: nil,
|
|
66
|
-
args: nil, kwargs: nil,
|
|
67
|
-
serialized_entry_args: nil)
|
|
68
|
-
if probe.capture_snapshot? && !target_self
|
|
67
|
+
def build_executed(context)
|
|
68
|
+
build_snapshot(context)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
NANOSECONDS = 1_000_000_000
|
|
72
|
+
MILLISECONDS = 1000
|
|
73
|
+
|
|
74
|
+
def build_snapshot(context)
|
|
75
|
+
probe = context.probe
|
|
76
|
+
|
|
77
|
+
if probe.capture_snapshot? && !context.target_self
|
|
69
78
|
raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
|
|
70
79
|
end
|
|
71
80
|
|
|
72
81
|
# TODO also verify that non-capturing probe does not pass
|
|
73
82
|
# snapshot or vars/args into this method
|
|
83
|
+
capture_expression_evaluation_errors = []
|
|
74
84
|
captures = if probe.capture_snapshot?
|
|
85
|
+
snapshot_limits = probe.snapshot_serializer_limits(settings)
|
|
75
86
|
if probe.method?
|
|
76
87
|
return_arguments = {
|
|
77
|
-
"@return": serializer.serialize_value(
|
|
78
|
-
|
|
79
|
-
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
|
|
80
|
-
self: serializer.serialize_value(target_self),
|
|
88
|
+
"@return": serializer.serialize_value(context.return_value, **snapshot_limits),
|
|
89
|
+
self: serializer.serialize_value(context.target_self, **snapshot_limits),
|
|
81
90
|
}
|
|
82
91
|
{
|
|
83
92
|
entry: {
|
|
84
|
-
|
|
85
|
-
arguments: if serialized_entry_args
|
|
86
|
-
serialized_entry_args
|
|
87
|
-
else
|
|
88
|
-
(args || kwargs) && serializer.serialize_args(args, kwargs, target_self,
|
|
89
|
-
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
|
90
|
-
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
|
91
|
-
end,
|
|
92
|
-
# standard:enable all
|
|
93
|
+
arguments: context.serialized_entry_args,
|
|
93
94
|
},
|
|
94
95
|
return: {
|
|
95
96
|
arguments: return_arguments,
|
|
96
|
-
throwable: nil,
|
|
97
|
+
throwable: context.exception ? serialize_throwable(context.exception) : nil,
|
|
97
98
|
},
|
|
98
99
|
}
|
|
99
100
|
elsif probe.line?
|
|
100
101
|
{
|
|
101
|
-
lines: serialized_locals && {
|
|
102
|
+
lines: (locals = context.serialized_locals) && {
|
|
102
103
|
probe.line_no => {
|
|
103
|
-
locals:
|
|
104
|
-
arguments: {self: serializer.serialize_value(target_self)},
|
|
104
|
+
locals: locals,
|
|
105
|
+
arguments: {self: serializer.serialize_value(context.target_self, **snapshot_limits)},
|
|
105
106
|
},
|
|
106
107
|
},
|
|
107
108
|
}
|
|
108
109
|
end
|
|
110
|
+
elsif probe.capture_expressions?
|
|
111
|
+
if probe.method?
|
|
112
|
+
if probe.evaluate_at_entry?
|
|
113
|
+
captured_block = context.entry_capture_expressions || {}
|
|
114
|
+
capture_expression_evaluation_errors = context.entry_capture_evaluation_errors || []
|
|
115
|
+
{
|
|
116
|
+
entry: {captureExpressions: captured_block},
|
|
117
|
+
}
|
|
118
|
+
else
|
|
119
|
+
captured_block, capture_expression_evaluation_errors =
|
|
120
|
+
capture_expression_evaluator.evaluate(probe, context)
|
|
121
|
+
{
|
|
122
|
+
return: {
|
|
123
|
+
captureExpressions: captured_block,
|
|
124
|
+
throwable: context.exception ? serialize_throwable(context.exception) : nil,
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
elsif probe.line?
|
|
129
|
+
captured_block, capture_expression_evaluation_errors =
|
|
130
|
+
capture_expression_evaluator.evaluate(probe, context)
|
|
131
|
+
{
|
|
132
|
+
lines: {
|
|
133
|
+
probe.line_no => {captureExpressions: captured_block},
|
|
134
|
+
},
|
|
135
|
+
}
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
message = nil
|
|
140
|
+
evaluation_errors = []
|
|
141
|
+
if segments = probe.template_segments
|
|
142
|
+
message, evaluation_errors = evaluate_template(segments, context)
|
|
143
|
+
end
|
|
144
|
+
evaluation_errors.concat(capture_expression_evaluation_errors)
|
|
145
|
+
build_snapshot_base(context,
|
|
146
|
+
evaluation_errors: evaluation_errors, message: message,
|
|
147
|
+
captures: captures)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def build_condition_evaluation_failed(context, expression, exception)
|
|
151
|
+
error = {
|
|
152
|
+
message: "#{exception.class}: #{exception}",
|
|
153
|
+
expr: expression.dsl_expr,
|
|
154
|
+
}
|
|
155
|
+
build_snapshot_base(context, evaluation_errors: [error])
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Builds a probe status notification payload.
|
|
159
|
+
#
|
|
160
|
+
# @param probe [Probe] the probe to build status for
|
|
161
|
+
# @param message [String] human-readable status message
|
|
162
|
+
# @param status [String] status value (RECEIVED, INSTALLED, EMITTING, ERROR)
|
|
163
|
+
# @param exception [Exception, nil] exception to include for ERROR status
|
|
164
|
+
# @return [Hash] the status payload
|
|
165
|
+
def build_status(probe, message:, status:, exception: nil)
|
|
166
|
+
diagnostics = {
|
|
167
|
+
probeId: probe.id,
|
|
168
|
+
probeVersion: 0,
|
|
169
|
+
runtimeId: Core::Environment::Identity.id,
|
|
170
|
+
parentId: nil,
|
|
171
|
+
status: status,
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
# Exception field is required by the backend for ERROR status.
|
|
175
|
+
# If the ERROR status is sent without the exception field, the status
|
|
176
|
+
# appears to be completely ignored by the backend.
|
|
177
|
+
# Note: The Go DI implementation does not send the top-level message
|
|
178
|
+
# field at all when sending error statuses.
|
|
179
|
+
if status == 'ERROR'
|
|
180
|
+
diagnostics[:exception] = { # steep:ignore
|
|
181
|
+
type: exception ? exception.class.name : 'Error',
|
|
182
|
+
message: exception ? exception.message : message
|
|
183
|
+
}
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
{
|
|
187
|
+
service: settings.service,
|
|
188
|
+
timestamp: timestamp_now,
|
|
189
|
+
message: message,
|
|
190
|
+
ddsource: 'dd_debugger',
|
|
191
|
+
debugger: {
|
|
192
|
+
diagnostics: diagnostics,
|
|
193
|
+
},
|
|
194
|
+
}
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
private
|
|
198
|
+
|
|
199
|
+
# Serializes an exception for the throwable field in snapshot captures.
|
|
200
|
+
#
|
|
201
|
+
# Uses the C extension's exception_message to get the original message
|
|
202
|
+
# without invoking any Ruby-level message method override, which
|
|
203
|
+
# could be customer code.
|
|
204
|
+
#
|
|
205
|
+
# Caveats:
|
|
206
|
+
#
|
|
207
|
+
# 1. The value returned by exception_message is not guaranteed to be
|
|
208
|
+
# a string — it is whatever was passed to the Exception constructor.
|
|
209
|
+
# Calling .to_s on an arbitrary object would invoke customer code,
|
|
210
|
+
# violating DI's constraint of never executing customer methods
|
|
211
|
+
# during instrumentation. We only use the value directly when it
|
|
212
|
+
# is a String; for non-string values we return a redacted
|
|
213
|
+
# placeholder (reporting the class name would duplicate the
|
|
214
|
+
# exception type already present in the :type field).
|
|
215
|
+
#
|
|
216
|
+
# 2. Custom exception classes may not store a meaningful message via
|
|
217
|
+
# the constructor (e.g. they may compute it in an overridden
|
|
218
|
+
# +message+ method). In such cases exception_message may return
|
|
219
|
+
# nil or an unrelated constructor argument. This is acceptable:
|
|
220
|
+
# we still report the exception type, and a missing/wrong message
|
|
221
|
+
# is better than invoking customer code or reporting nothing.
|
|
222
|
+
#
|
|
223
|
+
# @param exception [Exception] the exception to serialize
|
|
224
|
+
# @return [Hash{Symbol => String?}] hash with :type and :message keys
|
|
225
|
+
def serialize_throwable(exception)
|
|
226
|
+
msg = DI.exception_message(exception)
|
|
227
|
+
message = if msg.nil? || String === msg
|
|
228
|
+
msg
|
|
229
|
+
else
|
|
230
|
+
# Non-string constructor argument — return a redacted placeholder
|
|
231
|
+
# rather than calling .to_s which could be customer code.
|
|
232
|
+
# The exception class is already reported via the :type field.
|
|
233
|
+
'<REDACTED: not a string value>'
|
|
234
|
+
end
|
|
235
|
+
# Prefer backtrace_locations (structured Location objects) over
|
|
236
|
+
# backtrace (formatted strings that need regex parsing).
|
|
237
|
+
#
|
|
238
|
+
# However, backtrace_locations returns nil when someone has called
|
|
239
|
+
# Exception#set_backtrace with Array<String> — the VM cannot
|
|
240
|
+
# reconstruct Location objects from formatted strings. This happens
|
|
241
|
+
# in exception wrapping patterns (catch, create new exception, copy
|
|
242
|
+
# original's string backtrace via set_backtrace, re-raise).
|
|
243
|
+
# In that case, fall back to backtrace strings.
|
|
244
|
+
#
|
|
245
|
+
# Both accessors use the UnboundMethod trick to bypass subclass
|
|
246
|
+
# overrides, consistent with the rest of this method.
|
|
247
|
+
#
|
|
248
|
+
# If a subclass overrides #backtrace, MRI's raise never stores
|
|
249
|
+
# the real backtrace — both backtrace_locations and backtrace
|
|
250
|
+
# return nil, and stacktrace is [].
|
|
251
|
+
# This is unrecoverable without calling customer code.
|
|
252
|
+
# See DI::EXCEPTION_BACKTRACE comment for details.
|
|
253
|
+
locations = DI::EXCEPTION_BACKTRACE_LOCATIONS.bind(exception).call
|
|
254
|
+
stacktrace = if locations
|
|
255
|
+
format_backtrace_locations(locations)
|
|
256
|
+
else
|
|
257
|
+
format_backtrace_strings(DI::EXCEPTION_BACKTRACE.bind(exception).call)
|
|
258
|
+
end
|
|
259
|
+
{
|
|
260
|
+
type: exception.class.name,
|
|
261
|
+
message: message,
|
|
262
|
+
stacktrace: stacktrace,
|
|
263
|
+
}
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Matches Ruby backtrace frame format: "/path/file.rb:42:in `method_name'"
|
|
267
|
+
# Captures: $1 = file path, $2 = line number, $3 = method name
|
|
268
|
+
BACKTRACE_FRAME_PATTERN = /\A(.+):(\d+):in\s+[`'](.+)'\z/
|
|
269
|
+
|
|
270
|
+
# Converts backtrace locations into the stack frame format
|
|
271
|
+
# expected by the Datadog UI.
|
|
272
|
+
#
|
|
273
|
+
# Uses Thread::Backtrace::Location objects which provide structured
|
|
274
|
+
# path/lineno/label directly, avoiding the round-trip of formatting
|
|
275
|
+
# to strings and regex-parsing back.
|
|
276
|
+
#
|
|
277
|
+
# @param locations [Array<Thread::Backtrace::Location>]
|
|
278
|
+
# @return [Array<Hash>]
|
|
279
|
+
def format_backtrace_locations(locations)
|
|
280
|
+
locations.map do |loc|
|
|
281
|
+
{fileName: loc.path, function: loc.label, lineNumber: loc.lineno}
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# Parses Ruby backtrace strings into the stack frame format
|
|
286
|
+
# expected by the Datadog UI.
|
|
287
|
+
#
|
|
288
|
+
# Fallback for when backtrace_locations returns nil (see
|
|
289
|
+
# serialize_throwable for details on when this happens).
|
|
290
|
+
#
|
|
291
|
+
# Ruby backtrace format: "/path/file.rb:42:in `method_name'"
|
|
292
|
+
#
|
|
293
|
+
# @param backtrace [Array<String>, nil] from Exception#backtrace
|
|
294
|
+
# @return [Array<Hash>]
|
|
295
|
+
def format_backtrace_strings(backtrace)
|
|
296
|
+
return [] if backtrace.nil?
|
|
297
|
+
|
|
298
|
+
backtrace.map do |frame|
|
|
299
|
+
if frame =~ BACKTRACE_FRAME_PATTERN
|
|
300
|
+
{fileName: $1, function: $3, lineNumber: $2.to_i}
|
|
301
|
+
else
|
|
302
|
+
{fileName: frame, function: '', lineNumber: 0}
|
|
303
|
+
end
|
|
109
304
|
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def build_snapshot_base(context, evaluation_errors: [], captures: nil, message: nil)
|
|
308
|
+
probe = context.probe
|
|
309
|
+
|
|
310
|
+
timestamp = timestamp_now
|
|
311
|
+
duration = context.duration
|
|
110
312
|
|
|
111
313
|
location = if probe.line?
|
|
112
314
|
{
|
|
113
|
-
file: path,
|
|
114
|
-
|
|
315
|
+
file: context.path,
|
|
316
|
+
# Line numbers are required to be strings by the
|
|
317
|
+
# system tests schema.
|
|
318
|
+
# Backend I think accepts them also as integers, but some
|
|
319
|
+
# other languages send strings and we decided to require
|
|
320
|
+
# strings for everyone.
|
|
321
|
+
lines: [probe.line_no.to_s],
|
|
115
322
|
}
|
|
116
323
|
elsif probe.method?
|
|
117
324
|
{
|
|
@@ -120,34 +327,50 @@ module Datadog
|
|
|
120
327
|
}
|
|
121
328
|
end
|
|
122
329
|
|
|
123
|
-
stack = if caller_locations
|
|
330
|
+
stack = if caller_locations = context.caller_locations
|
|
124
331
|
format_caller_locations(caller_locations)
|
|
125
332
|
end
|
|
126
333
|
|
|
127
|
-
|
|
128
|
-
{
|
|
334
|
+
payload = {
|
|
129
335
|
service: settings.service,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
336
|
+
debugger: {
|
|
337
|
+
type: 'snapshot',
|
|
338
|
+
# Product can have three values: di, ld, er.
|
|
339
|
+
# We do not currently implement exception replay.
|
|
340
|
+
# There is currently no specification, and no consensus, for
|
|
341
|
+
# when product should be di (dynamic instrumentation) and when
|
|
342
|
+
# it should be ld (live debugger). I thought the backend was
|
|
343
|
+
# supposed to provide this in probe specification via remote
|
|
344
|
+
# config, but apparently this is not the case and the expectation
|
|
345
|
+
# is that the library figures out the product via heuristics,
|
|
346
|
+
# except there is currently no consensus on said heuristics.
|
|
347
|
+
# .NET always sends ld, other languages send nothing at the moment.
|
|
348
|
+
# Don't send anything for the time being.
|
|
349
|
+
# product: 'di/ld',
|
|
350
|
+
snapshot: {
|
|
351
|
+
id: SecureRandom.uuid,
|
|
352
|
+
timestamp: timestamp,
|
|
353
|
+
evaluationErrors: evaluation_errors,
|
|
354
|
+
probe: {
|
|
355
|
+
id: probe.id,
|
|
356
|
+
version: 0,
|
|
357
|
+
location: location,
|
|
358
|
+
},
|
|
359
|
+
language: 'ruby',
|
|
360
|
+
# TODO add test coverage for callers being nil
|
|
361
|
+
stack: stack,
|
|
362
|
+
# System tests schema validation requires captures to
|
|
363
|
+
# always be present
|
|
364
|
+
captures: captures || {},
|
|
138
365
|
},
|
|
139
|
-
language: 'ruby',
|
|
140
|
-
# TODO add test coverage for callers being nil
|
|
141
|
-
stack: stack,
|
|
142
|
-
captures: captures,
|
|
143
366
|
},
|
|
144
367
|
# In python tracer duration is under debugger.snapshot,
|
|
145
368
|
# but UI appears to expect it here at top level.
|
|
146
|
-
duration: duration ? (duration *
|
|
369
|
+
duration: duration ? (duration * NANOSECONDS).to_i : 0,
|
|
147
370
|
host: nil,
|
|
148
371
|
logger: {
|
|
149
372
|
name: probe.file,
|
|
150
|
-
method: probe.method_name
|
|
373
|
+
method: probe.method_name,
|
|
151
374
|
thread_name: Thread.current.name,
|
|
152
375
|
# Dynamic instrumentation currently does not need thread_id for
|
|
153
376
|
# anything. It can be sent if a customer requests it at which point
|
|
@@ -160,30 +383,13 @@ module Datadog
|
|
|
160
383
|
"dd.trace_id": active_trace&.id&.to_s,
|
|
161
384
|
"dd.span_id": active_span&.id&.to_s,
|
|
162
385
|
ddsource: 'dd_debugger',
|
|
163
|
-
message:
|
|
164
|
-
duration: duration ? duration * 1000 : 0),
|
|
386
|
+
message: message,
|
|
165
387
|
timestamp: timestamp,
|
|
166
388
|
}
|
|
167
|
-
end
|
|
168
389
|
|
|
169
|
-
|
|
390
|
+
tag_process_tags!(payload, settings)
|
|
170
391
|
|
|
171
|
-
|
|
172
|
-
{
|
|
173
|
-
service: settings.service,
|
|
174
|
-
timestamp: timestamp_now,
|
|
175
|
-
message: message,
|
|
176
|
-
ddsource: 'dd_debugger',
|
|
177
|
-
debugger: {
|
|
178
|
-
diagnostics: {
|
|
179
|
-
probeId: probe.id,
|
|
180
|
-
probeVersion: 0,
|
|
181
|
-
runtimeId: Core::Environment::Identity.id,
|
|
182
|
-
parentId: nil,
|
|
183
|
-
status: status,
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
}
|
|
392
|
+
payload
|
|
187
393
|
end
|
|
188
394
|
|
|
189
395
|
def format_caller_locations(caller_locations)
|
|
@@ -192,16 +398,39 @@ module Datadog
|
|
|
192
398
|
end
|
|
193
399
|
end
|
|
194
400
|
|
|
195
|
-
def evaluate_template(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
401
|
+
def evaluate_template(template_segments, context)
|
|
402
|
+
evaluation_errors = []
|
|
403
|
+
message = template_segments.map do |segment|
|
|
404
|
+
case segment
|
|
405
|
+
when String
|
|
406
|
+
segment
|
|
407
|
+
when EL::Expression
|
|
408
|
+
serializer.serialize_value_for_message(segment.evaluate(context))
|
|
409
|
+
else
|
|
410
|
+
raise ArgumentError, "Invalid template segment type: #{segment}"
|
|
411
|
+
end
|
|
412
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
413
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
414
|
+
evaluation_errors << {
|
|
415
|
+
message: "#{exc.class}: #{exc.message}",
|
|
416
|
+
expr: segment.dsl_expr, # steep:ignore NoMethod
|
|
417
|
+
}
|
|
418
|
+
'[evaluation error]'
|
|
419
|
+
end.join
|
|
420
|
+
[message, evaluation_errors]
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def tag_process_tags!(payload, settings)
|
|
424
|
+
return unless settings.experimental_propagate_process_tags_enabled
|
|
425
|
+
|
|
426
|
+
process_tags = Core::Environment::Process.serialized
|
|
427
|
+
return if process_tags.empty?
|
|
428
|
+
|
|
429
|
+
payload[:process_tags] = process_tags
|
|
201
430
|
end
|
|
202
431
|
|
|
203
432
|
def timestamp_now
|
|
204
|
-
(Core::Utils::Time.now.to_f *
|
|
433
|
+
(Core::Utils::Time.now.to_f * MILLISECONDS).to_i
|
|
205
434
|
end
|
|
206
435
|
|
|
207
436
|
def active_trace
|
|
@@ -218,3 +447,5 @@ module Datadog
|
|
|
218
447
|
end
|
|
219
448
|
end
|
|
220
449
|
end
|
|
450
|
+
|
|
451
|
+
# rubocop:enable Lint/AssignmentInCondition
|