datadog 2.12.0 → 2.22.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 +348 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
- data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
- data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
- data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
- data/ext/libdatadog_api/crashtracker.c +11 -12
- data/ext/libdatadog_api/crashtracker.h +5 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/ddsketch.c +106 -0
- data/ext/libdatadog_api/extconf.rb +5 -3
- data/ext/libdatadog_api/init.c +18 -0
- data/ext/libdatadog_api/library_config.c +172 -0
- data/ext/libdatadog_api/library_config.h +25 -0
- data/ext/libdatadog_api/process_discovery.c +118 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +15 -5
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +24 -2
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
- data/lib/datadog/appsec/api_security/sampler.rb +59 -0
- data/lib/datadog/appsec/api_security.rb +23 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +46 -71
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +162 -30
- data/lib/datadog/appsec/context.rb +30 -7
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
- data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +103 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -0
- data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +11 -12
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -9
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +53 -31
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
- 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/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- 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 +91 -147
- data/lib/datadog/appsec/ext.rb +4 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -2
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/metrics/collector.rb +23 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
- data/lib/datadog/appsec/metrics.rb +1 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
- data/lib/datadog/appsec/remote.rb +43 -59
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/engine.rb +176 -0
- data/lib/datadog/appsec/security_engine/result.rb +44 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +37 -0
- 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/utils.rb +0 -2
- data/lib/datadog/appsec.rb +5 -15
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +69 -37
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/config_helper.rb +100 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +4 -1
- data/lib/datadog/core/configuration/option.rb +117 -77
- data/lib/datadog/core/configuration/option_definition.rb +5 -14
- data/lib/datadog/core/configuration/options.rb +15 -13
- data/lib/datadog/core/configuration/settings.rb +117 -48
- data/lib/datadog/core/configuration/stable_config.rb +32 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/ddsketch.rb +21 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/agent_info.rb +4 -3
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -8
- data/lib/datadog/core/environment/git.rb +3 -2
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/environment/variable_helpers.rb +4 -4
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +29 -29
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/pin.rb +4 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +61 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +44 -35
- data/lib/datadog/core/remote/component.rb +12 -17
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +14 -1
- data/lib/datadog/core/remote/negotiation.rb +9 -9
- data/lib/datadog/core/remote/transport/config.rb +4 -3
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -37
- data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
- data/lib/datadog/core/remote/transport/http.rb +25 -89
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/tag_builder.rb +56 -0
- data/lib/datadog/core/telemetry/component.rb +92 -52
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +18 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +5 -4
- data/lib/datadog/core/telemetry/logging.rb +11 -5
- data/lib/datadog/core/telemetry/metric.rb +8 -8
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
- data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
- data/lib/datadog/core/telemetry/transport/http.rb +63 -0
- data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
- data/lib/datadog/core/telemetry/worker.rb +90 -24
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/api/instance.rb +17 -0
- data/lib/datadog/core/transport/http/api/spec.rb +17 -0
- data/lib/datadog/core/transport/http/builder.rb +19 -17
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http.rb +75 -0
- data/lib/datadog/core/transport/response.rb +4 -1
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +25 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/utils.rb +7 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +29 -12
- data/lib/datadog/core/workers/interval_loop.rb +12 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/core.rb +10 -0
- data/lib/datadog/di/boot.rb +43 -0
- data/lib/datadog/di/component.rb +21 -2
- data/lib/datadog/di/context.rb +70 -0
- data/lib/datadog/di/el/compiler.rb +164 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +25 -0
- data/lib/datadog/di/instrumenter.rb +132 -20
- data/lib/datadog/di/probe.rb +35 -15
- data/lib/datadog/di/probe_builder.rb +39 -1
- 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_manager.rb +3 -2
- data/lib/datadog/di/probe_notification_builder.rb +61 -67
- data/lib/datadog/di/probe_notifier_worker.rb +25 -17
- data/lib/datadog/di/remote.rb +5 -5
- data/lib/datadog/di/serializer.rb +160 -8
- data/lib/datadog/di/transport/diagnostics.rb +4 -3
- data/lib/datadog/di/transport/http/api.rb +2 -12
- data/lib/datadog/di/transport/http/client.rb +4 -3
- data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
- data/lib/datadog/di/transport/http/input.rb +18 -35
- data/lib/datadog/di/transport/http.rb +15 -77
- data/lib/datadog/di/transport/input.rb +14 -5
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +0 -34
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events/v2.rb +196 -0
- data/lib/datadog/kit/appsec/events.rb +17 -4
- data/lib/datadog/kit/identity.rb +22 -12
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +21 -6
- data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
- 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 +15 -11
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/info.rb +44 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +8 -9
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +12 -7
- data/lib/datadog/profiling/ext.rb +2 -15
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +8 -62
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +9 -9
- data/lib/datadog/profiling/tag_builder.rb +7 -41
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/profiling.rb +13 -10
- 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/component.rb +21 -29
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +8 -4
- data/lib/datadog/tracing/configuration/settings.rb +50 -12
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- 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 +19 -4
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- 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 +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/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 +12 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
- 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/component.rb +2 -2
- 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/configuration/settings.rb +1 -1
- 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 +6 -7
- 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 +7 -5
- data/lib/datadog/tracing/contrib/ext.rb +4 -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 +9 -5
- 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/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- 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 +84 -48
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
- 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/distributed/propagation.rb +3 -0
- 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/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
- 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 +11 -19
- 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/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -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 +23 -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 +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
- data/lib/datadog/tracing/contrib/patcher.rb +12 -11
- 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 +4 -3
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- 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 +8 -6
- 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/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- 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/span_attribute_schema.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/support.rb +28 -0
- 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/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
- data/lib/datadog/tracing/distributed/baggage.rb +196 -0
- data/lib/datadog/tracing/distributed/datadog.rb +8 -7
- 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 +28 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- 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/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +13 -0
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata/tagging.rb +4 -4
- data/lib/datadog/tracing/metadata.rb +2 -0
- 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/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- 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 +11 -2
- data/lib/datadog/tracing/span_event.rb +11 -11
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +76 -26
- data/lib/datadog/tracing/sync_writer.rb +5 -4
- data/lib/datadog/tracing/trace_digest.rb +29 -24
- data/lib/datadog/tracing/trace_operation.rb +121 -97
- data/lib/datadog/tracing/trace_segment.rb +8 -6
- data/lib/datadog/tracing/tracer.rb +90 -43
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +6 -5
- data/lib/datadog/tracing/transport/http/traces.rb +15 -43
- data/lib/datadog/tracing/transport/http.rb +13 -75
- 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/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +31 -14
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing/writer.rb +4 -4
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +1 -1
- data/lib/datadog.rb +8 -2
- metadata +115 -24
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
- data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/telemetry/http/env.rb +0 -20
- data/lib/datadog/core/telemetry/http/ext.rb +0 -28
- data/lib/datadog/core/telemetry/http/response.rb +0 -70
- data/lib/datadog/core/telemetry/http/transport.rb +0 -90
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require_relative '../core/utils/time'
|
|
4
4
|
|
|
5
5
|
# rubocop:disable Lint/AssignmentInCondition
|
|
6
|
+
# rubocop:disable Style/AndOr
|
|
6
7
|
|
|
7
8
|
module Datadog
|
|
8
9
|
module DI
|
|
@@ -52,6 +53,17 @@ module Datadog
|
|
|
52
53
|
# (however, Probe instances can be replaced by OpenStruct instances
|
|
53
54
|
# providing the same interface with not much effort).
|
|
54
55
|
#
|
|
56
|
+
# Instrumenter (this class) is responsible for building snapshots.
|
|
57
|
+
# This is because to capture values on method entry, those values need to
|
|
58
|
+
# be duplicated or serialized into immutable values to prevent their
|
|
59
|
+
# modification by the instrumented method. Therefore this class must
|
|
60
|
+
# do at least some serialization/snapshot building and to keep the code
|
|
61
|
+
# well-encapsulated, all serialization/snapshot building should thus be
|
|
62
|
+
# initiated from this class rather than downstream code.
|
|
63
|
+
#
|
|
64
|
+
# As a consequence of Instrumenter building snapshots, it should not
|
|
65
|
+
# expose TracePoint objects to any downstream code.
|
|
66
|
+
#
|
|
55
67
|
# @api private
|
|
56
68
|
class Instrumenter
|
|
57
69
|
def initialize(settings, serializer, logger, code_tracker: nil, telemetry: nil)
|
|
@@ -107,28 +119,57 @@ module Datadog
|
|
|
107
119
|
|
|
108
120
|
mod = Module.new do
|
|
109
121
|
define_method(method_name) do |*args, **kwargs, &target_block| # steep:ignore
|
|
110
|
-
|
|
122
|
+
continue = true
|
|
123
|
+
if condition = probe.condition
|
|
124
|
+
begin
|
|
125
|
+
# This context will be recreated later, unlike for line probes.
|
|
126
|
+
context = Context.new(
|
|
127
|
+
locals: serializer.combine_args(args, kwargs, self),
|
|
128
|
+
target_self: self,
|
|
129
|
+
probe: probe, settings: settings, serializer: serializer,
|
|
130
|
+
caller_locations: caller_locations,
|
|
131
|
+
)
|
|
132
|
+
continue = condition.satisfied?(context)
|
|
133
|
+
rescue
|
|
134
|
+
raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
135
|
+
|
|
136
|
+
# TODO log / report via telemetry?
|
|
137
|
+
continue = false
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
if continue and rate_limiter.nil? || rate_limiter.allow?
|
|
111
142
|
# Arguments may be mutated by the method, therefore
|
|
112
143
|
# they need to be serialized prior to method invocation.
|
|
113
|
-
|
|
114
|
-
serializer.serialize_args(args, kwargs,
|
|
144
|
+
serialized_entry_args = if probe.capture_snapshot?
|
|
145
|
+
serializer.serialize_args(args, kwargs, self,
|
|
115
146
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
|
116
147
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
|
117
148
|
end
|
|
118
149
|
start_time = Core::Utils::Time.get_time
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
150
|
+
|
|
151
|
+
rv = nil
|
|
152
|
+
begin
|
|
153
|
+
# Under Ruby 2.6 we cannot just call super(*args, **kwargs)
|
|
154
|
+
# for methods defined via method_missing.
|
|
155
|
+
rv = if args.any?
|
|
156
|
+
if kwargs.any?
|
|
157
|
+
super(*args, **kwargs, &target_block)
|
|
158
|
+
else
|
|
159
|
+
super(*args, &target_block)
|
|
160
|
+
end
|
|
161
|
+
elsif kwargs.any?
|
|
162
|
+
super(**kwargs, &target_block)
|
|
124
163
|
else
|
|
125
|
-
super(
|
|
164
|
+
super(&target_block)
|
|
126
165
|
end
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
166
|
+
rescue NoMemoryError, Interrupt, SystemExit
|
|
167
|
+
raise
|
|
168
|
+
rescue Exception => exc # standard:disable Lint/RescueException
|
|
169
|
+
# We will raise the exception captured here later, after
|
|
170
|
+
# the instrumentation callback runs.
|
|
131
171
|
end
|
|
172
|
+
|
|
132
173
|
duration = Core::Utils::Time.get_time - start_time
|
|
133
174
|
# The method itself is not part of the stack trace because
|
|
134
175
|
# we are getting the stack trace from outside of the method.
|
|
@@ -147,10 +188,20 @@ module Datadog
|
|
|
147
188
|
end
|
|
148
189
|
caller_locs = method_frame + caller_locations # steep:ignore
|
|
149
190
|
# TODO capture arguments at exit
|
|
191
|
+
|
|
192
|
+
context = Context.new(locals: nil, target_self: self,
|
|
193
|
+
probe: probe, settings: settings, serializer: serializer,
|
|
194
|
+
serialized_entry_args: serialized_entry_args,
|
|
195
|
+
caller_locations: caller_locs,
|
|
196
|
+
return_value: rv, duration: duration, exception: exc,)
|
|
197
|
+
|
|
150
198
|
# & is to stop steep complaints, block is always present here.
|
|
151
|
-
block&.call(
|
|
152
|
-
|
|
153
|
-
|
|
199
|
+
block&.call(context)
|
|
200
|
+
if exc
|
|
201
|
+
raise exc
|
|
202
|
+
else
|
|
203
|
+
rv
|
|
204
|
+
end
|
|
154
205
|
else
|
|
155
206
|
# stop standard from trying to mess up my code
|
|
156
207
|
_ = 42
|
|
@@ -294,14 +345,57 @@ module Datadog
|
|
|
294
345
|
# are invoked for *each* line of Ruby executed.
|
|
295
346
|
# TODO find out exactly when the path in trace point is relative.
|
|
296
347
|
# Looks like this is the case when line trace point is not targeted?
|
|
297
|
-
|
|
348
|
+
continue = iseq || tp.lineno == probe.line_no && (
|
|
298
349
|
probe.file == tp.path || probe.file_matches?(tp.path)
|
|
299
350
|
)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
351
|
+
|
|
352
|
+
# We set the trace point on :return to be able to instrument
|
|
353
|
+
# 'end' lines. This also causes the trace point to be invoked on
|
|
354
|
+
# non-'end' lines when a line raises an exception, since the
|
|
355
|
+
# exception causes the method to stop executing and stack unwends.
|
|
356
|
+
# We do not want two invocations of the trace point.
|
|
357
|
+
# Therefore, if a trace point is invoked with a :line event,
|
|
358
|
+
# mark it as such and ignore subsequent :return events.
|
|
359
|
+
continue &&= if probe.executed_on_line?
|
|
360
|
+
tp.event == :line
|
|
361
|
+
else
|
|
362
|
+
if tp.event == :line
|
|
363
|
+
probe.executed_on_line!
|
|
364
|
+
end
|
|
365
|
+
true
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
if continue
|
|
369
|
+
if condition = probe.condition
|
|
370
|
+
context = Context.new(
|
|
371
|
+
locals: Instrumenter.get_local_variables(tp),
|
|
372
|
+
target_self: tp.self,
|
|
373
|
+
probe: probe, settings: settings, serializer: serializer,
|
|
374
|
+
path: tp.path,
|
|
375
|
+
caller_locations: caller_locations,
|
|
376
|
+
)
|
|
377
|
+
continue = condition.satisfied?(context)
|
|
303
378
|
end
|
|
304
379
|
end
|
|
380
|
+
|
|
381
|
+
continue &&= rate_limiter.nil? || rate_limiter.allow? # standard:disable Style/AndOr
|
|
382
|
+
|
|
383
|
+
if continue
|
|
384
|
+
# The context creation is relatively expensive and we don't
|
|
385
|
+
# want to run it if the callback won't be executed due to the
|
|
386
|
+
# rate limit.
|
|
387
|
+
# Thus the copy-paste of the creation call here.
|
|
388
|
+
context ||= Context.new(
|
|
389
|
+
locals: Instrumenter.get_local_variables(tp),
|
|
390
|
+
target_self: tp.self,
|
|
391
|
+
probe: probe, settings: settings, serializer: serializer,
|
|
392
|
+
path: tp.path,
|
|
393
|
+
caller_locations: caller_locations,
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
# & is to stop steep complaints, block is always present here.
|
|
397
|
+
block&.call(context)
|
|
398
|
+
end
|
|
305
399
|
rescue => exc
|
|
306
400
|
raise if settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
|
307
401
|
logger.debug { "di: unhandled exception in line trace point: #{exc.class}: #{exc}" }
|
|
@@ -371,6 +465,23 @@ module Datadog
|
|
|
371
465
|
end
|
|
372
466
|
end
|
|
373
467
|
|
|
468
|
+
class << self
|
|
469
|
+
def get_local_variables(trace_point)
|
|
470
|
+
# binding appears to be constructed on access, therefore
|
|
471
|
+
# 1) we should attempt to cache it and
|
|
472
|
+
# 2) we should not call +binding+ until we actually need variable values.
|
|
473
|
+
binding = trace_point.binding
|
|
474
|
+
|
|
475
|
+
# steep hack - should never happen
|
|
476
|
+
return {} unless binding
|
|
477
|
+
|
|
478
|
+
binding.local_variables.each_with_object({}) do |name, map|
|
|
479
|
+
value = binding.local_variable_get(name)
|
|
480
|
+
map[name] = value
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|
|
374
485
|
private
|
|
375
486
|
|
|
376
487
|
attr_reader :lock
|
|
@@ -406,3 +517,4 @@ module Datadog
|
|
|
406
517
|
end
|
|
407
518
|
|
|
408
519
|
# rubocop:enable Lint/AssignmentInCondition
|
|
520
|
+
# rubocop:enable Style/AndOr
|
data/lib/datadog/di/probe.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Datadog
|
|
|
17
17
|
# and remote config code must be prepared to deal with exceptions
|
|
18
18
|
# raised by Probe constructor in particular. Therefore, Probe constructor
|
|
19
19
|
# will raise an exception if it determines that there is not enough
|
|
20
|
-
# information (or
|
|
20
|
+
# information (or conflicting information) in the arguments to create a
|
|
21
21
|
# functional probe, and upstream code is tasked with not spamming logs
|
|
22
22
|
# with notifications of such errors (and potentially limiting the
|
|
23
23
|
# attempts to construct probe from a given payload).
|
|
@@ -36,8 +36,9 @@ module Datadog
|
|
|
36
36
|
|
|
37
37
|
def initialize(id:, type:,
|
|
38
38
|
file: nil, line_no: nil, type_name: nil, method_name: nil,
|
|
39
|
-
template: nil,
|
|
40
|
-
|
|
39
|
+
template: nil, template_segments: nil,
|
|
40
|
+
capture_snapshot: false, max_capture_depth: nil,
|
|
41
|
+
max_capture_attribute_count: nil, condition: nil,
|
|
41
42
|
rate_limit: nil)
|
|
42
43
|
# Perform some sanity checks here to detect unexpected attribute
|
|
43
44
|
# combinations, in order to not do them in subsequent code.
|
|
@@ -45,9 +46,17 @@ module Datadog
|
|
|
45
46
|
raise ArgumentError, "Unknown probe type: #{type}"
|
|
46
47
|
end
|
|
47
48
|
|
|
48
|
-
if
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
# Probe should be inferred to be a line probe if the specification
|
|
50
|
+
# contains a line number. This how Java tracer works and Go tracer
|
|
51
|
+
# is implementing the same behavior, and Go will have all 3 fields
|
|
52
|
+
# (file path, line number and method name) for line probes.
|
|
53
|
+
# Do not raise if line number and method name both exist - instead
|
|
54
|
+
# treat the probe as a line probe.
|
|
55
|
+
#
|
|
56
|
+
# In the future we want to provide type name and method name to line
|
|
57
|
+
# probes, so that the library can verify that the instrumented line
|
|
58
|
+
# is in the method that the frontend showed to the user when the
|
|
59
|
+
# user created the probe.
|
|
51
60
|
|
|
52
61
|
if line_no && !file
|
|
53
62
|
raise ArgumentError, "Probe contains line number but not file: #{id}"
|
|
@@ -57,6 +66,10 @@ module Datadog
|
|
|
57
66
|
raise ArgumentError, "Partial method probe definition: #{id}"
|
|
58
67
|
end
|
|
59
68
|
|
|
69
|
+
if line_no.nil? && method_name.nil?
|
|
70
|
+
raise ArgumentError, "Unhandled probe type: neither method nor line probe: #{id}"
|
|
71
|
+
end
|
|
72
|
+
|
|
60
73
|
@id = id
|
|
61
74
|
@type = type
|
|
62
75
|
@file = file
|
|
@@ -64,17 +77,11 @@ module Datadog
|
|
|
64
77
|
@type_name = type_name
|
|
65
78
|
@method_name = method_name
|
|
66
79
|
@template = template
|
|
80
|
+
@template_segments = template_segments
|
|
67
81
|
@capture_snapshot = !!capture_snapshot
|
|
68
82
|
@max_capture_depth = max_capture_depth
|
|
69
83
|
@max_capture_attribute_count = max_capture_attribute_count
|
|
70
|
-
|
|
71
|
-
# These checks use instance methods that have more complex logic
|
|
72
|
-
# than checking a single argument value. To avoid duplicating
|
|
73
|
-
# the logic here, use the methods and perform these checks after
|
|
74
|
-
# instance variable assignment.
|
|
75
|
-
unless method? || line?
|
|
76
|
-
raise ArgumentError, "Unhandled probe type: neither method nor line probe: #{id}"
|
|
77
|
-
end
|
|
84
|
+
@condition = condition
|
|
78
85
|
|
|
79
86
|
@rate_limit = rate_limit || (@capture_snapshot ? 1 : 5000)
|
|
80
87
|
@rate_limiter = Datadog::Core::TokenBucket.new(@rate_limit)
|
|
@@ -89,6 +96,10 @@ module Datadog
|
|
|
89
96
|
attr_reader :type_name
|
|
90
97
|
attr_reader :method_name
|
|
91
98
|
attr_reader :template
|
|
99
|
+
attr_reader :template_segments
|
|
100
|
+
|
|
101
|
+
# The compiled condition for the probe, as a String.
|
|
102
|
+
attr_reader :condition
|
|
92
103
|
|
|
93
104
|
# Configured maximum capture depth. Can be nil in which case
|
|
94
105
|
# the global default will be used.
|
|
@@ -122,7 +133,7 @@ module Datadog
|
|
|
122
133
|
|
|
123
134
|
# Returns whether the probe is a method probe.
|
|
124
135
|
def method?
|
|
125
|
-
|
|
136
|
+
line_no.nil?
|
|
126
137
|
end
|
|
127
138
|
|
|
128
139
|
# Returns the line number associated with the probe, raising
|
|
@@ -186,6 +197,15 @@ module Datadog
|
|
|
186
197
|
def emitting_notified?
|
|
187
198
|
!!@emitting_notified
|
|
188
199
|
end
|
|
200
|
+
|
|
201
|
+
def executed_on_line?
|
|
202
|
+
!!@executed_on_line
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def executed_on_line!
|
|
206
|
+
# TODO lock?
|
|
207
|
+
@executed_on_line = true
|
|
208
|
+
end
|
|
189
209
|
end
|
|
190
210
|
end
|
|
191
211
|
end
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# rubocop:disable Lint/AssignmentInCondition
|
|
4
|
+
|
|
3
5
|
require_relative "probe"
|
|
6
|
+
require_relative 'el'
|
|
4
7
|
|
|
5
8
|
module Datadog
|
|
6
9
|
module DI
|
|
@@ -21,10 +24,19 @@ module Datadog
|
|
|
21
24
|
'LOG_PROBE' => :log,
|
|
22
25
|
}.freeze
|
|
23
26
|
|
|
24
|
-
module_function
|
|
27
|
+
module_function
|
|
28
|
+
|
|
29
|
+
def build_from_remote_config(config)
|
|
25
30
|
# The validations here are not yet comprehensive.
|
|
26
31
|
type = config.fetch('type')
|
|
27
32
|
type_symbol = PROBE_TYPES[type] or raise ArgumentError, "Unrecognized probe type: #{type}"
|
|
33
|
+
cond = if cond_spec = config['when']
|
|
34
|
+
unless cond_spec['dsl'] && cond_spec['json']
|
|
35
|
+
raise ArgumentError, "Malformed condition specification for probe: #{config}"
|
|
36
|
+
end
|
|
37
|
+
compiled = EL::Compiler.new.compile(cond_spec['json'])
|
|
38
|
+
EL::Expression.new(cond_spec['dsl'], compiled)
|
|
39
|
+
end
|
|
28
40
|
Probe.new(
|
|
29
41
|
id: config.fetch("id"),
|
|
30
42
|
type: type_symbol,
|
|
@@ -34,15 +46,41 @@ module Datadog
|
|
|
34
46
|
line_no: config["where"]&.[]("lines")&.compact&.map(&:to_i)&.first,
|
|
35
47
|
type_name: config["where"]&.[]("typeName"),
|
|
36
48
|
method_name: config["where"]&.[]("methodName"),
|
|
49
|
+
# We should not be using the template for anything - we instead
|
|
50
|
+
# use +segments+ - but keep the template for debugging.
|
|
37
51
|
template: config["template"],
|
|
52
|
+
template_segments: build_template_segments(config['segments']),
|
|
38
53
|
capture_snapshot: !!config["captureSnapshot"],
|
|
39
54
|
max_capture_depth: config["capture"]&.[]("maxReferenceDepth"),
|
|
40
55
|
max_capture_attribute_count: config["capture"]&.[]("maxFieldCount"),
|
|
41
56
|
rate_limit: config["sampling"]&.[]("snapshotsPerSecond"),
|
|
57
|
+
condition: cond,
|
|
42
58
|
)
|
|
43
59
|
rescue KeyError => exc
|
|
44
60
|
raise ArgumentError, "Malformed remote configuration entry for probe: #{exc.class}: #{exc}: #{config}"
|
|
45
61
|
end
|
|
62
|
+
|
|
63
|
+
def build_template_segments(segments)
|
|
64
|
+
segments&.map do |segment|
|
|
65
|
+
if Hash === segment
|
|
66
|
+
if str = segment['str']
|
|
67
|
+
str
|
|
68
|
+
elsif ast = segment['json']
|
|
69
|
+
unless dsl = segment['dsl']
|
|
70
|
+
raise ArgumentError, "Missing dsl for json in segment: #{segment}"
|
|
71
|
+
end
|
|
72
|
+
compiled = EL::Compiler.new.compile(ast)
|
|
73
|
+
EL::Expression.new(dsl, compiled)
|
|
74
|
+
else
|
|
75
|
+
# TODO report to telemetry?
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
# TODO report to telemetry?
|
|
79
|
+
end
|
|
80
|
+
end&.compact
|
|
81
|
+
end
|
|
46
82
|
end
|
|
47
83
|
end
|
|
48
84
|
end
|
|
85
|
+
|
|
86
|
+
# rubocop:enable Lint/AssignmentInCondition
|
|
@@ -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 = DATADOG_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
|
|
@@ -229,7 +229,8 @@ module Datadog
|
|
|
229
229
|
# This method is responsible for queueing probe status to be sent to the
|
|
230
230
|
# backend (once per the probe's lifetime) and a snapshot corresponding
|
|
231
231
|
# to the current invocation.
|
|
232
|
-
def probe_executed_callback(
|
|
232
|
+
def probe_executed_callback(context)
|
|
233
|
+
probe = context.probe
|
|
233
234
|
logger.trace { "di: executed #{probe.type} probe at #{probe.location} (#{probe.id})" }
|
|
234
235
|
unless probe.emitting_notified?
|
|
235
236
|
payload = probe_notification_builder.build_emitting(probe)
|
|
@@ -237,7 +238,7 @@ module Datadog
|
|
|
237
238
|
probe.emitting_notified = true
|
|
238
239
|
end
|
|
239
240
|
|
|
240
|
-
payload = probe_notification_builder.build_executed(
|
|
241
|
+
payload = probe_notification_builder.build_executed(context)
|
|
241
242
|
probe_notifier_worker.add_snapshot(payload)
|
|
242
243
|
end
|
|
243
244
|
|