datadog 2.39.0 → 2.47.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 +269 -44
- data/README.md +3 -0
- data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +256 -193
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -5
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +19 -20
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +267 -171
- data/ext/datadog_profiling_native_extension/collectors_stack.h +17 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +307 -217
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +10 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -10
- data/ext/datadog_profiling_native_extension/extconf.rb +67 -99
- data/ext/datadog_profiling_native_extension/heap_recorder.c +353 -257
- data/ext/datadog_profiling_native_extension/heap_recorder.h +50 -31
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +853 -496
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +42 -15
- data/ext/datadog_profiling_native_extension/profiling.c +30 -23
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +4 -80
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -7
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +0 -2
- data/ext/datadog_profiling_native_extension/stack_recorder.c +116 -89
- data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -5
- data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
- data/ext/datadog_profiling_native_extension/time_helpers.h +15 -15
- data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
- data/ext/libdatadog_api/datadog_ruby_common.h +7 -10
- data/ext/libdatadog_api/di.c +43 -3
- data/ext/libdatadog_api/extconf.rb +6 -1
- data/ext/libdatadog_api/feature_flags.c +8 -0
- data/ext/libdatadog_api/init.c +9 -1
- data/ext/libdatadog_api/otel_thread_context.c +274 -0
- data/ext/libdatadog_api/otel_thread_context.h +5 -0
- data/ext/libdatadog_api/process_discovery.c +15 -1
- data/ext/libdatadog_api/trace_exporter.c +2078 -0
- data/ext/libdatadog_api/trace_exporter.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +14 -9
- data/lib/datadog/ai_guard/component.rb +17 -8
- data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
- data/lib/datadog/ai_guard/configuration.rb +13 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +48 -55
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
- data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
- data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +12 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
- data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +6 -6
- data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +8 -64
- data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +11 -18
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
- data/lib/datadog/ai_guard/evaluation.rb +36 -14
- data/lib/datadog/ai_guard/ext.rb +4 -1
- data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +7 -5
- data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
- data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
- data/lib/datadog/ai_guard/redaction/result.rb +29 -0
- data/lib/datadog/ai_guard/redaction.rb +80 -0
- data/lib/datadog/ai_guard.rb +58 -57
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
- data/lib/datadog/appsec/assets/blocked.html +1 -108
- data/lib/datadog/appsec/configuration.rb +11 -2
- data/lib/datadog/appsec/context.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
- data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -3
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +30 -3
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +8 -7
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +15 -3
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +8 -7
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
- data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
- data/lib/datadog/appsec/response.rb +1 -1
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
- data/lib/datadog/appsec/security_engine/engine.rb +5 -4
- data/lib/datadog/core/configuration/components.rb +50 -19
- data/lib/datadog/core/configuration/components_state.rb +8 -1
- data/lib/datadog/core/configuration/option_definition.rb +1 -1
- data/lib/datadog/core/configuration/options.rb +1 -1
- data/lib/datadog/core/configuration/settings.rb +38 -43
- data/lib/datadog/core/configuration/supported_configurations.rb +18 -2
- data/lib/datadog/core/crashtracking/component.rb +5 -1
- data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
- data/lib/datadog/core/environment/gc.rb +1 -1
- data/lib/datadog/core/environment/vm_cache.rb +1 -1
- data/lib/datadog/core/environment/yjit.rb +2 -2
- data/lib/datadog/core/metrics/helpers.rb +1 -1
- data/lib/datadog/core/metrics/options.rb +2 -2
- data/lib/datadog/core/process_discovery.rb +6 -2
- data/lib/datadog/core/remote/client/capabilities.rb +32 -21
- data/lib/datadog/core/remote/client.rb +45 -4
- data/lib/datadog/core/remote/component.rb +30 -7
- data/lib/datadog/core/remote/configuration/repository.rb +2 -2
- data/lib/datadog/core/remote/dispatcher.rb +47 -6
- data/lib/datadog/core/remote/worker.rb +8 -0
- data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
- data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
- data/lib/datadog/core/telemetry/event/log.rb +2 -2
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
- data/lib/datadog/core/telemetry/metric.rb +2 -2
- data/lib/datadog/core/telemetry/request.rb +2 -2
- data/lib/datadog/core/transport/http.rb +1 -1
- data/lib/datadog/core/transport/transport.rb +1 -1
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +170 -18
- data/lib/datadog/core/utils/sequence.rb +3 -6
- data/lib/datadog/core/utils/time.rb +16 -54
- data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
- data/lib/datadog/data_streams/pathway_context.rb +20 -22
- data/lib/datadog/data_streams/processor.rb +45 -14
- data/lib/datadog/di/boot.rb +1 -0
- data/lib/datadog/di/capture_expression_evaluator/result.rb +30 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +39 -9
- data/lib/datadog/di/component.rb +108 -3
- data/lib/datadog/di/configuration.rb +53 -2
- data/lib/datadog/di/context.rb +7 -2
- data/lib/datadog/di/contrib/active_record.rb +8 -2
- data/lib/datadog/di/el/compiler.rb +88 -12
- data/lib/datadog/di/el/evaluator.rb +82 -2
- data/lib/datadog/di/el/expression.rb +13 -2
- data/lib/datadog/di/evaluation_failure.rb +28 -0
- data/lib/datadog/di/guardrails_telemetry/reason.rb +87 -0
- data/lib/datadog/di/guardrails_telemetry.rb +203 -0
- data/lib/datadog/di/instrumenter.rb +106 -15
- data/lib/datadog/di/logger.rb +32 -10
- data/lib/datadog/di/probe.rb +9 -1
- data/lib/datadog/di/probe_builder.rb +7 -6
- data/lib/datadog/di/probe_manager.rb +56 -8
- data/lib/datadog/di/probe_notification_builder.rb +31 -28
- data/lib/datadog/di/probe_notifier_worker.rb +56 -6
- data/lib/datadog/di/proc_responder.rb +1 -1
- data/lib/datadog/di/remote.rb +49 -5
- data/lib/datadog/di/serializer.rb +172 -55
- data/lib/datadog/di/snapshot_event.rb +38 -0
- data/lib/datadog/di/transport/http.rb +13 -3
- data/lib/datadog/di/transport/input.rb +32 -7
- data/lib/datadog/error_tracking/component.rb +1 -1
- data/lib/datadog/kit/appsec/events/v2.rb +2 -2
- data/lib/datadog/open_feature/activation.rb +268 -0
- data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
- data/lib/datadog/open_feature/agentless/parser.rb +43 -0
- data/lib/datadog/open_feature/agentless/response.rb +19 -0
- data/lib/datadog/open_feature/agentless/transport.rb +103 -0
- data/lib/datadog/open_feature/component.rb +85 -13
- data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
- data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
- data/lib/datadog/open_feature/configuration/source.rb +43 -0
- data/lib/datadog/open_feature/configuration.rb +124 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +29 -3
- data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
- data/lib/datadog/open_feature/exposures/event.rb +15 -8
- data/lib/datadog/open_feature/ext.rb +19 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +236 -80
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +179 -68
- data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +24 -21
- data/lib/datadog/open_feature/native_evaluator.rb +20 -6
- data/lib/datadog/open_feature/noop_evaluator.rb +5 -0
- data/lib/datadog/open_feature/provider.rb +315 -10
- data/lib/datadog/open_feature/remote.rb +5 -5
- data/lib/datadog/open_feature/transport.rb +5 -0
- data/lib/datadog/open_feature.rb +31 -1
- data/lib/datadog/opentelemetry/sdk/propagator.rb +1 -1
- data/lib/datadog/opentelemetry/signal_configuration.rb +13 -9
- data/lib/datadog/opentelemetry/trace.rb +3 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +10 -2
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -7
- data/lib/datadog/profiling/collectors/info.rb +40 -13
- data/lib/datadog/profiling/collectors/thread_context.rb +6 -17
- data/lib/datadog/profiling/component.rb +33 -39
- data/lib/datadog/profiling/exporter.rb +10 -10
- data/lib/datadog/profiling/tasks/exec.rb +1 -1
- data/lib/datadog/profiling.rb +4 -0
- data/lib/datadog/symbol_database/extractor.rb +89 -107
- data/lib/datadog/tracing/component.rb +44 -2
- data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
- data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
- data/lib/datadog/tracing/configuration/ext.rb +4 -0
- data/lib/datadog/tracing/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/context.rb +24 -2
- data/lib/datadog/tracing/context_provider.rb +17 -5
- data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +10 -5
- data/lib/datadog/tracing/contrib/excon/middleware.rb +10 -3
- data/lib/datadog/tracing/contrib/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +10 -4
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +32 -5
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +16 -1
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +8 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +10 -4
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +4 -0
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +7 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +7 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/patchable.rb +1 -1
- data/lib/datadog/tracing/contrib/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +10 -3
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -5
- data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +50 -63
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +108 -3
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
- data/lib/datadog/tracing/correlation.rb +2 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -2
- data/lib/datadog/tracing/distributed/baggage.rb +1 -3
- data/lib/datadog/tracing/distributed/datadog.rb +3 -3
- data/lib/datadog/tracing/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +14 -271
- data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
- data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
- data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
- data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
- data/lib/datadog/tracing/metadata/ext.rb +3 -0
- data/lib/datadog/tracing/metadata/tagging.rb +1 -1
- data/lib/datadog/tracing/otel_thread_context.rb +97 -0
- data/lib/datadog/tracing/remote.rb +236 -37
- data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_operation.rb +1 -1
- data/lib/datadog/tracing/sync_writer.rb +8 -3
- data/lib/datadog/tracing/trace_digest.rb +22 -4
- data/lib/datadog/tracing/trace_operation.rb +22 -10
- data/lib/datadog/tracing/tracer.rb +28 -7
- data/lib/datadog/tracing/transport/http/telemetry.rb +94 -0
- data/lib/datadog/tracing/transport/http/traces.rb +2 -0
- data/lib/datadog/tracing/transport/io/traces.rb +1 -1
- data/lib/datadog/tracing/transport/native/response.rb +71 -0
- data/lib/datadog/tracing/transport/native/telemetry.rb +17 -0
- data/lib/datadog/tracing/transport/native.rb +395 -0
- data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
- data/lib/datadog/tracing/transport/telemetry.rb +62 -0
- data/lib/datadog/tracing/transport/trace_formatter.rb +14 -4
- data/lib/datadog/tracing/transport/traces.rb +85 -38
- data/lib/datadog/tracing/writer.rb +17 -4
- data/lib/datadog/version.rb +1 -1
- metadata +51 -13
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +0 -31
- data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "../core/semaphore"
|
|
4
4
|
require_relative "fatal_exceptions"
|
|
5
|
+
require_relative "guardrails_telemetry"
|
|
6
|
+
require_relative "snapshot_event"
|
|
5
7
|
|
|
6
8
|
module Datadog
|
|
7
9
|
module DI
|
|
@@ -24,14 +26,23 @@ module Datadog
|
|
|
24
26
|
#
|
|
25
27
|
# @api private
|
|
26
28
|
class ProbeNotifierWorker
|
|
29
|
+
# Initializes the background worker.
|
|
30
|
+
#
|
|
31
|
+
# @param settings [Datadog::Core::Configuration::Settings] tracer settings
|
|
32
|
+
# @param logger [DI::Logger] logger for worker diagnostics
|
|
33
|
+
# @param agent_settings [Datadog::Core::Configuration::AgentSettings] agent connection settings for the transports
|
|
27
34
|
# @param probe_repository [ProbeRepository] Repository for looking up probes.
|
|
28
35
|
# Used for handling serialization errors (disabling affected probes).
|
|
29
36
|
# @param probe_notification_builder [ProbeNotificationBuilder] Builder for
|
|
30
37
|
# creating status notifications. Used for reporting ERROR status.
|
|
38
|
+
# @param telemetry [Datadog::Core::Telemetry::Component, nil] component worker errors are reported through
|
|
39
|
+
# @param guardrails_telemetry [GuardrailsTelemetry] emitter for the canonical
|
|
40
|
+
# guardrails drop metric at the queue-full admission drop
|
|
31
41
|
def initialize(settings, logger, agent_settings:,
|
|
32
|
-
probe_repository:, probe_notification_builder:, telemetry: nil)
|
|
42
|
+
probe_repository:, probe_notification_builder:, guardrails_telemetry:, telemetry: nil)
|
|
33
43
|
@settings = settings
|
|
34
44
|
@telemetry = telemetry
|
|
45
|
+
@guardrails_telemetry = guardrails_telemetry
|
|
35
46
|
@status_queue = []
|
|
36
47
|
@snapshot_queue = []
|
|
37
48
|
@agent_settings = agent_settings
|
|
@@ -42,6 +53,8 @@ module Datadog
|
|
|
42
53
|
@sleep_remaining = nil
|
|
43
54
|
@wake_scheduled = false
|
|
44
55
|
@thread = nil
|
|
56
|
+
@status_transport = nil
|
|
57
|
+
@snapshot_transport = nil
|
|
45
58
|
@pid = nil
|
|
46
59
|
@flush = 0
|
|
47
60
|
@probe_repository = probe_repository
|
|
@@ -51,6 +64,9 @@ module Datadog
|
|
|
51
64
|
attr_reader :settings
|
|
52
65
|
attr_reader :logger
|
|
53
66
|
attr_reader :telemetry
|
|
67
|
+
# The guardrails metric emitter.
|
|
68
|
+
# @return [GuardrailsTelemetry]
|
|
69
|
+
attr_reader :guardrails_telemetry
|
|
54
70
|
attr_reader :agent_settings
|
|
55
71
|
attr_reader :probe_repository
|
|
56
72
|
attr_reader :probe_notification_builder
|
|
@@ -188,6 +204,9 @@ module Datadog
|
|
|
188
204
|
|
|
189
205
|
attr_reader :last_sent
|
|
190
206
|
|
|
207
|
+
# Builds and memoizes the diagnostics transport for status events.
|
|
208
|
+
#
|
|
209
|
+
# @return [DI::Transport::Diagnostics::Transport]
|
|
191
210
|
def status_transport
|
|
192
211
|
@status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings, logger: logger)
|
|
193
212
|
end
|
|
@@ -196,8 +215,12 @@ module Datadog
|
|
|
196
215
|
status_transport.send_diagnostics(batch)
|
|
197
216
|
end
|
|
198
217
|
|
|
218
|
+
# Builds and memoizes the snapshot input transport.
|
|
219
|
+
#
|
|
220
|
+
# @return [DI::Transport::Input::Transport]
|
|
199
221
|
def snapshot_transport
|
|
200
|
-
@snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger,
|
|
222
|
+
@snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger,
|
|
223
|
+
telemetry: telemetry, guardrails_telemetry: guardrails_telemetry,)
|
|
201
224
|
end
|
|
202
225
|
|
|
203
226
|
# Sends a batch of snapshot payloads to the agent.
|
|
@@ -206,7 +229,7 @@ module Datadog
|
|
|
206
229
|
# serialization failures via callback. This allows healthy probes
|
|
207
230
|
# to continue working even when one probe produces un-serializable data.
|
|
208
231
|
#
|
|
209
|
-
# @param batch [Array<
|
|
232
|
+
# @param batch [Array<SnapshotEvent>] the snapshot events queued for sending
|
|
210
233
|
def do_send_snapshot(batch)
|
|
211
234
|
snapshot_transport.send_input(batch, tags, on_serialization_error: method(:handle_serialization_error))
|
|
212
235
|
end
|
|
@@ -259,6 +282,12 @@ module Datadog
|
|
|
259
282
|
# Signals the background thread to wake up (and do the sending)
|
|
260
283
|
# if it has been more than 1 second since the last send of the same
|
|
261
284
|
# event type.
|
|
285
|
+
#
|
|
286
|
+
# @param event [Hash] the status or snapshot payload to enqueue
|
|
287
|
+
# @param probe [Probe, nil] the probe the payload belongs to, for status log
|
|
288
|
+
# attribution, the queue-full drop event type, and the queued
|
|
289
|
+
# snapshot event's guardrails event type
|
|
290
|
+
# @return [void]
|
|
262
291
|
define_method("add_#{event_type}") do |event, probe: nil|
|
|
263
292
|
# Enqueueing reads DI configuration and writes debug/trace logs, both
|
|
264
293
|
# of which can call stdlib methods (e.g. Set#include? via the
|
|
@@ -275,12 +304,28 @@ module Datadog
|
|
|
275
304
|
begin
|
|
276
305
|
@lock.synchronize do
|
|
277
306
|
queue = send("#{event_type}_queue")
|
|
307
|
+
guardrails_event_type = if event_type == :snapshot
|
|
308
|
+
probe ? GuardrailsTelemetry.probe_event_type_tag(probe) : GuardrailsTelemetry::EVENT_TYPE_SNAPSHOT
|
|
309
|
+
end
|
|
278
310
|
if queue.length > settings.dynamic_instrumentation.internal.snapshot_queue_capacity
|
|
279
311
|
if event_type == :status && probe
|
|
280
312
|
status = event.dig(:debugger, :diagnostics, :status)
|
|
281
|
-
logger.debug
|
|
313
|
+
logger.debug do
|
|
314
|
+
"di: dropping status for #{probe.type} probe at #{probe.location}" \
|
|
315
|
+
" (#{probe.id}): #{status} because queue is full" \
|
|
316
|
+
" (#{GuardrailsTelemetry::Reason::QUEUE_FULL})"
|
|
317
|
+
end
|
|
282
318
|
else
|
|
283
|
-
logger.debug
|
|
319
|
+
logger.debug do
|
|
320
|
+
"di: #{self.class.name}: dropping #{event_type} event because queue is full" \
|
|
321
|
+
" (#{GuardrailsTelemetry::Reason::QUEUE_FULL})"
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
if event_type == :snapshot
|
|
325
|
+
guardrails_telemetry.dropped(
|
|
326
|
+
reason: GuardrailsTelemetry::Reason::QUEUE_FULL,
|
|
327
|
+
event_type: guardrails_event_type,
|
|
328
|
+
)
|
|
284
329
|
end
|
|
285
330
|
else
|
|
286
331
|
if event_type == :status && probe
|
|
@@ -289,7 +334,11 @@ module Datadog
|
|
|
289
334
|
else
|
|
290
335
|
logger.trace { "di: #{self.class.name}: queueing #{event_type} event" }
|
|
291
336
|
end
|
|
292
|
-
queue <<
|
|
337
|
+
queue << if event_type == :snapshot
|
|
338
|
+
SnapshotEvent.new(payload: event, event_type: guardrails_event_type)
|
|
339
|
+
else
|
|
340
|
+
event
|
|
341
|
+
end
|
|
293
342
|
end
|
|
294
343
|
end
|
|
295
344
|
|
|
@@ -307,6 +356,7 @@ module Datadog
|
|
|
307
356
|
# Worker could be not running if the process forked - check and
|
|
308
357
|
# start it again in this case.
|
|
309
358
|
start
|
|
359
|
+
nil
|
|
310
360
|
ensure
|
|
311
361
|
Datadog::DI.leave_probe unless was_in_probe
|
|
312
362
|
end
|
|
@@ -20,7 +20,7 @@ module Datadog
|
|
|
20
20
|
executed_proc.call(context)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def probe_condition_evaluation_failed_callback(context, exc)
|
|
23
|
+
def probe_condition_evaluation_failed_callback(context, _expr, exc)
|
|
24
24
|
if failed_proc.nil?
|
|
25
25
|
raise NotImplementedError, "Failed proc not provided"
|
|
26
26
|
end
|
data/lib/datadog/di/remote.rb
CHANGED
|
@@ -22,7 +22,7 @@ module Datadog
|
|
|
22
22
|
# when DI is explicitly disabled, or the runtime cannot run DI
|
|
23
23
|
# (JRuby, Ruby 2.5), that block — including this bit — is skipped.
|
|
24
24
|
# The enable signal itself is delivered in APM_TRACING payloads and
|
|
25
|
-
# routed here by Tracing::Remote.
|
|
25
|
+
# routed here by Tracing::Remote.merge_and_apply_configs.
|
|
26
26
|
CAPABILITIES = [
|
|
27
27
|
1 << 38, # APM_TRACING_ENABLE_DYNAMIC_INSTRUMENTATION: Implicit DI enablement
|
|
28
28
|
].freeze
|
|
@@ -37,7 +37,7 @@ module Datadog
|
|
|
37
37
|
|
|
38
38
|
# Entry point for the RC-driven DI enable/disable path.
|
|
39
39
|
#
|
|
40
|
-
# Invoked from {Datadog::Tracing::Remote.
|
|
40
|
+
# Invoked from {Datadog::Tracing::Remote.merge_and_apply_configs} when an
|
|
41
41
|
# APM_TRACING payload carries `dynamic_instrumentation_enabled`. Runs
|
|
42
42
|
# on the remote-config thread; never raises.
|
|
43
43
|
#
|
|
@@ -45,7 +45,7 @@ module Datadog
|
|
|
45
45
|
# false to stop it. The `DD_DYNAMIC_INSTRUMENTATION_ENABLED=false`
|
|
46
46
|
# env var blocks an enable here (see {.explicitly_disabled?}).
|
|
47
47
|
# @param repository [Datadog::Core::Remote::Configuration::Repository, nil]
|
|
48
|
-
# the RC repository, passed by {Datadog::Tracing::Remote.
|
|
48
|
+
# the RC repository, passed by {Datadog::Tracing::Remote.apply_lib_config}
|
|
49
49
|
# so that a stopped->started transition can reconcile against probes that
|
|
50
50
|
# were delivered in an earlier poll. nil when called outside the RC
|
|
51
51
|
# dispatch path (e.g. unit tests), in which case no reconcile happens.
|
|
@@ -98,6 +98,9 @@ module Datadog
|
|
|
98
98
|
# and DI.activate_tracking is defined.
|
|
99
99
|
DI.activate_tracking
|
|
100
100
|
was_started = component.started?
|
|
101
|
+
if repository && !was_started
|
|
102
|
+
remove_withdrawn_probes(repository, component)
|
|
103
|
+
end
|
|
101
104
|
component.start!
|
|
102
105
|
# A probe delivered in an earlier poll while the component was stopped
|
|
103
106
|
# was dropped by #receivers (which ignores changes while !started?) and
|
|
@@ -145,7 +148,9 @@ module Datadog
|
|
|
145
148
|
# DEV: Apply this refactor to AppSec as well if implemented.
|
|
146
149
|
|
|
147
150
|
component = DI.component
|
|
148
|
-
if
|
|
151
|
+
if changes.empty?
|
|
152
|
+
remove_withdrawn_probes(repository, component) if component
|
|
153
|
+
elsif component&.started?
|
|
149
154
|
changes.each do |change|
|
|
150
155
|
case change.type
|
|
151
156
|
when :insert
|
|
@@ -176,7 +181,7 @@ module Datadog
|
|
|
176
181
|
|
|
177
182
|
def receiver(products = [PRODUCT], &block)
|
|
178
183
|
matcher = Core::Remote::Dispatcher::Matcher::Product.new(products)
|
|
179
|
-
[Core::Remote::Dispatcher::Receiver.new(matcher, &block)]
|
|
184
|
+
[Core::Remote::Dispatcher::Receiver.new(matcher, initial_reconcile: true, &block)]
|
|
180
185
|
end
|
|
181
186
|
|
|
182
187
|
private
|
|
@@ -266,6 +271,45 @@ module Datadog
|
|
|
266
271
|
end
|
|
267
272
|
end
|
|
268
273
|
|
|
274
|
+
# Removes every probe the component tracks whose id is absent from all
|
|
275
|
+
# LIVE_DEBUGGING contents in the repository. Reconciles backend deletions that
|
|
276
|
+
# produced no delete change for {.receivers}. Skips removal while a
|
|
277
|
+
# LIVE_DEBUGGING content fails to parse, because that content can hold any
|
|
278
|
+
# tracked probe.
|
|
279
|
+
def remove_withdrawn_probes(repository, component)
|
|
280
|
+
# @type var present_probe_ids: Array[String]
|
|
281
|
+
present_probe_ids = []
|
|
282
|
+
content_failed_to_parse = false
|
|
283
|
+
repository.contents.each do |content|
|
|
284
|
+
next unless content.path.product == PRODUCT
|
|
285
|
+
|
|
286
|
+
begin
|
|
287
|
+
present_probe_ids << parse_content(content)["id"]
|
|
288
|
+
rescue => exc
|
|
289
|
+
component.logger.debug do
|
|
290
|
+
"di: skipping withdrawn-probe reconcile, a LIVE_DEBUGGING content failed to parse: " \
|
|
291
|
+
"#{exc.class}: #{exc.message}"
|
|
292
|
+
end
|
|
293
|
+
content_failed_to_parse = true
|
|
294
|
+
break
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
return if content_failed_to_parse
|
|
298
|
+
|
|
299
|
+
probe_repository = component.probe_manager.probe_repository
|
|
300
|
+
tracked_probe_ids = probe_repository.installed_probes.keys | probe_repository.pending_probes.keys
|
|
301
|
+
(tracked_probe_ids - present_probe_ids).each do |probe_id|
|
|
302
|
+
component.logger.trace { "di: removing probe #{probe_id} withdrawn from remote configuration" }
|
|
303
|
+
component.probe_manager.remove_probe(probe_id)
|
|
304
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
305
|
+
Datadog::DI.reraise_if_fatal(exc)
|
|
306
|
+
raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
307
|
+
|
|
308
|
+
component.logger.debug { "di: error removing withdrawn probe #{probe_id}: #{exc.class}: #{exc.message}" }
|
|
309
|
+
component.telemetry&.report(exc, description: "Error removing withdrawn probe")
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
269
313
|
def probe_known?(probe_id, component)
|
|
270
314
|
repo = component.probe_manager.probe_repository
|
|
271
315
|
!!(repo.find_installed(probe_id) ||
|