datadog 2.46.0 → 2.48.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 +56 -2
- data/LICENSE-3rdparty.csv +1 -0
- data/ext/datadog_profiling_native_extension/collectors_stack.c +143 -86
- data/ext/datadog_profiling_native_extension/collectors_stack.h +9 -1
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +6 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +7 -13
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +67 -14
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +8 -1
- data/ext/datadog_profiling_native_extension/profiling.c +1 -1
- data/ext/libdatadog_api/extconf.rb +9 -7
- data/ext/libdatadog_api/trace_exporter.c +34 -7
- data/ext/libdatadog_extconf_helpers.rb +2 -2
- data/lib/datadog/ai_guard/component.rb +1 -1
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +1 -9
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +1 -1
- data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +1 -1
- data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +3 -3
- data/lib/datadog/ai_guard/evaluation/client.rb +3 -3
- data/lib/datadog/ai_guard/evaluation.rb +2 -2
- data/lib/datadog/ai_guard/http_client.rb +3 -2
- data/lib/datadog/ai_guard/redaction.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +1 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +3 -3
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +5366 -1517
- data/lib/datadog/appsec/assets/waf_rules/strict.json +2 -2
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +1 -1
- data/lib/datadog/appsec/compressed_json.rb +1 -1
- data/lib/datadog/appsec/configuration.rb +3 -3
- data/lib/datadog/appsec/context.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +11 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +12 -4
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +7 -7
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -5
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +31 -4
- data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +8 -7
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -5
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +8 -7
- data/lib/datadog/appsec/metrics/collector.rb +5 -5
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +3 -3
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/processor/rule_loader.rb +1 -1
- data/lib/datadog/appsec/response.rb +1 -1
- data/lib/datadog/appsec/security_engine/engine.rb +8 -7
- data/lib/datadog/appsec/security_engine/runner.rb +2 -2
- data/lib/datadog/appsec/trace_keeper.rb +1 -1
- data/lib/datadog/appsec.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +14 -13
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/components.rb +12 -11
- data/lib/datadog/core/configuration/components_state.rb +8 -1
- data/lib/datadog/core/configuration/settings.rb +5 -2
- data/lib/datadog/core/configuration/supported_configurations.rb +3 -0
- data/lib/datadog/core/configuration.rb +2 -2
- data/lib/datadog/core/crashtracking/component.rb +1 -1
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/environment/cgroup.rb +2 -2
- data/lib/datadog/core/environment/container.rb +3 -3
- data/lib/datadog/core/metrics/client.rb +6 -6
- data/lib/datadog/core/process_discovery.rb +1 -1
- data/lib/datadog/core/remote/client.rb +44 -3
- data/lib/datadog/core/remote/dispatcher.rb +34 -3
- data/lib/datadog/core/remote/tie/tracing.rb +4 -3
- data/lib/datadog/core/remote/transport/http.rb +2 -2
- data/lib/datadog/core/runtime/metrics.rb +14 -14
- data/lib/datadog/core/semaphore.rb +3 -1
- data/lib/datadog/core/telemetry/event/app_started.rb +9 -9
- data/lib/datadog/core/telemetry/logger.rb +1 -1
- data/lib/datadog/core/telemetry/logging.rb +1 -1
- data/lib/datadog/core/telemetry/request.rb +9 -3
- data/lib/datadog/core/telemetry/transport/http.rb +2 -2
- data/lib/datadog/core/telemetry/worker.rb +1 -1
- data/lib/datadog/core/transport/http/adapters/net.rb +1 -1
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
- data/lib/datadog/core/transport/http/builder.rb +1 -1
- data/lib/datadog/core/transport/http.rb +3 -3
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
- data/lib/datadog/core/workers/async.rb +1 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/data_streams/pathway_context.rb +1 -1
- data/lib/datadog/data_streams/processor.rb +48 -27
- data/lib/datadog/data_streams/transport/http.rb +1 -1
- data/lib/datadog/data_streams.rb +16 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +48 -11
- data/lib/datadog/di/component.rb +73 -2
- data/lib/datadog/di/configuration.rb +19 -0
- data/lib/datadog/di/contrib/active_record.rb +1 -1
- data/lib/datadog/di/el/compiler.rb +4 -4
- data/lib/datadog/di/el/evaluator.rb +247 -43
- data/lib/datadog/di/el/expression.rb +36 -6
- data/lib/datadog/di/error.rb +16 -0
- data/lib/datadog/di/guardrails_telemetry/reason.rb +3 -2
- data/lib/datadog/di/instrumenter.rb +39 -10
- data/lib/datadog/di/probe_notification_builder.rb +58 -10
- data/lib/datadog/di/probe_notifier_worker.rb +1 -1
- data/lib/datadog/di/remote.rb +46 -2
- data/lib/datadog/di/serializer.rb +47 -13
- data/lib/datadog/di.rb +27 -0
- data/lib/datadog/error_tracking/component.rb +1 -1
- data/lib/datadog/error_tracking/configuration.rb +1 -1
- data/lib/datadog/kit/appsec/events/v2.rb +6 -6
- data/lib/datadog/kit/appsec/events.rb +1 -1
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/identity.rb +1 -1
- data/lib/datadog/open_feature/activation.rb +26 -1
- data/lib/datadog/open_feature/agentless/configuration_source.rb +94 -15
- data/lib/datadog/open_feature/component.rb +22 -2
- data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +6 -0
- data/lib/datadog/open_feature/configuration.rb +10 -4
- data/lib/datadog/open_feature/evaluation_engine.rb +62 -4
- data/lib/datadog/open_feature/exposures/buffer.rb +4 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +17 -4
- data/lib/datadog/open_feature/exposures/worker.rb +37 -6
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +5 -5
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +1 -1
- data/lib/datadog/open_feature/hooks/debug_logging_hook.rb +56 -0
- data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
- data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +2 -2
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +1 -1
- data/lib/datadog/open_feature/native_evaluator.rb +1 -1
- data/lib/datadog/open_feature/noop_evaluator.rb +1 -1
- data/lib/datadog/open_feature/provider.rb +69 -12
- data/lib/datadog/open_feature/remote.rb +8 -1
- data/lib/datadog/open_feature/resolution_details.rb +2 -2
- data/lib/datadog/open_feature/transport.rb +6 -6
- data/lib/datadog/opentelemetry/api/context.rb +3 -3
- data/lib/datadog/opentelemetry/logs.rb +5 -5
- data/lib/datadog/opentelemetry/metrics.rb +3 -3
- data/lib/datadog/opentelemetry/sdk/propagator.rb +3 -3
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +2 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +3 -3
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -4
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +37 -6
- data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
- data/lib/datadog/profiling/component.rb +41 -39
- data/lib/datadog/profiling/exporter.rb +4 -6
- data/lib/datadog/profiling/http_transport.rb +3 -3
- data/lib/datadog/profiling/profiler.rb +2 -2
- data/lib/datadog/profiling/scheduler.rb +2 -2
- data/lib/datadog/profiling/tag_builder.rb +1 -1
- data/lib/datadog/symbol_database/extractor.rb +8 -8
- data/lib/datadog/symbol_database/uploader.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +3 -3
- data/lib/datadog/tracing/client_ip.rb +1 -1
- data/lib/datadog/tracing/component.rb +15 -10
- data/lib/datadog/tracing/configuration/dynamic/option.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +2 -0
- data/lib/datadog/tracing/configuration/settings.rb +14 -3
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +8 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +27 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -2
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +17 -12
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +14 -8
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -4
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -1
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +21 -6
- data/lib/datadog/tracing/contrib/http.rb +1 -1
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +14 -8
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +14 -8
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/framework.rb +7 -7
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +17 -10
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_env_parser.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +102 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/waterdrop.rb +1 -1
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +3 -3
- data/lib/datadog/tracing/distributed/datadog.rb +3 -3
- data/lib/datadog/tracing/distributed/propagation.rb +7 -7
- data/lib/datadog/tracing/distributed/trace_context.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +1 -1
- data/lib/datadog/tracing/otel_thread_context.rb +3 -3
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/remote.rb +50 -19
- data/lib/datadog/tracing/sampling/priority_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +1 -1
- data/lib/datadog/tracing/trace_digest.rb +1 -1
- data/lib/datadog/tracing/trace_operation.rb +6 -6
- data/lib/datadog/tracing/tracer.rb +6 -6
- data/lib/datadog/tracing/transport/http/telemetry.rb +1 -1
- data/lib/datadog/tracing/transport/http.rb +2 -2
- data/lib/datadog/tracing/transport/io.rb +1 -1
- data/lib/datadog/tracing/transport/native.rb +3 -3
- data/lib/datadog/tracing/transport/statistics.rb +2 -2
- data/lib/datadog/tracing/transport/telemetry.rb +3 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +12 -12
- data/lib/datadog/tracing/transport/traces.rb +1 -1
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers.rb +1 -1
- data/lib/datadog/version.rb +1 -1
- metadata +9 -8
- data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
|
@@ -54,7 +54,11 @@ module Datadog
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def enqueue(event)
|
|
57
|
-
buffer.push(event)
|
|
57
|
+
unless buffer.push(event)
|
|
58
|
+
@logger.debug { "Feature Flags: exposure not queued: buffer closed" }
|
|
59
|
+
return false
|
|
60
|
+
end
|
|
61
|
+
|
|
58
62
|
start unless running?
|
|
59
63
|
|
|
60
64
|
true
|
|
@@ -84,7 +88,10 @@ module Datadog
|
|
|
84
88
|
break if Core::Utils::Time.get_time - started > wait_time
|
|
85
89
|
end
|
|
86
90
|
|
|
87
|
-
|
|
91
|
+
log_shutdown_outcome(wait_time)
|
|
92
|
+
stopped = stop(true)
|
|
93
|
+
@logger.debug("Feature Flags: exposure worker stopped") unless running?
|
|
94
|
+
stopped
|
|
88
95
|
end
|
|
89
96
|
|
|
90
97
|
private
|
|
@@ -93,23 +100,47 @@ module Datadog
|
|
|
93
100
|
return if events.empty?
|
|
94
101
|
|
|
95
102
|
if dropped.positive?
|
|
96
|
-
@logger.debug
|
|
103
|
+
@logger.debug do
|
|
104
|
+
"Feature Flags: dropped #{dropped} older queued exposure event(s) because the exposure buffer was full"
|
|
105
|
+
end
|
|
97
106
|
end
|
|
98
107
|
|
|
99
108
|
payload = @batch_builder.payload_for(events)
|
|
109
|
+
@logger.debug { "Feature Flags: flushing #{events.size} exposure event(s) to the Datadog Agent" }
|
|
100
110
|
response = @transport.send_exposures(payload)
|
|
101
111
|
|
|
102
|
-
|
|
103
|
-
@logger.debug { "
|
|
112
|
+
if response&.ok?
|
|
113
|
+
@logger.debug { "Feature Flags: sent #{events.size} exposure event(s) to the Datadog Agent" }
|
|
114
|
+
else
|
|
115
|
+
@logger.debug do
|
|
116
|
+
"Feature Flags: exposure upload response was not OK; dropping #{events.size} exposure event(s) " \
|
|
117
|
+
"without retry: #{response.inspect}"
|
|
118
|
+
end
|
|
104
119
|
end
|
|
105
120
|
|
|
106
121
|
response
|
|
107
122
|
rescue => e
|
|
108
|
-
@logger.debug
|
|
123
|
+
@logger.debug do
|
|
124
|
+
"Feature Flags: failed to flush exposure events; dropping #{events.size} exposure event(s) " \
|
|
125
|
+
"without retry: #{e.class}: #{e.message}"
|
|
126
|
+
end
|
|
109
127
|
@telemetry.report(e, description: "OpenFeature: Failed to flush resolution details events")
|
|
110
128
|
|
|
111
129
|
nil
|
|
112
130
|
end
|
|
131
|
+
|
|
132
|
+
def log_shutdown_outcome(wait_time)
|
|
133
|
+
@logger.debug do
|
|
134
|
+
queued = buffer.length
|
|
135
|
+
evicted = buffer.pending_dropped_count
|
|
136
|
+
uploading = !!in_iteration?
|
|
137
|
+
remaining = queued.positive? ? "; #{queued} queued exposure event(s) will not be sent" : "; no queued exposure events remain"
|
|
138
|
+
remaining += "; #{evicted} exposure event(s) evicted from the full buffer were not sent" if evicted.positive?
|
|
139
|
+
outcome = uploading ? "; the in-flight upload may still report sent or dropping during shutdown; if forcibly terminated, its outcome will not be reported" : ""
|
|
140
|
+
"Feature Flags: exposure shutdown wait finished; queued=#{queued}, " \
|
|
141
|
+
"upload_in_progress=#{uploading}, wait_budget=#{wait_time}s#{remaining}#{outcome}"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
113
144
|
end
|
|
114
145
|
end
|
|
115
146
|
end
|
|
@@ -124,7 +124,7 @@ module Datadog
|
|
|
124
124
|
if per_flag_count >= @per_flag_cap
|
|
125
125
|
add_to_degraded(
|
|
126
126
|
flag_key, variant, allocation_key, runtime_default, error_message, evaluation_time_ms,
|
|
127
|
-
observe_full_evaluation_data
|
|
127
|
+
observe_full_evaluation_data,
|
|
128
128
|
)
|
|
129
129
|
return
|
|
130
130
|
end
|
|
@@ -140,7 +140,7 @@ module Datadog
|
|
|
140
140
|
error_message: error_message,
|
|
141
141
|
targeting_key: targeting_key,
|
|
142
142
|
context_attrs: observe_full_evaluation_data ? attrs : nil,
|
|
143
|
-
observe_full_evaluation_data: observe_full_evaluation_data
|
|
143
|
+
observe_full_evaluation_data: observe_full_evaluation_data,
|
|
144
144
|
)
|
|
145
145
|
@full[full_key] = entry
|
|
146
146
|
@global_count += 1
|
|
@@ -148,7 +148,7 @@ module Datadog
|
|
|
148
148
|
# Route to degraded tier
|
|
149
149
|
add_to_degraded(
|
|
150
150
|
flag_key, variant, allocation_key, runtime_default, error_message, evaluation_time_ms,
|
|
151
|
-
observe_full_evaluation_data
|
|
151
|
+
observe_full_evaluation_data,
|
|
152
152
|
)
|
|
153
153
|
end
|
|
154
154
|
end
|
|
@@ -328,7 +328,7 @@ module Datadog
|
|
|
328
328
|
end
|
|
329
329
|
|
|
330
330
|
output[prefix] = string_value.encode(
|
|
331
|
-
Encoding::UTF_8, invalid: :replace, undef: :replace
|
|
331
|
+
Encoding::UTF_8, invalid: :replace, undef: :replace,
|
|
332
332
|
).freeze
|
|
333
333
|
rescue
|
|
334
334
|
# Unsupported caller values must not break flag evaluation.
|
|
@@ -433,7 +433,7 @@ module Datadog
|
|
|
433
433
|
evaluation_time_ms,
|
|
434
434
|
runtime_default: runtime_default,
|
|
435
435
|
error_message: error_message,
|
|
436
|
-
observe_full_evaluation_data: observe_full_evaluation_data
|
|
436
|
+
observe_full_evaluation_data: observe_full_evaluation_data,
|
|
437
437
|
)
|
|
438
438
|
end
|
|
439
439
|
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../ext"
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module OpenFeature
|
|
7
|
+
module Hooks
|
|
8
|
+
# Logs each SDK-final evaluation outcome for onboarding diagnostics.
|
|
9
|
+
#
|
|
10
|
+
# Logs raw flag values, default values, targeting keys, context attributes, and
|
|
11
|
+
# error messages, so it is only registered while debug logging is enabled.
|
|
12
|
+
class DebugLoggingHook
|
|
13
|
+
include ::OpenFeature::SDK::Hooks::Hook if defined?(::OpenFeature::SDK::Hooks::Hook)
|
|
14
|
+
|
|
15
|
+
def self.available?
|
|
16
|
+
!!defined?(::OpenFeature::SDK::Hooks::Hook)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def initialize(logger)
|
|
20
|
+
@logger = logger
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def finally(hook_context:, evaluation_details:, **_opts)
|
|
24
|
+
@logger.debug do
|
|
25
|
+
evaluation_context = hook_context.evaluation_context
|
|
26
|
+
"Feature Flags: evaluated #{hook_context.flag_key.inspect} (" \
|
|
27
|
+
"type=#{hook_context.flag_value_type}, " \
|
|
28
|
+
"default=#{hook_context.default_value.inspect}, " \
|
|
29
|
+
"value=#{evaluation_details.value.inspect}, " \
|
|
30
|
+
"variant=#{evaluation_details.variant.inspect}, " \
|
|
31
|
+
"reason=#{evaluation_details.reason.inspect}, " \
|
|
32
|
+
"allocation=#{extract_allocation_key(evaluation_details).inspect}, " \
|
|
33
|
+
"error_code=#{evaluation_details.error_code.inspect}, " \
|
|
34
|
+
"error_message=#{evaluation_details.error_message.inspect}, " \
|
|
35
|
+
"targeting_key=#{evaluation_context&.targeting_key.inspect}, " \
|
|
36
|
+
"attributes=#{attributes(evaluation_context).inspect}, " \
|
|
37
|
+
"flag_metadata=#{evaluation_details.flag_metadata.inspect})"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def extract_allocation_key(evaluation_details)
|
|
44
|
+
metadata = evaluation_details.flag_metadata
|
|
45
|
+
metadata&.[](Ext::METADATA_ALLOCATION_KEY)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def attributes(evaluation_context)
|
|
49
|
+
return {} unless evaluation_context
|
|
50
|
+
|
|
51
|
+
evaluation_context.fields.reject { |key, _value| key == ::OpenFeature::SDK::EvaluationContext::TARGETING_KEY }
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenFeature
|
|
5
|
+
module Hooks
|
|
6
|
+
class EvaluationTelemetryOptOutHook
|
|
7
|
+
PARAMETER = "dd_evaluation_telemetry_opt_out"
|
|
8
|
+
|
|
9
|
+
def self.opted_out?(evaluation_context)
|
|
10
|
+
evaluation_context&.fields&.[](PARAMETER).equal?(true)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(hook)
|
|
14
|
+
@hook = hook
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def finally(hook_context:, evaluation_details:, **options)
|
|
18
|
+
return if self.class.opted_out?(hook_context.evaluation_context)
|
|
19
|
+
|
|
20
|
+
@hook.finally(hook_context: hook_context, evaluation_details: evaluation_details, **options)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -94,7 +94,7 @@ module Datadog
|
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
96
|
rescue => e
|
|
97
|
-
@logger.debug { "Error capturing span enrichment: #{e.class}: #{e.message}" }
|
|
97
|
+
@logger.debug { "OpenFeature: Error capturing span enrichment: #{e.class}: #{e.message}" }
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
# Provider-close cleanup: mark the hook inactive and drop all accumulated
|
|
@@ -153,7 +153,7 @@ module Datadog
|
|
|
153
153
|
|
|
154
154
|
write_tags_on_root(span_op, finishing_trace_op, state)
|
|
155
155
|
rescue => e
|
|
156
|
-
@logger.debug { "Error writing span enrichment tags: #{e.class}: #{e.message}" }
|
|
156
|
+
@logger.debug { "OpenFeature: Error writing span enrichment tags: #{e.class}: #{e.message}" }
|
|
157
157
|
end
|
|
158
158
|
end
|
|
159
159
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require_relative "ext"
|
|
4
4
|
require_relative "../open_feature"
|
|
5
5
|
require_relative "../core/utils/time"
|
|
6
|
+
require_relative "hooks/evaluation_telemetry_opt_out_hook"
|
|
6
7
|
require "open_feature/sdk"
|
|
7
8
|
|
|
8
9
|
module Datadog
|
|
@@ -67,7 +68,15 @@ module Datadog
|
|
|
67
68
|
|
|
68
69
|
attr_reader :metadata
|
|
69
70
|
|
|
70
|
-
def initialize
|
|
71
|
+
def initialize(enable_evaluation_telemetry_opt_out_parameter: nil)
|
|
72
|
+
@enable_evaluation_telemetry_opt_out_parameter = case enable_evaluation_telemetry_opt_out_parameter
|
|
73
|
+
when nil
|
|
74
|
+
Datadog.configuration.feature_flags.evaluation_telemetry_per_subject_opt_out_enabled
|
|
75
|
+
when true, false
|
|
76
|
+
enable_evaluation_telemetry_opt_out_parameter
|
|
77
|
+
else
|
|
78
|
+
raise ArgumentError, "enable_evaluation_telemetry_opt_out_parameter expects true, false, or nil"
|
|
79
|
+
end
|
|
71
80
|
@metadata = ::OpenFeature::SDK::Provider::ProviderMetadata.new(name: NAME).freeze
|
|
72
81
|
@initialization_mutex = Mutex.new
|
|
73
82
|
@initializing = false
|
|
@@ -99,6 +108,7 @@ module Datadog
|
|
|
99
108
|
@stale_emitted = false
|
|
100
109
|
@stale_pending = false
|
|
101
110
|
end
|
|
111
|
+
Datadog.logger.debug { "Feature Flags: provider initialization started" }
|
|
102
112
|
ready_handler_installed = install_initialization_ready_handler
|
|
103
113
|
|
|
104
114
|
component, failure = OpenFeature.activate_provider(self)
|
|
@@ -117,6 +127,7 @@ module Datadog
|
|
|
117
127
|
case wait_result
|
|
118
128
|
when Component::CONFIGURATION_READY
|
|
119
129
|
@initialization_mutex.synchronize { @initializing = false } unless ready_handler_installed
|
|
130
|
+
Datadog.logger.debug { "Feature Flags: provider initialized successfully" }
|
|
120
131
|
when Component::CONFIGURATION_TIMEOUT
|
|
121
132
|
message = "Feature Flags provider initialization timed out while waiting for configuration"
|
|
122
133
|
Datadog.logger.error(message)
|
|
@@ -164,14 +175,20 @@ module Datadog
|
|
|
164
175
|
)
|
|
165
176
|
end
|
|
166
177
|
OpenFeature.deactivate_provider(self)
|
|
178
|
+
Datadog.logger.debug { "Feature Flags: provider shut down" }
|
|
167
179
|
end
|
|
168
180
|
|
|
169
181
|
def hooks
|
|
170
182
|
component = Datadog.send(:components).open_feature
|
|
171
|
-
[
|
|
183
|
+
telemetry_hooks = [
|
|
172
184
|
component&.flag_eval_metrics_hook,
|
|
173
185
|
component&.flag_eval_evp_hook,
|
|
174
186
|
].compact
|
|
187
|
+
if @enable_evaluation_telemetry_opt_out_parameter
|
|
188
|
+
telemetry_hooks = telemetry_hooks.map { |hook| Hooks::EvaluationTelemetryOptOutHook.new(hook) }
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
[*telemetry_hooks, component&.debug_logging_hook].compact
|
|
175
192
|
end
|
|
176
193
|
|
|
177
194
|
def fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil)
|
|
@@ -222,6 +239,8 @@ module Datadog
|
|
|
222
239
|
def fail_initialization(component, message)
|
|
223
240
|
prepare_initialization_failure(component)
|
|
224
241
|
cancel_initialization_if_shutdown!
|
|
242
|
+
# Non-blocking set_provider surfaces this only as a PROVIDER_ERROR event.
|
|
243
|
+
Datadog.logger.debug { "Feature Flags: provider failed to initialize: #{message}" }
|
|
225
244
|
raise message.to_s
|
|
226
245
|
end
|
|
227
246
|
|
|
@@ -314,7 +333,7 @@ module Datadog
|
|
|
314
333
|
end
|
|
315
334
|
end
|
|
316
335
|
end
|
|
317
|
-
|
|
336
|
+
emit_state_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_READY) if emit_ready
|
|
318
337
|
end
|
|
319
338
|
|
|
320
339
|
def provider_ready(_details)
|
|
@@ -336,7 +355,7 @@ module Datadog
|
|
|
336
355
|
end
|
|
337
356
|
end
|
|
338
357
|
configuration.remove_handler(::OpenFeature::SDK::ProviderEvent::PROVIDER_READY, handler) if handler
|
|
339
|
-
|
|
358
|
+
emit_state_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_STALE) if emit_stale
|
|
340
359
|
end
|
|
341
360
|
|
|
342
361
|
def configuration_changed(event)
|
|
@@ -382,7 +401,25 @@ module Datadog
|
|
|
382
401
|
end
|
|
383
402
|
end
|
|
384
403
|
|
|
385
|
-
|
|
404
|
+
emit_state_event(event_type) if event_type
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
def emit_state_event(event_type)
|
|
408
|
+
log_state_event(event_type)
|
|
409
|
+
emit_event(event_type)
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def log_state_event(event_type)
|
|
413
|
+
logger = Datadog.logger
|
|
414
|
+
logger.debug do
|
|
415
|
+
availability = case event_type
|
|
416
|
+
when ::OpenFeature::SDK::ProviderEvent::PROVIDER_READY
|
|
417
|
+
"; configuration is available"
|
|
418
|
+
when ::OpenFeature::SDK::ProviderEvent::PROVIDER_STALE
|
|
419
|
+
"; configuration is no longer available"
|
|
420
|
+
end
|
|
421
|
+
"Feature Flags: provider emitted #{event_type}#{availability}"
|
|
422
|
+
end
|
|
386
423
|
end
|
|
387
424
|
|
|
388
425
|
def evaluate(flag_key, default_value:, expected_type:, evaluation_context:)
|
|
@@ -392,7 +429,10 @@ module Datadog
|
|
|
392
429
|
flag_meta = nil
|
|
393
430
|
|
|
394
431
|
engine = OpenFeature.engine
|
|
395
|
-
|
|
432
|
+
if engine.nil?
|
|
433
|
+
log_component_not_configured(flag_key, expected_type)
|
|
434
|
+
return component_not_configured_default(default_value, eval_time_ms)
|
|
435
|
+
end
|
|
396
436
|
|
|
397
437
|
result = fetch_engine_value(engine, flag_key, default_value, expected_type, evaluation_context)
|
|
398
438
|
|
|
@@ -406,7 +446,9 @@ module Datadog
|
|
|
406
446
|
# Drive APM span enrichment directly from the evaluation path. This is the only reliable
|
|
407
447
|
# way to attach `ffe_*` tags across all supported OpenFeature SDK versions, since older
|
|
408
448
|
# SDKs do not dispatch provider hooks. Guarded so enrichment can never break evaluation.
|
|
409
|
-
|
|
449
|
+
unless evaluation_telemetry_opted_out?(evaluation_context)
|
|
450
|
+
enrich_span(flag_key, result, evaluation_context)
|
|
451
|
+
end
|
|
410
452
|
|
|
411
453
|
sdk_success_details(result, flag_meta)
|
|
412
454
|
rescue => e
|
|
@@ -414,11 +456,11 @@ module Datadog
|
|
|
414
456
|
error_result = Datadog::OpenFeature::ResolutionDetails.build_error(
|
|
415
457
|
value: default_value,
|
|
416
458
|
error_code: Ext::GENERAL,
|
|
417
|
-
error_message: error_message
|
|
459
|
+
error_message: error_message,
|
|
418
460
|
)
|
|
419
461
|
error_flag_meta = flag_meta
|
|
420
462
|
error_flag_meta ||= build_flag_metadata(
|
|
421
|
-
error_result, eval_time_ms || (Core::Utils::Time.now.to_f * 1000).to_i
|
|
463
|
+
error_result, eval_time_ms || (Core::Utils::Time.now.to_f * 1000).to_i,
|
|
422
464
|
)
|
|
423
465
|
|
|
424
466
|
sdk_error_details(default_value, Ext::GENERAL, error_message, Ext::ERROR, error_flag_meta)
|
|
@@ -429,7 +471,7 @@ module Datadog
|
|
|
429
471
|
flag_key,
|
|
430
472
|
default_value: default_value,
|
|
431
473
|
expected_type: expected_type,
|
|
432
|
-
evaluation_context: evaluation_context
|
|
474
|
+
evaluation_context: evaluation_context,
|
|
433
475
|
)
|
|
434
476
|
end
|
|
435
477
|
|
|
@@ -448,7 +490,7 @@ module Datadog
|
|
|
448
490
|
error_code: error_code,
|
|
449
491
|
error_message: error_message,
|
|
450
492
|
reason: reason,
|
|
451
|
-
flag_metadata: flag_meta
|
|
493
|
+
flag_metadata: flag_meta,
|
|
452
494
|
)
|
|
453
495
|
end
|
|
454
496
|
|
|
@@ -495,6 +537,21 @@ module Datadog
|
|
|
495
537
|
Datadog.send(:components).open_feature&.span_enrichment_hook
|
|
496
538
|
end
|
|
497
539
|
|
|
540
|
+
# No component means no DebugLoggingHook and no raw-data warning, so only non-raw fields are logged.
|
|
541
|
+
def log_component_not_configured(flag_key, expected_type)
|
|
542
|
+
logger = Datadog.logger
|
|
543
|
+
logger.debug do
|
|
544
|
+
"Feature Flags: provider returned the default value for #{flag_key.inspect} (type=#{expected_type}): " \
|
|
545
|
+
"the Feature Flags component is not active; see the provider initialization logs " \
|
|
546
|
+
"(error_code=#{Ext::PROVIDER_FATAL})"
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
def evaluation_telemetry_opted_out?(evaluation_context)
|
|
551
|
+
@enable_evaluation_telemetry_opt_out_parameter &&
|
|
552
|
+
Hooks::EvaluationTelemetryOptOutHook.opted_out?(evaluation_context)
|
|
553
|
+
end
|
|
554
|
+
|
|
498
555
|
def component_not_configured_default(value, eval_time_ms)
|
|
499
556
|
::OpenFeature::SDK::Provider::ResolutionDetails.new(
|
|
500
557
|
value: value,
|
|
@@ -504,7 +561,7 @@ module Datadog
|
|
|
504
561
|
flag_metadata: {
|
|
505
562
|
"dd.eval.timestamp_ms" => eval_time_ms,
|
|
506
563
|
Ext::METADATA_OBSERVE_FULL_EVALUATION_DATA => false,
|
|
507
|
-
}
|
|
564
|
+
},
|
|
508
565
|
)
|
|
509
566
|
end
|
|
510
567
|
end
|
|
@@ -19,7 +19,7 @@ module Datadog
|
|
|
19
19
|
FFE_PRODUCTS
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def receivers(telemetry, component_provider:)
|
|
22
|
+
def receivers(telemetry, component_provider:, logger: Datadog.logger)
|
|
23
23
|
matcher = Core::Remote::Dispatcher::Matcher::Product.new(FFE_PRODUCTS)
|
|
24
24
|
receiver = Core::Remote::Dispatcher::Receiver.new(matcher) do |repository, changes|
|
|
25
25
|
component = component_provider.call
|
|
@@ -27,8 +27,15 @@ module Datadog
|
|
|
27
27
|
|
|
28
28
|
changes.each do |change|
|
|
29
29
|
content = repository[change.path]
|
|
30
|
+
logger.debug do
|
|
31
|
+
version = content ? " (version #{content.version})" : ""
|
|
32
|
+
"Feature Flags: received Remote Configuration #{change.type} for #{change.path}#{version}"
|
|
33
|
+
end
|
|
30
34
|
|
|
31
35
|
unless content || change.type == :delete
|
|
36
|
+
logger.debug do
|
|
37
|
+
"Feature Flags: ignored Remote Configuration #{change.type} for #{change.path}: content is missing"
|
|
38
|
+
end
|
|
32
39
|
next telemetry.error("OpenFeature: Remote Configuration change is not present on #{change.type}")
|
|
33
40
|
end
|
|
34
41
|
|
|
@@ -19,7 +19,7 @@ module Datadog
|
|
|
19
19
|
:extra_logging,
|
|
20
20
|
:log?,
|
|
21
21
|
:error?,
|
|
22
|
-
keyword_init: true
|
|
22
|
+
keyword_init: true,
|
|
23
23
|
)
|
|
24
24
|
def self.build_error(value:, error_code:, error_message:, reason: Ext::ERROR)
|
|
25
25
|
new(
|
|
@@ -29,7 +29,7 @@ module Datadog
|
|
|
29
29
|
reason: reason,
|
|
30
30
|
error?: true,
|
|
31
31
|
log?: false,
|
|
32
|
-
serial_id: nil
|
|
32
|
+
serial_id: nil,
|
|
33
33
|
).freeze
|
|
34
34
|
end
|
|
35
35
|
end
|
|
@@ -18,7 +18,7 @@ module Datadog
|
|
|
18
18
|
class Spec
|
|
19
19
|
def initialize
|
|
20
20
|
@endpoint = Core::Transport::HTTP::API::Endpoint.new(
|
|
21
|
-
:post, "/evp_proxy/v2/api/v2/exposures"
|
|
21
|
+
:post, "/evp_proxy/v2/api/v2/exposures",
|
|
22
22
|
)
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -43,7 +43,7 @@ module Datadog
|
|
|
43
43
|
class FlagevaluationsSpec
|
|
44
44
|
def initialize
|
|
45
45
|
@endpoint = Core::Transport::HTTP::API::Endpoint.new(
|
|
46
|
-
:post, "/evp_proxy/v2/api/v2/flagevaluation"
|
|
46
|
+
:post, "/evp_proxy/v2/api/v2/flagevaluation",
|
|
47
47
|
)
|
|
48
48
|
end
|
|
49
49
|
|
|
@@ -64,7 +64,7 @@ module Datadog
|
|
|
64
64
|
def self.build(agent_settings:, logger:)
|
|
65
65
|
Core::Transport::HTTP.build(
|
|
66
66
|
agent_settings: agent_settings,
|
|
67
|
-
logger: logger
|
|
67
|
+
logger: logger,
|
|
68
68
|
) { |t| t.api("exposures", HTTP::Spec.new) }.to_transport(self)
|
|
69
69
|
end
|
|
70
70
|
|
|
@@ -72,7 +72,7 @@ module Datadog
|
|
|
72
72
|
def self.build_flagevaluations(agent_settings:, logger:)
|
|
73
73
|
Core::Transport::HTTP.build(
|
|
74
74
|
agent_settings: agent_settings,
|
|
75
|
-
logger: logger
|
|
75
|
+
logger: logger,
|
|
76
76
|
) { |t| t.api("flagevaluations", HTTP::FlagevaluationsSpec.new) }.to_transport(self)
|
|
77
77
|
end
|
|
78
78
|
|
|
@@ -85,7 +85,7 @@ module Datadog
|
|
|
85
85
|
encoder = Core::Encoding::JSONEncoder
|
|
86
86
|
parcel = Core::Transport::Parcel.new(
|
|
87
87
|
encoder.encode(payload),
|
|
88
|
-
content_type: encoder.content_type
|
|
88
|
+
content_type: encoder.content_type,
|
|
89
89
|
)
|
|
90
90
|
request = Core::Transport::Request.new(parcel)
|
|
91
91
|
|
|
@@ -106,7 +106,7 @@ module Datadog
|
|
|
106
106
|
encoder = Core::Encoding::JSONEncoder
|
|
107
107
|
parcel = Core::Transport::Parcel.new(
|
|
108
108
|
encoder.encode(payload),
|
|
109
|
-
content_type: encoder.content_type
|
|
109
|
+
content_type: encoder.content_type,
|
|
110
110
|
)
|
|
111
111
|
request = Core::Transport::Request.new(parcel)
|
|
112
112
|
|
|
@@ -77,7 +77,7 @@ module Datadog
|
|
|
77
77
|
# It effectively becomes an internal trace propagation.
|
|
78
78
|
trace = Datadog::OpenTelemetry::Trace.start_trace_copy(
|
|
79
79
|
current_span.datadog_trace,
|
|
80
|
-
parent_span: current_span.datadog_span
|
|
80
|
+
parent_span: current_span.datadog_span,
|
|
81
81
|
)
|
|
82
82
|
end
|
|
83
83
|
|
|
@@ -143,8 +143,8 @@ module Datadog
|
|
|
143
143
|
unless calls_matched
|
|
144
144
|
::OpenTelemetry.handle_error(
|
|
145
145
|
exception: ::OpenTelemetry::Context::DetachError.new(
|
|
146
|
-
"calls to detach should match corresponding calls to attach."
|
|
147
|
-
)
|
|
146
|
+
"calls to detach should match corresponding calls to attach.",
|
|
147
|
+
),
|
|
148
148
|
)
|
|
149
149
|
end
|
|
150
150
|
|
|
@@ -13,7 +13,7 @@ module Datadog
|
|
|
13
13
|
true
|
|
14
14
|
rescue => exc
|
|
15
15
|
components.logger.warn(
|
|
16
|
-
"Failed to initialize OpenTelemetry logs: #{exc.class}: #{exc.message}\n#{(exc.backtrace || []).join("\n")}"
|
|
16
|
+
"Failed to initialize OpenTelemetry logs: #{exc.class}: #{exc.message}\n#{(exc.backtrace || []).join("\n")}",
|
|
17
17
|
)
|
|
18
18
|
false
|
|
19
19
|
end
|
|
@@ -42,7 +42,7 @@ module Datadog
|
|
|
42
42
|
def disable_log_injection
|
|
43
43
|
@logger.warn("OTel logs enabled: disabling Datadog log injection to prevent duplicate trace correlation fields")
|
|
44
44
|
Datadog.configure do |c|
|
|
45
|
-
c.tracing.log_injection = false
|
|
45
|
+
c.tracing.log_injection = false
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -67,7 +67,7 @@ module Datadog
|
|
|
67
67
|
endpoint = config_or_exporter_fallback(
|
|
68
68
|
signal: :logs,
|
|
69
69
|
option_name: :endpoint,
|
|
70
|
-
computed_default: default_logs_endpoint
|
|
70
|
+
computed_default: default_logs_endpoint,
|
|
71
71
|
)
|
|
72
72
|
timeout = config_or_exporter_fallback(signal: :logs, option_name: :timeout_millis)
|
|
73
73
|
headers = config_or_exporter_fallback(signal: :logs, option_name: :headers)
|
|
@@ -77,7 +77,7 @@ module Datadog
|
|
|
77
77
|
exporter = Datadog::OpenTelemetry::SDK::LogsExporter.new(
|
|
78
78
|
endpoint: endpoint,
|
|
79
79
|
timeout: timeout / 1000.0,
|
|
80
|
-
headers: headers
|
|
80
|
+
headers: headers,
|
|
81
81
|
)
|
|
82
82
|
|
|
83
83
|
processor = ::OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
|
|
@@ -85,7 +85,7 @@ module Datadog
|
|
|
85
85
|
max_queue_size: logs_config.max_queue_size,
|
|
86
86
|
schedule_delay: logs_config.schedule_delay_millis,
|
|
87
87
|
exporter_timeout: logs_config.export_timeout_millis,
|
|
88
|
-
max_export_batch_size: logs_config.max_export_batch_size
|
|
88
|
+
max_export_batch_size: logs_config.max_export_batch_size,
|
|
89
89
|
)
|
|
90
90
|
provider.add_log_record_processor(processor)
|
|
91
91
|
true
|
|
@@ -63,7 +63,7 @@ module Datadog
|
|
|
63
63
|
endpoint = config_or_exporter_fallback(
|
|
64
64
|
signal: :metrics,
|
|
65
65
|
option_name: :endpoint,
|
|
66
|
-
computed_default: default_metrics_endpoint
|
|
66
|
+
computed_default: default_metrics_endpoint,
|
|
67
67
|
)
|
|
68
68
|
timeout = config_or_exporter_fallback(signal: :metrics, option_name: :timeout_millis)
|
|
69
69
|
headers = config_or_exporter_fallback(signal: :metrics, option_name: :headers)
|
|
@@ -73,13 +73,13 @@ module Datadog
|
|
|
73
73
|
exporter = Datadog::OpenTelemetry::SDK::MetricsExporter.new(
|
|
74
74
|
endpoint: endpoint,
|
|
75
75
|
timeout: timeout / 1000.0,
|
|
76
|
-
headers: headers
|
|
76
|
+
headers: headers,
|
|
77
77
|
)
|
|
78
78
|
|
|
79
79
|
reader = ::OpenTelemetry::SDK::Metrics::Export::PeriodicMetricReader.new(
|
|
80
80
|
exporter: exporter,
|
|
81
81
|
export_interval_millis: metrics_config.export_interval_millis,
|
|
82
|
-
export_timeout_millis: metrics_config.export_timeout_millis
|
|
82
|
+
export_timeout_millis: metrics_config.export_timeout_millis,
|
|
83
83
|
)
|
|
84
84
|
provider.add_metric_reader(reader)
|
|
85
85
|
rescue LoadError => e
|
|
@@ -19,7 +19,7 @@ module Datadog
|
|
|
19
19
|
Datadog.logger.error(
|
|
20
20
|
"Custom setter is not supported. Please inform the `datadog` team at " \
|
|
21
21
|
" https://github.com/DataDog/dd-trace-rb of your use case so we can best support you. Using the default " \
|
|
22
|
-
"OpenTelemetry::Context::Propagation.text_map_setter as a fallback setter."
|
|
22
|
+
"OpenTelemetry::Context::Propagation.text_map_setter as a fallback setter.",
|
|
23
23
|
)
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -36,7 +36,7 @@ module Datadog
|
|
|
36
36
|
Datadog.logger.error(
|
|
37
37
|
"Custom getter #{getter} is not supported. Please inform the `datadog` team at " \
|
|
38
38
|
" https://github.com/DataDog/dd-trace-rb of your use case so we can best support you. Using the default " \
|
|
39
|
-
"OpenTelemetry::Context::Propagation.text_map_getter as a fallback getter."
|
|
39
|
+
"OpenTelemetry::Context::Propagation.text_map_getter as a fallback getter.",
|
|
40
40
|
)
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -75,7 +75,7 @@ module Datadog
|
|
|
75
75
|
span_id: span_id,
|
|
76
76
|
trace_flags: trace_flags,
|
|
77
77
|
tracestate: tracestate,
|
|
78
|
-
remote: true
|
|
78
|
+
remote: true,
|
|
79
79
|
)
|
|
80
80
|
|
|
81
81
|
span = ::OpenTelemetry::Trace.non_recording_span(span_context)
|