datadog 2.21.0 → 2.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +574 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +301 -82
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
- data/ext/datadog_profiling_native_extension/collectors_stack.c +63 -32
- data/ext/datadog_profiling_native_extension/collectors_stack.h +7 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +728 -436
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
- data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +41 -37
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
- data/ext/datadog_profiling_native_extension/heap_recorder.c +252 -103
- data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +3 -22
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +0 -5
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +40 -43
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -0
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +63 -46
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +17 -5
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +110 -85
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
- data/ext/libdatadog_api/crashtracker.c +16 -15
- data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
- data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
- data/ext/libdatadog_api/ddsketch.c +102 -0
- data/ext/libdatadog_api/di.c +203 -0
- data/ext/libdatadog_api/extconf.rb +18 -24
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/helpers.h +27 -0
- data/ext/libdatadog_api/init.c +13 -1
- data/ext/libdatadog_api/library_config.c +34 -25
- data/ext/libdatadog_api/process_discovery.c +19 -13
- data/ext/libdatadog_extconf_helpers.rb +94 -11
- data/lib/datadog/ai_guard/api_client.rb +84 -0
- data/lib/datadog/ai_guard/autoload.rb +10 -0
- data/lib/datadog/ai_guard/component.rb +44 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration.rb +115 -0
- data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
- data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
- data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
- data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
- data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +108 -0
- data/lib/datadog/ai_guard/ext.rb +29 -0
- data/lib/datadog/ai_guard.rb +181 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +66 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +38 -9
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- data/lib/datadog/appsec/assets/blocked.html +10 -1
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
- data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +16 -9
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +51 -13
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -12
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -12
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +52 -13
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +48 -33
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +40 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +26 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +38 -0
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -0
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +43 -13
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +1 -1
- data/lib/datadog/appsec/counter_sampler.rb +25 -0
- data/lib/datadog/appsec/default_header_tags.rb +52 -0
- data/lib/datadog/appsec/event.rb +13 -31
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/metrics/collector.rb +43 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +20 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -1
- data/lib/datadog/appsec/metrics.rb +5 -5
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/remote.rb +44 -29
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
- data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
- data/lib/datadog/appsec/route_normalizer.rb +80 -0
- data/lib/datadog/appsec/security_engine/engine.rb +26 -5
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +20 -10
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/trace_keeper.rb +18 -6
- data/lib/datadog/appsec/utils/http/body.rb +38 -0
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
- data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
- data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
- data/lib/datadog/appsec.rb +6 -3
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +185 -17
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +11 -2
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option.rb +32 -6
- data/lib/datadog/core/configuration/option_definition.rb +42 -14
- data/lib/datadog/core/configuration/options.rb +49 -12
- data/lib/datadog/core/configuration/settings.rb +115 -16
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +379 -300
- data/lib/datadog/core/configuration.rb +3 -3
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +73 -21
- data/lib/datadog/core/crashtracking/tag_builder.rb +6 -0
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/core/environment/agent_info.rb +65 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +13 -0
- data/lib/datadog/core/environment/identity.rb +40 -4
- data/lib/datadog/core/environment/process.rb +122 -0
- data/lib/datadog/core/environment/socket.rb +13 -0
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/knuth_sampler.rb +59 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +6 -6
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery.rb +21 -18
- data/lib/datadog/core/rate_limiter.rb +11 -1
- data/lib/datadog/core/remote/client/capabilities.rb +49 -6
- data/lib/datadog/core/remote/client.rb +15 -7
- data/lib/datadog/core/remote/component.rb +64 -36
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +1 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +9 -36
- data/lib/datadog/core/remote/transport/http/config.rb +15 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +59 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +177 -171
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +2 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +4 -2
- data/lib/datadog/core/telemetry/logging.rb +17 -5
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -5
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
- data/lib/datadog/core/telemetry/worker.rb +108 -32
- data/lib/datadog/core/transport/ext.rb +3 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +10 -6
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/response.rb +4 -0
- data/lib/datadog/core/transport/http.rb +24 -19
- data/lib/datadog/core/transport/parcel.rb +61 -9
- data/lib/datadog/core/transport/response.rb +16 -2
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
- data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
- data/lib/datadog/core/utils/fnv.rb +26 -0
- data/lib/datadog/core/utils/forking.rb +3 -1
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
- data/lib/datadog/core/utils/time.rb +6 -2
- data/lib/datadog/core/utils.rb +3 -1
- data/lib/datadog/core/workers/async.rb +11 -2
- data/lib/datadog/core/workers/interval_loop.rb +51 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +96 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +10 -3
- data/lib/datadog/data_streams/configuration.rb +50 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +511 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
- data/lib/datadog/data_streams/transport/http.rb +36 -0
- data/lib/datadog/data_streams/transport/stats.rb +39 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/base.rb +15 -7
- data/lib/datadog/di/boot.rb +7 -2
- data/lib/datadog/di/capture_expression.rb +21 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
- data/lib/datadog/di/capture_limits.rb +41 -0
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +139 -51
- data/lib/datadog/di/configuration.rb +241 -2
- data/lib/datadog/di/context.rb +82 -0
- data/lib/datadog/di/contrib/active_record.rb +34 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +44 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +623 -147
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +122 -14
- data/lib/datadog/di/probe_builder.rb +124 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +12 -7
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +321 -90
- data/lib/datadog/di/probe_notifier_worker.rb +112 -36
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/proc_responder.rb +36 -0
- data/lib/datadog/di/redactor.rb +24 -2
- data/lib/datadog/di/remote.rb +258 -93
- data/lib/datadog/di/serializer.rb +310 -29
- data/lib/datadog/di/transport/diagnostics.rb +12 -42
- data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
- data/lib/datadog/di/transport/http/input.rb +2 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +112 -38
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +204 -4
- data/lib/datadog/error_tracking/collector.rb +2 -1
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/error_tracking/configuration.rb +55 -2
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +60 -3
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
- data/lib/datadog/open_feature/component.rb +100 -0
- data/lib/datadog/open_feature/configuration.rb +37 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +16 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +101 -0
- data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
- data/lib/datadog/open_feature/native_evaluator.rb +60 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +191 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +121 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
- data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +65 -1
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +9 -3
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +71 -12
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -4
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -5
- data/lib/datadog/profiling/collectors/info.rb +18 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +10 -5
- data/lib/datadog/profiling/component.rb +82 -40
- data/lib/datadog/profiling/exporter.rb +41 -12
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
- data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +21 -8
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -14
- data/lib/datadog/profiling/scheduler.rb +10 -9
- data/lib/datadog/profiling/stack_recorder.rb +0 -8
- data/lib/datadog/profiling/tag_builder.rb +37 -3
- data/lib/datadog/profiling/tasks/exec.rb +8 -3
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling.rb +1 -3
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +2 -2
- data/lib/datadog/symbol_database/component.rb +734 -0
- data/lib/datadog/symbol_database/configuration.rb +73 -0
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +1110 -0
- data/lib/datadog/symbol_database/file_hash.rb +48 -0
- data/lib/datadog/symbol_database/logger.rb +43 -0
- data/lib/datadog/symbol_database/remote.rb +180 -0
- data/lib/datadog/symbol_database/scope.rb +102 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
- data/lib/datadog/symbol_database/service_version.rb +66 -0
- data/lib/datadog/symbol_database/symbol.rb +69 -0
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
- data/lib/datadog/symbol_database/transport/http.rb +45 -0
- data/lib/datadog/symbol_database/transport.rb +54 -0
- data/lib/datadog/symbol_database/uploader.rb +230 -0
- data/lib/datadog/symbol_database.rb +71 -0
- data/lib/datadog/tracing/buffer.rb +3 -3
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +22 -0
- data/lib/datadog/tracing/configuration/settings.rb +96 -4
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -7
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +28 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -5
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -5
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/configurable.rb +18 -3
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/extensions.rb +19 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +10 -7
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +75 -44
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +7 -7
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -8
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +15 -18
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +13 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +24 -0
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +62 -27
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +119 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +3 -1
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +7 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -7
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +4 -1
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +4 -2
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
- data/lib/datadog/tracing/contrib.rb +9 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +4 -2
- data/lib/datadog/tracing/distributed/baggage.rb +64 -8
- data/lib/datadog/tracing/distributed/datadog.rb +13 -11
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -14
- data/lib/datadog/tracing/distributed/propagation.rb +35 -3
- data/lib/datadog/tracing/distributed/trace_context.rb +85 -62
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +34 -10
- data/lib/datadog/tracing/sync_writer.rb +0 -1
- data/lib/datadog/tracing/trace_digest.rb +7 -0
- data/lib/datadog/tracing/trace_operation.rb +123 -16
- data/lib/datadog/tracing/tracer.rb +82 -23
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +6 -9
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +13 -81
- data/lib/datadog/tracing/workers.rb +2 -1
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -1
- metadata +185 -36
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/configuration/settings.rb +0 -400
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/configuration/settings.rb +0 -212
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative '../../core/utils'
|
|
4
|
+
require_relative 'helpers'
|
|
5
|
+
|
|
3
6
|
module Datadog
|
|
4
7
|
module Tracing
|
|
5
8
|
module Distributed
|
|
@@ -75,34 +78,6 @@ module Datadog
|
|
|
75
78
|
|
|
76
79
|
private
|
|
77
80
|
|
|
78
|
-
# Refinements to ensure newer rubies do not suffer performance impact
|
|
79
|
-
# by needing to use older APIs.
|
|
80
|
-
module Refine
|
|
81
|
-
# Backport `Regexp::match?` because it is measurably the most performant
|
|
82
|
-
# way to check if a string matches a regular expression.
|
|
83
|
-
unless Regexp.method_defined?(:match?)
|
|
84
|
-
refine ::Regexp do
|
|
85
|
-
def match?(*args)
|
|
86
|
-
!match(*args).nil?
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
unless String.method_defined?(:delete_prefix)
|
|
92
|
-
refine ::String do
|
|
93
|
-
def delete_prefix(prefix)
|
|
94
|
-
prefix = prefix.to_s
|
|
95
|
-
if rindex(prefix, 0)
|
|
96
|
-
self[prefix.length..-1]
|
|
97
|
-
else
|
|
98
|
-
dup
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
using Refine
|
|
105
|
-
|
|
106
81
|
# @see https://www.w3.org/TR/trace-context/#traceparent-header
|
|
107
82
|
def build_traceparent(digest)
|
|
108
83
|
build_traceparent_string(
|
|
@@ -149,9 +124,9 @@ module Datadog
|
|
|
149
124
|
# @see https://www.w3.org/TR/trace-context/#tracestate-header
|
|
150
125
|
def build_tracestate(digest)
|
|
151
126
|
tracestate = +'dd='
|
|
152
|
-
tracestate
|
|
153
|
-
tracestate
|
|
154
|
-
tracestate
|
|
127
|
+
append_dd(tracestate, last_dd_parent_id(digest))
|
|
128
|
+
append_dd(tracestate, "s:#{digest.trace_sampling_priority};") if digest.trace_sampling_priority
|
|
129
|
+
append_dd(tracestate, "o:#{serialize_origin(digest.trace_origin)};") if digest.trace_origin
|
|
155
130
|
|
|
156
131
|
# Replacing this by safe navigation seems to have a different behaviour on Rubies <= 3.0.
|
|
157
132
|
# It cause a LocalJumpError in the CI.
|
|
@@ -159,45 +134,50 @@ module Datadog
|
|
|
159
134
|
digest.trace_distributed_tags.each do |name, value|
|
|
160
135
|
tag = "t.#{serialize_tag_key(name)}:#{serialize_tag_value(value)};"
|
|
161
136
|
|
|
162
|
-
# If tracestate size limit is
|
|
163
|
-
|
|
164
|
-
#
|
|
165
|
-
# We add 1 to the limit because of the trailing comma, which will be removed before returning.
|
|
166
|
-
break if tracestate.bytesize + tag.bytesize > (TRACESTATE_VALUE_SIZE_LIMIT + 1)
|
|
167
|
-
|
|
168
|
-
tracestate << tag
|
|
137
|
+
# If tracestate size limit is exceeded, drop the remaining data.
|
|
138
|
+
break unless append_dd(tracestate, tag)
|
|
169
139
|
end
|
|
170
140
|
end
|
|
171
141
|
|
|
172
|
-
tracestate
|
|
142
|
+
append_dd(tracestate, digest.trace_state_unknown_fields) if digest.trace_state_unknown_fields
|
|
143
|
+
vendors = split_tracestate(digest.trace_state)
|
|
173
144
|
|
|
174
145
|
# Is there any Datadog-specific information to propagate.
|
|
175
146
|
# Check for > 3 size because the empty prefix `dd=` has 3 characters.
|
|
176
|
-
if tracestate.
|
|
147
|
+
if tracestate.bytesize > 3
|
|
177
148
|
# Propagate upstream tracestate with `dd=...` appended to the list
|
|
178
149
|
tracestate.chop! # Removes trailing `;` from Datadog trace state string.
|
|
179
150
|
|
|
180
|
-
if
|
|
181
|
-
trace_state = digest.trace_state.strip
|
|
182
|
-
|
|
151
|
+
if vendors && !vendors.empty?
|
|
183
152
|
# Delete existing `dd=` tracestate fields, if present.
|
|
184
|
-
vendors = split_tracestate(trace_state)
|
|
185
153
|
vendors.reject! { |v| v.start_with?('dd=') }
|
|
186
|
-
end
|
|
187
154
|
|
|
188
|
-
if vendors && !vendors.empty?
|
|
189
155
|
# Ensure the list has at most 31 elements, as we need to prepend Datadog's
|
|
190
156
|
# entry and the limit is 32 elements total.
|
|
191
|
-
vendors
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
157
|
+
vendors.first(TRACESTATE_MAX_LIST_MEMBERS - 1).each do |vendor|
|
|
158
|
+
break if tracestate.bytesize + vendor.bytesize + 1 > TRACESTATE_MAX_SIZE_LIMIT
|
|
159
|
+
|
|
160
|
+
tracestate << ',' << vendor
|
|
161
|
+
end
|
|
195
162
|
end
|
|
196
|
-
|
|
197
|
-
|
|
163
|
+
|
|
164
|
+
tracestate.to_s
|
|
165
|
+
elsif vendors && !vendors.empty?
|
|
166
|
+
vendors.join(',')
|
|
198
167
|
end
|
|
199
168
|
end
|
|
200
169
|
|
|
170
|
+
# Appends a Datadog tracestate field when it fits.
|
|
171
|
+
def append_dd(tracestate, field)
|
|
172
|
+
return true if field.empty?
|
|
173
|
+
|
|
174
|
+
# We add 1 to the limit because of the trailing semicolon, which will be removed before returning.
|
|
175
|
+
return false if tracestate.bytesize + field.bytesize > (TRACESTATE_VALUE_SIZE_LIMIT + 1)
|
|
176
|
+
|
|
177
|
+
tracestate << field
|
|
178
|
+
true
|
|
179
|
+
end
|
|
180
|
+
|
|
201
181
|
def last_dd_parent_id(digest)
|
|
202
182
|
if !digest.span_remote
|
|
203
183
|
span_id = digest.span_id || 0 # Fall back to zero (invalid) if not present
|
|
@@ -281,19 +261,21 @@ module Datadog
|
|
|
281
261
|
|
|
282
262
|
def parse_traceparent_string(traceparent)
|
|
283
263
|
return unless traceparent
|
|
264
|
+
return if traceparent.bytesize > TRACEPARENT_MAX_SIZE_LIMIT
|
|
265
|
+
|
|
266
|
+
traceparent = traceparent.strip
|
|
284
267
|
|
|
285
|
-
version, trace_id, parent_id, trace_flags, extra = traceparent.
|
|
268
|
+
version, trace_id, parent_id, trace_flags, extra = traceparent.split('-', 5)
|
|
286
269
|
|
|
287
|
-
return
|
|
270
|
+
return unless version && trace_id && parent_id && trace_flags
|
|
271
|
+
return if version.size != 2 || trace_id.size != 32 || parent_id.size != 16 || trace_flags.size != 2
|
|
272
|
+
return if version[0] < '0' || version[0] > 'f' || version[1] < '0' || version[1] > 'f'
|
|
288
273
|
|
|
289
274
|
return if version == INVALID_VERSION
|
|
290
275
|
|
|
291
276
|
# Extra fields are not allowed in version 00, but we have to be lenient for future versions.
|
|
292
277
|
return if version == SPEC_VERSION && extra
|
|
293
278
|
|
|
294
|
-
# Invalid field sizes
|
|
295
|
-
return if trace_id.size != 32 || parent_id.size != 16 || trace_flags.size != 2
|
|
296
|
-
|
|
297
279
|
[Integer(trace_id, 16), Integer(parent_id, 16), Integer(trace_flags, 16)]
|
|
298
280
|
rescue ArgumentError # Conversion to integer failed
|
|
299
281
|
nil
|
|
@@ -303,12 +285,16 @@ module Datadog
|
|
|
303
285
|
trace_flags & TRACE_FLAGS_SAMPLED
|
|
304
286
|
end
|
|
305
287
|
|
|
306
|
-
# @return [
|
|
307
|
-
#
|
|
288
|
+
# @return [nil] when the tracestate is absent or has no vendor entries.
|
|
289
|
+
# @return [String] when no `dd=` entry is present, the joined vendor list.
|
|
290
|
+
# @return [Array(String, Integer, String, String, Hash, String)] when a `dd=`
|
|
291
|
+
# entry is present: [tracestate without `dd=`, sampling_priority, origin,
|
|
292
|
+
# ts_parent_id, tags, unknown_fields]. All elements past the first may be nil.
|
|
308
293
|
def extract_tracestate(tracestate)
|
|
309
|
-
return unless tracestate
|
|
310
|
-
|
|
311
294
|
vendors = split_tracestate(tracestate)
|
|
295
|
+
return unless vendors && !vendors.empty?
|
|
296
|
+
|
|
297
|
+
tracestate = vendors.join(',')
|
|
312
298
|
|
|
313
299
|
# Find Datadog's `dd=` tracestate field.
|
|
314
300
|
idx = vendors.index { |v| v.start_with?('dd=') }
|
|
@@ -396,10 +382,47 @@ module Datadog
|
|
|
396
382
|
end
|
|
397
383
|
end
|
|
398
384
|
|
|
385
|
+
# We MUST NOT propagate partial members, but we SHOULD try
|
|
386
|
+
# to parse as much of the tracestate as possible.
|
|
399
387
|
def split_tracestate(tracestate)
|
|
400
|
-
|
|
388
|
+
return unless tracestate
|
|
389
|
+
|
|
390
|
+
remove_last_member = false
|
|
391
|
+
if tracestate.bytesize > TRACESTATE_MAX_SIZE_LIMIT
|
|
392
|
+
# We parse 1 byte over the limit to detect if the last member
|
|
393
|
+
# is a partial member (toss) or ends exactly at the limit (keep).
|
|
394
|
+
remove_last_member = tracestate.byteslice(TRACESTATE_MAX_SIZE_LIMIT, 1) != ','
|
|
395
|
+
|
|
396
|
+
# To ensure we don't have a trailing partial UTF-8 codepoint, we keep one extra byte
|
|
397
|
+
# and safely remove it with `#chop`.
|
|
398
|
+
# `#chop` walks back the string until it finds a valid character boundary and deletes
|
|
399
|
+
# from there.
|
|
400
|
+
tracestate = tracestate.byteslice(0, TRACESTATE_MAX_SIZE_LIMIT + 1) #: String
|
|
401
|
+
tracestate = tracestate.chop
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
tracestate = ::Datadog::Core::Utils.utf8_encode(tracestate, placeholder: nil)
|
|
405
|
+
return unless tracestate
|
|
406
|
+
|
|
407
|
+
vendors = tracestate.split(',', TRACESTATE_MAX_LIST_MEMBERS + 1)
|
|
408
|
+
if vendors.length > TRACESTATE_MAX_LIST_MEMBERS || remove_last_member
|
|
409
|
+
vendors.pop
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
vendors.each(&:strip!)
|
|
413
|
+
vendors.pop while vendors.last == ''
|
|
414
|
+
vendors
|
|
401
415
|
end
|
|
402
416
|
|
|
417
|
+
TRACEPARENT_MAX_SIZE_LIMIT = 512
|
|
418
|
+
private_constant :TRACEPARENT_MAX_SIZE_LIMIT
|
|
419
|
+
|
|
420
|
+
TRACESTATE_MAX_SIZE_LIMIT = 512
|
|
421
|
+
private_constant :TRACESTATE_MAX_SIZE_LIMIT
|
|
422
|
+
|
|
423
|
+
TRACESTATE_MAX_LIST_MEMBERS = 32
|
|
424
|
+
private_constant :TRACESTATE_MAX_LIST_MEMBERS
|
|
425
|
+
|
|
403
426
|
# Version 0xFF is invalid as per spec
|
|
404
427
|
# @see https://www.w3.org/TR/trace-context/#version
|
|
405
428
|
INVALID_VERSION = 'ff'
|
|
@@ -62,7 +62,7 @@ module Datadog
|
|
|
62
62
|
block.call(*args)
|
|
63
63
|
rescue => e
|
|
64
64
|
Datadog.logger.debug do
|
|
65
|
-
"Error while handling '#{name}' event with '#{block}': #{e.class
|
|
65
|
+
"Error while handling '#{name}' event with '#{block}': #{e.class}: #{e.message} " \
|
|
66
66
|
"at #{Array(e.backtrace).first}"
|
|
67
67
|
end
|
|
68
68
|
end
|
|
@@ -33,6 +33,16 @@ module Datadog
|
|
|
33
33
|
|
|
34
34
|
TAG_APM_ENABLED = '_dd.apm.enabled'
|
|
35
35
|
|
|
36
|
+
# Set to the global service name when a span's service is overridden
|
|
37
|
+
TAG_BASE_SERVICE = '_dd.base_service'
|
|
38
|
+
|
|
39
|
+
# Set to the source of a span's service override: the component name for Datadog-instrumented spans
|
|
40
|
+
# (e.g. 'redis', 'pg'), or {SVC_SRC_MANUAL} for manually-instrumented spans
|
|
41
|
+
TAG_SVC_SRC = '_dd.svc_src'
|
|
42
|
+
|
|
43
|
+
# Value for {TAG_SVC_SRC} indicating that a span was manually instrumented via the Tracing API
|
|
44
|
+
SVC_SRC_MANUAL = 'm'
|
|
45
|
+
|
|
36
46
|
# Defines constants for trace analytics
|
|
37
47
|
# @public_api
|
|
38
48
|
module Analytics
|
|
@@ -66,6 +76,10 @@ module Datadog
|
|
|
66
76
|
TAG_DD_PARENT_ID = '_dd.parent_id'
|
|
67
77
|
DD_PARENT_ID_DEFAULT = '0000000000000000'
|
|
68
78
|
|
|
79
|
+
# Knuth Sampling Rate: the sampling rate applied by agent-based or rule-based sampling.
|
|
80
|
+
# This is a propagated tag (prefixed with `_dd.p.`) that is included in `x-datadog-tags`.
|
|
81
|
+
TAG_KNUTH_SAMPLING_RATE = '_dd.p.ksr'
|
|
82
|
+
|
|
69
83
|
# Trace tags with this prefix will propagate from a trace through distributed tracing.
|
|
70
84
|
# Distributed headers tags with this prefix will be injected into the active trace.
|
|
71
85
|
TAGS_PREFIX = '_dd.p.'
|
|
@@ -82,12 +96,20 @@ module Datadog
|
|
|
82
96
|
TAG_MSG = 'error.message'
|
|
83
97
|
TAG_STACK = 'error.stack'
|
|
84
98
|
TAG_TYPE = 'error.type'
|
|
99
|
+
|
|
100
|
+
# From https://opentelemetry.io/docs/specs/semconv/registry/attributes/exception/#exception-stacktrace
|
|
101
|
+
ATTRIBUTE_MESSAGE = 'exception.message'
|
|
102
|
+
ATTRIBUTE_STACKTRACE = 'exception.stacktrace'
|
|
103
|
+
ATTRIBUTE_TYPE = 'exception.type'
|
|
104
|
+
|
|
105
|
+
# From https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/#exception-event
|
|
106
|
+
EVENT_NAME = 'exception'
|
|
85
107
|
end
|
|
86
108
|
|
|
87
109
|
# @public_api
|
|
88
110
|
module HTTP
|
|
89
|
-
ERROR_RANGE = (500...600).freeze
|
|
90
111
|
TAG_BASE_URL = 'http.base_url'
|
|
112
|
+
TAG_ENDPOINT = 'http.endpoint'
|
|
91
113
|
TAG_METHOD = 'http.method'
|
|
92
114
|
TAG_STATUS_CODE = 'http.status_code'
|
|
93
115
|
TAG_USER_AGENT = 'http.useragent'
|
|
@@ -52,7 +52,7 @@ module Datadog
|
|
|
52
52
|
meta[Core::Utils.utf8_encode(key)] = Core::Utils.utf8_encode(value)
|
|
53
53
|
end
|
|
54
54
|
rescue => e
|
|
55
|
-
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
|
|
55
|
+
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e.class}: #{e.message}")
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
# Sets tags from given hash, for each key in hash it sets the tag with that key
|
|
@@ -102,7 +102,7 @@ module Datadog
|
|
|
102
102
|
# Encode strings in UTF-8 to facilitate downstream serialization
|
|
103
103
|
metrics[Core::Utils.utf8_encode(key)] = value
|
|
104
104
|
rescue => e
|
|
105
|
-
Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e}")
|
|
105
|
+
Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e.class}: #{e.message}")
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
# This method removes a metric for the given key. It acts like {#clear_tag}.
|
|
@@ -7,8 +7,6 @@ module Datadog
|
|
|
7
7
|
module Tracing
|
|
8
8
|
# Remote configuration declaration
|
|
9
9
|
module Remote
|
|
10
|
-
class ReadError < StandardError; end
|
|
11
|
-
|
|
12
10
|
class << self
|
|
13
11
|
PRODUCT = 'APM_TRACING'
|
|
14
12
|
|
|
@@ -17,6 +15,9 @@ module Datadog
|
|
|
17
15
|
1 << 13, # APM_TRACING_LOGS_INJECTION: Dynamic trace logs injection configuration
|
|
18
16
|
1 << 14, # APM_TRACING_HTTP_HEADER_TAGS: Dynamic trace HTTP header tags configuration
|
|
19
17
|
1 << 29, # APM_TRACING_SAMPLE_RULES: Dynamic trace sampling rules configuration
|
|
18
|
+
# APM_TRACING_ENABLE_DYNAMIC_INSTRUMENTATION (bit 38) is declared in
|
|
19
|
+
# DI::Remote.capabilities, not here, so it is registered only when DI
|
|
20
|
+
# is not explicitly disabled and the runtime supports DI.
|
|
20
21
|
].freeze
|
|
21
22
|
|
|
22
23
|
def products
|
|
@@ -27,7 +28,7 @@ module Datadog
|
|
|
27
28
|
CAPABILITIES
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
def process_config(config, content)
|
|
31
|
+
def process_config(config, content, repository = nil)
|
|
31
32
|
lib_config = config['lib_config']
|
|
32
33
|
|
|
33
34
|
env_vars = Datadog::Tracing::Configuration::Dynamic::OPTIONS.map do |name, env_var, option|
|
|
@@ -41,11 +42,39 @@ module Datadog
|
|
|
41
42
|
[env_var, value]
|
|
42
43
|
end
|
|
43
44
|
|
|
45
|
+
if (di_enabled = lib_config['dynamic_instrumentation_enabled']) != nil # rubocop:disable Style/NonNilCheck
|
|
46
|
+
# repository is forwarded so that an enable signal can reconcile DI
|
|
47
|
+
# against probes delivered in an earlier poll while DI was stopped
|
|
48
|
+
# (see Datadog::DI::Remote.handle_rc_enablement).
|
|
49
|
+
Datadog::DI::Remote.handle_rc_enablement(di_enabled, repository)
|
|
50
|
+
|
|
51
|
+
if di_enabled
|
|
52
|
+
# DI was just (implicitly) enabled. A Symbol Database upload signal
|
|
53
|
+
# received in an earlier poll while DI was inactive was deferred by
|
|
54
|
+
# the component's DI-active gate; re-attempt it now. Mirrors the DI
|
|
55
|
+
# probe replay in handle_rc_enablement above. allow_initialization:
|
|
56
|
+
# false because this runs on the remote-config worker thread.
|
|
57
|
+
Datadog.send(:components, allow_initialization: false)&.symbol_database&.resume_pending_upload
|
|
58
|
+
else
|
|
59
|
+
# DI was disabled via remote configuration. In the nil-default
|
|
60
|
+
# (follows-DI) case, stop Symbol Database too so its TracePoint and
|
|
61
|
+
# scheduler don't keep uploading while DI is off. An explicit
|
|
62
|
+
# symbol_database.enabled = true is independent and keeps running.
|
|
63
|
+
Datadog.send(:components, allow_initialization: false)&.symbol_database&.stop_for_di_disable
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
44
67
|
content.applied
|
|
45
68
|
|
|
46
|
-
|
|
69
|
+
# allow_initialization: false because process_config runs on the
|
|
70
|
+
# remote-config worker thread. If components haven't been built yet
|
|
71
|
+
# (e.g. during a teardown/reset window), the default `true` would
|
|
72
|
+
# synchronously build the entire component tree from this thread.
|
|
73
|
+
# The &. chain matches the pattern used by DI::Remote.handle_rc_enablement
|
|
74
|
+
# in the same dispatch path.
|
|
75
|
+
Datadog.send(:components, allow_initialization: false)&.telemetry&.client_configuration_change!(env_vars)
|
|
47
76
|
rescue => e
|
|
48
|
-
content.errored("#{e.class
|
|
77
|
+
content.errored("#{e.class}: #{e.message}: #{Array(e.backtrace).join("\n")}")
|
|
49
78
|
end
|
|
50
79
|
|
|
51
80
|
def receivers(_telemetry)
|
|
@@ -57,7 +86,7 @@ module Datadog
|
|
|
57
86
|
case content.path.product
|
|
58
87
|
when PRODUCT
|
|
59
88
|
config = parse_content(content)
|
|
60
|
-
process_config(config, content)
|
|
89
|
+
process_config(config, content, repository)
|
|
61
90
|
end
|
|
62
91
|
end
|
|
63
92
|
end
|
|
@@ -71,13 +100,7 @@ module Datadog
|
|
|
71
100
|
private
|
|
72
101
|
|
|
73
102
|
def parse_content(content)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
content.data.rewind
|
|
77
|
-
|
|
78
|
-
raise ReadError, 'EOF reached' if data.nil?
|
|
79
|
-
|
|
80
|
-
JSON.parse(data)
|
|
103
|
+
JSON.parse(content.data)
|
|
81
104
|
end
|
|
82
105
|
end
|
|
83
106
|
end
|
|
@@ -47,6 +47,8 @@ module Datadog
|
|
|
47
47
|
MANUAL = '-4'
|
|
48
48
|
# Formerly AppSec.
|
|
49
49
|
ASM = '-5'
|
|
50
|
+
# AI Guard.
|
|
51
|
+
AI_GUARD = '-13'
|
|
50
52
|
# Dynamically configured rule, explicitly created by the user.
|
|
51
53
|
REMOTE_USER_RULE = '-11'
|
|
52
54
|
# Dynamically configured rule, automatically generated by Datadog.
|
|
@@ -60,7 +60,9 @@ module Datadog
|
|
|
60
60
|
ensure
|
|
61
61
|
if trace.sampling_priority && trace.sampling_priority > 0
|
|
62
62
|
# Don't modify decision if priority was set upstream.
|
|
63
|
-
|
|
63
|
+
# Steep: https://github.com/soutaro/steep/issues/1971
|
|
64
|
+
if !distributed_sampling_priority && # steep:ignore FallbackAny
|
|
65
|
+
!trace.has_tag?(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
64
66
|
# If no sampling priority being assigned at this point, a custom
|
|
65
67
|
# sampler implementation is configured: this means the user has
|
|
66
68
|
# full control over the sampling decision.
|
|
@@ -75,6 +77,19 @@ module Datadog
|
|
|
75
77
|
end
|
|
76
78
|
end
|
|
77
79
|
|
|
80
|
+
def reconsider_sample_resource!(trace)
|
|
81
|
+
return unless @priority_sampler.respond_to?(:reconsider_sample_resource!)
|
|
82
|
+
|
|
83
|
+
preserving_sampling(trace) do
|
|
84
|
+
@priority_sampler.reconsider_sample_resource!(trace)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def resource_sampling?
|
|
89
|
+
@priority_sampler.respond_to?(:resource_sampling?) &&
|
|
90
|
+
@priority_sampler.resource_sampling?
|
|
91
|
+
end
|
|
92
|
+
|
|
78
93
|
# (see Datadog::Tracing::Sampling::RateByServiceSampler#update)
|
|
79
94
|
def update(rate_by_service, decision: nil)
|
|
80
95
|
@priority_sampler.update(rate_by_service, decision: decision)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative 'sampler'
|
|
4
|
-
require_relative '
|
|
4
|
+
require_relative '../../core/knuth_sampler'
|
|
5
5
|
|
|
6
6
|
module Datadog
|
|
7
7
|
module Tracing
|
|
@@ -9,46 +9,35 @@ module Datadog
|
|
|
9
9
|
# {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
|
|
10
10
|
class RateSampler < Sampler
|
|
11
11
|
KNUTH_FACTOR = 1111111111111111111
|
|
12
|
-
UINT64_MODULO = (1 << 64)
|
|
13
12
|
|
|
14
13
|
# Initialize a {Datadog::Tracing::Sampling::RateSampler}.
|
|
15
14
|
# This sampler keeps a random subset of the traces. Its main purpose is to
|
|
16
15
|
# reduce the instrumentation footprint.
|
|
17
16
|
#
|
|
18
17
|
# @param sample_rate [Numeric] the sample rate between 0.0 and 1.0, inclusive.
|
|
19
|
-
# 0.0 means that no trace will be sampled; 1.0 means that all traces will be
|
|
18
|
+
# 0.0 means that no trace will be sampled; 1.0 means that all traces will be sampled.
|
|
20
19
|
def initialize(sample_rate = 1.0, decision: nil)
|
|
21
20
|
super()
|
|
22
|
-
|
|
23
|
-
unless sample_rate >= 0.0 && sample_rate <= 1.0
|
|
24
|
-
Datadog.logger.warn('sample rate is not between 0 and 1, falling back to 1')
|
|
25
|
-
sample_rate = 1.0
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
self.sample_rate = sample_rate
|
|
29
|
-
|
|
21
|
+
@sampler = Core::KnuthSampler.new(sample_rate, knuth_factor: KNUTH_FACTOR)
|
|
30
22
|
@decision = decision
|
|
31
23
|
end
|
|
32
24
|
|
|
33
25
|
def sample_rate(*_)
|
|
34
|
-
@
|
|
26
|
+
@sampler.rate
|
|
35
27
|
end
|
|
36
28
|
|
|
37
29
|
def sample_rate=(sample_rate)
|
|
38
|
-
@
|
|
39
|
-
@sampling_id_threshold = sample_rate * Tracing::Utils::EXTERNAL_MAX_ID
|
|
30
|
+
@sampler = Core::KnuthSampler.new(sample_rate, knuth_factor: KNUTH_FACTOR)
|
|
40
31
|
end
|
|
41
32
|
|
|
42
33
|
def sample?(trace)
|
|
43
|
-
(
|
|
34
|
+
@sampler.sample?(trace.id)
|
|
44
35
|
end
|
|
45
36
|
|
|
46
37
|
def sample!(trace)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return false unless sampled
|
|
38
|
+
return false unless sample?(trace)
|
|
50
39
|
|
|
51
|
-
trace.sample_rate =
|
|
40
|
+
trace.sample_rate = sample_rate
|
|
52
41
|
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, @decision) if @decision
|
|
53
42
|
|
|
54
43
|
true
|
|
@@ -34,7 +34,7 @@ module Datadog
|
|
|
34
34
|
@matcher.match?(trace)
|
|
35
35
|
rescue => e
|
|
36
36
|
Datadog.logger.error(
|
|
37
|
-
"Matcher failed. Cause: #{e.class
|
|
37
|
+
"Matcher failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
38
38
|
)
|
|
39
39
|
Datadog::Core::Telemetry::Logger.report(e, description: 'Matcher failed')
|
|
40
40
|
nil
|
|
@@ -50,6 +50,7 @@ module Datadog
|
|
|
50
50
|
# TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
|
|
51
51
|
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
|
|
52
52
|
end
|
|
53
|
+
@reconsider_sample_resource_enabled = @rules.any? { |rule| resource_rule?(rule) }
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
def self.parse(rules, rate_limit, default_sample_rate)
|
|
@@ -84,7 +85,7 @@ module Datadog
|
|
|
84
85
|
new(parsed_rules, rate_limit: rate_limit, default_sample_rate: default_sample_rate)
|
|
85
86
|
rescue => e
|
|
86
87
|
Datadog.logger.warn do
|
|
87
|
-
"Could not parse trace sampling rules '#{rules}': #{e.class
|
|
88
|
+
"Could not parse trace sampling rules '#{rules}': #{e.class}: #{e.message} at #{Array(e.backtrace).first}"
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
nil
|
|
@@ -103,6 +104,18 @@ module Datadog
|
|
|
103
104
|
trace.sampled = sampled
|
|
104
105
|
end
|
|
105
106
|
|
|
107
|
+
def reconsider_sample_resource!(trace)
|
|
108
|
+
rule = @rules.find { |r| resource_rule?(r) && r.match?(trace) }
|
|
109
|
+
return if rule.nil?
|
|
110
|
+
|
|
111
|
+
reconsider_matching_rule!(trace, rule)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Do any rules match on the resource name?
|
|
115
|
+
def resource_sampling?
|
|
116
|
+
@reconsider_sample_resource_enabled
|
|
117
|
+
end
|
|
118
|
+
|
|
106
119
|
# @!visibility private
|
|
107
120
|
def update(*args, **kwargs)
|
|
108
121
|
return false unless @default_sampler.respond_to?(:update)
|
|
@@ -117,32 +130,10 @@ module Datadog
|
|
|
117
130
|
|
|
118
131
|
return yield(trace) if rule.nil?
|
|
119
132
|
|
|
120
|
-
|
|
121
|
-
sample_rate = rule.sample_rate(trace)
|
|
122
|
-
|
|
123
|
-
set_priority(trace, sampled)
|
|
124
|
-
set_rule_metrics(trace, sample_rate)
|
|
125
|
-
|
|
126
|
-
return false unless sampled
|
|
127
|
-
|
|
128
|
-
rate_limiter.allow?.tap do |allowed|
|
|
129
|
-
set_priority(trace, allowed)
|
|
130
|
-
set_limiter_metrics(trace, rate_limiter.effective_rate)
|
|
131
|
-
|
|
132
|
-
provenance = case rule.provenance
|
|
133
|
-
when Rule::PROVENANCE_REMOTE_USER
|
|
134
|
-
Ext::Decision::REMOTE_USER_RULE
|
|
135
|
-
when Rule::PROVENANCE_REMOTE_DYNAMIC
|
|
136
|
-
Ext::Decision::REMOTE_DYNAMIC_RULE
|
|
137
|
-
else
|
|
138
|
-
Ext::Decision::TRACE_SAMPLING_RULE
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance)
|
|
142
|
-
end
|
|
133
|
+
apply_rule!(trace, rule)
|
|
143
134
|
rescue => e
|
|
144
135
|
Datadog.logger.error(
|
|
145
|
-
"Rule sampling failed. Cause: #{e.class
|
|
136
|
+
"Rule sampling failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
146
137
|
)
|
|
147
138
|
Datadog::Core::Telemetry::Logger.report(e, description: 'Rule sampling failed')
|
|
148
139
|
|
|
@@ -166,6 +157,44 @@ module Datadog
|
|
|
166
157
|
def set_limiter_metrics(trace, limiter_rate)
|
|
167
158
|
trace.rate_limiter_rate = limiter_rate
|
|
168
159
|
end
|
|
160
|
+
|
|
161
|
+
def apply_rule!(trace, rule)
|
|
162
|
+
sampled = rule.sample!(trace)
|
|
163
|
+
sample_rate = rule.sample_rate(trace)
|
|
164
|
+
|
|
165
|
+
set_priority(trace, sampled)
|
|
166
|
+
set_rule_metrics(trace, sample_rate)
|
|
167
|
+
|
|
168
|
+
return false unless sampled
|
|
169
|
+
|
|
170
|
+
rate_limiter.allow?.tap do |allowed|
|
|
171
|
+
set_priority(trace, allowed)
|
|
172
|
+
set_limiter_metrics(trace, rate_limiter.effective_rate)
|
|
173
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance_for(rule))
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def provenance_for(rule)
|
|
178
|
+
case rule.provenance
|
|
179
|
+
when Rule::PROVENANCE_REMOTE_USER
|
|
180
|
+
Ext::Decision::REMOTE_USER_RULE
|
|
181
|
+
when Rule::PROVENANCE_REMOTE_DYNAMIC
|
|
182
|
+
Ext::Decision::REMOTE_DYNAMIC_RULE
|
|
183
|
+
else
|
|
184
|
+
Ext::Decision::TRACE_SAMPLING_RULE
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def resource_rule?(rule)
|
|
189
|
+
matcher = rule.matcher
|
|
190
|
+
matcher.respond_to?(:resource) && matcher.resource != Matcher::MATCH_ALL
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def reconsider_matching_rule!(trace, rule)
|
|
194
|
+
trace.agent_sample_rate = nil
|
|
195
|
+
trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
196
|
+
apply_rule!(trace, rule)
|
|
197
|
+
end
|
|
169
198
|
end
|
|
170
199
|
end
|
|
171
200
|
end
|
|
@@ -29,7 +29,7 @@ module Datadog
|
|
|
29
29
|
rescue => e
|
|
30
30
|
Datadog.logger.warn(
|
|
31
31
|
"Error parsing Span Sampling Rules `#{rules.inspect}`: " \
|
|
32
|
-
"#{e.class
|
|
32
|
+
"#{e.class}: #{e.message} at #{Array(e.backtrace).first}"
|
|
33
33
|
)
|
|
34
34
|
return nil
|
|
35
35
|
end
|
|
@@ -61,7 +61,7 @@ module Datadog
|
|
|
61
61
|
rescue => e
|
|
62
62
|
Datadog.logger.warn(
|
|
63
63
|
"Cannot parse Span Sampling Rule #{hash.inspect}: " \
|
|
64
|
-
"#{e.class
|
|
64
|
+
"#{e.class}: #{e.message} at #{Array(e.backtrace).first}"
|
|
65
65
|
)
|
|
66
66
|
return nil
|
|
67
67
|
end
|
data/lib/datadog/tracing/span.rb
CHANGED