datadog 2.18.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 +73 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +51 -10
- data/ext/datadog_profiling_native_extension/collectors_stack.c +58 -49
- data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -1
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +5 -6
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +37 -26
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +0 -1
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +1 -1
- data/ext/libdatadog_api/extconf.rb +3 -1
- data/ext/libdatadog_extconf_helpers.rb +13 -3
- data/lib/datadog/appsec/api_security/route_extractor.rb +7 -1
- 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 +17 -1
- 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/core/configuration/settings.rb +20 -0
- data/lib/datadog/core/telemetry/component.rb +8 -4
- data/lib/datadog/core/telemetry/event/app_started.rb +21 -3
- data/lib/datadog/di/boot.rb +7 -0
- data/lib/datadog/di/component.rb +7 -0
- data/lib/datadog/di/instrumenter.rb +11 -18
- 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/probe_notification_builder.rb +21 -16
- data/lib/datadog/di/remote.rb +3 -5
- data/lib/datadog/di/serializer.rb +6 -2
- data/lib/datadog/di.rb +0 -7
- data/lib/datadog/kit/appsec/events/v2.rb +196 -0
- 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/collectors/cpu_and_wall_time_worker.rb +2 -0
- data/lib/datadog/profiling/collectors/info.rb +41 -0
- data/lib/datadog/profiling/component.rb +1 -0
- data/lib/datadog/profiling/exporter.rb +9 -3
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/tag_builder.rb +2 -0
- data/lib/datadog/profiling.rb +7 -8
- data/lib/datadog/single_step_instrument.rb +9 -0
- 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 +13 -7
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- 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/instrumentation.rb +16 -6
- 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/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
- 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 +8 -2
- 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 +31 -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
- data/lib/datadog.rb +7 -0
- metadata +17 -6
@@ -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
|
|
@@ -554,6 +554,26 @@ module Datadog
|
|
554
554
|
o.env 'DD_PROFILING_NATIVE_FILENAMES_ENABLED'
|
555
555
|
o.default true
|
556
556
|
end
|
557
|
+
|
558
|
+
# Controls if the profiler should sample directly from the signal handler.
|
559
|
+
# Sampling directly from the signal handler improves accuracy of the data collected.
|
560
|
+
#
|
561
|
+
# We recommend using this setting with Ruby 3.2.5+ / Ruby 3.3.4+ and above
|
562
|
+
# as they include additional safety measures added in https://github.com/ruby/ruby/pull/11036.
|
563
|
+
# We have not validated it thoroughly with earlier versions, but in practice it should work on Ruby 3.0+
|
564
|
+
# (the key change was https://github.com/ruby/ruby/pull/3296).
|
565
|
+
#
|
566
|
+
# Enabling this on Ruby 2 is not recommended as it may cause VM crashes and/or incorrect data.
|
567
|
+
#
|
568
|
+
# @default true on Ruby 3.2.5+ / Ruby 3.3.4+, false on older Rubies
|
569
|
+
option :sighandler_sampling_enabled do |o|
|
570
|
+
o.type :bool
|
571
|
+
o.env 'DD_PROFILING_SIGHANDLER_SAMPLING_ENABLED'
|
572
|
+
o.default do
|
573
|
+
Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.2.5') &&
|
574
|
+
!(RUBY_VERSION.start_with?('3.3.') && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3.4'))
|
575
|
+
end
|
576
|
+
end
|
557
577
|
end
|
558
578
|
|
559
579
|
# @public_api
|
@@ -62,7 +62,9 @@ module Datadog
|
|
62
62
|
return unless @enabled
|
63
63
|
|
64
64
|
@transport = if settings.telemetry.agentless_enabled
|
65
|
-
agent_settings
|
65
|
+
# We don't touch the `agent_settings` since we still want the telemetry payloads to refer to the original
|
66
|
+
# settings, even though the telemetry itself may be using a different path.
|
67
|
+
telemetry_specific_agent_settings = Core::Configuration::AgentlessSettingsResolver.call(
|
66
68
|
settings,
|
67
69
|
host_prefix: 'instrumentation-telemetry-intake',
|
68
70
|
url_override: settings.telemetry.agentless_url_override,
|
@@ -70,7 +72,7 @@ module Datadog
|
|
70
72
|
logger: logger,
|
71
73
|
)
|
72
74
|
Telemetry::Transport::HTTP.agentless_telemetry(
|
73
|
-
agent_settings:
|
75
|
+
agent_settings: telemetry_specific_agent_settings,
|
74
76
|
logger: logger,
|
75
77
|
# api_key should have already validated to be
|
76
78
|
# not nil by +build+ method above.
|
@@ -96,6 +98,8 @@ module Datadog
|
|
96
98
|
logger: logger,
|
97
99
|
shutdown_timeout: settings.telemetry.shutdown_timeout_seconds,
|
98
100
|
)
|
101
|
+
|
102
|
+
@agent_settings = agent_settings
|
99
103
|
end
|
100
104
|
|
101
105
|
def disable!
|
@@ -107,9 +111,9 @@ module Datadog
|
|
107
111
|
return if !@enabled
|
108
112
|
|
109
113
|
initial_event = if initial_event_is_change
|
110
|
-
Event::SynthAppClientConfigurationChange.new
|
114
|
+
Event::SynthAppClientConfigurationChange.new(agent_settings: @agent_settings)
|
111
115
|
else
|
112
|
-
Event::AppStarted.new
|
116
|
+
Event::AppStarted.new(agent_settings: @agent_settings)
|
113
117
|
end
|
114
118
|
|
115
119
|
@worker.start(initial_event)
|
@@ -8,6 +8,10 @@ module Datadog
|
|
8
8
|
module Event
|
9
9
|
# Telemetry class for the 'app-started' event
|
10
10
|
class AppStarted < Base
|
11
|
+
def initialize(agent_settings:)
|
12
|
+
@agent_settings = agent_settings
|
13
|
+
end
|
14
|
+
|
11
15
|
def type
|
12
16
|
'app-started'
|
13
17
|
end
|
@@ -96,7 +100,7 @@ module Datadog
|
|
96
100
|
),
|
97
101
|
|
98
102
|
# Mix of env var, programmatic and default config, so we use unknown
|
99
|
-
conf_value('DD_AGENT_TRANSPORT', agent_transport
|
103
|
+
conf_value('DD_AGENT_TRANSPORT', agent_transport, seq_id, 'unknown'),
|
100
104
|
|
101
105
|
# writer_options is defined as an option that has a Hash value.
|
102
106
|
conf_value(
|
@@ -162,6 +166,20 @@ module Datadog
|
|
162
166
|
)
|
163
167
|
end
|
164
168
|
|
169
|
+
instrumentation_source = if Datadog.const_defined?(:SingleStepInstrument, false) &&
|
170
|
+
Datadog::SingleStepInstrument.const_defined?(:LOADED, false) &&
|
171
|
+
Datadog::SingleStepInstrument::LOADED
|
172
|
+
'ssi'
|
173
|
+
else
|
174
|
+
'manual'
|
175
|
+
end
|
176
|
+
# Track ssi configurations
|
177
|
+
list.push(
|
178
|
+
conf_value('instrumentation_source', instrumentation_source, seq_id, 'code'),
|
179
|
+
conf_value('DD_INJECT_FORCE', Core::Environment::VariableHelpers.env_to_bool('DD_INJECT_FORCE', false), seq_id, 'env_var'),
|
180
|
+
conf_value('DD_INJECTION_ENABLED', ENV['DD_INJECTION_ENABLED'] || '', seq_id, 'env_var'),
|
181
|
+
)
|
182
|
+
|
165
183
|
# Add some more custom additional payload values here
|
166
184
|
if config.logger.instance
|
167
185
|
list << conf_value(
|
@@ -200,8 +218,8 @@ module Datadog
|
|
200
218
|
# standard:enable Metrics/AbcSize
|
201
219
|
# standard:enable Metrics/MethodLength
|
202
220
|
|
203
|
-
def agent_transport
|
204
|
-
adapter =
|
221
|
+
def agent_transport
|
222
|
+
adapter = @agent_settings.adapter
|
205
223
|
if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
|
206
224
|
'UDS'
|
207
225
|
else
|
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
|
@@ -121,9 +121,8 @@ module Datadog
|
|
121
121
|
if rate_limiter.nil? || rate_limiter.allow?
|
122
122
|
# Arguments may be mutated by the method, therefore
|
123
123
|
# they need to be serialized prior to method invocation.
|
124
|
-
|
125
|
-
|
126
|
-
serializer.serialize_args(args, kwargs, instance_vars,
|
124
|
+
serialized_entry_args = if probe.capture_snapshot?
|
125
|
+
serializer.serialize_args(args, kwargs, self,
|
127
126
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
128
127
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
129
128
|
end
|
@@ -160,9 +159,10 @@ module Datadog
|
|
160
159
|
caller_locs = method_frame + caller_locations # steep:ignore
|
161
160
|
# TODO capture arguments at exit
|
162
161
|
# & is to stop steep complaints, block is always present here.
|
163
|
-
block&.call(probe: probe, rv: rv,
|
164
|
-
|
165
|
-
|
162
|
+
block&.call(probe: probe, rv: rv,
|
163
|
+
duration: duration, caller_locations: caller_locs,
|
164
|
+
target_self: self,
|
165
|
+
serialized_entry_args: serialized_entry_args)
|
166
166
|
rv
|
167
167
|
else
|
168
168
|
# stop standard from trying to mess up my code
|
@@ -311,19 +311,20 @@ module Datadog
|
|
311
311
|
probe.file == tp.path || probe.file_matches?(tp.path)
|
312
312
|
)
|
313
313
|
if rate_limiter.nil? || rate_limiter.allow?
|
314
|
-
|
314
|
+
serialized_locals = if probe.capture_snapshot?
|
315
315
|
serializer.serialize_vars(Instrumenter.get_local_variables(tp),
|
316
316
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
317
317
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
318
318
|
end
|
319
|
-
|
320
|
-
serializer.
|
319
|
+
if probe.capture_snapshot?
|
320
|
+
serializer.serialize_value(tp.self,
|
321
321
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
322
322
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
323
323
|
end
|
324
324
|
# & is to stop steep complaints, block is always present here.
|
325
325
|
block&.call(probe: probe,
|
326
|
-
|
326
|
+
serialized_locals: serialized_locals,
|
327
|
+
target_self: tp.self,
|
327
328
|
path: tp.path, caller_locations: caller_locations)
|
328
329
|
end
|
329
330
|
end
|
@@ -397,14 +398,6 @@ module Datadog
|
|
397
398
|
end
|
398
399
|
|
399
400
|
class << self
|
400
|
-
def get_instance_variables(object)
|
401
|
-
{}.tap do |hash|
|
402
|
-
object.instance_variables.each do |var|
|
403
|
-
hash[var] = object.instance_variable_get(var)
|
404
|
-
end
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
401
|
def get_local_variables(trace_point)
|
409
402
|
# binding appears to be constructed on access, therefore
|
410
403
|
# 1) we should attempt to cache it and
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module DI
|
5
|
+
module ProbeFileLoader
|
6
|
+
# Railtie class initializes dynamic instrumentation contrib code
|
7
|
+
# in Rails environments.
|
8
|
+
class Railtie < Rails::Railtie
|
9
|
+
initializer 'datadog.dynamic_instrumentation.load_probe_file' do |app| # steep:ignore
|
10
|
+
ProbeFileLoader.load_now
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module DI
|
7
|
+
module ProbeFileLoader
|
8
|
+
module_function def load_now_or_later
|
9
|
+
if Datadog::Core::Contrib::Rails::Utils.railtie_supported?
|
10
|
+
Datadog.logger.debug('di: loading probe_file_loader/railtie')
|
11
|
+
require_relative 'probe_file_loader/railtie'
|
12
|
+
else
|
13
|
+
load_now
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# This method can be called more than once, to attempt to load
|
18
|
+
# DI components that depend on third-party libraries after additional
|
19
|
+
# dependencies are loaded (or potentially loaded).
|
20
|
+
module_function def load_now
|
21
|
+
should_propagate = false
|
22
|
+
|
23
|
+
probe_file_path = ENV['DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE']
|
24
|
+
if probe_file_path.nil? || probe_file_path.empty?
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
# We want to initialize the component tree here if it was not already
|
29
|
+
# initialized.
|
30
|
+
component = Datadog::DI.component
|
31
|
+
return unless component
|
32
|
+
|
33
|
+
begin
|
34
|
+
probe_specs = File.open(probe_file_path) do |f|
|
35
|
+
# The probe file should contain an array, JSON.parse does not work
|
36
|
+
JSON.load(f) # standard:disable Security/JSONLoad
|
37
|
+
end
|
38
|
+
|
39
|
+
probe_specs.each do |probe_spec|
|
40
|
+
probe = component.parse_probe_spec_and_notify(probe_spec)
|
41
|
+
component.logger.debug { "di: received #{probe.type} probe at #{probe.location} (#{probe.id}) via probe file: #{probe_file_path}" }
|
42
|
+
|
43
|
+
begin
|
44
|
+
component.probe_manager.add_probe(probe)
|
45
|
+
rescue DI::Error::DITargetNotInRegistry => exc
|
46
|
+
component.telemetry&.report(exc, description: "Line probe is targeting a loaded file that is not in code tracker")
|
47
|
+
|
48
|
+
payload = component.probe_notification_builder.build_errored(probe, exc)
|
49
|
+
component.probe_notifier_worker.add_status(payload)
|
50
|
+
rescue => exc
|
51
|
+
raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
52
|
+
|
53
|
+
component.logger.debug { "di: unhandled exception adding #{probe.type} probe at #{probe.location} (#{probe.id}) in DI probe file loader: #{exc.class}: #{exc}" }
|
54
|
+
component.telemetry&.report(exc, description: "Unhandled exception adding probe in DI probe file loader")
|
55
|
+
|
56
|
+
# TODO test this path
|
57
|
+
payload = component.probe_notification_builder.build_errored(probe, exc)
|
58
|
+
component.probe_notifier_worker.add_status(payload)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
rescue => exc
|
62
|
+
if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
63
|
+
should_propagate = true
|
64
|
+
raise
|
65
|
+
end
|
66
|
+
|
67
|
+
component.logger.debug { "di: unhandled exception handling a probe in DI probe file loader: #{exc.class}: #{exc}" }
|
68
|
+
component.telemetry&.report(exc, description: "Unhandled exception handling probe in DI probe file loader")
|
69
|
+
end
|
70
|
+
rescue
|
71
|
+
# We should generally never get here, but if component tree
|
72
|
+
# initialization fails for some unexpected reason, don't nuke
|
73
|
+
# the customer application.
|
74
|
+
#
|
75
|
+
# For the same reason, we do not check
|
76
|
+
# component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
77
|
+
# here again, but rely on the local variable storing that value.
|
78
|
+
raise if should_propagate
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -42,9 +42,9 @@ module Datadog
|
|
42
42
|
# path is the actual path of the instrumented file.
|
43
43
|
def build_executed(probe,
|
44
44
|
path: nil, rv: nil, duration: nil, caller_locations: nil,
|
45
|
-
|
45
|
+
serialized_locals: nil, args: nil, kwargs: nil, target_self: nil,
|
46
46
|
serialized_entry_args: nil)
|
47
|
-
build_snapshot(probe, rv: rv,
|
47
|
+
build_snapshot(probe, rv: rv, serialized_locals: serialized_locals,
|
48
48
|
# Actual path of the instrumented file.
|
49
49
|
path: path,
|
50
50
|
duration: duration,
|
@@ -52,14 +52,23 @@ module Datadog
|
|
52
52
|
# this should be all frames for enriched probes and no frames for
|
53
53
|
# non-enriched probes?
|
54
54
|
caller_locations: caller_locations,
|
55
|
-
args: args, kwargs: kwargs,
|
55
|
+
args: args, kwargs: kwargs,
|
56
|
+
target_self: target_self,
|
56
57
|
serialized_entry_args: serialized_entry_args)
|
57
58
|
end
|
58
59
|
|
59
|
-
def build_snapshot(probe, rv: nil,
|
60
|
+
def build_snapshot(probe, rv: nil, serialized_locals: nil, path: nil,
|
61
|
+
# In Ruby everything is a method, therefore we should always have
|
62
|
+
# a target self. However, if we are not capturing a snapshot,
|
63
|
+
# there is no need to pass in the target self.
|
64
|
+
target_self: nil,
|
60
65
|
duration: nil, caller_locations: nil,
|
61
|
-
args: nil, kwargs: nil,
|
66
|
+
args: nil, kwargs: nil,
|
62
67
|
serialized_entry_args: nil)
|
68
|
+
if probe.capture_snapshot? && !target_self
|
69
|
+
raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
|
70
|
+
end
|
71
|
+
|
63
72
|
# TODO also verify that non-capturing probe does not pass
|
64
73
|
# snapshot or vars/args into this method
|
65
74
|
captures = if probe.capture_snapshot?
|
@@ -68,25 +77,18 @@ module Datadog
|
|
68
77
|
"@return": serializer.serialize_value(rv,
|
69
78
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
70
79
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
|
80
|
+
self: serializer.serialize_value(target_self),
|
71
81
|
}
|
72
|
-
if instance_vars
|
73
|
-
return_arguments.update(
|
74
|
-
serializer.serialize_vars(instance_vars,
|
75
|
-
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
76
|
-
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
77
|
-
)
|
78
|
-
end
|
79
82
|
{
|
80
83
|
entry: {
|
81
84
|
# standard:disable all
|
82
85
|
arguments: if serialized_entry_args
|
83
86
|
serialized_entry_args
|
84
87
|
else
|
85
|
-
(args || kwargs) && serializer.serialize_args(args, kwargs,
|
88
|
+
(args || kwargs) && serializer.serialize_args(args, kwargs, target_self,
|
86
89
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
87
90
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
88
91
|
end,
|
89
|
-
throwable: nil,
|
90
92
|
# standard:enable all
|
91
93
|
},
|
92
94
|
return: {
|
@@ -96,8 +98,11 @@ module Datadog
|
|
96
98
|
}
|
97
99
|
elsif probe.line?
|
98
100
|
{
|
99
|
-
lines:
|
100
|
-
probe.line_no => {
|
101
|
+
lines: serialized_locals && {
|
102
|
+
probe.line_no => {
|
103
|
+
locals: serialized_locals,
|
104
|
+
arguments: {self: serializer.serialize_value(target_self)},
|
105
|
+
},
|
101
106
|
},
|
102
107
|
}
|
103
108
|
end
|
data/lib/datadog/di/remote.rb
CHANGED
@@ -43,6 +43,8 @@ module Datadog
|
|
43
43
|
if component
|
44
44
|
|
45
45
|
probe_manager = component.probe_manager
|
46
|
+
probe_notification_builder = component.probe_notification_builder
|
47
|
+
probe_notifier_worker = component.probe_notifier_worker
|
46
48
|
|
47
49
|
current_probe_ids = {}
|
48
50
|
repository.contents.each do |content|
|
@@ -50,11 +52,7 @@ module Datadog
|
|
50
52
|
when PRODUCT
|
51
53
|
begin
|
52
54
|
probe_spec = parse_content(content)
|
53
|
-
probe =
|
54
|
-
probe_notification_builder = component.probe_notification_builder
|
55
|
-
payload = probe_notification_builder.build_received(probe)
|
56
|
-
probe_notifier_worker = component.probe_notifier_worker
|
57
|
-
probe_notifier_worker.add_status(payload)
|
55
|
+
probe = component.parse_probe_spec_and_notify(probe_spec)
|
58
56
|
component.logger.debug { "di: received #{probe.type} probe at #{probe.location} (#{probe.id}) via RC" }
|
59
57
|
|
60
58
|
begin
|
@@ -36,6 +36,10 @@ module Datadog
|
|
36
36
|
# efficient but there would be additional overhead from passing this
|
37
37
|
# parameter all the time and the API would get more complex.
|
38
38
|
#
|
39
|
+
# Note: "self" cannot be used as a parameter name in Ruby, therefore
|
40
|
+
# there should never be a conflict between instance variable
|
41
|
+
# serialization and method parameters.
|
42
|
+
#
|
39
43
|
# @api private
|
40
44
|
class Serializer
|
41
45
|
# Third-party library integration / custom serializers.
|
@@ -86,7 +90,7 @@ module Datadog
|
|
86
90
|
# Instance variables are technically a hash just like kwargs,
|
87
91
|
# we take them as a separate parameter to avoid a hash merge
|
88
92
|
# in upstream code.
|
89
|
-
def serialize_args(args, kwargs,
|
93
|
+
def serialize_args(args, kwargs, target_self,
|
90
94
|
depth: settings.dynamic_instrumentation.max_capture_depth,
|
91
95
|
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count)
|
92
96
|
counter = 0
|
@@ -95,7 +99,7 @@ module Datadog
|
|
95
99
|
# Conversion to symbol is needed here to put args ahead of
|
96
100
|
# kwargs when they are merged below.
|
97
101
|
c[:"arg#{counter}"] = value
|
98
|
-
end.update(kwargs).update(
|
102
|
+
end.update(kwargs).update(self: target_self)
|
99
103
|
serialize_vars(combined, depth: depth, attribute_count: attribute_count)
|
100
104
|
end
|
101
105
|
|
data/lib/datadog/di.rb
CHANGED
@@ -19,7 +19,6 @@ module Datadog
|
|
19
19
|
Extensions.activate!
|
20
20
|
|
21
21
|
class << self
|
22
|
-
|
23
22
|
# This method is called from DI Remote handler to issue DI operations
|
24
23
|
# to the probe manager (add or remove probes).
|
25
24
|
#
|
@@ -35,9 +34,3 @@ module Datadog
|
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
38
|
-
|
39
|
-
# Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
|
40
|
-
# trace point. Activate DI automatically on supported Ruby versions but
|
41
|
-
# always load its settings so that, for example, turning DI off when
|
42
|
-
# we are on Ruby 2.5 does not produce exceptions.
|
43
|
-
require_relative 'di/boot' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
|