datadog 2.19.0 → 2.20.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 +27 -1
- data/ext/libdatadog_api/extconf.rb +3 -1
- data/ext/libdatadog_extconf_helpers.rb +13 -3
- data/lib/datadog/appsec/component.rb +3 -13
- data/lib/datadog/appsec/context.rb +23 -0
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +0 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +0 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +14 -22
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +0 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +23 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/event.rb +3 -18
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +16 -0
- data/lib/datadog/appsec/metrics/collector.rb +7 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +28 -0
- data/lib/datadog/appsec/metrics.rb +1 -0
- data/lib/datadog/appsec/security_engine/engine.rb +14 -32
- data/lib/datadog/appsec/security_engine/result.rb +16 -0
- data/lib/datadog/appsec/security_engine/runner.rb +18 -4
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +24 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec.rb +0 -7
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/option.rb +29 -20
- data/lib/datadog/core/configuration/option_definition.rb +2 -2
- data/lib/datadog/core/configuration/options.rb +13 -7
- data/lib/datadog/di/boot.rb +7 -0
- data/lib/datadog/di/component.rb +7 -0
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +82 -0
- data/lib/datadog/di/remote.rb +3 -5
- data/lib/datadog/di.rb +0 -1
- data/lib/datadog/kit/appsec/events/v2.rb +5 -4
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/identity.rb +17 -11
- data/lib/datadog/opentelemetry/api/baggage.rb +2 -2
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/profiling.rb +6 -8
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +7 -7
- data/lib/datadog/tracing/configuration/dynamic.rb +4 -6
- data/lib/datadog/tracing/configuration/ext.rb +3 -2
- data/lib/datadog/tracing/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +6 -6
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +6 -6
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/extensions.rb +9 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +4 -2
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +24 -24
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +13 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +6 -6
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
- data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +5 -4
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -3
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +5 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +73 -8
- data/lib/datadog/tracing/distributed/datadog.rb +4 -5
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/tagging.rb +4 -4
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +0 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +10 -10
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +9 -11
- data/lib/datadog/tracing/trace_digest.rb +21 -23
- data/lib/datadog/tracing/trace_operation.rb +84 -88
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +36 -38
- data/lib/datadog/tracing/transport/http/client.rb +1 -1
- data/lib/datadog/tracing/transport/http/traces.rb +2 -2
- data/lib/datadog/tracing/transport/io/client.rb +5 -5
- data/lib/datadog/tracing/transport/io/traces.rb +4 -4
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/traces.rb +5 -5
- data/lib/datadog/tracing/workers/trace_writer.rb +12 -12
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +1 -1
- metadata +15 -6
data/lib/datadog/appsec/event.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
require_relative 'rate_limiter'
|
5
|
+
require_relative 'trace_keeper'
|
5
6
|
require_relative 'compressed_json'
|
6
7
|
|
7
8
|
module Datadog
|
@@ -40,8 +41,7 @@ module Datadog
|
|
40
41
|
|
41
42
|
class << self
|
42
43
|
def tag_and_keep!(context, waf_result)
|
43
|
-
|
44
|
-
context.trace&.keep!
|
44
|
+
TraceKeeper.keep!(context.trace)
|
45
45
|
|
46
46
|
if context.span
|
47
47
|
if waf_result.actions.key?('block_request') || waf_result.actions.key?('redirect_request')
|
@@ -50,8 +50,6 @@ module Datadog
|
|
50
50
|
|
51
51
|
context.span.set_tag('appsec.event', 'true')
|
52
52
|
end
|
53
|
-
|
54
|
-
add_distributed_tags(context.trace)
|
55
53
|
end
|
56
54
|
|
57
55
|
def record(context, request: nil, response: nil)
|
@@ -66,8 +64,7 @@ module Datadog
|
|
66
64
|
end
|
67
65
|
|
68
66
|
if event_group.any? { |event| event.attack? || event.schema? }
|
69
|
-
|
70
|
-
trace[Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER] = Tracing::Sampling::Ext::Decision::ASM
|
67
|
+
TraceKeeper.keep!(trace)
|
71
68
|
|
72
69
|
context.span['_dd.origin'] = 'appsec'
|
73
70
|
context.span.set_tags(request_tags(request)) if request
|
@@ -138,18 +135,6 @@ module Datadog
|
|
138
135
|
|
139
136
|
nil
|
140
137
|
end
|
141
|
-
|
142
|
-
# Propagate to downstream services the information that the current distributed trace is
|
143
|
-
# containing at least one ASM security event.
|
144
|
-
def add_distributed_tags(trace)
|
145
|
-
return unless trace
|
146
|
-
|
147
|
-
trace.set_tag(
|
148
|
-
Datadog::Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
|
149
|
-
Datadog::Tracing::Sampling::Ext::Decision::ASM
|
150
|
-
)
|
151
|
-
trace.set_distributed_source(Datadog::AppSec::Ext::PRODUCT_BIT)
|
152
|
-
end
|
153
138
|
end
|
154
139
|
end
|
155
140
|
end
|
@@ -21,6 +21,22 @@ module Datadog
|
|
21
21
|
@session_id = session_id
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
# This class is used to pass arbitrary data to the event system with an
|
26
|
+
# option to tie it to a context.
|
27
|
+
#
|
28
|
+
# NOTE: This class is a subject of elimination and will be removed when
|
29
|
+
# the event system is refactored.
|
30
|
+
class DataContainer < Argument
|
31
|
+
attr_reader :data, :context
|
32
|
+
|
33
|
+
def initialize(data, context:)
|
34
|
+
super()
|
35
|
+
|
36
|
+
@data = data
|
37
|
+
@context = context
|
38
|
+
end
|
39
|
+
end
|
24
40
|
end
|
25
41
|
end
|
26
42
|
end
|
@@ -5,19 +5,21 @@ module Datadog
|
|
5
5
|
module Metrics
|
6
6
|
# A class responsible for collecting WAF and RASP call metrics.
|
7
7
|
class Collector
|
8
|
-
Store = Struct.new(:evals, :timeouts, :duration_ns, :duration_ext_ns, keyword_init: true)
|
8
|
+
Store = Struct.new(:evals, :matches, :errors, :timeouts, :duration_ns, :duration_ext_ns, keyword_init: true)
|
9
9
|
|
10
10
|
attr_reader :waf, :rasp
|
11
11
|
|
12
12
|
def initialize
|
13
13
|
@mutex = Mutex.new
|
14
|
-
@waf = Store.new(evals: 0, timeouts: 0, duration_ns: 0, duration_ext_ns: 0)
|
15
|
-
@rasp = Store.new(evals: 0, timeouts: 0, duration_ns: 0, duration_ext_ns: 0)
|
14
|
+
@waf = Store.new(evals: 0, matches: 0, errors: 0, timeouts: 0, duration_ns: 0, duration_ext_ns: 0)
|
15
|
+
@rasp = Store.new(evals: 0, matches: 0, errors: 0, timeouts: 0, duration_ns: 0, duration_ext_ns: 0)
|
16
16
|
end
|
17
17
|
|
18
18
|
def record_waf(result)
|
19
19
|
@mutex.synchronize do
|
20
20
|
@waf.evals += 1
|
21
|
+
@waf.matches += 1 if result.match?
|
22
|
+
@waf.errors += 1 if result.error?
|
21
23
|
@waf.timeouts += 1 if result.timeout?
|
22
24
|
@waf.duration_ns += result.duration_ns
|
23
25
|
@waf.duration_ext_ns += result.duration_ext_ns
|
@@ -27,6 +29,8 @@ module Datadog
|
|
27
29
|
def record_rasp(result)
|
28
30
|
@mutex.synchronize do
|
29
31
|
@rasp.evals += 1
|
32
|
+
@waf.matches += 1 if result.match?
|
33
|
+
@waf.errors += 1 if result.error?
|
30
34
|
@rasp.timeouts += 1 if result.timeout?
|
31
35
|
@rasp.duration_ns += result.duration_ns
|
32
36
|
@rasp.duration_ext_ns += result.duration_ext_ns
|
@@ -8,7 +8,7 @@ module Datadog
|
|
8
8
|
module_function
|
9
9
|
|
10
10
|
def report_rasp(type, result)
|
11
|
-
return if result.
|
11
|
+
return if result.error?
|
12
12
|
|
13
13
|
tags = {rule_type: type, waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING}
|
14
14
|
namespace = Ext::TELEMETRY_METRICS_NAMESPACE
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
module Metrics
|
6
|
+
# A class responsible for exporting WAF request metrics via Telemetry.
|
7
|
+
module TelemetryExporter
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def export_waf_request_metrics(metrics, context)
|
11
|
+
AppSec.telemetry.inc(
|
12
|
+
Ext::TELEMETRY_METRICS_NAMESPACE, 'waf.requests', 1,
|
13
|
+
tags: {
|
14
|
+
waf_version: WAF::VERSION::BASE_STRING,
|
15
|
+
event_rules_version: context.waf_runner_ruleset_version,
|
16
|
+
rule_triggered: metrics.matches.positive?.to_s,
|
17
|
+
waf_error: metrics.errors.positive?.to_s,
|
18
|
+
waf_timeout: metrics.timeouts.positive?.to_s,
|
19
|
+
request_blocked: context.interrupted?.to_s,
|
20
|
+
block_failure: 'false',
|
21
|
+
rate_limited: (!context.trace.sampled?).to_s
|
22
|
+
}
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -20,8 +20,6 @@ module Datadog
|
|
20
20
|
exclusion_data
|
21
21
|
].freeze
|
22
22
|
|
23
|
-
attr_reader :waf_addresses, :ruleset_version
|
24
|
-
|
25
23
|
def initialize(appsec_settings:, telemetry:)
|
26
24
|
@default_ruleset = appsec_settings.ruleset
|
27
25
|
|
@@ -39,9 +37,9 @@ module Datadog
|
|
39
37
|
|
40
38
|
diagnostics = load_default_config(telemetry: telemetry)
|
41
39
|
report_configuration_diagnostics(diagnostics, action: 'init', telemetry: telemetry)
|
40
|
+
@ruleset_version = diagnostics['ruleset_version']
|
42
41
|
|
43
|
-
@
|
44
|
-
@waf_addresses = @waf_handle.known_addresses
|
42
|
+
@handle_ref = ThreadSafeRef.new(@waf_builder.build_handle)
|
45
43
|
rescue WAF::Error => e
|
46
44
|
error_message = "AppSec security engine failed to initialize"
|
47
45
|
|
@@ -51,16 +49,8 @@ module Datadog
|
|
51
49
|
raise e
|
52
50
|
end
|
53
51
|
|
54
|
-
def finalize!
|
55
|
-
@waf_handle&.finalize!
|
56
|
-
@waf_builder&.finalize!
|
57
|
-
|
58
|
-
@waf_addresses = []
|
59
|
-
@ruleset_version = nil
|
60
|
-
end
|
61
|
-
|
62
52
|
def new_runner
|
63
|
-
SecurityEngine::Runner.new(@
|
53
|
+
SecurityEngine::Runner.new(@handle_ref, ruleset_version: @ruleset_version)
|
64
54
|
end
|
65
55
|
|
66
56
|
def add_or_update_config(config, path:)
|
@@ -70,7 +60,7 @@ module Datadog
|
|
70
60
|
remove_config_at_path(DEFAULT_RULES_CONFIG_PATH) if @is_ruleset_update
|
71
61
|
|
72
62
|
diagnostics = @waf_builder.add_or_update_config(config, path: path)
|
73
|
-
@
|
63
|
+
@reconfigured_ruleset_version = diagnostics['ruleset_version'] if diagnostics.key?('ruleset_version')
|
74
64
|
report_configuration_diagnostics(diagnostics, action: 'update', telemetry: AppSec.telemetry)
|
75
65
|
|
76
66
|
# we need to load default config if diagnostics contains top-level error for rules or processors
|
@@ -79,6 +69,7 @@ module Datadog
|
|
79
69
|
diagnostics.dig('rules', 'error') ||
|
80
70
|
diagnostics.dig('processors', 'errors'))
|
81
71
|
diagnostics = load_default_config(telemetry: AppSec.telemetry)
|
72
|
+
@reconfigured_ruleset_version = diagnostics['ruleset_version']
|
82
73
|
report_configuration_diagnostics(diagnostics, action: 'update', telemetry: AppSec.telemetry)
|
83
74
|
end
|
84
75
|
|
@@ -95,6 +86,7 @@ module Datadog
|
|
95
86
|
|
96
87
|
if result && path != DEFAULT_RULES_CONFIG_PATH && path.include?('ASM_DD')
|
97
88
|
diagnostics = load_default_config(telemetry: AppSec.telemetry)
|
89
|
+
@reconfigured_ruleset_version = diagnostics['ruleset_version']
|
98
90
|
report_configuration_diagnostics(diagnostics, action: 'update', telemetry: AppSec.telemetry)
|
99
91
|
end
|
100
92
|
|
@@ -107,24 +99,17 @@ module Datadog
|
|
107
99
|
end
|
108
100
|
|
109
101
|
def reconfigure!
|
110
|
-
|
111
|
-
|
112
|
-
@waf_handle = @waf_builder.build_handle
|
113
|
-
@waf_addresses = @waf_handle.known_addresses
|
102
|
+
new_waf_handle = @waf_builder.build_handle
|
103
|
+
@ruleset_version = @reconfigured_ruleset_version
|
114
104
|
|
115
|
-
|
105
|
+
@handle_ref.current = new_waf_handle
|
116
106
|
rescue WAF::Error => e
|
117
|
-
|
107
|
+
# WAF::Error can only be raised during new WAF handle creation or when reading known addresses.
|
108
|
+
# This means that the current WAF handle was not yet substituted.
|
109
|
+
error_message = "AppSec security engine failed to reconfigure, reverting to the previous configuration"
|
118
110
|
|
119
111
|
Datadog.logger.error("#{error_message}, error #{e.inspect}")
|
120
112
|
AppSec.telemetry.report(e, description: error_message)
|
121
|
-
|
122
|
-
if old_waf_handle
|
123
|
-
Datadog.logger.warn("Reverting to the previous configuration")
|
124
|
-
|
125
|
-
@waf_handle = old_waf_handle
|
126
|
-
@waf_addresses = old_waf_handle.known_addresses
|
127
|
-
end
|
128
113
|
end
|
129
114
|
|
130
115
|
private
|
@@ -141,10 +126,7 @@ module Datadog
|
|
141
126
|
# deprecated - ip passlist should be configured via RC
|
142
127
|
config['exclusions'] ||= AppSec::Processor::RuleLoader.load_exclusions(ip_passlist: @default_ip_passlist)
|
143
128
|
|
144
|
-
|
145
|
-
@ruleset_version = diagnostics['ruleset_version']
|
146
|
-
|
147
|
-
diagnostics
|
129
|
+
@waf_builder.add_or_update_config(config, path: DEFAULT_RULES_CONFIG_PATH)
|
148
130
|
end
|
149
131
|
|
150
132
|
def report_configuration_diagnostics(diagnostics, action:, telemetry:)
|
@@ -152,7 +134,7 @@ module Datadog
|
|
152
134
|
|
153
135
|
common_tags = {
|
154
136
|
waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING,
|
155
|
-
event_rules_version: diagnostics
|
137
|
+
event_rules_version: diagnostics['ruleset_version'].to_s,
|
156
138
|
action: action
|
157
139
|
}
|
158
140
|
|
@@ -26,6 +26,10 @@ module Datadog
|
|
26
26
|
def match?
|
27
27
|
raise NotImplementedError
|
28
28
|
end
|
29
|
+
|
30
|
+
def error?
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
# A result that indicates a security rule match
|
@@ -33,6 +37,10 @@ module Datadog
|
|
33
37
|
def match?
|
34
38
|
true
|
35
39
|
end
|
40
|
+
|
41
|
+
def error?
|
42
|
+
false
|
43
|
+
end
|
36
44
|
end
|
37
45
|
|
38
46
|
# A result that indicates a successful security rules check without a match
|
@@ -40,6 +48,10 @@ module Datadog
|
|
40
48
|
def match?
|
41
49
|
false
|
42
50
|
end
|
51
|
+
|
52
|
+
def error?
|
53
|
+
false
|
54
|
+
end
|
43
55
|
end
|
44
56
|
|
45
57
|
# A result that indicates an internal security library error
|
@@ -60,6 +72,10 @@ module Datadog
|
|
60
72
|
def match?
|
61
73
|
false
|
62
74
|
end
|
75
|
+
|
76
|
+
def error?
|
77
|
+
true
|
78
|
+
end
|
63
79
|
end
|
64
80
|
end
|
65
81
|
end
|
@@ -9,9 +9,13 @@ module Datadog
|
|
9
9
|
class Runner
|
10
10
|
SUCCESSFUL_EXECUTION_CODES = [:ok, :match].freeze
|
11
11
|
|
12
|
-
|
12
|
+
attr_reader :ruleset_version
|
13
|
+
|
14
|
+
def initialize(handle_ref, ruleset_version:)
|
13
15
|
@mutex = Mutex.new
|
14
|
-
@
|
16
|
+
@handle_ref = handle_ref
|
17
|
+
@waf_handle = handle_ref.acquire
|
18
|
+
@ruleset_version = ruleset_version
|
15
19
|
|
16
20
|
@debug_tag = "libddwaf:#{WAF::VERSION::STRING} method:ddwaf_run"
|
17
21
|
end
|
@@ -54,14 +58,24 @@ module Datadog
|
|
54
58
|
@mutex.unlock
|
55
59
|
end
|
56
60
|
|
61
|
+
def waf_context
|
62
|
+
@waf_context ||= @waf_handle.build_context
|
63
|
+
end
|
64
|
+
|
65
|
+
def waf_addresses
|
66
|
+
@waf_handle.known_addresses
|
67
|
+
end
|
68
|
+
|
57
69
|
def finalize!
|
58
|
-
@waf_context
|
70
|
+
@waf_context&.finalize!
|
71
|
+
ensure
|
72
|
+
@handle_ref.release(@waf_handle)
|
59
73
|
end
|
60
74
|
|
61
75
|
private
|
62
76
|
|
63
77
|
def try_run(persistent_data, ephemeral_data, timeout)
|
64
|
-
|
78
|
+
waf_context.run(persistent_data, ephemeral_data, timeout)
|
65
79
|
rescue WAF::LibDDWAFError => e
|
66
80
|
Datadog.logger.debug { "#{@debug_tag} execution error: #{e} backtrace: #{e.backtrace&.first(3)}" }
|
67
81
|
AppSec.telemetry.report(e, description: 'libddwaf-rb internal low-level error')
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
# This class is used for referencing an object that might be marked
|
6
|
+
# for finalization in another thread.
|
7
|
+
#
|
8
|
+
# References to the object are counted, and objects marked for finalization
|
9
|
+
# can be safely finalized when their reference count reaches zero.
|
10
|
+
class ThreadSafeRef
|
11
|
+
def initialize(initial_obj, finalizer: :finalize!)
|
12
|
+
@current = initial_obj
|
13
|
+
@finalizer = finalizer
|
14
|
+
|
15
|
+
@counters = Hash.new(0)
|
16
|
+
@outdated = []
|
17
|
+
@mutex = Mutex.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def acquire
|
21
|
+
@mutex.synchronize do
|
22
|
+
@counters[@current] += 1
|
23
|
+
|
24
|
+
@current
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def release(obj)
|
29
|
+
@mutex.synchronize do
|
30
|
+
@counters[obj] -= 1
|
31
|
+
|
32
|
+
@outdated.reject! do |outdated_obj|
|
33
|
+
next unless @counters[outdated_obj].zero?
|
34
|
+
|
35
|
+
finalize(outdated_obj)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def current=(obj)
|
41
|
+
@mutex.synchronize do
|
42
|
+
@outdated << @current
|
43
|
+
|
44
|
+
@current = obj
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def finalize(obj)
|
51
|
+
obj.public_send(@finalizer)
|
52
|
+
|
53
|
+
true
|
54
|
+
rescue => e
|
55
|
+
Datadog.logger.debug("Couldn't finalize #{obj.class.name} object, error: #{e.inspect}")
|
56
|
+
|
57
|
+
true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
# This class is used to mark trace as manual keep and tag it as ASM product.
|
6
|
+
module TraceKeeper
|
7
|
+
def self.keep!(trace)
|
8
|
+
return unless trace
|
9
|
+
|
10
|
+
# NOTE: This action will not set correct decision maker value, so the
|
11
|
+
# trace keeping must be done with additional steps below
|
12
|
+
trace.keep!
|
13
|
+
|
14
|
+
# Propagate to downstream services the information that
|
15
|
+
# the current distributed trace is containing at least one ASM event.
|
16
|
+
trace.set_tag(
|
17
|
+
Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
|
18
|
+
Tracing::Sampling::Ext::Decision::ASM
|
19
|
+
)
|
20
|
+
trace.set_distributed_source(Ext::PRODUCT_BIT)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
module Utils
|
6
|
+
# A module for coercing arbitrary objects into hashes.
|
7
|
+
module HashCoercion
|
8
|
+
# A best effort to coerce an object to a hash with methods known to various
|
9
|
+
# frameworks with a fallback to standard library.
|
10
|
+
#
|
11
|
+
# @param object [Object] The object to coerce.
|
12
|
+
# @return [Hash, nil] The coerced `Hash` or `nil` if the object is not coercible.
|
13
|
+
def self.coerce(object)
|
14
|
+
return object.as_json if object.respond_to?(:as_json)
|
15
|
+
return object.to_hash if object.respond_to?(:to_hash)
|
16
|
+
return object.to_h if object.respond_to?(:to_h)
|
17
|
+
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/datadog/appsec.rb
CHANGED
@@ -34,13 +34,6 @@ module Datadog
|
|
34
34
|
components.appsec&.reconfigure!
|
35
35
|
end
|
36
36
|
|
37
|
-
def reconfigure_lock(&block)
|
38
|
-
appsec_component = components.appsec
|
39
|
-
return unless appsec_component
|
40
|
-
|
41
|
-
appsec_component.reconfigure_lock(&block)
|
42
|
-
end
|
43
|
-
|
44
37
|
def perform_api_security_check?
|
45
38
|
Datadog.configuration.appsec.api_security.enabled &&
|
46
39
|
Datadog.configuration.appsec.api_security.sample_rate.sample?
|
@@ -22,9 +22,18 @@ module Datadog
|
|
22
22
|
# Represents an Option precedence level.
|
23
23
|
# Each precedence has a `numeric` value; higher values means higher precedence.
|
24
24
|
# `name` is for inspection purposes only.
|
25
|
-
|
25
|
+
|
26
|
+
class Value
|
26
27
|
include Comparable
|
27
28
|
|
29
|
+
attr_accessor :numeric, :name, :origin
|
30
|
+
|
31
|
+
def initialize(numeric, name, origin)
|
32
|
+
@numeric = numeric
|
33
|
+
@name = name
|
34
|
+
@origin = origin
|
35
|
+
end
|
36
|
+
|
28
37
|
def <=>(other)
|
29
38
|
return nil unless other.is_a?(Value)
|
30
39
|
|
@@ -172,20 +181,17 @@ module Datadog
|
|
172
181
|
private
|
173
182
|
|
174
183
|
def coerce_env_variable(value)
|
175
|
-
|
184
|
+
env_parser = @definition.env_parser
|
185
|
+
return context_exec(value, &env_parser) if env_parser
|
176
186
|
|
177
187
|
case @definition.type
|
178
188
|
when :hash
|
179
189
|
values = value.split(',') # By default we only want to support comma separated strings
|
180
190
|
|
181
|
-
values.
|
191
|
+
values.each_with_object({}) do |v, hash| # $ Hash[String, String]
|
182
192
|
v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
|
193
|
+
next if v.empty?
|
183
194
|
|
184
|
-
v.empty? ? nil : v
|
185
|
-
end
|
186
|
-
|
187
|
-
values.compact!
|
188
|
-
values.each.with_object({}) do |v, hash|
|
189
195
|
pair = v.split(':', 2)
|
190
196
|
hash[pair[0]] = pair[1]
|
191
197
|
end
|
@@ -196,14 +202,12 @@ module Datadog
|
|
196
202
|
when :array
|
197
203
|
values = value.split(',')
|
198
204
|
|
199
|
-
values.
|
205
|
+
values.each_with_object([]) do |v, arr| # $ Array[String]
|
200
206
|
v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
|
207
|
+
next if v.empty?
|
201
208
|
|
202
|
-
|
209
|
+
arr << v
|
203
210
|
end
|
204
|
-
|
205
|
-
values.compact!
|
206
|
-
values
|
207
211
|
when :bool
|
208
212
|
string_value = value.strip
|
209
213
|
string_value = string_value.downcase
|
@@ -329,18 +333,22 @@ module Datadog
|
|
329
333
|
resolved_env = nil
|
330
334
|
|
331
335
|
if definition.env
|
332
|
-
|
333
|
-
|
336
|
+
# @type var env_and_aliases: Array[String]
|
337
|
+
env_and_aliases = Array(definition.env)
|
338
|
+
env_and_aliases.each do |env|
|
339
|
+
env_value = env_vars[env]
|
340
|
+
next if env_value.nil?
|
334
341
|
|
335
342
|
resolved_env = env
|
336
|
-
value = coerce_env_variable(
|
343
|
+
value = coerce_env_variable(env_value)
|
337
344
|
break
|
338
345
|
end
|
339
346
|
end
|
340
347
|
|
341
|
-
|
348
|
+
deprecated_env = definition.deprecated_env ? env_vars[definition.deprecated_env] : nil
|
349
|
+
if value.nil? && deprecated_env
|
342
350
|
resolved_env = definition.deprecated_env
|
343
|
-
value = coerce_env_variable(
|
351
|
+
value = coerce_env_variable(deprecated_env)
|
344
352
|
|
345
353
|
Datadog::Core.log_deprecation do
|
346
354
|
"#{definition.deprecated_env} #{source} is deprecated, use #{definition.env} instead."
|
@@ -349,9 +357,10 @@ module Datadog
|
|
349
357
|
|
350
358
|
[value, resolved_env]
|
351
359
|
rescue ArgumentError
|
360
|
+
env_value = resolved_env ? env_vars[resolved_env] : nil
|
352
361
|
raise ArgumentError,
|
353
|
-
"Expected #{source} #{resolved_env} to be a #{
|
354
|
-
|
362
|
+
"Expected #{source} #{resolved_env} to be a #{definition.type}, " \
|
363
|
+
"but '#{env_value}' was provided"
|
355
364
|
end
|
356
365
|
|
357
366
|
# Anchor object that represents a value that is not set.
|
@@ -22,7 +22,7 @@ module Datadog
|
|
22
22
|
:type,
|
23
23
|
:type_options
|
24
24
|
|
25
|
-
def initialize(name, meta
|
25
|
+
def initialize(name, meta, &block)
|
26
26
|
@default = meta[:default]
|
27
27
|
@default_proc = meta[:default_proc]
|
28
28
|
@env = meta[:env]
|
@@ -44,7 +44,7 @@ module Datadog
|
|
44
44
|
# Acts as DSL for building OptionDefinitions
|
45
45
|
# @public_api
|
46
46
|
class Builder
|
47
|
-
|
47
|
+
InvalidOptionError = Class.new(StandardError)
|
48
48
|
|
49
49
|
attr_reader \
|
50
50
|
:helpers
|
@@ -40,14 +40,19 @@ module Datadog
|
|
40
40
|
|
41
41
|
def default_helpers(name)
|
42
42
|
option_name = name.to_sym
|
43
|
-
|
43
|
+
# @type var opt_getter: Configuration::OptionDefinition::helper_proc
|
44
|
+
opt_getter = proc do
|
45
|
+
# These Procs uses `get/set_option`, but we only add them to the OptionDefinition helpers here.
|
46
|
+
# Steep is right that these methods are not defined, but we only run these Procs in instance context.
|
47
|
+
get_option(option_name) # steep:ignore NoMethod
|
48
|
+
end
|
49
|
+
# @type var opt_setter: Configuration::OptionDefinition::helper_proc
|
50
|
+
opt_setter = proc do |value|
|
51
|
+
set_option(option_name, value) # steep:ignore NoMethod
|
52
|
+
end
|
44
53
|
{
|
45
|
-
option_name.to_sym =>
|
46
|
-
|
47
|
-
end,
|
48
|
-
:"#{option_name}=" => proc do |value|
|
49
|
-
set_option(option_name, value)
|
50
|
-
end
|
54
|
+
option_name.to_sym => opt_getter,
|
55
|
+
:"#{option_name}=" => opt_setter
|
51
56
|
}
|
52
57
|
end
|
53
58
|
|
@@ -113,6 +118,7 @@ module Datadog
|
|
113
118
|
|
114
119
|
assert_valid_option!(name)
|
115
120
|
definition = self.class.options[name]
|
121
|
+
# @type self: Configuration::Options::GenericSettingsClass
|
116
122
|
options[name] = definition.build(self)
|
117
123
|
end
|
118
124
|
|
data/lib/datadog/di/boot.rb
CHANGED
@@ -32,3 +32,10 @@ end
|
|
32
32
|
require_relative 'contrib'
|
33
33
|
|
34
34
|
Datadog::DI::Contrib.load_now_or_later
|
35
|
+
|
36
|
+
if %w[1 true yes].include?(ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED']) # steep:ignore
|
37
|
+
if ENV['DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE']
|
38
|
+
require_relative 'probe_file_loader'
|
39
|
+
Datadog::DI::ProbeFileLoader.load_now_or_later
|
40
|
+
end
|
41
|
+
end
|
data/lib/datadog/di/component.rb
CHANGED
@@ -112,6 +112,13 @@ module Datadog
|
|
112
112
|
probe_manager.close
|
113
113
|
probe_notifier_worker.stop
|
114
114
|
end
|
115
|
+
|
116
|
+
def parse_probe_spec_and_notify(probe_spec)
|
117
|
+
probe = ProbeBuilder.build_from_remote_config(probe_spec)
|
118
|
+
payload = probe_notification_builder.build_received(probe)
|
119
|
+
probe_notifier_worker.add_status(payload)
|
120
|
+
probe
|
121
|
+
end
|
115
122
|
end
|
116
123
|
end
|
117
124
|
end
|