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
|
@@ -42,6 +42,14 @@ module Datadog
|
|
|
42
42
|
#
|
|
43
43
|
# @api private
|
|
44
44
|
class Serializer
|
|
45
|
+
# Exception classes that should never be caught during serialization.
|
|
46
|
+
# These represent fatal conditions (signals, interrupts, system exit)
|
|
47
|
+
# that must propagate to the caller. NoMemoryError is deliberately
|
|
48
|
+
# excluded (unlike DI::FATAL_EXCEPTION_CLASSES): serialization of large
|
|
49
|
+
# or deeply recursive objects can exhaust memory, and the serializer must
|
|
50
|
+
# return a safe stub rather than tear the process down.
|
|
51
|
+
SERIALIZABLE_FATAL_EXCEPTION_CLASSES = [SystemExit, SignalException].freeze
|
|
52
|
+
|
|
45
53
|
# Third-party library integration / custom serializers.
|
|
46
54
|
#
|
|
47
55
|
# Dynamic instrumentation has limited payload sizes, and for efficiency
|
|
@@ -64,6 +72,25 @@ module Datadog
|
|
|
64
72
|
# a common base class but are all of different classes) or for Mongoid
|
|
65
73
|
# models (that do not have a common base class at all but include a
|
|
66
74
|
# standard Mongoid module).
|
|
75
|
+
#
|
|
76
|
+
# Important: these serializers are NOT used in log messages.
|
|
77
|
+
# They are only used for variables that are captured in the snapshots.
|
|
78
|
+
#
|
|
79
|
+
# Exception handling: If a custom serializer's condition lambda raises
|
|
80
|
+
# an exception (e.g., regex match against invalid UTF-8 strings), the
|
|
81
|
+
# exception will be logged at WARN level, then the serializer will be
|
|
82
|
+
# skipped and the next serializer will be tried. This prevents custom
|
|
83
|
+
# serializers from breaking the entire serialization process.
|
|
84
|
+
#
|
|
85
|
+
# IMPORTANT: Custom serializers MUST produce data that can be JSON-encoded.
|
|
86
|
+
# Specifically, custom serializers MUST NOT produce strings with binary
|
|
87
|
+
# encoding (ASCII-8BIT) containing non-ASCII code points (bytes >= 0x80)
|
|
88
|
+
# that cannot be automatically transcoded to UTF-8. Such strings will
|
|
89
|
+
# cause JSON encoding to fail, which will result in the probe being
|
|
90
|
+
# disabled and an ERROR status being reported. If your data contains
|
|
91
|
+
# binary content, encode it to a text representation (e.g., Base64,
|
|
92
|
+
# hex string, or UTF-8 with replacement characters) before returning
|
|
93
|
+
# it from the custom serializer.
|
|
67
94
|
@@flat_registry = []
|
|
68
95
|
def self.register(condition: nil, &block)
|
|
69
96
|
@@flat_registry << {condition: condition, proc: block}
|
|
@@ -79,6 +106,18 @@ module Datadog
|
|
|
79
106
|
attr_reader :redactor
|
|
80
107
|
attr_reader :telemetry
|
|
81
108
|
|
|
109
|
+
def combine_args(args, kwargs, target_self)
|
|
110
|
+
counter = 0
|
|
111
|
+
combined = args.each_with_object({}) do |value, c|
|
|
112
|
+
counter += 1
|
|
113
|
+
# Conversion to symbol is needed here to put args ahead of
|
|
114
|
+
# kwargs when they are merged below.
|
|
115
|
+
c[:"arg#{counter}"] = value
|
|
116
|
+
end.update(kwargs)
|
|
117
|
+
combined[:self] = target_self
|
|
118
|
+
combined
|
|
119
|
+
end
|
|
120
|
+
|
|
82
121
|
# Serializes positional and keyword arguments to a method,
|
|
83
122
|
# as obtained by a method probe.
|
|
84
123
|
#
|
|
@@ -92,15 +131,12 @@ module Datadog
|
|
|
92
131
|
# in upstream code.
|
|
93
132
|
def serialize_args(args, kwargs, target_self,
|
|
94
133
|
depth: settings.dynamic_instrumentation.max_capture_depth,
|
|
95
|
-
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
c[:"arg#{counter}"] = value
|
|
102
|
-
end.update(kwargs).update(self: target_self)
|
|
103
|
-
serialize_vars(combined, depth: depth, attribute_count: attribute_count)
|
|
134
|
+
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count,
|
|
135
|
+
length: nil,
|
|
136
|
+
collection_size: nil)
|
|
137
|
+
combined = combine_args(args, kwargs, target_self)
|
|
138
|
+
serialize_vars(combined, depth: depth, attribute_count: attribute_count,
|
|
139
|
+
length: length, collection_size: collection_size)
|
|
104
140
|
end
|
|
105
141
|
|
|
106
142
|
# Serializes variables captured by a line probe.
|
|
@@ -109,9 +145,12 @@ module Datadog
|
|
|
109
145
|
# of executed code.
|
|
110
146
|
def serialize_vars(vars,
|
|
111
147
|
depth: settings.dynamic_instrumentation.max_capture_depth,
|
|
112
|
-
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count
|
|
148
|
+
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count,
|
|
149
|
+
length: nil,
|
|
150
|
+
collection_size: nil)
|
|
113
151
|
vars.each_with_object({}) do |(k, v), agg|
|
|
114
|
-
agg[k] = serialize_value(v, name: k, depth: depth, attribute_count: attribute_count
|
|
152
|
+
agg[k] = serialize_value(v, name: k, depth: depth, attribute_count: attribute_count,
|
|
153
|
+
length: length, collection_size: collection_size)
|
|
115
154
|
end
|
|
116
155
|
end
|
|
117
156
|
|
|
@@ -130,6 +169,8 @@ module Datadog
|
|
|
130
169
|
def serialize_value(value, name: nil,
|
|
131
170
|
depth: settings.dynamic_instrumentation.max_capture_depth,
|
|
132
171
|
attribute_count: nil,
|
|
172
|
+
length: nil,
|
|
173
|
+
collection_size: nil,
|
|
133
174
|
type: nil)
|
|
134
175
|
attribute_count ||= settings.dynamic_instrumentation.max_capture_attribute_count
|
|
135
176
|
cls = type || value.class
|
|
@@ -143,13 +184,36 @@ module Datadog
|
|
|
143
184
|
end
|
|
144
185
|
|
|
145
186
|
@@flat_registry.each do |entry|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
187
|
+
condition = entry[:condition]
|
|
188
|
+
if condition
|
|
189
|
+
begin
|
|
190
|
+
condition_result = condition.call(value)
|
|
191
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
192
|
+
raise if SERIALIZABLE_FATAL_EXCEPTION_CLASSES.any? { |klass| e.is_a?(klass) }
|
|
193
|
+
|
|
194
|
+
# If a custom serializer condition raises an exception (e.g., regex match
|
|
195
|
+
# against invalid UTF-8), skip it and continue with the next serializer.
|
|
196
|
+
# We don't want custom serializer conditions to break the entire serialization.
|
|
197
|
+
#
|
|
198
|
+
# Custom serializers may be defined by customers (in which case we should
|
|
199
|
+
# surface errors so they can fix their serializers) or they may be defined
|
|
200
|
+
# internally by dd-trace-rb (in which case we need to fix them). We use
|
|
201
|
+
# WARN level to surface these errors in either case.
|
|
202
|
+
Datadog.logger.warn("DI: Custom serializer condition failed: #{e.class}: #{e.message}")
|
|
203
|
+
telemetry&.report(e, description: "Custom serializer condition failed")
|
|
204
|
+
next
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
if condition_result
|
|
208
|
+
serializer_proc = entry.fetch(:proc)
|
|
209
|
+
return serializer_proc.call(self, value, name: nil, depth: depth)
|
|
210
|
+
end
|
|
149
211
|
end
|
|
150
212
|
end
|
|
151
213
|
|
|
152
214
|
serialized = {type: class_name(cls)}
|
|
215
|
+
# https://github.com/soutaro/steep/issues/1860
|
|
216
|
+
# @type var serialized: untyped
|
|
153
217
|
case value
|
|
154
218
|
when NilClass
|
|
155
219
|
serialized.update(isNull: true)
|
|
@@ -173,19 +237,43 @@ module Datadog
|
|
|
173
237
|
else
|
|
174
238
|
value.to_s
|
|
175
239
|
end
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
240
|
+
|
|
241
|
+
# Handle binary strings and invalid UTF-8 by escaping to JSON-safe format.
|
|
242
|
+
# See escape_binary_string for details on the escaping format.
|
|
243
|
+
#
|
|
244
|
+
# Truncate binary data BEFORE escaping to avoid cutting mid-escape-sequence.
|
|
245
|
+
# For regular strings, the limit is applied to string length in characters.
|
|
246
|
+
length ||= settings.dynamic_instrumentation.max_capture_string_length
|
|
247
|
+
max = length
|
|
248
|
+
|
|
249
|
+
if value.encoding == Encoding::BINARY || !value.valid_encoding?
|
|
250
|
+
# Truncate binary data BEFORE escaping to avoid cutting mid-escape-sequence
|
|
251
|
+
# For invalid encodings, use bytesize instead of length to avoid encoding errors
|
|
252
|
+
original_size = value.bytesize
|
|
253
|
+
if original_size > max
|
|
254
|
+
serialized.update(truncated: true, size: original_size)
|
|
255
|
+
value = value.byteslice(0...max)
|
|
256
|
+
end
|
|
257
|
+
value = escape_binary_string(value) # steep:ignore ArgumentTypeMismatch
|
|
258
|
+
false # Already converted to a new string
|
|
259
|
+
else
|
|
260
|
+
# Truncate non-binary strings
|
|
261
|
+
if value.length > max
|
|
262
|
+
serialized.update(truncated: true, size: value.length)
|
|
263
|
+
value = value[0...max]
|
|
264
|
+
need_dup = false
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
value = value.dup if need_dup
|
|
181
268
|
end
|
|
182
|
-
|
|
269
|
+
|
|
183
270
|
serialized.update(value: value)
|
|
184
271
|
when Array
|
|
185
|
-
if depth
|
|
272
|
+
if depth <= 0
|
|
186
273
|
serialized.update(notCapturedReason: "depth")
|
|
187
274
|
else
|
|
188
|
-
|
|
275
|
+
collection_size ||= settings.dynamic_instrumentation.max_capture_collection_size
|
|
276
|
+
max = collection_size
|
|
189
277
|
if max != 0 && value.length > max
|
|
190
278
|
serialized.update(notCapturedReason: "collectionSize", size: value.length)
|
|
191
279
|
# same steep failure with array slices.
|
|
@@ -193,15 +281,16 @@ module Datadog
|
|
|
193
281
|
value = value[0...max] || []
|
|
194
282
|
end
|
|
195
283
|
entries = value.map do |elt|
|
|
196
|
-
serialize_value(elt, depth: depth - 1)
|
|
284
|
+
serialize_value(elt, depth: depth - 1, length: length, collection_size: collection_size, attribute_count: attribute_count)
|
|
197
285
|
end
|
|
198
286
|
serialized.update(elements: entries)
|
|
199
287
|
end
|
|
200
288
|
when Hash
|
|
201
|
-
if depth
|
|
289
|
+
if depth <= 0
|
|
202
290
|
serialized.update(notCapturedReason: "depth")
|
|
203
291
|
else
|
|
204
|
-
|
|
292
|
+
collection_size ||= settings.dynamic_instrumentation.max_capture_collection_size
|
|
293
|
+
max = collection_size
|
|
205
294
|
cur = 0
|
|
206
295
|
entries = []
|
|
207
296
|
value.each do |k, v|
|
|
@@ -210,12 +299,13 @@ module Datadog
|
|
|
210
299
|
break
|
|
211
300
|
end
|
|
212
301
|
cur += 1
|
|
213
|
-
entries << [serialize_value(k, depth: depth - 1
|
|
302
|
+
entries << [serialize_value(k, depth: depth - 1, length: length, collection_size: collection_size, attribute_count: attribute_count),
|
|
303
|
+
serialize_value(v, name: k, depth: depth - 1, length: length, collection_size: collection_size, attribute_count: attribute_count)]
|
|
214
304
|
end
|
|
215
305
|
serialized.update(entries: entries)
|
|
216
306
|
end
|
|
217
307
|
else
|
|
218
|
-
if depth
|
|
308
|
+
if depth <= 0
|
|
219
309
|
serialized.update(notCapturedReason: "depth")
|
|
220
310
|
else
|
|
221
311
|
fields = {}
|
|
@@ -249,20 +339,143 @@ module Datadog
|
|
|
249
339
|
break
|
|
250
340
|
end
|
|
251
341
|
cur += 1
|
|
252
|
-
fields[ivar] = serialize_value(value.instance_variable_get(ivar), name: ivar, depth: depth - 1)
|
|
342
|
+
fields[ivar] = serialize_value(value.instance_variable_get(ivar), name: ivar, depth: depth - 1, length: length, collection_size: collection_size, attribute_count: attribute_count)
|
|
253
343
|
end
|
|
254
344
|
serialized.update(fields: fields)
|
|
255
345
|
end
|
|
256
346
|
end
|
|
257
347
|
serialized
|
|
258
|
-
rescue => exc
|
|
348
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
349
|
+
# Re-raise fatal exceptions that should not be caught
|
|
350
|
+
# (signals, interrupts, system exit)
|
|
351
|
+
raise if SERIALIZABLE_FATAL_EXCEPTION_CLASSES.any? { |klass| exc.is_a?(klass) }
|
|
352
|
+
|
|
353
|
+
# Catch all other exceptions including SystemStackError and NoMemoryError.
|
|
354
|
+
# These inherit from Exception (not StandardError) but can occur during
|
|
355
|
+
# serialization (e.g., infinite recursion in custom serializers, memory
|
|
356
|
+
# exhaustion from large objects) and should return a safe structure
|
|
357
|
+
# rather than propagating to the transport layer.
|
|
259
358
|
telemetry&.report(exc, description: "Error serializing")
|
|
260
359
|
{type: class_name(cls), notSerializedReason: exc.to_s}
|
|
261
360
|
end
|
|
262
361
|
end
|
|
263
362
|
|
|
363
|
+
# This method is used for serializing arbitrary values into log messages.
|
|
364
|
+
# Because the output is meant to be human-readable, we cannot use
|
|
365
|
+
# the "normal" serialization format which is meant to be machine-readable.
|
|
366
|
+
# Serialize objects with depth of 1 and include the class name.
|
|
367
|
+
#
|
|
368
|
+
# Note that this method does not (currently) utilize the custom
|
|
369
|
+
# serializers that the "normal" serialization logic uses.
|
|
370
|
+
#
|
|
371
|
+
# This serializer differs from the RFC in two ways:
|
|
372
|
+
# 1. We omit the middle of long strings rather than the end,
|
|
373
|
+
# and also the inner entries in arrays/hashes/objects.
|
|
374
|
+
# 2. We use Ruby-ish syntax for hashes and objects.
|
|
375
|
+
#
|
|
376
|
+
# We also use the Ruby-like syntax for symbols, which don't exist
|
|
377
|
+
# in other languages.
|
|
378
|
+
def serialize_value_for_message(value, depth = 1)
|
|
379
|
+
# This method is more verbose than "normal" Ruby code to avoid
|
|
380
|
+
# array allocations.
|
|
381
|
+
case value
|
|
382
|
+
when NilClass
|
|
383
|
+
'nil'
|
|
384
|
+
when Integer, Float, TrueClass, FalseClass, Time, Date
|
|
385
|
+
value.to_s
|
|
386
|
+
when String
|
|
387
|
+
serialize_string_or_symbol_for_message(value)
|
|
388
|
+
when Symbol
|
|
389
|
+
':' + serialize_string_or_symbol_for_message(value) # steep:ignore ArgumentTypeMismatch
|
|
390
|
+
when Array
|
|
391
|
+
return '...' if depth <= 0
|
|
392
|
+
|
|
393
|
+
max = max_capture_collection_size_for_message
|
|
394
|
+
if value.length > max
|
|
395
|
+
value_ = value[0...max - 1] || []
|
|
396
|
+
value_ << '...'
|
|
397
|
+
value_ << value[-1]
|
|
398
|
+
value = value_
|
|
399
|
+
end
|
|
400
|
+
'[' + value.map do |item|
|
|
401
|
+
serialize_value_for_message(item, depth - 1)
|
|
402
|
+
end.join(', ') + ']'
|
|
403
|
+
when Hash
|
|
404
|
+
return '...' if depth <= 0
|
|
405
|
+
|
|
406
|
+
max = max_capture_collection_size_for_message
|
|
407
|
+
keys = value.keys
|
|
408
|
+
truncated = false
|
|
409
|
+
if value.length > max
|
|
410
|
+
keys_ = keys[0...max - 1] || []
|
|
411
|
+
keys_ << keys[-1]
|
|
412
|
+
keys = keys_
|
|
413
|
+
truncated = true
|
|
414
|
+
end
|
|
415
|
+
serialized = keys.map do |key|
|
|
416
|
+
"#{serialize_value_for_message(key, depth - 1)} => #{serialize_value_for_message(value[key], depth - 1)}"
|
|
417
|
+
end
|
|
418
|
+
if truncated
|
|
419
|
+
serialized[serialized.length] = serialized[serialized.length - 1]
|
|
420
|
+
serialized[serialized.length - 2] = '...'
|
|
421
|
+
end
|
|
422
|
+
"{#{serialized.join(", ")}}"
|
|
423
|
+
else
|
|
424
|
+
return '...' if depth <= 0
|
|
425
|
+
|
|
426
|
+
vars = value.instance_variables
|
|
427
|
+
truncated = false
|
|
428
|
+
max = max_capture_attribute_count_for_message
|
|
429
|
+
if vars.length > max
|
|
430
|
+
vars_ = vars[0...max - 1] || []
|
|
431
|
+
vars_ << vars[-1]
|
|
432
|
+
truncated = true
|
|
433
|
+
vars = vars_
|
|
434
|
+
end
|
|
435
|
+
serialized = vars.map do |var|
|
|
436
|
+
# +var+ here is always the instance variable name which is a
|
|
437
|
+
# symbol, we do not need to run it through our serializer.
|
|
438
|
+
"#{var}=#{serialize_value_for_message(value.send(:instance_variable_get, var), depth - 1)}"
|
|
439
|
+
end
|
|
440
|
+
if truncated
|
|
441
|
+
serialized << serialized.last
|
|
442
|
+
serialized[-2] = '...'
|
|
443
|
+
end
|
|
444
|
+
serialized = if serialized.any?
|
|
445
|
+
' ' + serialized.join(' ')
|
|
446
|
+
end
|
|
447
|
+
"#<#{class_name(value.class)}#{serialized}>"
|
|
448
|
+
end
|
|
449
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
450
|
+
raise if SERIALIZABLE_FATAL_EXCEPTION_CLASSES.any? { |klass| exc.is_a?(klass) }
|
|
451
|
+
|
|
452
|
+
telemetry&.report(exc, description: "Error serializing for message")
|
|
453
|
+
# TODO class_name(foo) can also fail, which we don't handle here.
|
|
454
|
+
# Telemetry reporting could potentially also fail?
|
|
455
|
+
"#<#{class_name(value.class)}: serialization error>"
|
|
456
|
+
end
|
|
457
|
+
|
|
264
458
|
private
|
|
265
459
|
|
|
460
|
+
MAX_MESSAGE_COLLECTION_SIZE = 3
|
|
461
|
+
MAX_MESSAGE_ATTRIBUTE_COUNT = 5
|
|
462
|
+
|
|
463
|
+
def max_capture_collection_size_for_message
|
|
464
|
+
max = settings.dynamic_instrumentation.max_capture_collection_size
|
|
465
|
+
if max > MAX_MESSAGE_COLLECTION_SIZE
|
|
466
|
+
max = MAX_MESSAGE_COLLECTION_SIZE
|
|
467
|
+
end
|
|
468
|
+
max
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def max_capture_attribute_count_for_message
|
|
472
|
+
max = settings.dynamic_instrumentation.max_capture_attribute_count
|
|
473
|
+
if max > MAX_MESSAGE_ATTRIBUTE_COUNT
|
|
474
|
+
max = MAX_MESSAGE_ATTRIBUTE_COUNT
|
|
475
|
+
end
|
|
476
|
+
max
|
|
477
|
+
end
|
|
478
|
+
|
|
266
479
|
# Returns the name for the specified class object.
|
|
267
480
|
#
|
|
268
481
|
# Ruby can have nameless classes, e.g. Class.new is a class object
|
|
@@ -273,6 +486,74 @@ module Datadog
|
|
|
273
486
|
# and we don't want to invoke user code.
|
|
274
487
|
cls.name || "[Unnamed class]"
|
|
275
488
|
end
|
|
489
|
+
|
|
490
|
+
def serialize_string_or_symbol_for_message(value)
|
|
491
|
+
max = settings.dynamic_instrumentation.max_capture_string_length
|
|
492
|
+
if max > 100
|
|
493
|
+
max = 100
|
|
494
|
+
end
|
|
495
|
+
value = value.to_s
|
|
496
|
+
if (length = value.length) > max
|
|
497
|
+
if max < 5
|
|
498
|
+
value[0...max]
|
|
499
|
+
else
|
|
500
|
+
upper = length - max / 2 + 1
|
|
501
|
+
if max % 2 == 0
|
|
502
|
+
upper += 1
|
|
503
|
+
end
|
|
504
|
+
value[0...max / 2 - 1] + '...' + value[upper...length] # steep:ignore NoMethod
|
|
505
|
+
end
|
|
506
|
+
else
|
|
507
|
+
value
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
# Escapes a binary string or invalid UTF-8 string to a JSON-safe format.
|
|
512
|
+
#
|
|
513
|
+
# IMPORTANT: This method should ONLY be called with either:
|
|
514
|
+
# 1. True binary strings (encoding == Encoding::BINARY / ASCII-8BIT)
|
|
515
|
+
# 2. Strings with invalid encoding (!value.valid_encoding?)
|
|
516
|
+
#
|
|
517
|
+
# Calling this method with valid UTF-8 strings will produce incorrect output.
|
|
518
|
+
#
|
|
519
|
+
# Binary data (ASCII-8BIT encoding) or strings with invalid encoding are
|
|
520
|
+
# converted to an escaped string in the format: b'...' with hex escapes
|
|
521
|
+
# for non-printable bytes.
|
|
522
|
+
#
|
|
523
|
+
# The output format matches other Datadog tracer libraries for consistency
|
|
524
|
+
# across language implementations. The output is JSON-serializable.
|
|
525
|
+
#
|
|
526
|
+
# Examples:
|
|
527
|
+
# "Hello".b -> "b'Hello'"
|
|
528
|
+
# "\x80\xFF".b -> "b'\\x80\\xff'"
|
|
529
|
+
# "\x80".force_encoding('UTF-8') -> "b'\\x80'" (invalid UTF-8)
|
|
530
|
+
#
|
|
531
|
+
# @param binary_string [String] A string with ASCII-8BIT encoding or invalid encoding
|
|
532
|
+
# @return [String] Escaped string with UTF-8 encoding
|
|
533
|
+
def escape_binary_string(binary_string)
|
|
534
|
+
result = +"b'"
|
|
535
|
+
binary_string.each_byte do |byte|
|
|
536
|
+
result << case byte
|
|
537
|
+
when 0x09 # \t
|
|
538
|
+
'\\t'
|
|
539
|
+
when 0x0A # \n
|
|
540
|
+
'\\n'
|
|
541
|
+
when 0x0D # \r
|
|
542
|
+
'\\r'
|
|
543
|
+
when 0x27 # '
|
|
544
|
+
"\\'"
|
|
545
|
+
when 0x5C # \
|
|
546
|
+
'\\\\'
|
|
547
|
+
when 0x20..0x7E # Printable ASCII (space through ~)
|
|
548
|
+
byte.chr
|
|
549
|
+
else
|
|
550
|
+
# Non-printable: use \xHH format
|
|
551
|
+
format('\\x%02x', byte)
|
|
552
|
+
end
|
|
553
|
+
end
|
|
554
|
+
result << "'"
|
|
555
|
+
result
|
|
556
|
+
end
|
|
276
557
|
end
|
|
277
558
|
end
|
|
278
559
|
end
|
|
@@ -1,59 +1,29 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
3
5
|
require_relative '../../core/transport/parcel'
|
|
4
|
-
require_relative '
|
|
6
|
+
require_relative '../../core/transport/request'
|
|
7
|
+
require_relative '../../core/transport/transport'
|
|
8
|
+
require_relative 'http/diagnostics'
|
|
5
9
|
|
|
6
10
|
module Datadog
|
|
7
11
|
module DI
|
|
8
12
|
module Transport
|
|
9
13
|
module Diagnostics
|
|
10
|
-
class EncodedParcel
|
|
11
|
-
include Datadog::Core::Transport::Parcel
|
|
12
|
-
end
|
|
13
|
-
|
|
14
14
|
class Request < Datadog::Core::Transport::Request
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
class Transport
|
|
18
|
-
attr_reader :client, :apis, :default_api, :current_api_id, :logger
|
|
19
|
-
|
|
20
|
-
def initialize(apis, default_api, logger:)
|
|
21
|
-
@apis = apis
|
|
22
|
-
@logger = logger
|
|
23
|
-
|
|
24
|
-
@client = HTTP::Client.new(current_api, logger: logger)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def current_api
|
|
28
|
-
@apis[HTTP::API::DIAGNOSTICS]
|
|
29
|
-
end
|
|
30
|
-
|
|
17
|
+
class Transport < Core::Transport::Transport
|
|
31
18
|
def send_diagnostics(payload)
|
|
32
|
-
|
|
33
|
-
parcel =
|
|
19
|
+
encoder = Core::Encoding::JSONEncoder
|
|
20
|
+
parcel = Core::Transport::Parcel.new(
|
|
21
|
+
encoder.encode(payload),
|
|
22
|
+
content_type: encoder.content_type,
|
|
23
|
+
)
|
|
34
24
|
request = Request.new(parcel)
|
|
35
25
|
|
|
36
|
-
|
|
37
|
-
unless response.ok?
|
|
38
|
-
# TODO Datadog::Core::Transport::InternalErrorResponse
|
|
39
|
-
# does not have +code+ method, what is the actual API of
|
|
40
|
-
# these response objects?
|
|
41
|
-
raise Error::AgentCommunicationError, "send_diagnostics failed: #{begin
|
|
42
|
-
response.code
|
|
43
|
-
rescue
|
|
44
|
-
"???"
|
|
45
|
-
end}: #{response.payload}"
|
|
46
|
-
end
|
|
47
|
-
rescue Error::AgentCommunicationError
|
|
48
|
-
raise
|
|
49
|
-
# Datadog::Core::Transport does not perform any exception mapping,
|
|
50
|
-
# therefore we could have any exception here from failure to parse
|
|
51
|
-
# agent URI for example.
|
|
52
|
-
# If we ever implement retries for network errors, we should distinguish
|
|
53
|
-
# actual network errors from non-network errors that are raised by
|
|
54
|
-
# transport code.
|
|
55
|
-
rescue => exc
|
|
56
|
-
raise Error::AgentCommunicationError, "send_diagnostics failed: #{exc.class}: #{exc}"
|
|
26
|
+
client.send_request(:diagnostics, request)
|
|
57
27
|
end
|
|
58
28
|
end
|
|
59
29
|
end
|
|
@@ -1,43 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '../../../core/transport/http/api/
|
|
4
|
-
require_relative '../../../core/transport/http/api/spec'
|
|
5
|
-
require_relative 'client'
|
|
3
|
+
require_relative '../../../core/transport/http/api/endpoint'
|
|
6
4
|
|
|
7
5
|
module Datadog
|
|
8
6
|
module DI
|
|
9
7
|
module Transport
|
|
10
8
|
module HTTP
|
|
11
9
|
module Diagnostics
|
|
12
|
-
module Client
|
|
13
|
-
def send_diagnostics_payload(request)
|
|
14
|
-
send_request(request) do |api, env|
|
|
15
|
-
api.send_diagnostics(env)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
10
|
module API
|
|
21
|
-
class Instance < Core::Transport::HTTP::API::Instance
|
|
22
|
-
def send_diagnostics(env)
|
|
23
|
-
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('diagnostics', self) unless spec.is_a?(Diagnostics::API::Spec)
|
|
24
|
-
|
|
25
|
-
spec.send_diagnostics(env) do |request_env|
|
|
26
|
-
call(request_env)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
class Spec < Core::Transport::HTTP::API::Spec
|
|
32
|
-
attr_accessor :diagnostics
|
|
33
|
-
|
|
34
|
-
def send_diagnostics(env, &block)
|
|
35
|
-
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('diagnostics', self) if diagnostics.nil?
|
|
36
|
-
|
|
37
|
-
diagnostics.call(env, &block)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
11
|
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
|
42
12
|
attr_reader :encoder
|
|
43
13
|
|
|
@@ -48,7 +18,9 @@ module Datadog
|
|
|
48
18
|
|
|
49
19
|
def call(env, &block)
|
|
50
20
|
event_payload = Core::Vendor::Multipart::Post::UploadIO.new(
|
|
51
|
-
StringIO.new(env.request.parcel.data),
|
|
21
|
+
StringIO.new(env.request.parcel.data),
|
|
22
|
+
env.request.parcel.content_type,
|
|
23
|
+
'event.json',
|
|
52
24
|
)
|
|
53
25
|
env.form = {'event' => event_payload}
|
|
54
26
|
|
|
@@ -57,8 +29,6 @@ module Datadog
|
|
|
57
29
|
end
|
|
58
30
|
end
|
|
59
31
|
end
|
|
60
|
-
|
|
61
|
-
HTTP::Client.include(Diagnostics::Client)
|
|
62
32
|
end
|
|
63
33
|
end
|
|
64
34
|
end
|
|
@@ -1,43 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '../../../core/transport/http/api/
|
|
4
|
-
require_relative '../../../core/transport/http/api/spec'
|
|
5
|
-
require_relative 'client'
|
|
3
|
+
require_relative '../../../core/transport/http/api/endpoint'
|
|
6
4
|
|
|
7
5
|
module Datadog
|
|
8
6
|
module DI
|
|
9
7
|
module Transport
|
|
10
8
|
module HTTP
|
|
11
9
|
module Input
|
|
12
|
-
module Client
|
|
13
|
-
def send_input_payload(request)
|
|
14
|
-
send_request(request) do |api, env|
|
|
15
|
-
api.send_input(env)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
10
|
module API
|
|
21
|
-
class Instance < Core::Transport::HTTP::API::Instance
|
|
22
|
-
def send_input(env)
|
|
23
|
-
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('input', self) unless spec.is_a?(Input::API::Spec)
|
|
24
|
-
|
|
25
|
-
spec.send_input(env) do |request_env|
|
|
26
|
-
call(request_env)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
class Spec < Core::Transport::HTTP::API::Spec
|
|
32
|
-
attr_accessor :input
|
|
33
|
-
|
|
34
|
-
def send_input(env, &block)
|
|
35
|
-
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('input', self) if input.nil?
|
|
36
|
-
|
|
37
|
-
input.call(env, &block)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
11
|
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
|
42
12
|
HEADER_CONTENT_TYPE = 'Content-Type'
|
|
43
13
|
|
|
@@ -51,7 +21,7 @@ module Datadog
|
|
|
51
21
|
|
|
52
22
|
def call(env, &block)
|
|
53
23
|
# Encode body & type
|
|
54
|
-
env.headers[HEADER_CONTENT_TYPE] =
|
|
24
|
+
env.headers[HEADER_CONTENT_TYPE] = env.request.parcel.content_type
|
|
55
25
|
env.body = env.request.parcel.data
|
|
56
26
|
env.query = {
|
|
57
27
|
# DEV: In theory we could serialize the tags here
|
|
@@ -69,8 +39,6 @@ module Datadog
|
|
|
69
39
|
end
|
|
70
40
|
end
|
|
71
41
|
end
|
|
72
|
-
|
|
73
|
-
HTTP::Client.include(Input::Client)
|
|
74
42
|
end
|
|
75
43
|
end
|
|
76
44
|
end
|