datadog 2.12.1 → 2.17.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 +154 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -14
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +23 -23
- data/ext/libdatadog_api/crashtracker.c +11 -12
- data/ext/libdatadog_api/crashtracker.h +5 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +122 -0
- data/ext/libdatadog_api/library_config.h +19 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +117 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +24 -2
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
- data/lib/datadog/appsec/api_security.rb +9 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
- data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +29 -20
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +93 -28
- data/lib/datadog/appsec/context.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
- data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
- data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +19 -18
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/event.rb +96 -135
- data/lib/datadog/appsec/ext.rb +4 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
- data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
- data/lib/datadog/appsec/processor.rb +1 -1
- data/lib/datadog/appsec/remote.rb +23 -11
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/runner.rb +3 -3
- data/lib/datadog/appsec/security_event.rb +39 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +1 -1
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +50 -31
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/ext.rb +4 -0
- data/lib/datadog/core/configuration/option.rb +79 -43
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +68 -35
- data/lib/datadog/core/configuration/stable_config.rb +23 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/agent_info.rb +4 -3
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -6
- data/lib/datadog/core/environment/git.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/environment/variable_helpers.rb +1 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +20 -21
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery.rb +32 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +40 -32
- data/lib/datadog/core/remote/component.rb +6 -9
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +2 -1
- data/lib/datadog/core/remote/negotiation.rb +9 -9
- data/lib/datadog/core/remote/transport/config.rb +4 -3
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -37
- data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
- data/lib/datadog/core/remote/transport/http.rb +22 -57
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/telemetry/component.rb +78 -53
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +1 -1
- data/lib/datadog/core/telemetry/metric.rb +8 -8
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
- data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
- data/lib/datadog/core/telemetry/transport/http.rb +63 -0
- data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
- data/lib/datadog/core/telemetry/worker.rb +90 -24
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/api/instance.rb +17 -0
- data/lib/datadog/core/transport/http/api/spec.rb +17 -0
- data/lib/datadog/core/transport/http/builder.rb +18 -16
- data/lib/datadog/core/transport/http.rb +39 -2
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +29 -12
- data/lib/datadog/core/workers/interval_loop.rb +12 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/core.rb +8 -0
- data/lib/datadog/di/boot.rb +34 -0
- data/lib/datadog/di/component.rb +0 -2
- data/lib/datadog/di/probe_notification_builder.rb +1 -1
- data/lib/datadog/di/probe_notifier_worker.rb +16 -16
- data/lib/datadog/di/remote.rb +2 -0
- data/lib/datadog/di/transport/diagnostics.rb +4 -3
- data/lib/datadog/di/transport/http/api.rb +2 -12
- data/lib/datadog/di/transport/http/client.rb +4 -3
- data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
- data/lib/datadog/di/transport/http/input.rb +7 -34
- data/lib/datadog/di/transport/http.rb +14 -62
- data/lib/datadog/di/transport/input.rb +4 -3
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +5 -32
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events.rb +12 -0
- data/lib/datadog/kit/identity.rb +5 -1
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +16 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +3 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +3 -4
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +5 -59
- data/lib/datadog/profiling/scheduler.rb +8 -1
- data/lib/datadog/profiling/stack_recorder.rb +4 -4
- data/lib/datadog/profiling/tag_builder.rb +1 -5
- data/lib/datadog/profiling.rb +6 -2
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/component.rb +15 -12
- data/lib/datadog/tracing/configuration/ext.rb +7 -1
- data/lib/datadog/tracing/configuration/settings.rb +18 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- 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 +131 -0
- data/lib/datadog/tracing/distributed/datadog.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +25 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +5 -0
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- data/lib/datadog/tracing/span.rb +10 -1
- data/lib/datadog/tracing/span_event.rb +1 -1
- data/lib/datadog/tracing/span_operation.rb +46 -16
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +44 -24
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +45 -5
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +5 -4
- data/lib/datadog/tracing/transport/http/traces.rb +13 -41
- data/lib/datadog/tracing/transport/http.rb +11 -44
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +26 -9
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
- data/lib/datadog/tracing/writer.rb +2 -6
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +2 -3
- metadata +80 -19
- data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/telemetry/http/env.rb +0 -20
- data/lib/datadog/core/telemetry/http/ext.rb +0 -28
- data/lib/datadog/core/telemetry/http/response.rb +0 -70
- data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -9,20 +9,23 @@ module Datadog
|
|
9
9
|
# Remote
|
10
10
|
module Remote
|
11
11
|
class ReadError < StandardError; end
|
12
|
+
|
12
13
|
class NoRulesError < StandardError; end
|
13
14
|
|
14
15
|
class << self
|
15
|
-
CAP_ASM_RESERVED_1
|
16
|
-
CAP_ASM_ACTIVATION
|
17
|
-
CAP_ASM_IP_BLOCKING
|
18
|
-
CAP_ASM_DD_RULES
|
19
|
-
CAP_ASM_EXCLUSIONS
|
20
|
-
CAP_ASM_REQUEST_BLOCKING
|
21
|
-
CAP_ASM_RESPONSE_BLOCKING
|
22
|
-
CAP_ASM_USER_BLOCKING
|
23
|
-
CAP_ASM_CUSTOM_RULES
|
24
|
-
CAP_ASM_CUSTOM_BLOCKING_RESPONSE
|
25
|
-
CAP_ASM_TRUSTED_IPS
|
16
|
+
CAP_ASM_RESERVED_1 = 1 << 0 # RESERVED
|
17
|
+
CAP_ASM_ACTIVATION = 1 << 1 # Remote activation via ASM_FEATURES product
|
18
|
+
CAP_ASM_IP_BLOCKING = 1 << 2 # accept IP blocking data from ASM_DATA product
|
19
|
+
CAP_ASM_DD_RULES = 1 << 3 # read ASM rules from ASM_DD product
|
20
|
+
CAP_ASM_EXCLUSIONS = 1 << 4 # exclusion filters (passlist) via ASM product
|
21
|
+
CAP_ASM_REQUEST_BLOCKING = 1 << 5 # can block on request info
|
22
|
+
CAP_ASM_RESPONSE_BLOCKING = 1 << 6 # can block on response info
|
23
|
+
CAP_ASM_USER_BLOCKING = 1 << 7 # accept user blocking data from ASM_DATA product
|
24
|
+
CAP_ASM_CUSTOM_RULES = 1 << 8 # accept custom rules
|
25
|
+
CAP_ASM_CUSTOM_BLOCKING_RESPONSE = 1 << 9 # supports custom http code or redirect sa blocking response
|
26
|
+
CAP_ASM_TRUSTED_IPS = 1 << 10 # supports trusted ip
|
27
|
+
CAP_ASM_RASP_SSRF = 1 << 23 # support for server-side request forgery exploit prevention rules
|
28
|
+
CAP_ASM_RASP_SQLI = 1 << 21 # support for SQL injection exploit prevention rules
|
26
29
|
|
27
30
|
# TODO: we need to dynamically add CAP_ASM_ACTIVATION once we support it
|
28
31
|
ASM_CAPABILITIES = [
|
@@ -35,6 +38,8 @@ module Datadog
|
|
35
38
|
CAP_ASM_CUSTOM_RULES,
|
36
39
|
CAP_ASM_CUSTOM_BLOCKING_RESPONSE,
|
37
40
|
CAP_ASM_TRUSTED_IPS,
|
41
|
+
CAP_ASM_RASP_SSRF,
|
42
|
+
CAP_ASM_RASP_SQLI,
|
38
43
|
].freeze
|
39
44
|
|
40
45
|
ASM_PRODUCTS = [
|
@@ -53,10 +58,12 @@ module Datadog
|
|
53
58
|
end
|
54
59
|
|
55
60
|
# rubocop:disable Metrics/MethodLength
|
61
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
56
62
|
def receivers(telemetry)
|
57
63
|
return [] unless remote_features_enabled?
|
58
64
|
|
59
65
|
matcher = Core::Remote::Dispatcher::Matcher::Product.new(ASM_PRODUCTS)
|
66
|
+
# rubocop:disable Metrics/BlockLength
|
60
67
|
receiver = Core::Remote::Dispatcher::Receiver.new(matcher) do |repository, changes|
|
61
68
|
changes.each do |change|
|
62
69
|
Datadog.logger.debug { "remote config change: '#{change.path}'" }
|
@@ -67,6 +74,7 @@ module Datadog
|
|
67
74
|
data = []
|
68
75
|
overrides = []
|
69
76
|
exclusions = []
|
77
|
+
actions = []
|
70
78
|
|
71
79
|
repository.contents.each do |content|
|
72
80
|
parsed_content = parse_content(content)
|
@@ -80,6 +88,7 @@ module Datadog
|
|
80
88
|
overrides << parsed_content['rules_override'] if parsed_content['rules_override']
|
81
89
|
exclusions << parsed_content['exclusions'] if parsed_content['exclusions']
|
82
90
|
custom_rules << parsed_content['custom_rules'] if parsed_content['custom_rules']
|
91
|
+
actions.concat(parsed_content['actions']) if parsed_content['actions']
|
83
92
|
end
|
84
93
|
end
|
85
94
|
|
@@ -97,6 +106,7 @@ module Datadog
|
|
97
106
|
ruleset = AppSec::Processor::RuleMerger.merge(
|
98
107
|
rules: rules,
|
99
108
|
data: data,
|
109
|
+
actions: actions,
|
100
110
|
overrides: overrides,
|
101
111
|
exclusions: exclusions,
|
102
112
|
custom_rules: custom_rules,
|
@@ -109,10 +119,12 @@ module Datadog
|
|
109
119
|
content.applied if ASM_PRODUCTS.include?(content.path.product)
|
110
120
|
end
|
111
121
|
end
|
122
|
+
# rubocop:enable Metrics/BlockLength
|
112
123
|
|
113
124
|
[receiver]
|
114
125
|
end
|
115
126
|
# rubocop:enable Metrics/MethodLength
|
127
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
116
128
|
|
117
129
|
private
|
118
130
|
|
@@ -30,13 +30,13 @@ module Datadog
|
|
30
30
|
|
31
31
|
def block_response(interrupt_params, http_accept_header)
|
32
32
|
content_type = case interrupt_params['type']
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
when nil, 'auto' then content_type(http_accept_header)
|
34
|
+
else FORMAT_TO_CONTENT_TYPE.fetch(interrupt_params['type'], DEFAULT_CONTENT_TYPE)
|
35
|
+
end
|
36
36
|
|
37
37
|
Response.new(
|
38
38
|
status: interrupt_params['status_code']&.to_i || 403,
|
39
|
-
headers: {
|
39
|
+
headers: {'Content-Type' => content_type},
|
40
40
|
body: [content(content_type)],
|
41
41
|
)
|
42
42
|
end
|
@@ -45,8 +45,8 @@ module Datadog
|
|
45
45
|
status_code = interrupt_params['status_code'].to_i
|
46
46
|
|
47
47
|
Response.new(
|
48
|
-
status: (status_code >= 300 && status_code < 400 ? status_code : 303),
|
49
|
-
headers: {
|
48
|
+
status: ((status_code >= 300 && status_code < 400) ? status_code : 303),
|
49
|
+
headers: {'Location' => interrupt_params.fetch('location')},
|
50
50
|
body: [],
|
51
51
|
)
|
52
52
|
end
|
@@ -24,13 +24,13 @@ module Datadog
|
|
24
24
|
persistent_data.reject! do |_, v|
|
25
25
|
next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
|
26
26
|
|
27
|
-
v.nil?
|
27
|
+
v.nil? || v.empty?
|
28
28
|
end
|
29
29
|
|
30
30
|
ephemeral_data.reject! do |_, v|
|
31
31
|
next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
|
32
32
|
|
33
|
-
v.nil?
|
33
|
+
v.nil? || v.empty?
|
34
34
|
end
|
35
35
|
|
36
36
|
_code, result = try_run(persistent_data, ephemeral_data, timeout)
|
@@ -42,7 +42,7 @@ module Datadog
|
|
42
42
|
return Result::Error.new(duration_ext_ns: stop_ns - start_ns)
|
43
43
|
end
|
44
44
|
|
45
|
-
klass = result.status == :match ? Result::Match : Result::Ok
|
45
|
+
klass = (result.status == :match) ? Result::Match : Result::Ok
|
46
46
|
klass.new(
|
47
47
|
events: result.events,
|
48
48
|
actions: result.actions,
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
# A class that represents a security event of any kind. It could be an event
|
6
|
+
# representing an attack or fingerprinting results as derivatives or an API
|
7
|
+
# security check with extracted schema.
|
8
|
+
class SecurityEvent
|
9
|
+
SCHEMA_KEY_PREFIX = '_dd.appsec.s.'
|
10
|
+
FINGERPRINT_KEY_PREFIX = '_dd.appsec.fp.'
|
11
|
+
|
12
|
+
attr_reader :waf_result, :trace, :span
|
13
|
+
|
14
|
+
def initialize(waf_result, trace:, span:)
|
15
|
+
@waf_result = waf_result
|
16
|
+
@trace = trace
|
17
|
+
@span = span
|
18
|
+
end
|
19
|
+
|
20
|
+
def attack?
|
21
|
+
return @is_attack if defined?(@is_attack)
|
22
|
+
|
23
|
+
@is_attack = @waf_result.is_a?(SecurityEngine::Result::Match)
|
24
|
+
end
|
25
|
+
|
26
|
+
def schema?
|
27
|
+
return @has_schema if defined?(@has_schema)
|
28
|
+
|
29
|
+
@has_schema = @waf_result.derivatives.any? { |name, _| name.start_with?(SCHEMA_KEY_PREFIX) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def fingerprint?
|
33
|
+
return @has_fingerprint if defined?(@has_fingerprint)
|
34
|
+
|
35
|
+
@has_fingerprint = @waf_result.derivatives.any? { |name, _| name.start_with?(FINGERPRINT_KEY_PREFIX) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/datadog/appsec/utils.rb
CHANGED
data/lib/datadog/appsec.rb
CHANGED
@@ -44,7 +44,7 @@ module Datadog
|
|
44
44
|
appsec_component.reconfigure_lock(&block)
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def perform_api_security_check?
|
48
48
|
Datadog.configuration.appsec.api_security.enabled &&
|
49
49
|
Datadog.configuration.appsec.api_security.sample_rate.sample?
|
50
50
|
end
|
@@ -40,7 +40,23 @@ module Datadog
|
|
40
40
|
add_all!(underflow) unless underflow.nil?
|
41
41
|
|
42
42
|
# Iteratively replace items, to ensure pseudo-random replacement.
|
43
|
-
overflow
|
43
|
+
overflow&.each { |item| replace!(item) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def unshift(*items)
|
47
|
+
# TODO The existing concat implementation does not always append
|
48
|
+
# to the end of the buffer - if the buffer is full, a random
|
49
|
+
# item is deleted and the new item is added in the position of
|
50
|
+
# removed item.
|
51
|
+
# Therefore, if we want to preserve the item order, concat
|
52
|
+
# would also need to be changed to maintain order.
|
53
|
+
# With the existing implementation, the idea is to not move
|
54
|
+
# existing items around, which is what sets unshift apart from
|
55
|
+
# concat to begin with.
|
56
|
+
#
|
57
|
+
# Since this method currently delegates to +concat+, it does not
|
58
|
+
# have a matching definition in the thread-safe worker.
|
59
|
+
concat(items)
|
44
60
|
end
|
45
61
|
|
46
62
|
# Stored items are returned and the local buffer is reset.
|
@@ -78,7 +94,7 @@ module Datadog
|
|
78
94
|
underflow = nil
|
79
95
|
overflow = nil
|
80
96
|
|
81
|
-
overflow_size = @max_size > 0 ? (@items.length + items.length) - @max_size : 0
|
97
|
+
overflow_size = (@max_size > 0) ? (@items.length + items.length) - @max_size : 0
|
82
98
|
|
83
99
|
if overflow_size > 0
|
84
100
|
# Items will overflow
|
@@ -37,8 +37,8 @@ module Datadog
|
|
37
37
|
case adapter
|
38
38
|
when Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
39
39
|
hostname = self.hostname
|
40
|
-
hostname = "[#{hostname}]" if hostname
|
41
|
-
"#{ssl ?
|
40
|
+
hostname = "[#{hostname}]" if IPV6_REGEXP.match?(hostname)
|
41
|
+
"#{ssl ? "https" : "http"}://#{hostname}:#{port}/"
|
42
42
|
when Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
|
43
43
|
"unix://#{uds_path}"
|
44
44
|
else
|
@@ -158,7 +158,7 @@ module Datadog
|
|
158
158
|
value: settings.agent.timeout_seconds,
|
159
159
|
),
|
160
160
|
try_parsing_as_integer(
|
161
|
-
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} "\
|
161
|
+
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} " \
|
162
162
|
'environment variable',
|
163
163
|
value: ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS],
|
164
164
|
)
|
@@ -338,13 +338,13 @@ module Datadog
|
|
338
338
|
log_warning(
|
339
339
|
'Configuration mismatch: values differ between ' \
|
340
340
|
"#{detected_configurations_in_priority_order
|
341
|
-
.map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(
|
341
|
+
.map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(" and ")}" \
|
342
342
|
". Using #{detected_configurations_in_priority_order.first.value.inspect} and ignoring other configuration."
|
343
343
|
)
|
344
344
|
end
|
345
345
|
|
346
346
|
def log_warning(message)
|
347
|
-
logger
|
347
|
+
logger&.warn(message)
|
348
348
|
end
|
349
349
|
|
350
350
|
def http_scheme?(uri)
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/*
|
4
|
+
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
require_relative 'agent_settings_resolver'
|
8
|
+
|
9
|
+
module Datadog
|
10
|
+
module Core
|
11
|
+
module Configuration
|
12
|
+
# Agent settings resolver for agentless operations (currently, telemetry
|
13
|
+
# in agentless mode).
|
14
|
+
#
|
15
|
+
# The terminology gets a little confusing here, but transports communicate
|
16
|
+
# with servers which are - for most components in the tracer - the
|
17
|
+
# (local) agent. Hence, "agent settings" to refer to where the server
|
18
|
+
# is located. Telemetry supports sending to the local agent but also
|
19
|
+
# implements agentless mode where it sends directly to Datadog intake
|
20
|
+
# endpoints. The agentless mode is configured using different settings,
|
21
|
+
# and this class produces AgentSettings instances when in agentless mode.
|
22
|
+
#
|
23
|
+
# Agentless settings resolver uses the following configuration sources:
|
24
|
+
#
|
25
|
+
# 1. url_override constructor parameter, if provided
|
26
|
+
# 2. Built-in default host/port/TLS settings for the backend
|
27
|
+
# intake endpoint
|
28
|
+
#
|
29
|
+
# The agentless resolver does NOT use agent settings (since it is
|
30
|
+
# for agentless operation), specifically it ignores:
|
31
|
+
#
|
32
|
+
# - c.agent.host
|
33
|
+
# - DD_AGENT_HOST
|
34
|
+
# - c.agent.port
|
35
|
+
# - DD_AGENT_PORT
|
36
|
+
#
|
37
|
+
# However, agentless resolver does respect the timeout specified via
|
38
|
+
# c.agent.timeout_seconds or DD_TRACE_AGENT_TIMEOUT_SECONDS.
|
39
|
+
class AgentlessSettingsResolver < AgentSettingsResolver
|
40
|
+
# To avoid coupling this class to telemetry, the URL override is
|
41
|
+
# taken here as a parameter instead of being read out of
|
42
|
+
# c.telemetry.agentless_url_override. For the same reason, the
|
43
|
+
# +url_override_source+ parameter should be set to the string
|
44
|
+
# "c.telemetry.agentless_url_override".
|
45
|
+
def self.call(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
|
46
|
+
new(
|
47
|
+
settings,
|
48
|
+
host_prefix: host_prefix,
|
49
|
+
url_override: url_override,
|
50
|
+
url_override_source: url_override_source,
|
51
|
+
logger: logger
|
52
|
+
).send(:call)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
attr_reader \
|
58
|
+
:host_prefix,
|
59
|
+
:url_override,
|
60
|
+
:url_override_source
|
61
|
+
|
62
|
+
def initialize(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
|
63
|
+
if url_override && url_override_source.nil?
|
64
|
+
raise ArgumentError, 'url_override_source must be provided when url_override is provided'
|
65
|
+
end
|
66
|
+
|
67
|
+
super(settings, logger: logger)
|
68
|
+
|
69
|
+
@host_prefix = host_prefix
|
70
|
+
@url_override = url_override
|
71
|
+
@url_override_source = url_override_source
|
72
|
+
end
|
73
|
+
|
74
|
+
def hostname
|
75
|
+
if should_use_uds?
|
76
|
+
nil
|
77
|
+
else
|
78
|
+
configured_hostname || "#{host_prefix}.#{settings.site}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def configured_hostname
|
83
|
+
return @configured_hostname if defined?(@configured_hostname)
|
84
|
+
|
85
|
+
if should_use_uds?
|
86
|
+
nil
|
87
|
+
else
|
88
|
+
@configured_hostname = (parsed_url.hostname if parsed_url)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def configured_port
|
93
|
+
return @configured_port if defined?(@configured_port)
|
94
|
+
|
95
|
+
@configured_port = (parsed_url.port if parsed_url)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Note that this method should always return true or false
|
99
|
+
def ssl?
|
100
|
+
if configured_hostname
|
101
|
+
configured_ssl || false
|
102
|
+
else
|
103
|
+
if should_use_uds?
|
104
|
+
false
|
105
|
+
else
|
106
|
+
# If no hostname is specified, we are communicating with the
|
107
|
+
# default Datadog intake, which uses TLS.
|
108
|
+
true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Note that this method can return nil
|
114
|
+
def configured_ssl
|
115
|
+
return @configured_ssl if defined?(@configured_ssl)
|
116
|
+
|
117
|
+
@configured_ssl = (parsed_url_ssl? if parsed_url)
|
118
|
+
end
|
119
|
+
|
120
|
+
def port
|
121
|
+
if configured_port
|
122
|
+
configured_port
|
123
|
+
else
|
124
|
+
if should_use_uds?
|
125
|
+
nil
|
126
|
+
else
|
127
|
+
# If no hostname is specified, we are communicating with the
|
128
|
+
# default Datadog intake, which exists on port 443.
|
129
|
+
443
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def mixed_http_and_uds
|
135
|
+
false
|
136
|
+
end
|
137
|
+
|
138
|
+
def configured_uds_path
|
139
|
+
return @configured_uds_path if defined?(@configured_uds_path)
|
140
|
+
|
141
|
+
parsed_url_uds_path
|
142
|
+
end
|
143
|
+
|
144
|
+
def can_use_uds?
|
145
|
+
# While in theory agentless transport could communicate via UDS,
|
146
|
+
# in practice "agentless" means we are communicating with Datadog
|
147
|
+
# infrastructure which is always remote.
|
148
|
+
# Permit UDS for proxy usage?
|
149
|
+
!configured_uds_path.nil?
|
150
|
+
end
|
151
|
+
|
152
|
+
def parsed_url
|
153
|
+
return @parsed_url if defined?(@parsed_url)
|
154
|
+
|
155
|
+
@parsed_url =
|
156
|
+
if @url_override
|
157
|
+
parsed = URI.parse(@url_override)
|
158
|
+
|
159
|
+
# Agentless URL should never refer to a UDS?
|
160
|
+
if http_scheme?(parsed) || unix_scheme?(parsed)
|
161
|
+
parsed
|
162
|
+
else
|
163
|
+
log_warning(
|
164
|
+
"Invalid URI scheme '#{parsed.scheme}' for #{url_override_source}. " \
|
165
|
+
"Ignoring the contents of #{url_override_source}."
|
166
|
+
)
|
167
|
+
nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# rubocop:enable Style/*
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'agent_settings_resolver'
|
4
|
+
require_relative 'components_state'
|
4
5
|
require_relative 'ext'
|
5
6
|
require_relative '../diagnostics/environment_logger'
|
6
7
|
require_relative '../diagnostics/health'
|
@@ -8,15 +9,15 @@ require_relative '../logger'
|
|
8
9
|
require_relative '../runtime/metrics'
|
9
10
|
require_relative '../telemetry/component'
|
10
11
|
require_relative '../workers/runtime_metrics'
|
11
|
-
|
12
12
|
require_relative '../remote/component'
|
13
13
|
require_relative '../../tracing/component'
|
14
14
|
require_relative '../../profiling/component'
|
15
15
|
require_relative '../../appsec/component'
|
16
16
|
require_relative '../../di/component'
|
17
|
+
require_relative '../../error_tracking/component'
|
17
18
|
require_relative '../crashtracking/component'
|
18
|
-
|
19
19
|
require_relative '../environment/agent_info'
|
20
|
+
require_relative '../process_discovery'
|
20
21
|
|
21
22
|
module Datadog
|
22
23
|
module Core
|
@@ -26,12 +27,12 @@ module Datadog
|
|
26
27
|
class << self
|
27
28
|
include Datadog::Tracing::Component
|
28
29
|
|
29
|
-
def build_health_metrics(settings, logger)
|
30
|
+
def build_health_metrics(settings, logger, telemetry)
|
30
31
|
settings = settings.health_metrics
|
31
|
-
options = {
|
32
|
+
options = {enabled: settings.enabled}
|
32
33
|
options[:statsd] = settings.statsd unless settings.statsd.nil?
|
33
34
|
|
34
|
-
Core::Diagnostics::Health::Metrics.new(logger: logger, **options)
|
35
|
+
Core::Diagnostics::Health::Metrics.new(telemetry: telemetry, logger: logger, **options)
|
35
36
|
end
|
36
37
|
|
37
38
|
def build_logger(settings)
|
@@ -41,23 +42,24 @@ module Datadog
|
|
41
42
|
logger
|
42
43
|
end
|
43
44
|
|
44
|
-
def build_runtime_metrics(settings, logger)
|
45
|
-
options = {
|
45
|
+
def build_runtime_metrics(settings, logger, telemetry)
|
46
|
+
options = {enabled: settings.runtime_metrics.enabled}
|
46
47
|
options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
|
47
48
|
options[:services] = [settings.service] unless settings.service.nil?
|
49
|
+
options[:experimental_runtime_id_enabled] = settings.runtime_metrics.experimental_runtime_id_enabled
|
48
50
|
|
49
|
-
Core::Runtime::Metrics.new(logger: logger, **options)
|
51
|
+
Core::Runtime::Metrics.new(logger: logger, telemetry: telemetry, **options)
|
50
52
|
end
|
51
53
|
|
52
|
-
def build_runtime_metrics_worker(settings, logger)
|
54
|
+
def build_runtime_metrics_worker(settings, logger, telemetry)
|
53
55
|
# NOTE: Should we just ignore building the worker if its not enabled?
|
54
56
|
options = settings.runtime_metrics.opts.merge(
|
55
57
|
enabled: settings.runtime_metrics.enabled,
|
56
|
-
metrics: build_runtime_metrics(settings, logger),
|
58
|
+
metrics: build_runtime_metrics(settings, logger, telemetry),
|
57
59
|
logger: logger,
|
58
60
|
)
|
59
61
|
|
60
|
-
Core::Workers::RuntimeMetrics.new(options)
|
62
|
+
Core::Workers::RuntimeMetrics.new(telemetry: telemetry, **options)
|
61
63
|
end
|
62
64
|
|
63
65
|
def build_telemetry(settings, agent_settings, logger)
|
@@ -67,7 +69,7 @@ module Datadog
|
|
67
69
|
def build_crashtracker(settings, agent_settings, logger:)
|
68
70
|
return unless settings.crashtracking.enabled
|
69
71
|
|
70
|
-
if (libdatadog_api_failure = Datadog::Core::
|
72
|
+
if (libdatadog_api_failure = Datadog::Core::LIBDATADOG_API_FAILURE)
|
71
73
|
logger.debug("Cannot enable crashtracking: #{libdatadog_api_failure}")
|
72
74
|
return
|
73
75
|
end
|
@@ -87,6 +89,7 @@ module Datadog
|
|
87
89
|
:telemetry,
|
88
90
|
:tracer,
|
89
91
|
:crashtracker,
|
92
|
+
:error_tracking,
|
90
93
|
:dynamic_instrumentation,
|
91
94
|
:appsec,
|
92
95
|
:agent_info
|
@@ -101,7 +104,7 @@ module Datadog
|
|
101
104
|
agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
102
105
|
|
103
106
|
# Exposes agent capability information for detection by any components
|
104
|
-
@agent_info = Core::Environment::AgentInfo.new(agent_settings)
|
107
|
+
@agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
|
105
108
|
|
106
109
|
@telemetry = self.class.build_telemetry(settings, agent_settings, @logger)
|
107
110
|
|
@@ -117,17 +120,22 @@ module Datadog
|
|
117
120
|
)
|
118
121
|
@environment_logger_extra.merge!(profiler_logger_extra) if profiler_logger_extra
|
119
122
|
|
120
|
-
@runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger)
|
121
|
-
@health_metrics = self.class.build_health_metrics(settings, @logger)
|
123
|
+
@runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
|
124
|
+
@health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
|
122
125
|
@appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
|
123
126
|
@dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
|
127
|
+
@error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
|
124
128
|
@environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
|
129
|
+
# TODO: Re-enable this once we have updated libdatadog to 17.1
|
130
|
+
# @process_discovery_fd = Core::ProcessDiscovery.get_and_store_metadata(settings, @logger)
|
125
131
|
|
126
132
|
self.class.configure_tracing(settings)
|
127
133
|
end
|
128
134
|
|
129
135
|
# Starts up components
|
130
136
|
def startup!(settings, old_state: nil)
|
137
|
+
telemetry.start(old_state&.telemetry_enabled?)
|
138
|
+
|
131
139
|
if settings.profiling.enabled
|
132
140
|
if profiler
|
133
141
|
profiler.start
|
@@ -138,7 +146,7 @@ module Datadog
|
|
138
146
|
end
|
139
147
|
end
|
140
148
|
|
141
|
-
if settings.remote.enabled && old_state&.
|
149
|
+
if settings.remote.enabled && old_state&.remote_started?
|
142
150
|
# The library was reconfigured and previously it already started
|
143
151
|
# the remote component (i.e., it received at least one request
|
144
152
|
# through the installed Rack middleware which started the remote).
|
@@ -156,20 +164,20 @@ module Datadog
|
|
156
164
|
# and avoid tearing down parts still in use.
|
157
165
|
def shutdown!(replacement = nil)
|
158
166
|
# Shutdown remote configuration
|
159
|
-
remote
|
167
|
+
remote&.shutdown!
|
160
168
|
|
161
169
|
# Shutdown DI after remote, since remote config triggers DI operations.
|
162
170
|
dynamic_instrumentation&.shutdown!
|
163
171
|
|
164
172
|
# Decommission AppSec
|
165
|
-
appsec
|
173
|
+
appsec&.shutdown!
|
166
174
|
|
167
175
|
# Shutdown the old tracer, unless it's still being used.
|
168
176
|
# (e.g. a custom tracer instance passed in.)
|
169
|
-
tracer.shutdown! unless replacement && tracer
|
177
|
+
tracer.shutdown! unless replacement && tracer.equal?(replacement.tracer)
|
170
178
|
|
171
179
|
# Shutdown old profiler
|
172
|
-
profiler
|
180
|
+
profiler&.shutdown!
|
173
181
|
|
174
182
|
# Shutdown workers
|
175
183
|
runtime_metrics.stop(true, close_metrics: false)
|
@@ -187,21 +195,32 @@ module Datadog
|
|
187
195
|
health_metrics.statsd
|
188
196
|
].compact.uniq
|
189
197
|
|
190
|
-
new_statsd =
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
+
new_statsd = if replacement
|
199
|
+
[
|
200
|
+
replacement.runtime_metrics.metrics.statsd,
|
201
|
+
replacement.health_metrics.statsd
|
202
|
+
].compact.uniq
|
203
|
+
else
|
204
|
+
[]
|
205
|
+
end
|
198
206
|
|
199
207
|
unused_statsd = (old_statsd - (old_statsd & new_statsd))
|
200
208
|
unused_statsd.each(&:close)
|
201
209
|
|
202
|
-
# enqueue closing event before stopping telemetry so it will be
|
203
|
-
telemetry.emit_closing! unless replacement
|
204
|
-
telemetry.
|
210
|
+
# enqueue closing event before stopping telemetry so it will be sent out on shutdown
|
211
|
+
telemetry.emit_closing! unless replacement&.telemetry&.enabled
|
212
|
+
telemetry.shutdown!
|
213
|
+
|
214
|
+
# TODO: Re-enable this once we have updated libdatadog to 17.1
|
215
|
+
# Core::ProcessDiscovery._native_close_tracer_memfd(@process_discovery_fd, @logger) if @process_discovery_fd
|
216
|
+
end
|
217
|
+
|
218
|
+
# Returns the current state of various components.
|
219
|
+
def state
|
220
|
+
ComponentsState.new(
|
221
|
+
telemetry_enabled: telemetry.enabled,
|
222
|
+
remote_started: remote&.started?,
|
223
|
+
)
|
205
224
|
end
|
206
225
|
end
|
207
226
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module Core
|
5
|
+
module Configuration
|
6
|
+
# Stores the state of component tree when replacing the tree.
|
7
|
+
class ComponentsState
|
8
|
+
def initialize(telemetry_enabled:, remote_started:)
|
9
|
+
@telemetry_enabled = !!telemetry_enabled
|
10
|
+
@remote_started = !!remote_started
|
11
|
+
end
|
12
|
+
|
13
|
+
def telemetry_enabled?
|
14
|
+
@telemetry_enabled
|
15
|
+
end
|
16
|
+
|
17
|
+
def remote_started?
|
18
|
+
@remote_started
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|