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
data/lib/datadog/di/logger.rb
CHANGED
|
@@ -8,7 +8,7 @@ module Datadog
|
|
|
8
8
|
#
|
|
9
9
|
# @api private
|
|
10
10
|
class Logger
|
|
11
|
-
extend Forwardable
|
|
11
|
+
extend Forwardable
|
|
12
12
|
|
|
13
13
|
def initialize(settings, target)
|
|
14
14
|
@settings = settings
|
|
@@ -18,7 +18,7 @@ module Datadog
|
|
|
18
18
|
attr_reader :settings
|
|
19
19
|
attr_reader :target
|
|
20
20
|
|
|
21
|
-
def_delegators :target, :debug
|
|
21
|
+
def_delegators :target, :debug
|
|
22
22
|
|
|
23
23
|
def trace(&block)
|
|
24
24
|
if settings.dynamic_instrumentation.internal.trace_logging
|
data/lib/datadog/di/probe.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Datadog
|
|
|
17
17
|
# and remote config code must be prepared to deal with exceptions
|
|
18
18
|
# raised by Probe constructor in particular. Therefore, Probe constructor
|
|
19
19
|
# will raise an exception if it determines that there is not enough
|
|
20
|
-
# information (or
|
|
20
|
+
# information (or conflicting information) in the arguments to create a
|
|
21
21
|
# functional probe, and upstream code is tasked with not spamming logs
|
|
22
22
|
# with notifications of such errors (and potentially limiting the
|
|
23
23
|
# attempts to construct probe from a given payload).
|
|
@@ -34,10 +34,17 @@ module Datadog
|
|
|
34
34
|
class Probe
|
|
35
35
|
KNOWN_TYPES = %i[log].freeze
|
|
36
36
|
|
|
37
|
+
EVALUATE_AT_VALUES = %i[entry exit].freeze
|
|
38
|
+
|
|
37
39
|
def initialize(id:, type:,
|
|
38
40
|
file: nil, line_no: nil, type_name: nil, method_name: nil,
|
|
39
|
-
template: nil,
|
|
41
|
+
template: nil, template_segments: nil,
|
|
42
|
+
capture_snapshot: false, max_capture_depth: nil,
|
|
40
43
|
max_capture_attribute_count: nil,
|
|
44
|
+
max_capture_collection_size: nil, max_capture_string_length: nil,
|
|
45
|
+
capture_expressions: [],
|
|
46
|
+
evaluate_at: nil,
|
|
47
|
+
condition: nil,
|
|
41
48
|
rate_limit: nil)
|
|
42
49
|
# Perform some sanity checks here to detect unexpected attribute
|
|
43
50
|
# combinations, in order to not do them in subsequent code.
|
|
@@ -45,9 +52,17 @@ module Datadog
|
|
|
45
52
|
raise ArgumentError, "Unknown probe type: #{type}"
|
|
46
53
|
end
|
|
47
54
|
|
|
48
|
-
if
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
# Probe should be inferred to be a line probe if the specification
|
|
56
|
+
# contains a line number. This how Java tracer works and Go tracer
|
|
57
|
+
# is implementing the same behavior, and Go will have all 3 fields
|
|
58
|
+
# (file path, line number and method name) for line probes.
|
|
59
|
+
# Do not raise if line number and method name both exist - instead
|
|
60
|
+
# treat the probe as a line probe.
|
|
61
|
+
#
|
|
62
|
+
# In the future we want to provide type name and method name to line
|
|
63
|
+
# probes, so that the library can verify that the instrumented line
|
|
64
|
+
# is in the method that the frontend showed to the user when the
|
|
65
|
+
# user created the probe.
|
|
51
66
|
|
|
52
67
|
if line_no && !file
|
|
53
68
|
raise ArgumentError, "Probe contains line number but not file: #{id}"
|
|
@@ -57,6 +72,10 @@ module Datadog
|
|
|
57
72
|
raise ArgumentError, "Partial method probe definition: #{id}"
|
|
58
73
|
end
|
|
59
74
|
|
|
75
|
+
if line_no.nil? && method_name.nil?
|
|
76
|
+
raise ArgumentError, "Unhandled probe type: neither method nor line probe: #{id}"
|
|
77
|
+
end
|
|
78
|
+
|
|
60
79
|
@id = id
|
|
61
80
|
@type = type
|
|
62
81
|
@file = file
|
|
@@ -64,22 +83,35 @@ module Datadog
|
|
|
64
83
|
@type_name = type_name
|
|
65
84
|
@method_name = method_name
|
|
66
85
|
@template = template
|
|
86
|
+
@template_segments = template_segments
|
|
67
87
|
@capture_snapshot = !!capture_snapshot
|
|
68
88
|
@max_capture_depth = max_capture_depth
|
|
69
89
|
@max_capture_attribute_count = max_capture_attribute_count
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
raise ArgumentError, "Unhandled probe type: neither method nor line probe: #{id}"
|
|
90
|
+
@max_capture_collection_size = max_capture_collection_size
|
|
91
|
+
@max_capture_string_length = max_capture_string_length
|
|
92
|
+
@capture_expressions = capture_expressions || []
|
|
93
|
+
evaluate_at = :exit if evaluate_at.nil?
|
|
94
|
+
unless EVALUATE_AT_VALUES.include?(evaluate_at)
|
|
95
|
+
raise ArgumentError, "Unknown evaluate_at value: #{evaluate_at.inspect} (expected one of #{EVALUATE_AT_VALUES.inspect})"
|
|
77
96
|
end
|
|
97
|
+
@evaluate_at = evaluate_at
|
|
98
|
+
@condition = condition
|
|
78
99
|
|
|
79
|
-
@rate_limit = rate_limit || (@capture_snapshot ? 1 : 5000)
|
|
100
|
+
@rate_limit = rate_limit || ((@capture_snapshot || !@capture_expressions.empty?) ? 1 : 5000)
|
|
80
101
|
@rate_limiter = Datadog::Core::TokenBucket.new(@rate_limit)
|
|
81
102
|
|
|
103
|
+
# At most one report per second.
|
|
104
|
+
# We create the rate limiter here even though it may never be used,
|
|
105
|
+
# to avoid having to synchronize the creation since method probes
|
|
106
|
+
# can be executed on multiple threads concurrently (even if line
|
|
107
|
+
# probes are never executed concurrently since those are done in a
|
|
108
|
+
# trace point).
|
|
109
|
+
if condition
|
|
110
|
+
@condition_evaluation_failed_rate_limiter = Datadog::Core::TokenBucket.new(1)
|
|
111
|
+
end
|
|
112
|
+
|
|
82
113
|
@emitting_notified = false
|
|
114
|
+
@enabled = true
|
|
83
115
|
end
|
|
84
116
|
|
|
85
117
|
attr_reader :id
|
|
@@ -89,6 +121,10 @@ module Datadog
|
|
|
89
121
|
attr_reader :type_name
|
|
90
122
|
attr_reader :method_name
|
|
91
123
|
attr_reader :template
|
|
124
|
+
attr_reader :template_segments
|
|
125
|
+
|
|
126
|
+
# The compiled condition for the probe, as a String.
|
|
127
|
+
attr_reader :condition
|
|
92
128
|
|
|
93
129
|
# Configured maximum capture depth. Can be nil in which case
|
|
94
130
|
# the global default will be used.
|
|
@@ -98,16 +134,57 @@ module Datadog
|
|
|
98
134
|
# the global default will be used.
|
|
99
135
|
attr_reader :max_capture_attribute_count
|
|
100
136
|
|
|
137
|
+
attr_reader :max_capture_collection_size
|
|
138
|
+
|
|
139
|
+
attr_reader :max_capture_string_length
|
|
140
|
+
|
|
141
|
+
attr_reader :capture_expressions
|
|
142
|
+
|
|
143
|
+
attr_reader :evaluate_at
|
|
144
|
+
|
|
101
145
|
# Rate limit in effect, in invocations per second. Always present.
|
|
102
146
|
attr_reader :rate_limit
|
|
103
147
|
|
|
104
148
|
# Rate limiter object. For internal DI use only.
|
|
105
149
|
attr_reader :rate_limiter
|
|
106
150
|
|
|
151
|
+
# Rate limiter object for sending snapshots with evaluation errors
|
|
152
|
+
# for when probe condition evaluation fails.
|
|
153
|
+
# This rate limit is separate from the "base" rate limit for the probe
|
|
154
|
+
# because when the condition evaluation succeeds we want the "base"
|
|
155
|
+
# rate limit applied, not tainted by any evaluation errors
|
|
156
|
+
# (for example, the condition can be highly selective, and when it
|
|
157
|
+
# does not hold the evaluation may fail - we don't want to use up the
|
|
158
|
+
# probe rate limit for the errors).
|
|
159
|
+
attr_reader :condition_evaluation_failed_rate_limiter
|
|
160
|
+
|
|
107
161
|
def capture_snapshot?
|
|
108
162
|
@capture_snapshot
|
|
109
163
|
end
|
|
110
164
|
|
|
165
|
+
def capture_expressions?
|
|
166
|
+
!@capture_expressions.empty?
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def evaluate_at_entry?
|
|
170
|
+
evaluate_at == :entry
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Capture-expression mode: the probe captures expressions but not a full
|
|
174
|
+
# snapshot. Snapshot capture serializes its own values, so expression
|
|
175
|
+
# capture only runs when a snapshot is not being taken.
|
|
176
|
+
def capture_expressions_only?
|
|
177
|
+
capture_expressions? && !capture_snapshot?
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def capture_entry_expressions?
|
|
181
|
+
capture_expressions_only? && evaluate_at_entry?
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def snapshot_serializer_limits(settings)
|
|
185
|
+
CaptureLimits.resolve(expr_limits: nil, probe: self, settings: settings)
|
|
186
|
+
end
|
|
187
|
+
|
|
111
188
|
# Returns whether the probe is a line probe.
|
|
112
189
|
#
|
|
113
190
|
# Method probes may still specify a file name (to aid in locating the
|
|
@@ -122,7 +199,7 @@ module Datadog
|
|
|
122
199
|
|
|
123
200
|
# Returns whether the probe is a method probe.
|
|
124
201
|
def method?
|
|
125
|
-
|
|
202
|
+
line_no.nil?
|
|
126
203
|
end
|
|
127
204
|
|
|
128
205
|
# Returns the line number associated with the probe, raising
|
|
@@ -139,6 +216,20 @@ module Datadog
|
|
|
139
216
|
line_no
|
|
140
217
|
end
|
|
141
218
|
|
|
219
|
+
# Returns the method name associated with the probe, raising
|
|
220
|
+
# Error::MissingMethodName if the probe does not have a method name
|
|
221
|
+
# associated with it.
|
|
222
|
+
#
|
|
223
|
+
# This method is used by instrumentation driver to ensure a method name
|
|
224
|
+
# that is passed into the instrumentation logic is actually a method name
|
|
225
|
+
# and not nil.
|
|
226
|
+
def method_name!
|
|
227
|
+
if method_name.nil?
|
|
228
|
+
raise Error::MissingMethodName, "Probe #{id} does not have a method name associated with it"
|
|
229
|
+
end
|
|
230
|
+
method_name
|
|
231
|
+
end
|
|
232
|
+
|
|
142
233
|
# Source code location of the probe, for diagnostic reporting.
|
|
143
234
|
def location
|
|
144
235
|
if method?
|
|
@@ -186,6 +277,23 @@ module Datadog
|
|
|
186
277
|
def emitting_notified?
|
|
187
278
|
!!@emitting_notified
|
|
188
279
|
end
|
|
280
|
+
|
|
281
|
+
def executed_on_line?
|
|
282
|
+
!!(defined?(@executed_on_line) && @executed_on_line)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def executed_on_line!
|
|
286
|
+
# TODO lock?
|
|
287
|
+
@executed_on_line = true
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def enabled?
|
|
291
|
+
@enabled
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def disable!
|
|
295
|
+
@enabled = false
|
|
296
|
+
end
|
|
189
297
|
end
|
|
190
298
|
end
|
|
191
299
|
end
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# rubocop:disable Lint/AssignmentInCondition
|
|
4
|
+
|
|
3
5
|
require_relative "probe"
|
|
6
|
+
require_relative "capture_expression"
|
|
7
|
+
require_relative "capture_limits"
|
|
8
|
+
require_relative 'el'
|
|
4
9
|
|
|
5
10
|
module Datadog
|
|
6
11
|
module DI
|
|
@@ -17,14 +22,39 @@ module Datadog
|
|
|
17
22
|
#
|
|
18
23
|
# @api private
|
|
19
24
|
module ProbeBuilder
|
|
20
|
-
|
|
25
|
+
# Steep: https://github.com/soutaro/steep/issues/363
|
|
26
|
+
PROBE_TYPES = { # steep:ignore IncompatibleAssignment
|
|
21
27
|
'LOG_PROBE' => :log,
|
|
22
28
|
}.freeze
|
|
23
29
|
|
|
24
|
-
module_function
|
|
30
|
+
module_function
|
|
31
|
+
|
|
32
|
+
CAPTURE_EXPRESSION_NAME_PATTERN = /\A[a-zA-Z0-9_?]+\z/
|
|
33
|
+
|
|
34
|
+
EVALUATE_AT_STRINGS = {
|
|
35
|
+
"ENTRY" => :entry,
|
|
36
|
+
"EXIT" => :exit,
|
|
37
|
+
"DEFAULT" => :exit,
|
|
38
|
+
}.freeze
|
|
39
|
+
|
|
40
|
+
def build_from_remote_config(config, logger:)
|
|
25
41
|
# The validations here are not yet comprehensive.
|
|
26
42
|
type = config.fetch('type')
|
|
27
43
|
type_symbol = PROBE_TYPES[type] or raise ArgumentError, "Unrecognized probe type: #{type}"
|
|
44
|
+
cond = if cond_spec = config['when']
|
|
45
|
+
unless cond_spec['dsl'] && cond_spec['json']
|
|
46
|
+
raise ArgumentError, "Malformed condition specification for probe: #{config}"
|
|
47
|
+
end
|
|
48
|
+
compiled = EL::Compiler.new.compile(cond_spec['json'])
|
|
49
|
+
EL::Expression.new(cond_spec['dsl'], compiled)
|
|
50
|
+
end
|
|
51
|
+
capture_expressions = build_capture_expressions(config['captureExpressions'])
|
|
52
|
+
capture_expressions = dedup_capture_expressions(capture_expressions, config["id"], logger)
|
|
53
|
+
if !!config["captureSnapshot"] && !capture_expressions.empty?
|
|
54
|
+
logger.debug do
|
|
55
|
+
"di: probe #{config["id"]}: captureSnapshot=true wins over captureExpressions (n=#{capture_expressions.size})"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
28
58
|
Probe.new(
|
|
29
59
|
id: config.fetch("id"),
|
|
30
60
|
type: type_symbol,
|
|
@@ -34,15 +64,106 @@ module Datadog
|
|
|
34
64
|
line_no: config["where"]&.[]("lines")&.compact&.map(&:to_i)&.first,
|
|
35
65
|
type_name: config["where"]&.[]("typeName"),
|
|
36
66
|
method_name: config["where"]&.[]("methodName"),
|
|
67
|
+
# We should not be using the template for anything - we instead
|
|
68
|
+
# use +segments+ - but keep the template for debugging.
|
|
37
69
|
template: config["template"],
|
|
70
|
+
template_segments: build_template_segments(config['segments']),
|
|
38
71
|
capture_snapshot: !!config["captureSnapshot"],
|
|
39
72
|
max_capture_depth: config["capture"]&.[]("maxReferenceDepth"),
|
|
40
73
|
max_capture_attribute_count: config["capture"]&.[]("maxFieldCount"),
|
|
74
|
+
max_capture_collection_size: config["capture"]&.[]("maxCollectionSize"),
|
|
75
|
+
max_capture_string_length: config["capture"]&.[]("maxLength"),
|
|
76
|
+
capture_expressions: capture_expressions,
|
|
77
|
+
evaluate_at: parse_evaluate_at(config["evaluateAt"], config["id"], logger),
|
|
41
78
|
rate_limit: config["sampling"]&.[]("snapshotsPerSecond"),
|
|
79
|
+
condition: cond,
|
|
42
80
|
)
|
|
43
81
|
rescue KeyError => exc
|
|
44
|
-
raise ArgumentError, "Malformed remote configuration entry for probe: #{exc.class}: #{exc}: #{config}"
|
|
82
|
+
raise ArgumentError, "Malformed remote configuration entry for probe: #{exc.class}: #{exc.message}: #{config}"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def build_capture_expressions(raw)
|
|
86
|
+
return [] if raw.nil?
|
|
87
|
+
unless Array === raw
|
|
88
|
+
raise ArgumentError, "captureExpressions must be an array, got: #{raw.class}"
|
|
89
|
+
end
|
|
90
|
+
return [] if raw.empty?
|
|
91
|
+
raw.map do |entry|
|
|
92
|
+
unless Hash === entry
|
|
93
|
+
raise ArgumentError, "captureExpressions entry must be a hash, got: #{entry.class}"
|
|
94
|
+
end
|
|
95
|
+
name = entry['name']
|
|
96
|
+
unless String === name && CAPTURE_EXPRESSION_NAME_PATTERN.match?(name)
|
|
97
|
+
raise ArgumentError, "captureExpressions entry name missing or invalid (must match #{CAPTURE_EXPRESSION_NAME_PATTERN.inspect}): #{name.inspect}"
|
|
98
|
+
end
|
|
99
|
+
expr_spec = entry['expr']
|
|
100
|
+
unless Hash === expr_spec && expr_spec['dsl'] && expr_spec['json']
|
|
101
|
+
raise ArgumentError, "captureExpressions entry #{name}: missing or malformed expr"
|
|
102
|
+
end
|
|
103
|
+
compiled = EL::Compiler.new.compile(expr_spec['json'])
|
|
104
|
+
expr = EL::Expression.new(expr_spec['dsl'], compiled)
|
|
105
|
+
limits = build_capture_limits(entry['capture'])
|
|
106
|
+
CaptureExpression.new(name: name, expr: expr, limits: limits)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def dedup_capture_expressions(capture_expressions, probe_id, logger)
|
|
111
|
+
return capture_expressions if capture_expressions.size < 2
|
|
112
|
+
by_name = {}
|
|
113
|
+
capture_expressions.each do |capture_expression|
|
|
114
|
+
by_name[capture_expression.name] = capture_expression
|
|
115
|
+
end
|
|
116
|
+
return capture_expressions if by_name.size == capture_expressions.size
|
|
117
|
+
logger.debug do
|
|
118
|
+
"di: probe #{probe_id}: collapsed duplicate captureExpressions names, kept last per name (#{capture_expressions.size} -> #{by_name.size})"
|
|
119
|
+
end
|
|
120
|
+
by_name.values
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def build_capture_limits(raw)
|
|
124
|
+
return nil if raw.nil?
|
|
125
|
+
unless Hash === raw
|
|
126
|
+
raise ArgumentError, "capture-expression entry capture must be a hash, got: #{raw.class}"
|
|
127
|
+
end
|
|
128
|
+
CaptureLimits.new(
|
|
129
|
+
max_reference_depth: raw['maxReferenceDepth'],
|
|
130
|
+
max_collection_size: raw['maxCollectionSize'],
|
|
131
|
+
max_length: raw['maxLength'],
|
|
132
|
+
max_field_count: raw['maxFieldCount'],
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def parse_evaluate_at(raw, probe_id, logger)
|
|
137
|
+
return :exit if raw.nil?
|
|
138
|
+
EVALUATE_AT_STRINGS[raw] || begin
|
|
139
|
+
logger.debug do
|
|
140
|
+
"di: probe #{probe_id}: unrecognized evaluateAt value #{raw.inspect}, defaulting to :exit"
|
|
141
|
+
end
|
|
142
|
+
:exit
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def build_template_segments(segments)
|
|
147
|
+
segments&.map do |segment|
|
|
148
|
+
if Hash === segment
|
|
149
|
+
if str = segment['str']
|
|
150
|
+
str
|
|
151
|
+
elsif ast = segment['json']
|
|
152
|
+
unless dsl = segment['dsl']
|
|
153
|
+
raise ArgumentError, "Missing dsl for json in segment: #{segment}"
|
|
154
|
+
end
|
|
155
|
+
compiled = EL::Compiler.new.compile(ast)
|
|
156
|
+
EL::Expression.new(dsl, compiled)
|
|
157
|
+
else
|
|
158
|
+
# TODO report to telemetry?
|
|
159
|
+
end
|
|
160
|
+
else
|
|
161
|
+
# TODO report to telemetry?
|
|
162
|
+
end
|
|
163
|
+
end&.compact
|
|
45
164
|
end
|
|
46
165
|
end
|
|
47
166
|
end
|
|
48
167
|
end
|
|
168
|
+
|
|
169
|
+
# rubocop:enable Lint/AssignmentInCondition
|
|
@@ -6,7 +6,7 @@ module Datadog
|
|
|
6
6
|
# Railtie class initializes dynamic instrumentation contrib code
|
|
7
7
|
# in Rails environments.
|
|
8
8
|
class Railtie < Rails::Railtie
|
|
9
|
-
initializer 'datadog.dynamic_instrumentation.load_probe_file' do |app|
|
|
9
|
+
initializer 'datadog.dynamic_instrumentation.load_probe_file' do |app|
|
|
10
10
|
ProbeFileLoader.load_now
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
5
|
+
require_relative 'fatal_exceptions'
|
|
6
|
+
|
|
5
7
|
module Datadog
|
|
6
8
|
module DI
|
|
7
9
|
module ProbeFileLoader
|
|
@@ -46,28 +48,31 @@ module Datadog
|
|
|
46
48
|
component.telemetry&.report(exc, description: "Line probe is targeting a loaded file that is not in code tracker")
|
|
47
49
|
|
|
48
50
|
payload = component.probe_notification_builder.build_errored(probe, exc)
|
|
49
|
-
component.probe_notifier_worker.add_status(payload)
|
|
50
|
-
rescue => exc
|
|
51
|
+
component.probe_notifier_worker.add_status(payload, probe: probe)
|
|
52
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
53
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
51
54
|
raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
52
55
|
|
|
53
|
-
component.logger.debug { "di: unhandled exception adding #{probe.type} probe at #{probe.location} (#{probe.id}) in DI probe file loader: #{exc.class}: #{exc}" }
|
|
56
|
+
component.logger.debug { "di: unhandled exception adding #{probe.type} probe at #{probe.location} (#{probe.id}) in DI probe file loader: #{exc.class}: #{exc.message}" }
|
|
54
57
|
component.telemetry&.report(exc, description: "Unhandled exception adding probe in DI probe file loader")
|
|
55
58
|
|
|
56
59
|
# TODO test this path
|
|
57
60
|
payload = component.probe_notification_builder.build_errored(probe, exc)
|
|
58
|
-
component.probe_notifier_worker.add_status(payload)
|
|
61
|
+
component.probe_notifier_worker.add_status(payload, probe: probe)
|
|
59
62
|
end
|
|
60
63
|
end
|
|
61
|
-
rescue => exc
|
|
64
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
65
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
62
66
|
if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
63
67
|
should_propagate = true
|
|
64
68
|
raise
|
|
65
69
|
end
|
|
66
70
|
|
|
67
|
-
component.logger.debug { "di: unhandled exception handling a probe in DI probe file loader: #{exc.class}: #{exc}" }
|
|
71
|
+
component.logger.debug { "di: unhandled exception handling a probe in DI probe file loader: #{exc.class}: #{exc.message}" }
|
|
68
72
|
component.telemetry&.report(exc, description: "Unhandled exception handling probe in DI probe file loader")
|
|
69
73
|
end
|
|
70
|
-
rescue
|
|
74
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
75
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
71
76
|
# We should generally never get here, but if component tree
|
|
72
77
|
# initialization fails for some unexpected reason, don't nuke
|
|
73
78
|
# the customer application.
|