datadog 2.22.0 → 2.24.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 +100 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +1 -58
- 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/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/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/init.c +2 -0
- data/ext/libdatadog_api/library_config.c +12 -11
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/api_security/route_extractor.rb +23 -6
- 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.rb +1 -1
- data/lib/datadog/appsec/context.rb +2 -1
- data/lib/datadog/appsec/remote.rb +5 -9
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/security_engine/result.rb +2 -1
- data/lib/datadog/core/configuration/components.rb +30 -3
- data/lib/datadog/core/configuration/config_helper.rb +2 -2
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option_definition.rb +4 -2
- data/lib/datadog/core/configuration/options.rb +8 -5
- data/lib/datadog/core/configuration/settings.rb +28 -3
- data/lib/datadog/core/configuration/supported_configurations.rb +332 -302
- data/lib/datadog/core/ddsketch.rb +0 -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 -0
- data/lib/datadog/core/environment/process.rb +87 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- 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 +6 -4
- 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/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +59 -16
- data/lib/datadog/core/telemetry/event/app_started.rb +86 -49
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- 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 +9 -0
- 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 +3 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- 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/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/component.rb +0 -16
- data/lib/datadog/di/contrib/active_record.rb +31 -5
- data/lib/datadog/di/el/compiler.rb +8 -4
- data/lib/datadog/di/el/evaluator.rb +1 -1
- data/lib/datadog/di/error.rb +9 -0
- data/lib/datadog/di/instrumenter.rb +93 -34
- data/lib/datadog/di/probe.rb +20 -0
- data/lib/datadog/di/probe_builder.rb +2 -1
- data/lib/datadog/di/probe_manager.rb +47 -33
- data/lib/datadog/di/probe_notification_builder.rb +77 -25
- data/lib/datadog/di/proc_responder.rb +32 -0
- data/lib/datadog/di/remote.rb +89 -84
- 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/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 +25 -1
- 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 +1 -1
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/info.rb +2 -1
- data/lib/datadog/profiling/component.rb +12 -11
- data/lib/datadog/profiling/http_transport.rb +4 -1
- data/lib/datadog/profiling/profiler.rb +4 -0
- data/lib/datadog/profiling/tag_builder.rb +36 -3
- data/lib/datadog/profiling.rb +1 -2
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/tracing/configuration/ext.rb +9 -0
- data/lib/datadog/tracing/configuration/settings.rb +74 -0
- 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/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/unified_trace.rb +22 -17
- 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/route_inference.rb +53 -0
- 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/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 +37 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +1 -1
- data/lib/datadog/tracing/remote.rb +1 -9
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +9 -4
- 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 +2 -0
- metadata +78 -21
- 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
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'zlib'
|
|
4
|
-
require_relative 'lru_cache'
|
|
5
4
|
require_relative 'route_extractor'
|
|
6
5
|
require_relative '../../core/utils/time'
|
|
6
|
+
require_relative '../../core/utils/lru_cache'
|
|
7
7
|
|
|
8
8
|
module Datadog
|
|
9
9
|
module AppSec
|
|
@@ -37,20 +37,23 @@ module Datadog
|
|
|
37
37
|
def initialize(sample_delay)
|
|
38
38
|
raise ArgumentError, 'sample_delay must be an Integer' unless sample_delay.is_a?(Integer)
|
|
39
39
|
|
|
40
|
-
@cache = LRUCache.new(MAX_CACHE_SIZE)
|
|
40
|
+
@cache = Core::Utils::LRUCache.new(MAX_CACHE_SIZE)
|
|
41
41
|
@sample_delay_seconds = sample_delay
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def sample?(request, response)
|
|
45
45
|
return true if @sample_delay_seconds.zero?
|
|
46
|
+
return false if response.status == 404
|
|
46
47
|
|
|
47
|
-
|
|
48
|
+
route_pattern = RouteExtractor.route_pattern(request).to_s
|
|
49
|
+
|
|
50
|
+
key = Zlib.crc32("#{request.request_method}#{route_pattern}#{response.status}")
|
|
48
51
|
current_timestamp = Core::Utils::Time.now.to_i
|
|
49
52
|
cached_timestamp = @cache[key] || 0
|
|
50
53
|
|
|
51
54
|
return false if current_timestamp - cached_timestamp <= @sample_delay_seconds
|
|
52
55
|
|
|
53
|
-
@cache
|
|
56
|
+
@cache[key] = current_timestamp
|
|
54
57
|
true
|
|
55
58
|
end
|
|
56
59
|
end
|
|
@@ -82,12 +82,20 @@
|
|
|
82
82
|
footer p {
|
|
83
83
|
font-size: 16px
|
|
84
84
|
}
|
|
85
|
+
|
|
86
|
+
.security-response-id {
|
|
87
|
+
font-size:14px;
|
|
88
|
+
color:#999;
|
|
89
|
+
margin-top:20px;
|
|
90
|
+
font-family:monospace
|
|
91
|
+
}
|
|
85
92
|
</style>
|
|
86
93
|
</head>
|
|
87
94
|
|
|
88
95
|
<body>
|
|
89
96
|
<main>
|
|
90
97
|
<p>Sorry, you cannot access this page. Please contact the customer service team.</p>
|
|
98
|
+
<p class="security-response-id">Security Response ID: [security_response_id]</p>
|
|
91
99
|
</main>
|
|
92
100
|
<footer>
|
|
93
101
|
<p>Security provided by <a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"errors":
|
|
1
|
+
{"errors":[{"title":"You've been blocked","detail":"Sorry, you cannot access this page. Please contact the customer service team. Security provided by Datadog."}],"security_response_id":"[security_response_id]"}
|
|
@@ -7,7 +7,8 @@ module Datadog
|
|
|
7
7
|
# This class accumulates the context over the request life-cycle and exposes
|
|
8
8
|
# interface sufficient for instrumentation to perform threat detection.
|
|
9
9
|
class Context
|
|
10
|
-
|
|
10
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
11
|
+
ActiveContextError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
11
12
|
|
|
12
13
|
# TODO: add delegators for active trace span
|
|
13
14
|
attr_reader :trace, :span, :events
|
|
@@ -7,8 +7,6 @@ module Datadog
|
|
|
7
7
|
module AppSec
|
|
8
8
|
# Remote
|
|
9
9
|
module Remote
|
|
10
|
-
class ReadError < StandardError; end
|
|
11
|
-
|
|
12
10
|
class NoRulesError < StandardError; end
|
|
13
11
|
|
|
14
12
|
class << self
|
|
@@ -23,6 +21,8 @@ module Datadog
|
|
|
23
21
|
CAP_ASM_CUSTOM_RULES = 1 << 8
|
|
24
22
|
CAP_ASM_CUSTOM_BLOCKING_RESPONSE = 1 << 9
|
|
25
23
|
CAP_ASM_TRUSTED_IPS = 1 << 10
|
|
24
|
+
CAP_ASM_PROCESSOR_OVERRIDES = 1 << 16
|
|
25
|
+
CAP_ASM_CUSTOM_DATA_SCANNERS = 1 << 17
|
|
26
26
|
CAP_ASM_RASP_SSRF = 1 << 23
|
|
27
27
|
CAP_ASM_RASP_SQLI = 1 << 21
|
|
28
28
|
CAP_ASM_AUTO_USER_INSTRUM_MODE = 1 << 31
|
|
@@ -43,6 +43,8 @@ module Datadog
|
|
|
43
43
|
CAP_ASM_CUSTOM_RULES,
|
|
44
44
|
CAP_ASM_CUSTOM_BLOCKING_RESPONSE,
|
|
45
45
|
CAP_ASM_TRUSTED_IPS,
|
|
46
|
+
CAP_ASM_PROCESSOR_OVERRIDES,
|
|
47
|
+
CAP_ASM_CUSTOM_DATA_SCANNERS,
|
|
46
48
|
CAP_ASM_RASP_SSRF,
|
|
47
49
|
CAP_ASM_RASP_SQLI,
|
|
48
50
|
CAP_ASM_AUTO_USER_INSTRUM_MODE,
|
|
@@ -105,13 +107,7 @@ module Datadog
|
|
|
105
107
|
end
|
|
106
108
|
|
|
107
109
|
def parse_content(content)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
content.data.rewind
|
|
111
|
-
|
|
112
|
-
raise ReadError, 'EOF reached' if data.nil?
|
|
113
|
-
|
|
114
|
-
JSON.parse(data)
|
|
110
|
+
JSON.parse(content.data)
|
|
115
111
|
end
|
|
116
112
|
end
|
|
117
113
|
end
|
|
@@ -7,6 +7,8 @@ module Datadog
|
|
|
7
7
|
module AppSec
|
|
8
8
|
# AppSec response
|
|
9
9
|
class Response
|
|
10
|
+
SECURITY_RESPONSE_ID_PLACEHOLDER = '[security_response_id]'
|
|
11
|
+
|
|
10
12
|
attr_reader :status, :headers, :body
|
|
11
13
|
|
|
12
14
|
def initialize(status:, headers: {}, body: [])
|
|
@@ -37,16 +39,26 @@ module Datadog
|
|
|
37
39
|
Response.new(
|
|
38
40
|
status: interrupt_params['status_code']&.to_i || 403,
|
|
39
41
|
headers: {'Content-Type' => content_type},
|
|
40
|
-
body: [
|
|
42
|
+
body: [
|
|
43
|
+
content(
|
|
44
|
+
security_response_id: interrupt_params['security_response_id'],
|
|
45
|
+
content_type: content_type
|
|
46
|
+
)
|
|
47
|
+
],
|
|
41
48
|
)
|
|
42
49
|
end
|
|
43
50
|
|
|
44
51
|
def redirect_response(interrupt_params)
|
|
45
52
|
status_code = interrupt_params['status_code'].to_i
|
|
53
|
+
location = interrupt_params.fetch('location')
|
|
54
|
+
|
|
55
|
+
if (security_response_id = interrupt_params.fetch('security_response_id'))
|
|
56
|
+
location.gsub!(SECURITY_RESPONSE_ID_PLACEHOLDER, security_response_id)
|
|
57
|
+
end
|
|
46
58
|
|
|
47
59
|
Response.new(
|
|
48
60
|
status: ((status_code >= 300 && status_code < 400) ? status_code : 303),
|
|
49
|
-
headers: {'Location' =>
|
|
61
|
+
headers: {'Location' => location},
|
|
50
62
|
body: [],
|
|
51
63
|
)
|
|
52
64
|
end
|
|
@@ -82,16 +94,18 @@ module Datadog
|
|
|
82
94
|
DEFAULT_CONTENT_TYPE
|
|
83
95
|
end
|
|
84
96
|
|
|
85
|
-
def content(content_type)
|
|
97
|
+
def content(security_response_id:, content_type:)
|
|
86
98
|
content_format = CONTENT_TYPE_TO_FORMAT[content_type]
|
|
87
99
|
|
|
88
100
|
using_default = Datadog.configuration.appsec.block.templates.using_default?(content_format)
|
|
89
101
|
|
|
90
|
-
if using_default
|
|
102
|
+
template = if using_default
|
|
91
103
|
Datadog::AppSec::Assets.blocked(format: content_format)
|
|
92
104
|
else
|
|
93
105
|
Datadog.configuration.appsec.block.templates.send(content_format)
|
|
94
106
|
end
|
|
107
|
+
|
|
108
|
+
template.gsub(SECURITY_RESPONSE_ID_PLACEHOLDER, security_response_id.to_s)
|
|
95
109
|
end
|
|
96
110
|
end
|
|
97
111
|
end
|
|
@@ -70,7 +70,8 @@ module Datadog
|
|
|
70
70
|
|
|
71
71
|
def initialize(duration_ext_ns:, input_truncated:)
|
|
72
72
|
@events = []
|
|
73
|
-
@actions =
|
|
73
|
+
@actions = {}.freeze
|
|
74
|
+
@attributes = {}.freeze
|
|
74
75
|
@duration_ns = 0
|
|
75
76
|
@duration_ext_ns = duration_ext_ns
|
|
76
77
|
@input_truncated = !!input_truncated
|
|
@@ -15,10 +15,12 @@ require_relative '../../tracing/component'
|
|
|
15
15
|
require_relative '../../profiling/component'
|
|
16
16
|
require_relative '../../appsec/component'
|
|
17
17
|
require_relative '../../di/component'
|
|
18
|
+
require_relative '../../open_feature/component'
|
|
18
19
|
require_relative '../../error_tracking/component'
|
|
19
20
|
require_relative '../crashtracking/component'
|
|
20
21
|
require_relative '../environment/agent_info'
|
|
21
22
|
require_relative '../process_discovery'
|
|
23
|
+
require_relative '../../data_streams/processor'
|
|
22
24
|
|
|
23
25
|
module Datadog
|
|
24
26
|
module Core
|
|
@@ -75,11 +77,26 @@ module Datadog
|
|
|
75
77
|
|
|
76
78
|
Datadog::Core::Crashtracking::Component.build(settings, agent_settings, logger: logger)
|
|
77
79
|
end
|
|
80
|
+
|
|
81
|
+
def build_data_streams(settings, agent_settings, logger)
|
|
82
|
+
return unless settings.data_streams.enabled
|
|
83
|
+
|
|
84
|
+
Datadog::DataStreams::Processor.new(
|
|
85
|
+
interval: settings.data_streams.interval,
|
|
86
|
+
logger: logger,
|
|
87
|
+
settings: settings,
|
|
88
|
+
agent_settings: agent_settings
|
|
89
|
+
)
|
|
90
|
+
rescue => e
|
|
91
|
+
logger.warn("Failed to initialize Data Streams Monitoring: #{e.class}: #{e}")
|
|
92
|
+
nil
|
|
93
|
+
end
|
|
78
94
|
end
|
|
79
95
|
|
|
80
96
|
attr_reader \
|
|
81
97
|
:health_metrics,
|
|
82
98
|
:settings,
|
|
99
|
+
:agent_settings,
|
|
83
100
|
:logger,
|
|
84
101
|
:remote,
|
|
85
102
|
:profiler,
|
|
@@ -90,7 +107,9 @@ module Datadog
|
|
|
90
107
|
:error_tracking,
|
|
91
108
|
:dynamic_instrumentation,
|
|
92
109
|
:appsec,
|
|
93
|
-
:agent_info
|
|
110
|
+
:agent_info,
|
|
111
|
+
:data_streams,
|
|
112
|
+
:open_feature
|
|
94
113
|
|
|
95
114
|
def initialize(settings)
|
|
96
115
|
@settings = settings
|
|
@@ -102,7 +121,7 @@ module Datadog
|
|
|
102
121
|
# This agent_settings is intended for use within Core. If you require
|
|
103
122
|
# agent_settings within a product outside of core you should extend
|
|
104
123
|
# the Core resolver from within your product/component's namespace.
|
|
105
|
-
agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
|
124
|
+
@agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
|
106
125
|
|
|
107
126
|
# Exposes agent capability information for detection by any components
|
|
108
127
|
@agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
|
|
@@ -124,8 +143,10 @@ module Datadog
|
|
|
124
143
|
@runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
|
|
125
144
|
@health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
|
|
126
145
|
@appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
|
|
146
|
+
@open_feature = OpenFeature::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
|
|
127
147
|
@dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
|
|
128
148
|
@error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
|
|
149
|
+
@data_streams = self.class.build_data_streams(settings, agent_settings, @logger)
|
|
129
150
|
@environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
|
|
130
151
|
|
|
131
152
|
# Configure non-privileged components.
|
|
@@ -142,7 +163,7 @@ module Datadog
|
|
|
142
163
|
|
|
143
164
|
# Starts up components
|
|
144
165
|
def startup!(settings, old_state: nil)
|
|
145
|
-
telemetry.start(old_state&.telemetry_enabled
|
|
166
|
+
telemetry.start(old_state&.telemetry_enabled?, components: self)
|
|
146
167
|
|
|
147
168
|
if settings.profiling.enabled
|
|
148
169
|
if profiler
|
|
@@ -182,6 +203,9 @@ module Datadog
|
|
|
182
203
|
# Shutdown DI after remote, since remote config triggers DI operations.
|
|
183
204
|
dynamic_instrumentation&.shutdown!
|
|
184
205
|
|
|
206
|
+
# Shutdown OpenFeature component
|
|
207
|
+
open_feature&.shutdown!
|
|
208
|
+
|
|
185
209
|
# Decommission AppSec
|
|
186
210
|
appsec&.shutdown!
|
|
187
211
|
|
|
@@ -195,6 +219,9 @@ module Datadog
|
|
|
195
219
|
# Shutdown workers
|
|
196
220
|
runtime_metrics.stop(true, close_metrics: false)
|
|
197
221
|
|
|
222
|
+
# Shutdown Data Streams Monitoring processor
|
|
223
|
+
data_streams&.stop(true)
|
|
224
|
+
|
|
198
225
|
# Shutdown the old metrics, unless they are still being used.
|
|
199
226
|
# (e.g. custom Statsd instances.)
|
|
200
227
|
#
|
|
@@ -9,7 +9,7 @@ module Datadog
|
|
|
9
9
|
class ConfigHelper
|
|
10
10
|
def initialize(
|
|
11
11
|
source_env: ENV,
|
|
12
|
-
supported_configurations:
|
|
12
|
+
supported_configurations: SUPPORTED_CONFIGURATION_NAMES,
|
|
13
13
|
aliases: ALIASES,
|
|
14
14
|
alias_to_canonical: ALIAS_TO_CANONICAL,
|
|
15
15
|
raise_on_unknown_env_var: false
|
|
@@ -57,7 +57,7 @@ module Datadog
|
|
|
57
57
|
# Until we've correctly implemented support for datadog-ci-rb, we disable config inversion if ci is enabled.
|
|
58
58
|
if !defined?(::Datadog::CI) &&
|
|
59
59
|
(name.start_with?('DD_', 'OTEL_') || @alias_to_canonical[name]) &&
|
|
60
|
-
!@supported_configurations
|
|
60
|
+
!@supported_configurations.include?(name)
|
|
61
61
|
if defined?(@raise_on_unknown_env_var) && @raise_on_unknown_env_var # Only enabled for tests!
|
|
62
62
|
if @alias_to_canonical[name]
|
|
63
63
|
raise "Please use #{@alias_to_canonical[name]} instead of #{name}. See docs/AccessEnvironmentVariables.md for details."
|
|
@@ -21,12 +21,12 @@ module Datadog
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
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
|
|
24
|
+
deprecations.each do |deprecated_env_var|
|
|
25
25
|
next unless source_env.key?(deprecated_env_var)
|
|
26
26
|
|
|
27
27
|
Datadog::Core.log_deprecation(disallowed_next_major: false, logger: logger) do
|
|
28
28
|
"#{deprecated_env_var} #{source_name} variable is deprecated" +
|
|
29
|
-
(alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ".
|
|
29
|
+
(alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ".")
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -42,7 +42,8 @@ module Datadog
|
|
|
42
42
|
# Acts as DSL for building OptionDefinitions
|
|
43
43
|
# @public_api
|
|
44
44
|
class Builder
|
|
45
|
-
|
|
45
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
46
|
+
InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
46
47
|
|
|
47
48
|
attr_reader \
|
|
48
49
|
:helpers
|
|
@@ -119,7 +120,8 @@ module Datadog
|
|
|
119
120
|
env_parser(&options[:env_parser]) if options.key?(:env_parser)
|
|
120
121
|
after_set(&options[:after_set]) if options.key?(:after_set)
|
|
121
122
|
resetter(&options[:resetter]) if options.key?(:resetter)
|
|
122
|
-
|
|
123
|
+
# Steep: https://github.com/soutaro/steep/issues/1979
|
|
124
|
+
setter(&options[:setter]) if options.key?(:setter) # steep:ignore BlockTypeMismatch
|
|
123
125
|
type(options[:type], **(options[:type_options] || {})) if options.key?(:type)
|
|
124
126
|
end
|
|
125
127
|
|
|
@@ -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
|
{
|
|
@@ -127,7 +129,8 @@ module Datadog
|
|
|
127
129
|
end
|
|
128
130
|
end
|
|
129
131
|
|
|
130
|
-
|
|
132
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
133
|
+
InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
131
134
|
end
|
|
132
135
|
end
|
|
133
136
|
end
|
|
@@ -12,6 +12,7 @@ require_relative '../remote/ext'
|
|
|
12
12
|
require_relative '../../profiling/ext'
|
|
13
13
|
|
|
14
14
|
require_relative '../../tracing/configuration/settings'
|
|
15
|
+
require_relative '../../opentelemetry/configuration/settings'
|
|
15
16
|
|
|
16
17
|
module Datadog
|
|
17
18
|
module Core
|
|
@@ -169,6 +170,20 @@ module Datadog
|
|
|
169
170
|
o.env Core::Environment::Ext::ENV_ENVIRONMENT
|
|
170
171
|
end
|
|
171
172
|
|
|
173
|
+
# Configuration for container environments. For internal use only.
|
|
174
|
+
# @!visibility private
|
|
175
|
+
settings :container do
|
|
176
|
+
# Data supplied by the container runner to assist in uniquely identifying this process.
|
|
177
|
+
# Used in [Origin Detection](https://docs.datadoghq.com/developers/dogstatsd/unix_socket/?tab=host#origin-detection)
|
|
178
|
+
#
|
|
179
|
+
# @default `DD_EXTERNAL_ENV` environment variable, otherwise `nil`
|
|
180
|
+
# @return [String,nil]
|
|
181
|
+
option :external_env do |o|
|
|
182
|
+
o.type :string, nilable: true
|
|
183
|
+
o.env Core::Environment::Ext::ENV_EXTERNAL_ENV
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
172
187
|
# Internal {Datadog::Statsd} metrics collection.
|
|
173
188
|
#
|
|
174
189
|
# @public_api
|
|
@@ -292,9 +307,6 @@ module Datadog
|
|
|
292
307
|
# for Ruby versions 2.x, 3.1.4+, 3.2.3+ and 3.3.0+
|
|
293
308
|
# (more details in {Datadog::Profiling::Component.enable_gc_profiling?})
|
|
294
309
|
#
|
|
295
|
-
# @warn Due to a VM bug in the Ractor implementation (https://bugs.ruby-lang.org/issues/19112) this feature
|
|
296
|
-
# stops working when Ractors get garbage collected.
|
|
297
|
-
#
|
|
298
310
|
# @default `DD_PROFILING_GC_ENABLED` environment variable, otherwise `true`
|
|
299
311
|
option :gc_enabled do |o|
|
|
300
312
|
o.type :bool
|
|
@@ -828,6 +840,7 @@ module Datadog
|
|
|
828
840
|
|
|
829
841
|
# Overrides agentless telemetry URL. To be used internally for testing purposes only.
|
|
830
842
|
#
|
|
843
|
+
# @default `DD_TELEMETRY_AGENTLESS_URL` environment variable, otherwise `nil`.
|
|
831
844
|
# @return [String]
|
|
832
845
|
# @!visibility private
|
|
833
846
|
option :agentless_url_override do |o|
|
|
@@ -1003,6 +1016,16 @@ module Datadog
|
|
|
1003
1016
|
end
|
|
1004
1017
|
end
|
|
1005
1018
|
|
|
1019
|
+
# Enable experimental process tags propagation such that payloads like spans contain the process tag.
|
|
1020
|
+
#
|
|
1021
|
+
# @default `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable, otherwise `false`
|
|
1022
|
+
# @return [Boolean]
|
|
1023
|
+
option :experimental_propagate_process_tags_enabled do |o|
|
|
1024
|
+
o.env 'DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED'
|
|
1025
|
+
o.default false
|
|
1026
|
+
o.type :bool
|
|
1027
|
+
end
|
|
1028
|
+
|
|
1006
1029
|
# Tracer specific configuration starting with APM (e.g. DD_APM_TRACING_ENABLED).
|
|
1007
1030
|
# @public_api
|
|
1008
1031
|
settings :apm do
|
|
@@ -1030,6 +1053,8 @@ module Datadog
|
|
|
1030
1053
|
# TODO: Tracing should manage its own settings.
|
|
1031
1054
|
# Keep this extension here for now to keep things working.
|
|
1032
1055
|
extend Datadog::Tracing::Configuration::Settings
|
|
1056
|
+
|
|
1057
|
+
extend Datadog::OpenTelemetry::Configuration::Settings
|
|
1033
1058
|
end
|
|
1034
1059
|
# standard:enable Metrics/BlockLength
|
|
1035
1060
|
end
|