datadog 2.20.0 → 2.26.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 +212 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +93 -23
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +21 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +9 -4
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +1 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
- data/ext/libdatadog_api/ddsketch.c +106 -0
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/init.c +5 -0
- data/ext/libdatadog_api/library_config.c +34 -25
- data/ext/libdatadog_api/process_discovery.c +24 -18
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/ai_guard/api_client.rb +82 -0
- data/lib/datadog/ai_guard/component.rb +42 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration/settings.rb +98 -0
- data/lib/datadog/ai_guard/configuration.rb +11 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +34 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +81 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +43 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +72 -0
- data/lib/datadog/ai_guard/ext.rb +16 -0
- data/lib/datadog/ai_guard.rb +153 -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 +59 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -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 +26 -5
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- data/lib/datadog/appsec/assets/blocked.html +8 -0
- 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/compressed_json.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +9 -0
- data/lib/datadog/appsec/context.rb +2 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +3 -2
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +3 -1
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -4
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +7 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +3 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +10 -4
- data/lib/datadog/appsec/event.rb +12 -14
- data/lib/datadog/appsec/metrics/collector.rb +19 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +2 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -4
- data/lib/datadog/appsec/remote.rb +34 -25
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/security_engine/engine.rb +3 -3
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +19 -9
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -4
- data/lib/datadog/core/configuration/components.rb +59 -11
- data/lib/datadog/core/configuration/config_helper.rb +100 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +38 -43
- data/lib/datadog/core/configuration/option_definition.rb +4 -11
- data/lib/datadog/core/configuration/options.rb +9 -10
- data/lib/datadog/core/configuration/settings.rb +38 -9
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +373 -0
- data/lib/datadog/core/configuration.rb +2 -2
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- 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 +7 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/process.rb +87 -0
- data/lib/datadog/core/environment/variable_helpers.rb +3 -3
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/metrics/client.rb +2 -2
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +2 -4
- data/lib/datadog/core/process_discovery.rb +48 -23
- data/lib/datadog/core/rate_limiter.rb +9 -1
- data/lib/datadog/core/remote/client/capabilities.rb +7 -0
- data/lib/datadog/core/remote/client.rb +14 -6
- data/lib/datadog/core/remote/component.rb +10 -10
- 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 +4 -25
- data/lib/datadog/core/remote/transport/http/config.rb +10 -50
- 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/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -1
- 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 +69 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +89 -51
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +2 -2
- data/lib/datadog/core/telemetry/logging.rb +2 -8
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -3
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +3 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -11
- data/lib/datadog/core/telemetry/worker.rb +88 -32
- data/lib/datadog/core/transport/ext.rb +2 -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 +9 -5
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http.rb +22 -19
- data/lib/datadog/core/transport/response.rb +15 -1
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/array.rb +29 -0
- 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_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/time.rb +1 -1
- data/lib/datadog/core/utils.rb +2 -0
- data/lib/datadog/core/workers/async.rb +10 -1
- data/lib/datadog/core/workers/interval_loop.rb +44 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +100 -1
- data/lib/datadog/core.rb +2 -0
- data/lib/datadog/data_streams/configuration/settings.rb +49 -0
- data/lib/datadog/data_streams/configuration.rb +11 -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 +509 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +52 -0
- data/lib/datadog/data_streams/transport/http.rb +40 -0
- data/lib/datadog/data_streams/transport/stats.rb +46 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/boot.rb +7 -3
- data/lib/datadog/di/component.rb +14 -16
- data/lib/datadog/di/context.rb +70 -0
- data/lib/datadog/di/contrib/active_record.rb +30 -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 +34 -0
- data/lib/datadog/di/instrumenter.rb +189 -55
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +55 -15
- data/lib/datadog/di/probe_builder.rb +41 -2
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +1 -1
- data/lib/datadog/di/probe_manager.rb +50 -35
- data/lib/datadog/di/probe_notification_builder.rb +121 -70
- data/lib/datadog/di/probe_notifier_worker.rb +5 -5
- data/lib/datadog/di/proc_responder.rb +32 -0
- data/lib/datadog/di/remote.rb +89 -84
- data/lib/datadog/di/serializer.rb +151 -7
- data/lib/datadog/di/transport/diagnostics.rb +8 -36
- data/lib/datadog/di/transport/http/diagnostics.rb +1 -33
- data/lib/datadog/di/transport/http/input.rb +1 -33
- data/lib/datadog/di/transport/http.rb +32 -17
- data/lib/datadog/di/transport/input.rb +67 -34
- data/lib/datadog/di.rb +61 -5
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +2 -3
- data/lib/datadog/open_feature/component.rb +60 -0
- data/lib/datadog/open_feature/configuration.rb +27 -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 +14 -0
- data/lib/datadog/open_feature/native_evaluator.rb +38 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +141 -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 +70 -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 +159 -0
- data/lib/datadog/opentelemetry/metrics.rb +117 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +26 -2
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +35 -0
- data/lib/datadog/opentelemetry.rb +3 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +41 -7
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -2
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +6 -5
- data/lib/datadog/profiling/component.rb +12 -11
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +18 -0
- data/lib/datadog/profiling/ext.rb +2 -1
- data/lib/datadog/profiling/http_transport.rb +5 -2
- data/lib/datadog/profiling/profiler.rb +4 -0
- data/lib/datadog/profiling/tag_builder.rb +36 -3
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling.rb +1 -2
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/tracing/component.rb +6 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +9 -3
- data/lib/datadog/tracing/configuration/settings.rb +89 -10
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/component.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/extensions.rb +10 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- 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 +84 -43
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
- 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/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/rack/middlewares.rb +59 -27
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
- data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +9 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -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 +41 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +3 -2
- data/lib/datadog/tracing/metadata/ext.rb +9 -1
- data/lib/datadog/tracing/remote.rb +1 -9
- data/lib/datadog/tracing/sampling/priority_sampler.rb +3 -1
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +20 -9
- data/lib/datadog/tracing/trace_operation.rb +44 -6
- data/lib/datadog/tracing/tracer.rb +42 -16
- 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 +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
- data/lib/datadog/tracing/transport/traces.rb +9 -71
- data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
- data/lib/datadog/tracing/writer.rb +1 -0
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +3 -0
- metadata +110 -24
- data/ext/libdatadog_api/macos_development.md +0 -26
- 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/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
|
@@ -68,7 +68,7 @@ module Datadog
|
|
|
68
68
|
),
|
|
69
69
|
DetectedConfiguration.new(
|
|
70
70
|
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_HOST} environment variable",
|
|
71
|
-
value:
|
|
71
|
+
value: DATADOG_ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_HOST]
|
|
72
72
|
)
|
|
73
73
|
)
|
|
74
74
|
end
|
|
@@ -87,7 +87,7 @@ module Datadog
|
|
|
87
87
|
),
|
|
88
88
|
try_parsing_as_integer(
|
|
89
89
|
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_PORT} environment variable",
|
|
90
|
-
value:
|
|
90
|
+
value: DATADOG_ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_PORT],
|
|
91
91
|
)
|
|
92
92
|
)
|
|
93
93
|
end
|
|
@@ -118,7 +118,7 @@ module Datadog
|
|
|
118
118
|
try_parsing_as_integer(
|
|
119
119
|
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} " \
|
|
120
120
|
'environment variable',
|
|
121
|
-
value:
|
|
121
|
+
value: DATADOG_ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS],
|
|
122
122
|
)
|
|
123
123
|
)
|
|
124
124
|
end
|
|
@@ -256,7 +256,7 @@ module Datadog
|
|
|
256
256
|
def parsed_url
|
|
257
257
|
return @parsed_url if defined?(@parsed_url)
|
|
258
258
|
|
|
259
|
-
unparsed_url_from_env =
|
|
259
|
+
unparsed_url_from_env = DATADOG_ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_URL]
|
|
260
260
|
|
|
261
261
|
@parsed_url =
|
|
262
262
|
if unparsed_url_from_env
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require_relative 'agent_settings_resolver'
|
|
4
4
|
require_relative 'components_state'
|
|
5
5
|
require_relative 'ext'
|
|
6
|
+
require_relative 'deprecations'
|
|
6
7
|
require_relative '../diagnostics/environment_logger'
|
|
7
8
|
require_relative '../diagnostics/health'
|
|
8
9
|
require_relative '../logger'
|
|
@@ -13,11 +14,14 @@ require_relative '../remote/component'
|
|
|
13
14
|
require_relative '../../tracing/component'
|
|
14
15
|
require_relative '../../profiling/component'
|
|
15
16
|
require_relative '../../appsec/component'
|
|
17
|
+
require_relative '../../ai_guard/component'
|
|
16
18
|
require_relative '../../di/component'
|
|
19
|
+
require_relative '../../open_feature/component'
|
|
17
20
|
require_relative '../../error_tracking/component'
|
|
18
21
|
require_relative '../crashtracking/component'
|
|
19
22
|
require_relative '../environment/agent_info'
|
|
20
23
|
require_relative '../process_discovery'
|
|
24
|
+
require_relative '../../data_streams/processor'
|
|
21
25
|
|
|
22
26
|
module Datadog
|
|
23
27
|
module Core
|
|
@@ -25,8 +29,6 @@ module Datadog
|
|
|
25
29
|
# Global components for the trace library.
|
|
26
30
|
class Components
|
|
27
31
|
class << self
|
|
28
|
-
include Datadog::Tracing::Component
|
|
29
|
-
|
|
30
32
|
def build_health_metrics(settings, logger, telemetry)
|
|
31
33
|
settings = settings.health_metrics
|
|
32
34
|
options = {enabled: settings.enabled}
|
|
@@ -47,6 +49,7 @@ module Datadog
|
|
|
47
49
|
options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
|
|
48
50
|
options[:services] = [settings.service] unless settings.service.nil?
|
|
49
51
|
options[:experimental_runtime_id_enabled] = settings.runtime_metrics.experimental_runtime_id_enabled
|
|
52
|
+
options[:experimental_propagate_process_tags_enabled] = settings.experimental_propagate_process_tags_enabled
|
|
50
53
|
|
|
51
54
|
Core::Runtime::Metrics.new(logger: logger, telemetry: telemetry, **options)
|
|
52
55
|
end
|
|
@@ -76,12 +79,26 @@ module Datadog
|
|
|
76
79
|
|
|
77
80
|
Datadog::Core::Crashtracking::Component.build(settings, agent_settings, logger: logger)
|
|
78
81
|
end
|
|
79
|
-
end
|
|
80
82
|
|
|
81
|
-
|
|
83
|
+
def build_data_streams(settings, agent_settings, logger)
|
|
84
|
+
return unless settings.data_streams.enabled
|
|
85
|
+
|
|
86
|
+
Datadog::DataStreams::Processor.new(
|
|
87
|
+
interval: settings.data_streams.interval,
|
|
88
|
+
logger: logger,
|
|
89
|
+
settings: settings,
|
|
90
|
+
agent_settings: agent_settings
|
|
91
|
+
)
|
|
92
|
+
rescue => e
|
|
93
|
+
logger.warn("Failed to initialize Data Streams Monitoring: #{e.class}: #{e}")
|
|
94
|
+
nil
|
|
95
|
+
end
|
|
96
|
+
end
|
|
82
97
|
|
|
83
98
|
attr_reader \
|
|
84
99
|
:health_metrics,
|
|
100
|
+
:settings,
|
|
101
|
+
:agent_settings,
|
|
85
102
|
:logger,
|
|
86
103
|
:remote,
|
|
87
104
|
:profiler,
|
|
@@ -92,16 +109,22 @@ module Datadog
|
|
|
92
109
|
:error_tracking,
|
|
93
110
|
:dynamic_instrumentation,
|
|
94
111
|
:appsec,
|
|
95
|
-
:
|
|
112
|
+
:ai_guard,
|
|
113
|
+
:agent_info,
|
|
114
|
+
:data_streams,
|
|
115
|
+
:open_feature
|
|
96
116
|
|
|
97
117
|
def initialize(settings)
|
|
118
|
+
@settings = settings
|
|
98
119
|
@logger = self.class.build_logger(settings)
|
|
99
120
|
@environment_logger_extra = {}
|
|
121
|
+
StableConfig.log_result(@logger)
|
|
122
|
+
Deprecations.log_deprecations_from_all_sources(@logger)
|
|
100
123
|
|
|
101
124
|
# This agent_settings is intended for use within Core. If you require
|
|
102
125
|
# agent_settings within a product outside of core you should extend
|
|
103
126
|
# the Core resolver from within your product/component's namespace.
|
|
104
|
-
agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
|
127
|
+
@agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
|
105
128
|
|
|
106
129
|
# Exposes agent capability information for detection by any components
|
|
107
130
|
@agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
|
|
@@ -109,7 +132,7 @@ module Datadog
|
|
|
109
132
|
@telemetry = self.class.build_telemetry(settings, agent_settings, @logger)
|
|
110
133
|
|
|
111
134
|
@remote = Remote::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
|
|
112
|
-
@tracer =
|
|
135
|
+
@tracer = Datadog::Tracing::Component.build_tracer(settings, agent_settings, logger: @logger)
|
|
113
136
|
@crashtracker = self.class.build_crashtracker(settings, agent_settings, logger: @logger)
|
|
114
137
|
|
|
115
138
|
@profiler, profiler_logger_extra = Datadog::Profiling::Component.build_profiler_component(
|
|
@@ -123,17 +146,28 @@ module Datadog
|
|
|
123
146
|
@runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
|
|
124
147
|
@health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
|
|
125
148
|
@appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
|
|
149
|
+
@ai_guard = Datadog::AIGuard::Component.build(settings, logger: @logger, telemetry: telemetry)
|
|
150
|
+
@open_feature = OpenFeature::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
|
|
126
151
|
@dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
|
|
127
152
|
@error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
|
|
153
|
+
@data_streams = self.class.build_data_streams(settings, agent_settings, @logger)
|
|
128
154
|
@environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
|
|
129
|
-
@process_discovery_fd = Core::ProcessDiscovery.get_and_store_metadata(settings, @logger)
|
|
130
155
|
|
|
131
|
-
|
|
156
|
+
# Configure non-privileged components.
|
|
157
|
+
Datadog::Tracing::Contrib::Component.configure(settings)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Hot-swaps with a new sampler.
|
|
161
|
+
# This operation acquires the Components lock to ensure
|
|
162
|
+
# there is no concurrent modification of the sampler.
|
|
163
|
+
def reconfigure_sampler(settings = Datadog.configuration)
|
|
164
|
+
sampler = Datadog::Tracing::Component.build_sampler(settings)
|
|
165
|
+
Datadog.send(:safely_synchronize) { tracer.sampler.sampler = sampler }
|
|
132
166
|
end
|
|
133
167
|
|
|
134
168
|
# Starts up components
|
|
135
169
|
def startup!(settings, old_state: nil)
|
|
136
|
-
telemetry.start(old_state&.telemetry_enabled
|
|
170
|
+
telemetry.start(old_state&.telemetry_enabled?, components: self)
|
|
137
171
|
|
|
138
172
|
if settings.profiling.enabled
|
|
139
173
|
if profiler
|
|
@@ -155,6 +189,11 @@ module Datadog
|
|
|
155
189
|
remote&.start
|
|
156
190
|
end
|
|
157
191
|
|
|
192
|
+
# This should stay here, not in initialize. During reconfiguration, the order of the calls is:
|
|
193
|
+
# initialize new components, shutdown old components, startup new components.
|
|
194
|
+
# Because this is a singleton, if we call it in initialize, it will be shutdown right away.
|
|
195
|
+
Core::ProcessDiscovery.publish(settings)
|
|
196
|
+
|
|
158
197
|
Core::Diagnostics::EnvironmentLogger.collect_and_log!(@environment_logger_extra)
|
|
159
198
|
end
|
|
160
199
|
|
|
@@ -168,9 +207,15 @@ module Datadog
|
|
|
168
207
|
# Shutdown DI after remote, since remote config triggers DI operations.
|
|
169
208
|
dynamic_instrumentation&.shutdown!
|
|
170
209
|
|
|
210
|
+
# Shutdown OpenFeature component
|
|
211
|
+
open_feature&.shutdown!
|
|
212
|
+
|
|
171
213
|
# Decommission AppSec
|
|
172
214
|
appsec&.shutdown!
|
|
173
215
|
|
|
216
|
+
# Shutdown AIGuard component
|
|
217
|
+
ai_guard&.shutdown!
|
|
218
|
+
|
|
174
219
|
# Shutdown the old tracer, unless it's still being used.
|
|
175
220
|
# (e.g. a custom tracer instance passed in.)
|
|
176
221
|
tracer.shutdown! unless replacement && tracer.equal?(replacement.tracer)
|
|
@@ -181,6 +226,9 @@ module Datadog
|
|
|
181
226
|
# Shutdown workers
|
|
182
227
|
runtime_metrics.stop(true, close_metrics: false)
|
|
183
228
|
|
|
229
|
+
# Shutdown Data Streams Monitoring processor
|
|
230
|
+
data_streams&.stop(true)
|
|
231
|
+
|
|
184
232
|
# Shutdown the old metrics, unless they are still being used.
|
|
185
233
|
# (e.g. custom Statsd instances.)
|
|
186
234
|
#
|
|
@@ -210,7 +258,7 @@ module Datadog
|
|
|
210
258
|
telemetry.emit_closing! unless replacement&.telemetry&.enabled
|
|
211
259
|
telemetry.shutdown!
|
|
212
260
|
|
|
213
|
-
|
|
261
|
+
Core::ProcessDiscovery.shutdown!
|
|
214
262
|
end
|
|
215
263
|
|
|
216
264
|
# Returns the current state of various components.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'supported_configurations'
|
|
4
|
+
require_relative '../logger'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Core
|
|
8
|
+
module Configuration
|
|
9
|
+
class ConfigHelper
|
|
10
|
+
def initialize(
|
|
11
|
+
source_env: ENV,
|
|
12
|
+
supported_configurations: SUPPORTED_CONFIGURATION_NAMES,
|
|
13
|
+
aliases: ALIASES,
|
|
14
|
+
alias_to_canonical: ALIAS_TO_CANONICAL,
|
|
15
|
+
raise_on_unknown_env_var: false
|
|
16
|
+
)
|
|
17
|
+
@source_env = source_env
|
|
18
|
+
@supported_configurations = supported_configurations
|
|
19
|
+
@aliases = aliases
|
|
20
|
+
@alias_to_canonical = alias_to_canonical
|
|
21
|
+
@raise_on_unknown_env_var = raise_on_unknown_env_var
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def [](name)
|
|
25
|
+
get_environment_variable(name)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def fetch(name, default_value = UNSET)
|
|
29
|
+
if (item = get_environment_variable(name))
|
|
30
|
+
return item
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return yield(name) if block_given?
|
|
34
|
+
return default_value unless default_value == UNSET
|
|
35
|
+
|
|
36
|
+
raise KeyError, "key not found: #{name}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def key?(name)
|
|
40
|
+
!get_environment_variable(name).nil?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
alias_method :has_key?, :key?
|
|
44
|
+
alias_method :include?, :key?
|
|
45
|
+
alias_method :member?, :key?
|
|
46
|
+
|
|
47
|
+
# Returns the environment variable value if the environment variable is a supported Datadog configuration (starts with DD_ or OTEL_)
|
|
48
|
+
# or if it is not a Datadog configuration. Otherwise, it returns nil.
|
|
49
|
+
#
|
|
50
|
+
# @param name [String] Environment variable name
|
|
51
|
+
# @param default_value [String, nil] Default value to return if the environment variable is not set
|
|
52
|
+
# @param source_env [Hash[String, String]] Environment variables to use
|
|
53
|
+
# @return [String, nil] The environment variable value
|
|
54
|
+
# @raise [RuntimeError] if the configuration is not supported
|
|
55
|
+
def get_environment_variable(name, default_value = nil, source_env: @source_env)
|
|
56
|
+
# datadog-ci-rb is using dd-trace-rb config DSL, which uses this method.
|
|
57
|
+
# Until we've correctly implemented support for datadog-ci-rb, we disable config inversion if ci is enabled.
|
|
58
|
+
if !defined?(::Datadog::CI) &&
|
|
59
|
+
(name.start_with?('DD_', 'OTEL_') || @alias_to_canonical[name]) &&
|
|
60
|
+
!@supported_configurations.include?(name)
|
|
61
|
+
if defined?(@raise_on_unknown_env_var) && @raise_on_unknown_env_var # Only enabled for tests!
|
|
62
|
+
if @alias_to_canonical[name]
|
|
63
|
+
raise "Please use #{@alias_to_canonical[name]} instead of #{name}. See docs/AccessEnvironmentVariables.md for details."
|
|
64
|
+
else
|
|
65
|
+
raise "Missing #{name} env/configuration in \"supported-configurations.json\" file. See docs/AccessEnvironmentVariables.md for details."
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
# TODO: Send telemetry to know if we ever miss an env var
|
|
69
|
+
return nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
env_value = source_env[name]
|
|
73
|
+
if env_value.nil? && @aliases[name]
|
|
74
|
+
@aliases[name].each do |alias_name|
|
|
75
|
+
return source_env[alias_name] if source_env[alias_name]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
env_value || default_value
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Only used in error message creation. Match get_environment_variable logic to return the resolved environment variable name.
|
|
83
|
+
def resolve_env(name, source_env: @source_env)
|
|
84
|
+
if source_env[name].nil? && @aliases[name]
|
|
85
|
+
@aliases[name].each do |alias_name|
|
|
86
|
+
return alias_name if source_env[alias_name]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Anchor object that represents an undefined default value.
|
|
94
|
+
# This is necessary because `nil` is a valid default value.
|
|
95
|
+
UNSET = Object.new
|
|
96
|
+
private_constant :UNSET
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'supported_configurations'
|
|
4
|
+
require_relative '../logger'
|
|
5
|
+
require_relative '../utils/only_once'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Core
|
|
9
|
+
module Configuration
|
|
10
|
+
module Deprecations
|
|
11
|
+
LOG_DEPRECATIONS_ONLY_ONCE = Datadog::Core::Utils::OnlyOnce.new
|
|
12
|
+
|
|
13
|
+
def self.log_deprecations_from_all_sources(logger, deprecations: DEPRECATIONS, alias_to_canonical: ALIAS_TO_CANONICAL)
|
|
14
|
+
LOG_DEPRECATIONS_ONLY_ONCE.run do
|
|
15
|
+
log_deprecated_environment_variables(logger, ENV, 'environment', deprecations, alias_to_canonical)
|
|
16
|
+
customer_config = StableConfig.configuration.dig(:local, :config)
|
|
17
|
+
log_deprecated_environment_variables(logger, customer_config, 'local', deprecations, alias_to_canonical) if customer_config
|
|
18
|
+
fleet_config = StableConfig.configuration.dig(:fleet, :config)
|
|
19
|
+
log_deprecated_environment_variables(logger, fleet_config, 'fleet', deprecations, alias_to_canonical) if fleet_config
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private_class_method def self.log_deprecated_environment_variables(logger, source_env, source_name, deprecations, alias_to_canonical)
|
|
24
|
+
deprecations.each do |deprecated_env_var|
|
|
25
|
+
next unless source_env.key?(deprecated_env_var)
|
|
26
|
+
|
|
27
|
+
Datadog::Core.log_deprecation(disallowed_next_major: false, logger: logger) do
|
|
28
|
+
"#{deprecated_env_var} #{source_name} variable is deprecated" +
|
|
29
|
+
(alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ".")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -15,7 +15,7 @@ module Datadog
|
|
|
15
15
|
# @!attribute [r] precedence_set
|
|
16
16
|
# When this option was last set, what was the value precedence used?
|
|
17
17
|
# @return [Precedence::Value]
|
|
18
|
-
attr_reader :definition, :precedence_set
|
|
18
|
+
attr_reader :definition, :precedence_set
|
|
19
19
|
|
|
20
20
|
# Option setting precedence.
|
|
21
21
|
module Precedence
|
|
@@ -68,7 +68,6 @@ module Datadog
|
|
|
68
68
|
@context = context
|
|
69
69
|
@value = nil
|
|
70
70
|
@is_set = false
|
|
71
|
-
@resolved_env = nil
|
|
72
71
|
|
|
73
72
|
# One value is stored per precedence, to allow unsetting a higher
|
|
74
73
|
# precedence value and falling back to a lower precedence one.
|
|
@@ -84,7 +83,7 @@ module Datadog
|
|
|
84
83
|
#
|
|
85
84
|
# @param value [Object] the new value to be associated with this option
|
|
86
85
|
# @param precedence [Precedence] from what precedence order this new value comes from
|
|
87
|
-
def set(value, precedence: Precedence::PROGRAMMATIC
|
|
86
|
+
def set(value, precedence: Precedence::PROGRAMMATIC)
|
|
88
87
|
# Is there a higher precedence value set?
|
|
89
88
|
if @precedence_set > precedence
|
|
90
89
|
# This should be uncommon, as higher precedence values tend to
|
|
@@ -103,7 +102,7 @@ module Datadog
|
|
|
103
102
|
return @value
|
|
104
103
|
end
|
|
105
104
|
|
|
106
|
-
internal_set(value, precedence
|
|
105
|
+
internal_set(value, precedence)
|
|
107
106
|
end
|
|
108
107
|
|
|
109
108
|
def unset(precedence)
|
|
@@ -121,7 +120,7 @@ module Datadog
|
|
|
121
120
|
# Look for value that is set.
|
|
122
121
|
# The hash `@value_per_precedence` has a custom default value of `UNSET`.
|
|
123
122
|
if (value = @value_per_precedence[p]) != UNSET
|
|
124
|
-
internal_set(value, p
|
|
123
|
+
internal_set(value, p)
|
|
125
124
|
return nil
|
|
126
125
|
end
|
|
127
126
|
end
|
|
@@ -189,7 +188,7 @@ module Datadog
|
|
|
189
188
|
values = value.split(',') # By default we only want to support comma separated strings
|
|
190
189
|
|
|
191
190
|
values.each_with_object({}) do |v, hash| # $ Hash[String, String]
|
|
192
|
-
v.gsub!(/\A[\s,]
|
|
191
|
+
v.gsub!(/\A[\s,]*+|[\s,]*+\Z/, '')
|
|
193
192
|
next if v.empty?
|
|
194
193
|
|
|
195
194
|
pair = v.split(':', 2)
|
|
@@ -203,7 +202,7 @@ module Datadog
|
|
|
203
202
|
values = value.split(',')
|
|
204
203
|
|
|
205
204
|
values.each_with_object([]) do |v, arr| # $ Array[String]
|
|
206
|
-
v.gsub!(/\A[\s,]
|
|
205
|
+
v.gsub!(/\A[\s,]*+|[\s,]*+\Z/, '')
|
|
207
206
|
next if v.empty?
|
|
208
207
|
|
|
209
208
|
arr << v
|
|
@@ -281,12 +280,11 @@ module Datadog
|
|
|
281
280
|
end
|
|
282
281
|
|
|
283
282
|
# Directly manipulates the current value and currently set precedence.
|
|
284
|
-
def internal_set(value, precedence
|
|
283
|
+
def internal_set(value, precedence)
|
|
285
284
|
old_value = @value
|
|
286
285
|
(@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v|
|
|
287
286
|
@is_set = true
|
|
288
287
|
@precedence_set = precedence
|
|
289
|
-
@resolved_env = resolved_env
|
|
290
288
|
# Store original value to ensure we can always safely call `#internal_set`
|
|
291
289
|
# when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
|
|
292
290
|
# on the original value, not on a value that has already been processed by `definition.setter`.
|
|
@@ -308,59 +306,56 @@ module Datadog
|
|
|
308
306
|
end
|
|
309
307
|
|
|
310
308
|
def set_env_value
|
|
311
|
-
value
|
|
312
|
-
set(value, precedence: Precedence::ENVIRONMENT
|
|
309
|
+
value = get_value_from_env
|
|
310
|
+
set(value, precedence: Precedence::ENVIRONMENT) unless value.nil?
|
|
313
311
|
end
|
|
314
312
|
|
|
315
313
|
def set_customer_stable_config_value
|
|
316
314
|
customer_config = StableConfig.configuration.dig(:local, :config)
|
|
317
315
|
return if customer_config.nil?
|
|
318
316
|
|
|
319
|
-
value
|
|
320
|
-
set(value, precedence: Precedence::LOCAL_STABLE
|
|
317
|
+
value = get_value_from(customer_config, 'local')
|
|
318
|
+
set(value, precedence: Precedence::LOCAL_STABLE) unless value.nil?
|
|
321
319
|
end
|
|
322
320
|
|
|
323
321
|
def set_fleet_stable_config_value
|
|
324
322
|
fleet_config = StableConfig.configuration.dig(:fleet, :config)
|
|
325
323
|
return if fleet_config.nil?
|
|
326
324
|
|
|
327
|
-
value
|
|
328
|
-
set(value, precedence: Precedence::FLEET_STABLE
|
|
325
|
+
value = get_value_from(fleet_config, 'fleet')
|
|
326
|
+
set(value, precedence: Precedence::FLEET_STABLE) unless value.nil?
|
|
329
327
|
end
|
|
330
328
|
|
|
331
|
-
def
|
|
332
|
-
|
|
333
|
-
|
|
329
|
+
def get_value_from_env
|
|
330
|
+
env = definition.env
|
|
331
|
+
return unless env
|
|
334
332
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
end
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
deprecated_env = definition.deprecated_env ? env_vars[definition.deprecated_env] : nil
|
|
349
|
-
if value.nil? && deprecated_env
|
|
350
|
-
resolved_env = definition.deprecated_env
|
|
351
|
-
value = coerce_env_variable(deprecated_env)
|
|
333
|
+
value = DATADOG_ENV[env]
|
|
334
|
+
coerce_env_variable(value) unless value.nil?
|
|
335
|
+
rescue ArgumentError
|
|
336
|
+
# This will be raised when the type is set to :int or :float but an invalid env var value is provided.
|
|
337
|
+
raise ArgumentError,
|
|
338
|
+
# ArgumentError will be thrown from coerce_env_variable, so we've already checked that env is not nil.
|
|
339
|
+
# @type var env: String
|
|
340
|
+
"Expected environment variable #{DATADOG_ENV.resolve_env(env)} " \
|
|
341
|
+
"to be a #{definition.type}, but '#{value}' was provided."
|
|
342
|
+
end
|
|
352
343
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
end
|
|
344
|
+
def get_value_from(source_env, source_name)
|
|
345
|
+
env = definition.env
|
|
346
|
+
return unless env
|
|
357
347
|
|
|
358
|
-
|
|
348
|
+
# An instance of ConfigHelper could be used with any Hash but this is the only place where
|
|
349
|
+
# it's used with something else than ENV, let's keep it simple for now by overriding the source_env parameter.
|
|
350
|
+
value = DATADOG_ENV.get_environment_variable(env, source_env: source_env)
|
|
351
|
+
coerce_env_variable(value) unless value.nil?
|
|
359
352
|
rescue ArgumentError
|
|
360
|
-
|
|
353
|
+
# This will be raised when the type is set to :int or :float but an invalid env var value is provided.
|
|
361
354
|
raise ArgumentError,
|
|
362
|
-
|
|
363
|
-
|
|
355
|
+
# ArgumentError will be thrown from coerce_env_variable, so we've already checked that env is not nil.
|
|
356
|
+
# @type var env: String
|
|
357
|
+
"Expected #{source_name} configuration file variable #{DATADOG_ENV.resolve_env(env, source_env: source_env)} " \
|
|
358
|
+
"to be a #{definition.type}, but '#{value}' was provided."
|
|
364
359
|
end
|
|
365
360
|
|
|
366
361
|
# Anchor object that represents a value that is not set.
|
|
@@ -13,7 +13,6 @@ module Datadog
|
|
|
13
13
|
:default,
|
|
14
14
|
:default_proc,
|
|
15
15
|
:env,
|
|
16
|
-
:deprecated_env,
|
|
17
16
|
:env_parser,
|
|
18
17
|
:name,
|
|
19
18
|
:after_set,
|
|
@@ -26,7 +25,6 @@ module Datadog
|
|
|
26
25
|
@default = meta[:default]
|
|
27
26
|
@default_proc = meta[:default_proc]
|
|
28
27
|
@env = meta[:env]
|
|
29
|
-
@deprecated_env = meta[:deprecated_env]
|
|
30
28
|
@env_parser = meta[:env_parser]
|
|
31
29
|
@name = name.to_sym
|
|
32
30
|
@after_set = meta[:after_set]
|
|
@@ -44,14 +42,14 @@ module Datadog
|
|
|
44
42
|
# Acts as DSL for building OptionDefinitions
|
|
45
43
|
# @public_api
|
|
46
44
|
class Builder
|
|
47
|
-
|
|
45
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
46
|
+
InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
48
47
|
|
|
49
48
|
attr_reader \
|
|
50
49
|
:helpers
|
|
51
50
|
|
|
52
51
|
def initialize(name, options = {})
|
|
53
52
|
@env = nil
|
|
54
|
-
@deprecated_env = nil
|
|
55
53
|
@env_parser = nil
|
|
56
54
|
@default = nil
|
|
57
55
|
@default_proc = nil
|
|
@@ -75,10 +73,6 @@ module Datadog
|
|
|
75
73
|
@env = value
|
|
76
74
|
end
|
|
77
75
|
|
|
78
|
-
def deprecated_env(value) # standard:disable Style/TrivialAccessors
|
|
79
|
-
@deprecated_env = value
|
|
80
|
-
end
|
|
81
|
-
|
|
82
76
|
# Invoked when the option is first read, and {#env} is defined.
|
|
83
77
|
# The block provided is only invoked if the environment variable is present (not-nil).
|
|
84
78
|
def env_parser(&block)
|
|
@@ -123,11 +117,11 @@ module Datadog
|
|
|
123
117
|
default(options[:default]) if options.key?(:default)
|
|
124
118
|
default_proc(&options[:default_proc]) if options.key?(:default_proc)
|
|
125
119
|
env(options[:env]) if options.key?(:env)
|
|
126
|
-
deprecated_env(options[:deprecated_env]) if options.key?(:deprecated_env)
|
|
127
120
|
env_parser(&options[:env_parser]) if options.key?(:env_parser)
|
|
128
121
|
after_set(&options[:after_set]) if options.key?(:after_set)
|
|
129
122
|
resetter(&options[:resetter]) if options.key?(:resetter)
|
|
130
|
-
|
|
123
|
+
# Steep: https://github.com/soutaro/steep/issues/1979
|
|
124
|
+
setter(&options[:setter]) if options.key?(:setter) # steep:ignore BlockTypeMismatch
|
|
131
125
|
type(options[:type], **(options[:type_options] || {})) if options.key?(:type)
|
|
132
126
|
end
|
|
133
127
|
|
|
@@ -140,7 +134,6 @@ module Datadog
|
|
|
140
134
|
default: @default,
|
|
141
135
|
default_proc: @default_proc,
|
|
142
136
|
env: @env,
|
|
143
|
-
deprecated_env: @deprecated_env,
|
|
144
137
|
env_parser: @env_parser,
|
|
145
138
|
after_set: @after_set,
|
|
146
139
|
resetter: @resetter,
|
|
@@ -40,14 +40,16 @@ module Datadog
|
|
|
40
40
|
|
|
41
41
|
def default_helpers(name)
|
|
42
42
|
option_name = name.to_sym
|
|
43
|
-
#
|
|
44
|
-
|
|
43
|
+
# Steep: https://github.com/soutaro/steep/issues/335
|
|
44
|
+
# @type var opt_getter: Configuration::OptionDefinition::generic_proc
|
|
45
|
+
opt_getter = proc do # steep:ignore IncompatibleAssignment
|
|
45
46
|
# These Procs uses `get/set_option`, but we only add them to the OptionDefinition helpers here.
|
|
46
47
|
# Steep is right that these methods are not defined, but we only run these Procs in instance context.
|
|
47
48
|
get_option(option_name) # steep:ignore NoMethod
|
|
48
49
|
end
|
|
49
|
-
#
|
|
50
|
-
|
|
50
|
+
# Steep: https://github.com/soutaro/steep/issues/335
|
|
51
|
+
# @type var opt_setter: Configuration::OptionDefinition::generic_proc
|
|
52
|
+
opt_setter = proc do |value| # steep:ignore IncompatibleAssignment
|
|
51
53
|
set_option(option_name, value) # steep:ignore NoMethod
|
|
52
54
|
end
|
|
53
55
|
{
|
|
@@ -73,7 +75,7 @@ module Datadog
|
|
|
73
75
|
end
|
|
74
76
|
|
|
75
77
|
def set_option(name, value, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
|
76
|
-
resolve_option(name).set(value, precedence: precedence
|
|
78
|
+
resolve_option(name).set(value, precedence: precedence)
|
|
77
79
|
end
|
|
78
80
|
|
|
79
81
|
def unset_option(name, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
|
@@ -122,16 +124,13 @@ module Datadog
|
|
|
122
124
|
options[name] = definition.build(self)
|
|
123
125
|
end
|
|
124
126
|
|
|
125
|
-
def resolved_env(name)
|
|
126
|
-
options[name].resolved_env if options.key?(name)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
127
|
def assert_valid_option!(name)
|
|
130
128
|
raise(InvalidOptionError, "#{self.class.name} doesn't define the option: #{name}") unless option_defined?(name)
|
|
131
129
|
end
|
|
132
130
|
end
|
|
133
131
|
|
|
134
|
-
|
|
132
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
133
|
+
InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
135
134
|
end
|
|
136
135
|
end
|
|
137
136
|
end
|