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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Top-level container wrapping scopes for upload to the agent.
|
|
8
|
+
#
|
|
9
|
+
# ServiceVersion is the root object serialized to JSON for symbol database uploads.
|
|
10
|
+
# Contains service metadata (name, env, version) and all extracted scopes.
|
|
11
|
+
# The language field identifies the tracer.
|
|
12
|
+
#
|
|
13
|
+
# Created by: Uploader (wraps scopes array before serialization)
|
|
14
|
+
# Contains: Array of top-level Scope objects (FILE scopes)
|
|
15
|
+
# Serialized to: JSON via to_json, then GZIP compressed for upload
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
class ServiceVersion
|
|
19
|
+
attr_reader :service, :env, :version, :language, :scopes, :upload_id, :batch_num, :final
|
|
20
|
+
|
|
21
|
+
# Initialize a new ServiceVersion
|
|
22
|
+
# @param service [String] Service name (required, from DD_SERVICE)
|
|
23
|
+
# @param env [String, nil] Environment (from DD_ENV, passed through unchanged)
|
|
24
|
+
# @param version [String, nil] Version (from DD_VERSION, passed through unchanged)
|
|
25
|
+
# @param scopes [Array<Scope>] Top-level scopes (required)
|
|
26
|
+
# @param upload_id [String, nil] UUID identifying the logical upload (shared by all batches)
|
|
27
|
+
# @param batch_num [Integer, nil] 1-indexed batch number within the upload
|
|
28
|
+
# @param final [Boolean, nil] true if this is the last batch of the upload
|
|
29
|
+
# @raise [ArgumentError] if service empty or scopes not an array
|
|
30
|
+
def initialize(service:, env:, version:, scopes:, upload_id: nil, batch_num: nil, final: nil)
|
|
31
|
+
raise ArgumentError, 'service is required' if service.nil? || service.empty?
|
|
32
|
+
raise ArgumentError, 'scopes must be an array' unless scopes.is_a?(Array)
|
|
33
|
+
|
|
34
|
+
@service = service
|
|
35
|
+
@env = env
|
|
36
|
+
@version = version
|
|
37
|
+
@language = 'ruby'
|
|
38
|
+
@scopes = scopes
|
|
39
|
+
@upload_id = upload_id
|
|
40
|
+
@batch_num = batch_num
|
|
41
|
+
@final = final
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Convert service version to Hash for JSON serialization.
|
|
45
|
+
# @return [Hash] ServiceVersion as hash with symbol keys
|
|
46
|
+
def to_h
|
|
47
|
+
{
|
|
48
|
+
service: service,
|
|
49
|
+
env: env,
|
|
50
|
+
version: version,
|
|
51
|
+
language: language,
|
|
52
|
+
scopes: scopes.map(&:to_h),
|
|
53
|
+
upload_id: upload_id,
|
|
54
|
+
batch_num: batch_num,
|
|
55
|
+
final: final,
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Serialize service version to JSON.
|
|
60
|
+
# @return [String] JSON string representation
|
|
61
|
+
def to_json(_state = nil)
|
|
62
|
+
JSON.generate(to_h)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Represents a symbol (variable, parameter, field, constant) within a scope.
|
|
8
|
+
#
|
|
9
|
+
# Symbols are the actual identifiers extracted from Ruby code:
|
|
10
|
+
# - Instance variables (@var) - FIELD type
|
|
11
|
+
# - Class variables (@@var) - STATIC_FIELD type
|
|
12
|
+
# - Constants (CONST) - STATIC_FIELD type
|
|
13
|
+
# - Method parameters (arg) - ARG type
|
|
14
|
+
# - Local variables (var) - LOCAL type (not yet implemented)
|
|
15
|
+
#
|
|
16
|
+
# Created by: Extractor (during class/method introspection)
|
|
17
|
+
# Contained in: Scope objects (symbols array)
|
|
18
|
+
# Serialized to: JSON via to_h/to_json
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
class Symbol
|
|
22
|
+
attr_reader :symbol_type, :name, :line, :type, :language_specifics
|
|
23
|
+
|
|
24
|
+
# Initialize a new Symbol
|
|
25
|
+
# @param symbol_type [String] Type: FIELD, STATIC_FIELD, ARG, LOCAL
|
|
26
|
+
# @param name [String] Symbol name (variable name, parameter name)
|
|
27
|
+
# @param line [Integer] Line number (UNKNOWN_MIN_LINE for entire scope, UNKNOWN_MAX_LINE for method-level only)
|
|
28
|
+
# @param type [String, nil] Type annotation (optional, Ruby is dynamic)
|
|
29
|
+
# @param language_specifics [Hash, nil] Symbol-specific metadata
|
|
30
|
+
def initialize(
|
|
31
|
+
symbol_type:,
|
|
32
|
+
name:,
|
|
33
|
+
line:,
|
|
34
|
+
type: nil,
|
|
35
|
+
language_specifics: nil
|
|
36
|
+
)
|
|
37
|
+
@symbol_type = symbol_type
|
|
38
|
+
@name = name
|
|
39
|
+
@line = line
|
|
40
|
+
@type = type
|
|
41
|
+
@language_specifics = language_specifics
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Convert symbol to Hash for JSON serialization.
|
|
45
|
+
# The `type` key is always present per the symdb JSON schema — emit nil
|
|
46
|
+
# when the type cannot be determined (the common case in Ruby since
|
|
47
|
+
# parameters and instance variables carry no declared type).
|
|
48
|
+
# `language_specifics` is omitted when nil to reduce payload size.
|
|
49
|
+
# @return [Hash] Symbol as hash with symbol keys
|
|
50
|
+
def to_h
|
|
51
|
+
# @type var h: Hash[::Symbol, untyped]
|
|
52
|
+
h = {
|
|
53
|
+
symbol_type: symbol_type,
|
|
54
|
+
name: name,
|
|
55
|
+
line: line,
|
|
56
|
+
type: type,
|
|
57
|
+
}
|
|
58
|
+
h[:language_specifics] = language_specifics if language_specifics
|
|
59
|
+
h
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Serialize symbol to JSON.
|
|
63
|
+
# @return [String] JSON string representation
|
|
64
|
+
def to_json(_state = nil)
|
|
65
|
+
JSON.generate(to_h)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../core/transport/http/api/endpoint'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
module Transport
|
|
8
|
+
module HTTP
|
|
9
|
+
module API
|
|
10
|
+
# POST endpoint for symbol database uploads. Multipart form-data
|
|
11
|
+
# is triggered by setting `env.form` on the request (handled in
|
|
12
|
+
# `Core::Transport::HTTP::Adapters::Net`); the multipart library
|
|
13
|
+
# sets Content-Type itself.
|
|
14
|
+
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
|
15
|
+
attr_reader :encoder
|
|
16
|
+
|
|
17
|
+
# @param path [String] URL path for the endpoint
|
|
18
|
+
# @param encoder [#encode] Encoder for request data
|
|
19
|
+
def initialize(path, encoder)
|
|
20
|
+
super(:post, path)
|
|
21
|
+
@encoder = encoder
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../core/encoding'
|
|
4
|
+
require_relative '../../core/transport/http'
|
|
5
|
+
require_relative 'http/endpoint'
|
|
6
|
+
require_relative '../transport'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
module Transport
|
|
11
|
+
# Namespace for HTTP transport components
|
|
12
|
+
module HTTP
|
|
13
|
+
# POST endpoint for the agent's symbol database intake.
|
|
14
|
+
# Multipart form-data is dispatched via `env.form` from the
|
|
15
|
+
# `Symbols::Client` subclass.
|
|
16
|
+
SYMBOLS_ENDPOINT = API::Endpoint.new(
|
|
17
|
+
'/symdb/v1/input',
|
|
18
|
+
Datadog::Core::Encoding::JSONEncoder,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Builds a transport for the symbols upload endpoint.
|
|
22
|
+
# @param agent_settings [Core::Configuration::AgentSettingsResolver::AgentSettings]
|
|
23
|
+
# Agent connection settings (host, port, timeout, etc.)
|
|
24
|
+
# @param logger [Logger] Logger instance
|
|
25
|
+
# @param headers [Hash, nil] Optional additional headers
|
|
26
|
+
# @return [Symbols::Transport] Transport for the symbols endpoint
|
|
27
|
+
def self.symbols(
|
|
28
|
+
agent_settings:,
|
|
29
|
+
logger:,
|
|
30
|
+
headers: nil
|
|
31
|
+
)
|
|
32
|
+
Core::Transport::HTTP.build(
|
|
33
|
+
logger: logger,
|
|
34
|
+
agent_settings: agent_settings,
|
|
35
|
+
headers: headers,
|
|
36
|
+
) do |transport|
|
|
37
|
+
transport.api 'symbols', SYMBOLS_ENDPOINT, default: true
|
|
38
|
+
|
|
39
|
+
yield(transport) if block_given?
|
|
40
|
+
end.to_transport(SymbolDatabase::Transport::Symbols::Transport)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../core/transport/request'
|
|
4
|
+
require_relative '../core/transport/transport'
|
|
5
|
+
require_relative '../core/transport/http/client'
|
|
6
|
+
require_relative '../core/transport/http/env'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
module Transport
|
|
11
|
+
# Transport classes for the symbols upload endpoint.
|
|
12
|
+
# Mirrors the per-purpose split used by DI (`DI::Transport::Input::*`).
|
|
13
|
+
module Symbols
|
|
14
|
+
# Request wrapper carrying the multipart form for a symbols upload.
|
|
15
|
+
class Request < Core::Transport::Request
|
|
16
|
+
attr_reader :form
|
|
17
|
+
|
|
18
|
+
# @param form [Hash] Multipart form data with UploadIO objects
|
|
19
|
+
def initialize(form)
|
|
20
|
+
@form = form
|
|
21
|
+
# Multipart upload — no parcel; the Net adapter reads form data
|
|
22
|
+
# off the env directly.
|
|
23
|
+
super(nil)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# HTTP client for symbol database uploads.
|
|
28
|
+
# Extends Core::Transport::HTTP::Client to set `env.form`, which the
|
|
29
|
+
# Net adapter (lib/datadog/core/transport/http/adapters/net.rb) detects
|
|
30
|
+
# and dispatches as multipart/form-data.
|
|
31
|
+
class Client < Core::Transport::HTTP::Client
|
|
32
|
+
# @param request [Request] Symbols upload request
|
|
33
|
+
# @return [Core::Transport::HTTP::Env] Env with form data set
|
|
34
|
+
def build_env(request)
|
|
35
|
+
Core::Transport::HTTP::Env.new(request, form: request.form)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Transport for the symbols upload endpoint.
|
|
40
|
+
class Transport < Core::Transport::Transport
|
|
41
|
+
self.http_client_class = Client
|
|
42
|
+
|
|
43
|
+
# Send a symbols upload to the agent.
|
|
44
|
+
# @param form [Hash] Multipart form data with UploadIO objects
|
|
45
|
+
# @return [Core::Transport::Response] Response from agent
|
|
46
|
+
def send_symbols(form)
|
|
47
|
+
request = Request.new(form)
|
|
48
|
+
client.send_request(:symbols, request)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'securerandom'
|
|
5
|
+
require 'zlib'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require_relative '../core/environment/identity'
|
|
8
|
+
require_relative '../core/vendor/multipart-post/multipart/post/composite_read_io'
|
|
9
|
+
require_relative '../tracing/ext'
|
|
10
|
+
require_relative 'service_version'
|
|
11
|
+
require_relative 'transport/http'
|
|
12
|
+
require_relative '../di/fatal_exceptions'
|
|
13
|
+
|
|
14
|
+
module Datadog
|
|
15
|
+
module SymbolDatabase
|
|
16
|
+
# Uploads symbol database payloads to the Datadog agent via HTTP multipart.
|
|
17
|
+
#
|
|
18
|
+
# Handles the complete upload process:
|
|
19
|
+
# 1. Wraps scopes in ServiceVersion (adds service/env/version metadata)
|
|
20
|
+
# 2. Serializes to JSON
|
|
21
|
+
# 3. Compresses with GZIP (always, ~40:1 ratio expected)
|
|
22
|
+
# 4. Builds multipart form: event.json (metadata) + symbols_{pid}.json.gz (data)
|
|
23
|
+
# 5. POSTs to agent at /symdb/v1/input via Core::Transport::HTTP
|
|
24
|
+
# No retries — single attempt. Any failure is logged at debug and discarded.
|
|
25
|
+
#
|
|
26
|
+
# Uses Core::Transport::HTTP infrastructure (consistent with DI, Profiling, DataStreams).
|
|
27
|
+
# Headers: DD-API-KEY, Datadog-Container-ID, Datadog-Entity-ID (automatic from transport)
|
|
28
|
+
#
|
|
29
|
+
# Called by: ScopeBatcher.perform_upload (when batch ready)
|
|
30
|
+
# Calls: Transport::HTTP for network, Zlib for compression
|
|
31
|
+
#
|
|
32
|
+
# @api private
|
|
33
|
+
class Uploader
|
|
34
|
+
MAX_PAYLOAD_SIZE = 50 * 1024 * 1024 # 50MB
|
|
35
|
+
|
|
36
|
+
# Initialize uploader.
|
|
37
|
+
# @param settings [Configuration::Settings] Tracer settings (for service, env, version metadata)
|
|
38
|
+
# @param agent_settings [Configuration::AgentSettings] Agent connection settings
|
|
39
|
+
# @param logger [Logger] Logger instance
|
|
40
|
+
# @param telemetry [Telemetry, nil] Optional telemetry component for error reporting
|
|
41
|
+
def initialize(settings:, agent_settings:, logger:, telemetry: nil)
|
|
42
|
+
@settings = settings
|
|
43
|
+
@agent_settings = agent_settings
|
|
44
|
+
@logger = logger
|
|
45
|
+
@telemetry = telemetry
|
|
46
|
+
|
|
47
|
+
@transport = Transport::HTTP.symbols(
|
|
48
|
+
agent_settings: agent_settings,
|
|
49
|
+
logger: @logger,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Protects the lazy initialization of @upload_pid/@upload_id and the
|
|
53
|
+
# @batch_num increment in next_upload_metadata. ScopeBatcher calls
|
|
54
|
+
# upload_scopes outside its own mutex, so two threads (e.g. a size-
|
|
55
|
+
# triggered flush and the timer/shutdown path) can race here.
|
|
56
|
+
@metadata_mutex = Mutex.new
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Upload a batch of scopes to the agent.
|
|
60
|
+
# Wraps in ServiceVersion, serializes to JSON, compresses with GZIP,
|
|
61
|
+
# builds multipart form, and POSTs to /symdb/v1/input via transport.
|
|
62
|
+
# No retries — single attempt, matching Python behavior.
|
|
63
|
+
# @param scopes [Array<Scope>] Scopes to upload
|
|
64
|
+
# @return [void]
|
|
65
|
+
def upload_scopes(scopes)
|
|
66
|
+
return if scopes.empty?
|
|
67
|
+
|
|
68
|
+
upload_id, batch_num = next_upload_metadata
|
|
69
|
+
json_data = build_symbol_payload(scopes, upload_id: upload_id, batch_num: batch_num)
|
|
70
|
+
compressed_data = Zlib.gzip(json_data)
|
|
71
|
+
|
|
72
|
+
# Emitted unconditionally so the rare oversized case is observable.
|
|
73
|
+
@telemetry&.distribution(
|
|
74
|
+
Tracing::Ext::TELEMETRY_METRICS_NAMESPACE,
|
|
75
|
+
'symbol_database.payload_size',
|
|
76
|
+
compressed_data.bytesize
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Symbols for very large applications (>50MB after gzip) are dropped:
|
|
80
|
+
# the upload is skipped and the customer sees no autocomplete /
|
|
81
|
+
# symbol probe results for those classes. Java handles the same case
|
|
82
|
+
# by splitting the payload across multiple requests; we have not
|
|
83
|
+
# implemented splitting here. Deferred for a post-MVP follow-up.
|
|
84
|
+
if compressed_data.bytesize > MAX_PAYLOAD_SIZE
|
|
85
|
+
@logger.debug { "symdb: payload too large: #{compressed_data.bytesize}/#{MAX_PAYLOAD_SIZE} bytes, skipping" }
|
|
86
|
+
return
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
perform_http_upload(compressed_data, scopes.size, upload_id: upload_id, batch_num: batch_num)
|
|
90
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
91
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
92
|
+
@logger.debug { "symdb: upload failed: #{e.class}: #{e.message}" }
|
|
93
|
+
@telemetry&.report(e, description: 'symdb: upload failed')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
# Build JSON payload from scopes.
|
|
99
|
+
# @param scopes [Array<Scope>] Scopes to serialize
|
|
100
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
101
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
102
|
+
# @return [String] JSON string
|
|
103
|
+
def build_symbol_payload(scopes, upload_id:, batch_num:)
|
|
104
|
+
ServiceVersion.new(
|
|
105
|
+
service: @settings.service,
|
|
106
|
+
env: @settings.env,
|
|
107
|
+
version: @settings.version,
|
|
108
|
+
scopes: scopes,
|
|
109
|
+
upload_id: upload_id,
|
|
110
|
+
batch_num: batch_num,
|
|
111
|
+
# Always false: the Ruby tracer continuously uploads new code
|
|
112
|
+
# as files are loaded; there is no defined end-of-upload point.
|
|
113
|
+
final: false,
|
|
114
|
+
).to_json
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Perform HTTP POST with multipart form-data via transport layer.
|
|
118
|
+
# @param compressed_data [String] GZIP compressed JSON payload
|
|
119
|
+
# @param scope_count [Integer] Number of scopes (for logging)
|
|
120
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
121
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
122
|
+
# @return [void]
|
|
123
|
+
def perform_http_upload(compressed_data, scope_count, upload_id:, batch_num:)
|
|
124
|
+
form = build_multipart_form(compressed_data, upload_id: upload_id, batch_num: batch_num)
|
|
125
|
+
response = @transport.send_symbols(form)
|
|
126
|
+
handle_response(response, scope_count)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Build multipart form-data with event metadata and compressed symbols.
|
|
130
|
+
# @param compressed_data [String] GZIP compressed JSON payload
|
|
131
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
132
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
133
|
+
# @return [Hash] Form data hash with UploadIO objects
|
|
134
|
+
def build_multipart_form(compressed_data, upload_id:, batch_num:)
|
|
135
|
+
event_io = StringIO.new(
|
|
136
|
+
build_event_metadata(compressed_data.bytesize, upload_id: upload_id, batch_num: batch_num),
|
|
137
|
+
)
|
|
138
|
+
file_io = StringIO.new(compressed_data)
|
|
139
|
+
|
|
140
|
+
event_upload = Datadog::Core::Vendor::Multipart::Post::UploadIO.new(
|
|
141
|
+
event_io,
|
|
142
|
+
'application/json',
|
|
143
|
+
'event.json',
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
file_upload = Datadog::Core::Vendor::Multipart::Post::UploadIO.new(
|
|
147
|
+
file_io,
|
|
148
|
+
'application/gzip',
|
|
149
|
+
"symbols_#{Process.pid}.json.gz",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
{
|
|
153
|
+
'event' => event_upload,
|
|
154
|
+
'file' => file_upload,
|
|
155
|
+
}
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Build event.json metadata part.
|
|
159
|
+
# @param attachment_size [Integer] Size of the compressed attachment in bytes
|
|
160
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
161
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
162
|
+
# @return [String] JSON string for event metadata
|
|
163
|
+
def build_event_metadata(attachment_size, upload_id:, batch_num:)
|
|
164
|
+
JSON.generate(
|
|
165
|
+
ddsource: 'ruby',
|
|
166
|
+
service: @settings.service,
|
|
167
|
+
version: @settings.version,
|
|
168
|
+
language: 'ruby',
|
|
169
|
+
runtimeId: Datadog::Core::Environment::Identity.id,
|
|
170
|
+
parentId: nil, # Fork tracking deferred for MVP
|
|
171
|
+
type: 'symdb',
|
|
172
|
+
uploadId: upload_id,
|
|
173
|
+
batchNum: batch_num,
|
|
174
|
+
# Always false: the Ruby tracer continuously uploads new code
|
|
175
|
+
# as files are loaded; there is no defined end-of-upload point.
|
|
176
|
+
final: false,
|
|
177
|
+
attachmentSize: attachment_size,
|
|
178
|
+
)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Return [upload_id, batch_num] for the current process. upload_id is
|
|
182
|
+
# generated lazily on first use and shared by all batches uploaded from
|
|
183
|
+
# the process. A forked child observes a different Process.pid and
|
|
184
|
+
# therefore gets a fresh upload_id and batch counter.
|
|
185
|
+
# Synchronized: ScopeBatcher releases its mutex before calling
|
|
186
|
+
# upload_scopes, so this can be entered concurrently.
|
|
187
|
+
# @return [Array<(String, Integer)>]
|
|
188
|
+
def next_upload_metadata
|
|
189
|
+
@metadata_mutex.synchronize do
|
|
190
|
+
if @upload_pid != Process.pid
|
|
191
|
+
@upload_pid = Process.pid
|
|
192
|
+
@upload_id = SecureRandom.uuid.freeze
|
|
193
|
+
@batch_num = 0
|
|
194
|
+
end
|
|
195
|
+
@batch_num += 1 # steep:ignore NoMethod
|
|
196
|
+
# @upload_id and @batch_num are non-nil after the branch above; refine for Steep.
|
|
197
|
+
upload_id = @upload_id or raise('unreachable: @upload_id should be set')
|
|
198
|
+
batch_num = @batch_num or raise('unreachable: @batch_num should be set')
|
|
199
|
+
[upload_id, batch_num]
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Handle HTTP response and track metrics.
|
|
204
|
+
# @param response [Core::Transport::Response] HTTP response from agent
|
|
205
|
+
# @param scope_count [Integer] Number of scopes uploaded
|
|
206
|
+
# @return [Boolean] true if successful, false otherwise
|
|
207
|
+
def handle_response(response, scope_count)
|
|
208
|
+
if response.internal_error?
|
|
209
|
+
@logger.debug { "symdb: upload failed: #{response.error.class}: #{response.error}" } # steep:ignore NoMethod
|
|
210
|
+
return false
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
case response.code
|
|
214
|
+
when 200..299
|
|
215
|
+
@logger.debug { "symdb: uploaded #{scope_count} scopes successfully" }
|
|
216
|
+
true
|
|
217
|
+
when 429
|
|
218
|
+
@logger.debug { "symdb: upload rejected: rate limited (429)" }
|
|
219
|
+
false
|
|
220
|
+
when 500..599
|
|
221
|
+
@logger.debug { "symdb: upload rejected: server error (#{response.code})" }
|
|
222
|
+
false
|
|
223
|
+
else
|
|
224
|
+
@logger.debug { "symdb: upload rejected: #{response.code}" }
|
|
225
|
+
false
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ruby_version'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Namespace for Datadog symbol database upload.
|
|
7
|
+
#
|
|
8
|
+
# @api private
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
# Sentinel value for unknown or unavailable minimum line number.
|
|
11
|
+
#
|
|
12
|
+
# Used for:
|
|
13
|
+
# 1. start_line when exact line cannot be determined (e.g., modules without methods)
|
|
14
|
+
# 2. Symbol line numbers for FIELD, STATIC_FIELD, ARG symbols to indicate
|
|
15
|
+
# the symbol is available throughout the entire enclosing scope
|
|
16
|
+
#
|
|
17
|
+
# Backend behavior: line=0 means symbol completes in every line of the scope
|
|
18
|
+
#
|
|
19
|
+
# Reference: Symbol Database Backend RFC, section "Edge Cases"
|
|
20
|
+
# - "We use 0 for FIELD, STATIC_FIELD and ARG. It means that the symbol
|
|
21
|
+
# will be completed in every line of the enclosing scope (CLASS or METHOD)."
|
|
22
|
+
#
|
|
23
|
+
# @see https://www.postgresql.org/docs/current/datatype-numeric.html
|
|
24
|
+
UNKNOWN_MIN_LINE = 0
|
|
25
|
+
|
|
26
|
+
# Sentinel value for unknown or unavailable maximum line number.
|
|
27
|
+
#
|
|
28
|
+
# Used for:
|
|
29
|
+
# 1. end_line when exact boundaries cannot be determined (e.g., modules, classes
|
|
30
|
+
# without methods, fallback when introspection fails)
|
|
31
|
+
# 2. LOCAL symbol line numbers when exact line is unknown (future feature)
|
|
32
|
+
#
|
|
33
|
+
# Value: 2147483647 (PostgreSQL signed INT_MAX, 2^31 - 1)
|
|
34
|
+
#
|
|
35
|
+
# Backend behavior:
|
|
36
|
+
# - For scopes: indicates "entire file" or "unknown end"
|
|
37
|
+
# - For LOCAL symbols (future): included in method probe completions but excluded
|
|
38
|
+
# from line probe completions
|
|
39
|
+
#
|
|
40
|
+
# Protocol specification:
|
|
41
|
+
# - "If the symbols of the scope should be available to all lines in the
|
|
42
|
+
# source_file of the scope, use start_line = 0 and end_line = 2147483647
|
|
43
|
+
# (maximum signed integer, postgres int max)."
|
|
44
|
+
# - "For LOCAL symbols, we use 2147483647 (signed int max) to avoid completing
|
|
45
|
+
# the symbol for line probes, but keep it in the method for method probe completions."
|
|
46
|
+
#
|
|
47
|
+
# Reference: Symbol Database Backend RFC, section "Scope" and "Edge Cases"
|
|
48
|
+
# @see https://www.postgresql.org/docs/current/datatype-numeric.html
|
|
49
|
+
UNKNOWN_MAX_LINE = 2147483647
|
|
50
|
+
|
|
51
|
+
# Collapses the symbol_database.enabled tri-state setting to a boolean.
|
|
52
|
+
# An explicit true/false wins; nil (unconfigured) yields the caller-supplied
|
|
53
|
+
# fallback.
|
|
54
|
+
# @param setting_value [Boolean, nil] the symbol_database.enabled setting
|
|
55
|
+
# @param di_fallback [Boolean] value used when the setting is unconfigured
|
|
56
|
+
# @return [Boolean]
|
|
57
|
+
def self.resolve_enabled(setting_value, di_fallback)
|
|
58
|
+
setting_value.nil? ? di_fallback : setting_value
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Whether the current Ruby runtime can run symbol database extraction:
|
|
62
|
+
# MRI (CRuby) on Ruby 2.7 or later. Used by the remote-config layer to avoid
|
|
63
|
+
# advertising the product on runtimes where Component.build would return nil
|
|
64
|
+
# (e.g. Ruby 2.6, which Dynamic Instrumentation supports but Symbol Database
|
|
65
|
+
# does not).
|
|
66
|
+
# @return [Boolean]
|
|
67
|
+
def self.supported_runtime?
|
|
68
|
+
RUBY_ENGINE == 'ruby' && RubyVersion.is?('>= 2.7')
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -56,7 +56,7 @@ module Datadog
|
|
|
56
56
|
@buffer_spans += trace.length
|
|
57
57
|
rescue => e
|
|
58
58
|
Datadog.logger.debug(
|
|
59
|
-
"Failed to measure queue accept. Cause: #{e.class
|
|
59
|
+
"Failed to measure queue accept. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
60
60
|
)
|
|
61
61
|
end
|
|
62
62
|
|
|
@@ -66,7 +66,7 @@ module Datadog
|
|
|
66
66
|
@buffer_spans -= trace.length
|
|
67
67
|
rescue => e
|
|
68
68
|
Datadog.logger.debug(
|
|
69
|
-
"Failed to measure queue drop. Cause: #{e.class
|
|
69
|
+
"Failed to measure queue drop. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
70
70
|
)
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -91,7 +91,7 @@ module Datadog
|
|
|
91
91
|
@buffer_spans = 0
|
|
92
92
|
rescue => e
|
|
93
93
|
Datadog.logger.debug(
|
|
94
|
-
"Failed to measure queue. Cause: #{e.class
|
|
94
|
+
"Failed to measure queue. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
95
95
|
)
|
|
96
96
|
end
|
|
97
97
|
end
|
|
@@ -12,16 +12,7 @@ module Datadog
|
|
|
12
12
|
module Tracing
|
|
13
13
|
# Tracing component
|
|
14
14
|
module Component
|
|
15
|
-
|
|
16
|
-
module InstanceMethods
|
|
17
|
-
# Hot-swaps with a new sampler.
|
|
18
|
-
# This operation acquires the Components lock to ensure
|
|
19
|
-
# there is no concurrent modification of the sampler.
|
|
20
|
-
def reconfigure_live_sampler
|
|
21
|
-
sampler = self.class.build_sampler(Datadog.configuration)
|
|
22
|
-
Datadog.send(:safely_synchronize) { tracer.sampler.sampler = sampler }
|
|
23
|
-
end
|
|
24
|
-
end
|
|
15
|
+
module_function
|
|
25
16
|
|
|
26
17
|
def build_tracer(settings, agent_settings, logger:)
|
|
27
18
|
# If a custom tracer has been provided, use it instead.
|
|
@@ -156,11 +147,6 @@ module Datadog
|
|
|
156
147
|
Tracing::Sampling::Span::Sampler.new(rules || [])
|
|
157
148
|
end
|
|
158
149
|
|
|
159
|
-
# Configure non-privileged components.
|
|
160
|
-
def configure_tracing(settings)
|
|
161
|
-
Datadog::Tracing::Contrib::Component.configure(settings)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
150
|
# Sampler wrapper component, to allow for hot-swapping
|
|
165
151
|
# the sampler instance used by the tracer.
|
|
166
152
|
# Swapping samplers happens during Dynamic Configuration.
|
|
@@ -175,6 +161,17 @@ module Datadog
|
|
|
175
161
|
@sampler.sample!(trace)
|
|
176
162
|
end
|
|
177
163
|
|
|
164
|
+
def reconsider_sample_resource!(trace)
|
|
165
|
+
return unless @sampler.respond_to?(:reconsider_sample_resource!)
|
|
166
|
+
|
|
167
|
+
@sampler.reconsider_sample_resource!(trace)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def resource_sampling?
|
|
171
|
+
@sampler.respond_to?(:resource_sampling?) &&
|
|
172
|
+
@sampler.resource_sampling?
|
|
173
|
+
end
|
|
174
|
+
|
|
178
175
|
def update(*args, **kwargs)
|
|
179
176
|
return unless @sampler.respond_to?(:update)
|
|
180
177
|
|
|
@@ -182,8 +179,7 @@ module Datadog
|
|
|
182
179
|
end
|
|
183
180
|
end
|
|
184
181
|
|
|
185
|
-
private
|
|
186
|
-
|
|
182
|
+
# @api private
|
|
187
183
|
def build_tracer_tags(settings)
|
|
188
184
|
settings.tags.dup.tap do |tags|
|
|
189
185
|
tags[Core::Environment::Ext::TAG_ENV] = settings.env unless settings.env.nil?
|
|
@@ -193,6 +189,7 @@ module Datadog
|
|
|
193
189
|
|
|
194
190
|
# Build a post-sampler that limits the rate of traces to one per `seconds`.
|
|
195
191
|
# E.g.: `build_rate_limit_post_sampler(seconds: 60)` will limit the rate to one trace per minute.
|
|
192
|
+
# @api private
|
|
196
193
|
def build_rate_limit_post_sampler(seconds:)
|
|
197
194
|
Tracing::Sampling::RuleSampler.new(
|
|
198
195
|
rate_limiter: Datadog::Core::TokenBucket.new(1.0 / seconds, 1.0),
|
|
@@ -200,11 +197,13 @@ module Datadog
|
|
|
200
197
|
)
|
|
201
198
|
end
|
|
202
199
|
|
|
200
|
+
# @api private
|
|
203
201
|
def build_test_mode_trace_flush(settings)
|
|
204
202
|
# If context flush behavior is provided, use it instead.
|
|
205
203
|
settings.tracing.test_mode.trace_flush || build_trace_flush(settings)
|
|
206
204
|
end
|
|
207
205
|
|
|
206
|
+
# @api private
|
|
208
207
|
def build_test_mode_sampler
|
|
209
208
|
# Do not sample any spans for tests; all must be preserved.
|
|
210
209
|
# Set priority sampler to ensure the agent doesn't drop any traces.
|
|
@@ -214,6 +213,7 @@ module Datadog
|
|
|
214
213
|
)
|
|
215
214
|
end
|
|
216
215
|
|
|
216
|
+
# @api private
|
|
217
217
|
def build_test_mode_writer(settings, agent_settings)
|
|
218
218
|
writer_options = settings.tracing.test_mode.writer_options || {}
|
|
219
219
|
|