datadog 2.7.1 → 2.18.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 +353 -1
- data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +78 -102
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
- data/ext/datadog_profiling_native_extension/collectors_stack.c +235 -57
- data/ext/datadog_profiling_native_extension/collectors_stack.h +21 -5
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +376 -156
- 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 +14 -8
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
- data/ext/datadog_profiling_native_extension/heap_recorder.c +295 -532
- data/ext/datadog_profiling_native_extension/heap_recorder.h +6 -8
- data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
- 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 +69 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -4
- data/ext/datadog_profiling_native_extension/profiling.c +19 -8
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +9 -21
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
- data/ext/datadog_profiling_native_extension/stack_recorder.c +231 -181
- data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
- data/ext/libdatadog_api/crashtracker.c +17 -15
- 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/extconf.rb +2 -2
- data/ext/libdatadog_api/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +164 -0
- data/ext/libdatadog_api/library_config.h +25 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +112 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +2 -2
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +49 -0
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +65 -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 +50 -5
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +623 -253
- data/lib/datadog/appsec/assets/waf_rules/strict.json +69 -107
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +49 -65
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +212 -27
- data/lib/datadog/appsec/context.rb +74 -0
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
- data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
- 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 +33 -25
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
- data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
- data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
- data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
- data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
- data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +73 -78
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
- data/lib/datadog/appsec/event.rb +96 -135
- data/lib/datadog/appsec/ext.rb +12 -3
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/metrics/collector.rb +38 -0
- data/lib/datadog/appsec/metrics/exporter.rb +35 -0
- data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
- data/lib/datadog/appsec/metrics.rb +13 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
- data/lib/datadog/appsec/processor/rule_loader.rb +30 -36
- data/lib/datadog/appsec/remote.rb +31 -57
- data/lib/datadog/appsec/response.rb +19 -85
- data/lib/datadog/appsec/security_engine/engine.rb +194 -0
- data/lib/datadog/appsec/security_engine/result.rb +67 -0
- data/lib/datadog/appsec/security_engine/runner.rb +87 -0
- data/lib/datadog/appsec/security_engine.rb +9 -0
- data/lib/datadog/appsec/security_event.rb +39 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +22 -12
- data/lib/datadog/auto_instrument.rb +3 -0
- 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 +4 -18
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +74 -32
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/ext.rb +5 -1
- data/lib/datadog/core/configuration/option.rb +81 -45
- data/lib/datadog/core/configuration/option_definition.rb +6 -4
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +121 -50
- data/lib/datadog/core/configuration/stable_config.rb +22 -0
- data/lib/datadog/core/configuration.rb +43 -11
- data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
- data/lib/datadog/core/crashtracking/component.rb +4 -13
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +17 -1
- data/lib/datadog/core/environment/agent_info.rb +78 -0
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -6
- data/lib/datadog/core/environment/git.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/environment/variable_helpers.rb +1 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +27 -27
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
- data/lib/datadog/core/process_discovery.rb +36 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client/capabilities.rb +6 -0
- data/lib/datadog/core/remote/client.rb +107 -92
- data/lib/datadog/core/remote/component.rb +18 -19
- 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/api.rb +13 -18
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
- data/lib/datadog/core/remote/transport/http.rb +25 -94
- data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
- data/lib/datadog/core/remote/worker.rb +10 -7
- 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 +84 -49
- 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_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 +269 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -383
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- 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 +12 -6
- data/lib/datadog/core/telemetry/metric.rb +28 -6
- 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 +128 -25
- 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/adapters/unix_socket.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
- data/lib/datadog/core/transport/http/api/spec.rb +36 -0
- data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
- 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 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/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 +8 -0
- data/lib/datadog/di/base.rb +115 -0
- data/lib/datadog/di/boot.rb +34 -0
- data/lib/datadog/di/code_tracker.rb +26 -15
- data/lib/datadog/di/component.rb +23 -14
- data/lib/datadog/di/configuration/settings.rb +25 -1
- data/lib/datadog/di/contrib/active_record.rb +1 -0
- data/lib/datadog/di/contrib/railtie.rb +15 -0
- data/lib/datadog/di/contrib.rb +28 -0
- data/lib/datadog/di/error.rb +5 -0
- data/lib/datadog/di/instrumenter.rb +162 -21
- data/lib/datadog/di/logger.rb +30 -0
- data/lib/datadog/di/preload.rb +18 -0
- data/lib/datadog/di/probe.rb +14 -7
- data/lib/datadog/di/probe_builder.rb +1 -0
- data/lib/datadog/di/probe_manager.rb +11 -5
- data/lib/datadog/di/probe_notification_builder.rb +54 -38
- data/lib/datadog/di/probe_notifier_worker.rb +60 -26
- data/lib/datadog/di/redactor.rb +0 -1
- data/lib/datadog/di/remote.rb +147 -0
- data/lib/datadog/di/serializer.rb +19 -8
- data/lib/datadog/di/transport/diagnostics.rb +62 -0
- data/lib/datadog/di/transport/http/api.rb +42 -0
- data/lib/datadog/di/transport/http/client.rb +47 -0
- data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
- data/lib/datadog/di/transport/http/input.rb +77 -0
- data/lib/datadog/di/transport/http.rb +57 -0
- data/lib/datadog/di/transport/input.rb +70 -0
- data/lib/datadog/di/utils.rb +103 -0
- data/lib/datadog/di.rb +14 -76
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events.rb +15 -3
- data/lib/datadog/kit/identity.rb +9 -5
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +16 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/info.rb +3 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +64 -82
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +3 -4
- data/lib/datadog/profiling/ext.rb +0 -14
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +8 -87
- data/lib/datadog/profiling/load_native_extension.rb +1 -33
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/stack_recorder.rb +9 -9
- data/lib/datadog/profiling/tag_builder.rb +5 -41
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/profiling.rb +6 -2
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/component.rb +16 -12
- data/lib/datadog/tracing/configuration/ext.rb +8 -1
- data/lib/datadog/tracing/configuration/settings.rb +22 -10
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
- 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 +5 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/extensions.rb +29 -3
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
- data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
- data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
- 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/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +131 -0
- data/lib/datadog/tracing/distributed/datadog.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +25 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +5 -0
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- data/lib/datadog/tracing/span.rb +22 -5
- data/lib/datadog/tracing/span_event.rb +124 -4
- data/lib/datadog/tracing/span_operation.rb +52 -16
- data/lib/datadog/tracing/sync_writer.rb +10 -6
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +55 -27
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +66 -14
- data/lib/datadog/tracing/transport/http/api.rb +5 -4
- data/lib/datadog/tracing/transport/http/client.rb +5 -4
- data/lib/datadog/tracing/transport/http/traces.rb +13 -44
- data/lib/datadog/tracing/transport/http.rb +13 -70
- data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +47 -13
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
- data/lib/datadog/tracing/workers.rb +5 -4
- data/lib/datadog/tracing/writer.rb +10 -6
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +2 -0
- metadata +149 -54
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
- data/ext/datadog_profiling_loader/extconf.rb +0 -60
- 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 -57
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
- data/lib/datadog/appsec/contrib/patcher.rb +0 -12
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
- data/lib/datadog/appsec/processor/actions.rb +0 -49
- data/lib/datadog/appsec/processor/context.rb +0 -107
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
- data/lib/datadog/appsec/processor.rb +0 -106
- data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
- data/lib/datadog/appsec/reactive/engine.rb +0 -47
- data/lib/datadog/appsec/reactive/operation.rb +0 -68
- data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
- data/lib/datadog/appsec/scope.rb +0 -58
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
- data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
- data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
- data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
- 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
- data/lib/datadog/di/transport.rb +0 -81
- data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -47,6 +47,14 @@ module Datadog
|
|
47
47
|
@run_async = false
|
48
48
|
Datadog.logger.debug { "Forcibly terminating worker thread for: #{self}" }
|
49
49
|
worker.terminate
|
50
|
+
# Wait for the worker thread to end
|
51
|
+
begin
|
52
|
+
Timeout.timeout(SHUTDOWN_TIMEOUT) do
|
53
|
+
worker.join
|
54
|
+
end
|
55
|
+
rescue Timeout::Error
|
56
|
+
Datadog.logger.debug { "Worker thread did not end after #{SHUTDOWN_TIMEOUT} seconds: #{self}" }
|
57
|
+
end
|
50
58
|
true
|
51
59
|
end
|
52
60
|
|
@@ -112,23 +120,33 @@ module Datadog
|
|
112
120
|
@worker ||= nil
|
113
121
|
end
|
114
122
|
|
123
|
+
# Returns true if worker thread is successfully started,
|
124
|
+
# false if it is not started. Reasons for not starting the worker
|
125
|
+
# thread: it is already running, or the process forked and fork
|
126
|
+
# policy is to stop the workers on fork (which means they are
|
127
|
+
# not started in children, really).
|
115
128
|
def start_async(&block)
|
116
129
|
mutex.synchronize do
|
117
|
-
return if running?
|
130
|
+
return false if running?
|
118
131
|
|
119
132
|
if forked?
|
120
133
|
case fork_policy
|
121
134
|
when FORK_POLICY_STOP
|
122
135
|
stop_fork
|
136
|
+
false
|
123
137
|
when FORK_POLICY_RESTART
|
138
|
+
# restart_after_fork should return true
|
124
139
|
restart_after_fork(&block)
|
125
140
|
end
|
126
141
|
elsif !run_async?
|
142
|
+
# start_worker should return true
|
127
143
|
start_worker(&block)
|
128
144
|
end
|
129
145
|
end
|
130
146
|
end
|
131
147
|
|
148
|
+
# Returns true if worker thread is successfully started,
|
149
|
+
# which should generally be always.
|
132
150
|
def start_worker
|
133
151
|
@run_async = true
|
134
152
|
@pid = Process.pid
|
@@ -136,22 +154,21 @@ module Datadog
|
|
136
154
|
Datadog.logger.debug { "Starting thread for: #{self}" }
|
137
155
|
|
138
156
|
@worker = ::Thread.new do
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
end
|
157
|
+
yield
|
158
|
+
# rubocop:disable Lint/RescueException
|
159
|
+
rescue Exception => e
|
160
|
+
@error = e
|
161
|
+
Datadog.logger.debug(
|
162
|
+
"Worker thread error. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
|
163
|
+
)
|
164
|
+
raise
|
165
|
+
|
149
166
|
# rubocop:enable Lint/RescueException
|
150
167
|
end
|
151
168
|
@worker.name = self.class.name
|
152
169
|
@worker.thread_variable_set(:fork_safe, true)
|
153
170
|
|
154
|
-
|
171
|
+
true
|
155
172
|
end
|
156
173
|
|
157
174
|
def stop_fork
|
@@ -21,7 +21,18 @@ module Datadog
|
|
21
21
|
# Methods that must be prepended
|
22
22
|
module PrependedMethods
|
23
23
|
def perform(*args)
|
24
|
-
perform_loop
|
24
|
+
perform_loop do
|
25
|
+
@in_iteration = true
|
26
|
+
begin
|
27
|
+
super(*args)
|
28
|
+
ensure
|
29
|
+
@in_iteration = false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def in_iteration?
|
35
|
+
defined?(@in_iteration) && @in_iteration
|
25
36
|
end
|
26
37
|
end
|
27
38
|
|
@@ -20,8 +20,8 @@ module Datadog
|
|
20
20
|
attr_reader \
|
21
21
|
:metrics
|
22
22
|
|
23
|
-
def initialize(options
|
24
|
-
@metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new }
|
23
|
+
def initialize(telemetry:, **options)
|
24
|
+
@metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new(logger: options[:logger], telemetry: telemetry) }
|
25
25
|
|
26
26
|
# Workers::Async::Thread settings
|
27
27
|
self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP)
|
data/lib/datadog/core.rb
CHANGED
@@ -11,6 +11,14 @@ module Datadog
|
|
11
11
|
# for higher-level features.
|
12
12
|
module Core
|
13
13
|
extend Core::Deprecations
|
14
|
+
|
15
|
+
LIBDATADOG_API_FAILURE =
|
16
|
+
begin
|
17
|
+
require "libdatadog_api.#{RUBY_VERSION[/\d+.\d+/]}_#{RUBY_PLATFORM}"
|
18
|
+
nil
|
19
|
+
rescue LoadError => e
|
20
|
+
e.message
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
24
|
extend Core::Extensions
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This file is loaded by datadog/di/preload.rb.
|
4
|
+
# It contains just the global DI reference to the (normally one and only)
|
5
|
+
# code tracker for the current process.
|
6
|
+
# This file should not require the rest of DI, specifically none of the
|
7
|
+
# contrib code that is meant to be loaded after third-party libraries
|
8
|
+
# are loaded, and also none of the rest of datadog library which also
|
9
|
+
# has contrib code in other products.
|
10
|
+
|
11
|
+
require_relative 'code_tracker'
|
12
|
+
|
13
|
+
module Datadog
|
14
|
+
# Namespace for Datadog dynamic instrumentation.
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
module DI
|
18
|
+
LOCK = Mutex.new
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_reader :code_tracker
|
22
|
+
|
23
|
+
# Activates code tracking. Normally this method should be called
|
24
|
+
# when the application starts. If instrumenting third-party code,
|
25
|
+
# code tracking needs to be enabled before the third-party libraries
|
26
|
+
# are loaded. Any third-party code loaded before code tracking is
|
27
|
+
# activated will NOT be instrumentable using dynamic instrumentation.
|
28
|
+
#
|
29
|
+
# TODO test that activating tracker multiple times preserves
|
30
|
+
# existing mappings in the registry
|
31
|
+
def activate_tracking!
|
32
|
+
(@code_tracker ||= CodeTracker.new).start
|
33
|
+
end
|
34
|
+
|
35
|
+
# Activates code tracking if possible.
|
36
|
+
#
|
37
|
+
# This method does nothing if invoked in an environment that does not
|
38
|
+
# implement required trace points for code tracking (MRI Ruby < 2.6,
|
39
|
+
# JRuby) and rescues any exceptions that may be raised by downstream
|
40
|
+
# DI code.
|
41
|
+
def activate_tracking
|
42
|
+
# :script_compiled trace point was added in Ruby 2.6.
|
43
|
+
return unless RUBY_VERSION >= '2.6'
|
44
|
+
|
45
|
+
begin
|
46
|
+
# Activate code tracking by default because line trace points will not work
|
47
|
+
# without it.
|
48
|
+
Datadog::DI.activate_tracking!
|
49
|
+
rescue => exc
|
50
|
+
if defined?(Datadog.logger)
|
51
|
+
Datadog.logger.warn { "di: Failed to activate code tracking for DI: #{exc.class}: #{exc}" }
|
52
|
+
else
|
53
|
+
# We do not have Datadog logger potentially because DI code tracker is
|
54
|
+
# being loaded early in application boot process and the rest of datadog
|
55
|
+
# wasn't loaded yet. Output to standard error.
|
56
|
+
warn("datadog: di: Failed to activate code tracking for DI: #{exc.class}: #{exc}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Deactivates code tracking. In normal usage of DI this method should
|
62
|
+
# never be called, however it is used by DI's test suite to reset
|
63
|
+
# state for individual tests.
|
64
|
+
#
|
65
|
+
# Note that deactivating tracking clears out the registry, losing
|
66
|
+
# the ability to look up files that have been loaded into the process
|
67
|
+
# already.
|
68
|
+
def deactivate_tracking!
|
69
|
+
code_tracker&.stop
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns whether code tracking is available.
|
73
|
+
# This method should be used instead of querying #code_tracker
|
74
|
+
# because the latter one may be nil.
|
75
|
+
def code_tracking_active?
|
76
|
+
code_tracker&.active? || false
|
77
|
+
end
|
78
|
+
|
79
|
+
# DI code tracker is instantiated globally before the regular set of
|
80
|
+
# components is created, but the code tracker needs to call out to the
|
81
|
+
# "current" DI component to perform instrumentation when application
|
82
|
+
# code is loaded. Because this call may happen prior to Datadog
|
83
|
+
# components having been initialized, we maintain the "current component"
|
84
|
+
# which contains a reference to the most recently instantiated
|
85
|
+
# DI::Component. This way, if a DI component hasn't been instantiated,
|
86
|
+
# we do not try to reference Datadog.components.
|
87
|
+
# In other words, this method exists so that we never attempt to call
|
88
|
+
# Datadog.components from the code tracker.
|
89
|
+
def current_component
|
90
|
+
LOCK.synchronize do
|
91
|
+
@current_components&.last
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# To avoid potential races with DI::Component being added and removed,
|
96
|
+
# we maintain a list of the components. Normally the list should contain
|
97
|
+
# either zero or one component depending on whether DI is enabled in
|
98
|
+
# Datadog configuration. However, if a new instance of DI::Component
|
99
|
+
# is created while the previous instance is still running, we are
|
100
|
+
# guaranteed to not end up with no component when one is running.
|
101
|
+
def add_current_component(component)
|
102
|
+
LOCK.synchronize do
|
103
|
+
@current_components ||= []
|
104
|
+
@current_components << component
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def remove_current_component(component)
|
109
|
+
LOCK.synchronize do
|
110
|
+
@current_components&.delete(component)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'logger'
|
4
|
+
require_relative 'base'
|
5
|
+
require_relative 'error'
|
6
|
+
require_relative 'code_tracker'
|
7
|
+
require_relative 'component'
|
8
|
+
require_relative 'instrumenter'
|
9
|
+
require_relative 'probe'
|
10
|
+
require_relative 'probe_builder'
|
11
|
+
require_relative 'probe_manager'
|
12
|
+
require_relative 'probe_notification_builder'
|
13
|
+
require_relative 'probe_notifier_worker'
|
14
|
+
require_relative 'redactor'
|
15
|
+
require_relative 'serializer'
|
16
|
+
require_relative 'transport/http'
|
17
|
+
require_relative 'utils'
|
18
|
+
|
19
|
+
if %w[1 true yes].include?(ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED']) # steep:ignore
|
20
|
+
# For initial release of Dynamic Instrumentation, activate code tracking
|
21
|
+
# only if DI is explicitly requested in the environment.
|
22
|
+
# Code tracking is required for line probes to work; see the comments
|
23
|
+
# above for the implementation of the method.
|
24
|
+
#
|
25
|
+
# If DI is enabled programmatically, the application can (and must,
|
26
|
+
# for line probes to work) activate tracking in an initializer.
|
27
|
+
# We seem to have Datadog.logger here already
|
28
|
+
Datadog.logger.debug("di: activating code tracking")
|
29
|
+
Datadog::DI.activate_tracking
|
30
|
+
end
|
31
|
+
|
32
|
+
require_relative 'contrib'
|
33
|
+
|
34
|
+
Datadog::DI::Contrib.load_now_or_later
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
# rubocop:disable Lint/AssignmentInCondition
|
4
4
|
|
5
|
+
require_relative 'error'
|
6
|
+
|
5
7
|
module Datadog
|
6
8
|
module DI
|
7
9
|
# Tracks loaded Ruby code by source file and maintains a map from
|
@@ -78,19 +80,21 @@ module Datadog
|
|
78
80
|
registry_lock.synchronize do
|
79
81
|
registry[path] = tp.instruction_sequence
|
80
82
|
end
|
81
|
-
end
|
82
|
-
|
83
|
-
DI.component&.probe_manager&.install_pending_line_probes(path)
|
84
83
|
|
84
|
+
# Also, pending line probes should only be installed for
|
85
|
+
# non-eval'd code.
|
86
|
+
DI.current_component&.probe_manager&.install_pending_line_probes(path)
|
87
|
+
end
|
85
88
|
# Since this method normally is called from customer applications,
|
86
89
|
# rescue any exceptions that might not be handled to not break said
|
87
90
|
# customer applications.
|
88
91
|
rescue => exc
|
89
|
-
#
|
90
|
-
#
|
91
|
-
|
92
|
+
# Code tracker may be loaded without the rest of DI,
|
93
|
+
# in which case DI.component will not yet be defined,
|
94
|
+
# but we will have DI.current_component (set to nil).
|
95
|
+
if component = DI.current_component
|
92
96
|
raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
|
93
|
-
component.logger.
|
97
|
+
component.logger.debug { "di: unhandled exception in script_compiled trace point: #{exc.class}: #{exc}" }
|
94
98
|
component.telemetry&.report(exc, description: "Unhandled exception in script_compiled trace point")
|
95
99
|
# TODO test this path
|
96
100
|
else
|
@@ -136,16 +140,23 @@ module Datadog
|
|
136
140
|
exact = registry[suffix]
|
137
141
|
return [suffix, exact] if exact
|
138
142
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
+
suffix = suffix.dup
|
144
|
+
loop do
|
145
|
+
inexact = []
|
146
|
+
registry.each do |path, iseq|
|
147
|
+
if Utils.path_matches_suffix?(path, suffix)
|
148
|
+
inexact << [path, iseq]
|
149
|
+
end
|
143
150
|
end
|
151
|
+
if inexact.length > 1
|
152
|
+
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix"
|
153
|
+
end
|
154
|
+
if inexact.any?
|
155
|
+
return inexact.first
|
156
|
+
end
|
157
|
+
return nil unless suffix.include?('/')
|
158
|
+
suffix.sub!(%r{.*/+}, '')
|
144
159
|
end
|
145
|
-
if inexact.length > 1
|
146
|
-
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix"
|
147
|
-
end
|
148
|
-
inexact.first
|
149
160
|
end
|
150
161
|
end
|
151
162
|
|
data/lib/datadog/di/component.rb
CHANGED
@@ -14,20 +14,22 @@ module Datadog
|
|
14
14
|
# resources and installed tracepoints upon shutdown.
|
15
15
|
class Component
|
16
16
|
class << self
|
17
|
-
def build(settings, agent_settings, telemetry: nil)
|
17
|
+
def build(settings, agent_settings, logger, telemetry: nil)
|
18
18
|
return unless settings.respond_to?(:dynamic_instrumentation) && settings.dynamic_instrumentation.enabled
|
19
19
|
|
20
20
|
unless settings.respond_to?(:remote) && settings.remote.enabled
|
21
|
-
|
21
|
+
logger.warn("di: dynamic instrumentation could not be enabled because Remote Configuration Management is not available. To enable Remote Configuration, see https://docs.datadoghq.com/agent/remote_config")
|
22
22
|
return
|
23
23
|
end
|
24
24
|
|
25
|
-
return unless environment_supported?(settings)
|
25
|
+
return unless environment_supported?(settings, logger)
|
26
26
|
|
27
|
-
new(settings, agent_settings,
|
27
|
+
new(settings, agent_settings, logger, code_tracker: DI.code_tracker, telemetry: telemetry).tap do |component|
|
28
|
+
DI.add_current_component(component)
|
29
|
+
end
|
28
30
|
end
|
29
31
|
|
30
|
-
def build!(settings, agent_settings, telemetry: nil)
|
32
|
+
def build!(settings, agent_settings, logger, telemetry: nil)
|
31
33
|
unless settings.respond_to?(:dynamic_instrumentation) && settings.dynamic_instrumentation.enabled
|
32
34
|
raise "Requested DI component but DI is not enabled in settings"
|
33
35
|
end
|
@@ -36,27 +38,31 @@ module Datadog
|
|
36
38
|
raise "Requested DI component but remote config is not enabled in settings"
|
37
39
|
end
|
38
40
|
|
39
|
-
unless environment_supported?(settings)
|
41
|
+
unless environment_supported?(settings, logger)
|
40
42
|
raise "DI does not support the environment (development or Ruby version too low or not MRI)"
|
41
43
|
end
|
42
44
|
|
43
|
-
new(settings, agent_settings,
|
45
|
+
new(settings, agent_settings, logger, code_tracker: DI.code_tracker, telemetry: telemetry)
|
44
46
|
end
|
45
47
|
|
46
48
|
# Checks whether the runtime environment is supported by
|
47
49
|
# dynamic instrumentation. Currently we only require that, if Rails
|
48
50
|
# is used, that Rails environment is not development because
|
49
51
|
# DI does not currently support code unloading and reloading.
|
50
|
-
def environment_supported?(settings)
|
52
|
+
def environment_supported?(settings, logger)
|
51
53
|
# TODO add tests?
|
52
54
|
unless settings.dynamic_instrumentation.internal.development
|
53
55
|
if Datadog::Core::Environment::Execution.development?
|
54
|
-
|
56
|
+
logger.warn("di: development environment detected; not enabling dynamic instrumentation")
|
55
57
|
return false
|
56
58
|
end
|
57
59
|
end
|
58
|
-
if RUBY_ENGINE != 'ruby'
|
59
|
-
|
60
|
+
if RUBY_ENGINE != 'ruby'
|
61
|
+
logger.warn("di: cannot enable dynamic instrumentation: MRI is required, but running on #{RUBY_ENGINE}")
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
if RUBY_VERSION < '2.6'
|
65
|
+
logger.warn("di: cannot enable dynamic instrumentation: Ruby 2.6+ is required, but running on #{RUBY_VERSION}")
|
60
66
|
return false
|
61
67
|
end
|
62
68
|
true
|
@@ -66,13 +72,14 @@ module Datadog
|
|
66
72
|
def initialize(settings, agent_settings, logger, code_tracker: nil, telemetry: nil)
|
67
73
|
@settings = settings
|
68
74
|
@agent_settings = agent_settings
|
75
|
+
logger = DI::Logger.new(settings, logger)
|
69
76
|
@logger = logger
|
70
77
|
@telemetry = telemetry
|
78
|
+
@code_tracker = code_tracker
|
71
79
|
@redactor = Redactor.new(settings)
|
72
80
|
@serializer = Serializer.new(settings, redactor, telemetry: telemetry)
|
73
81
|
@instrumenter = Instrumenter.new(settings, serializer, logger, code_tracker: code_tracker, telemetry: telemetry)
|
74
|
-
@
|
75
|
-
@probe_notifier_worker = ProbeNotifierWorker.new(settings, transport, logger, telemetry: telemetry)
|
82
|
+
@probe_notifier_worker = ProbeNotifierWorker.new(settings, logger, agent_settings: agent_settings, telemetry: telemetry)
|
76
83
|
@probe_notification_builder = ProbeNotificationBuilder.new(settings, serializer)
|
77
84
|
@probe_manager = ProbeManager.new(settings, instrumenter, probe_notification_builder, probe_notifier_worker, logger, telemetry: telemetry)
|
78
85
|
probe_notifier_worker.start
|
@@ -82,8 +89,8 @@ module Datadog
|
|
82
89
|
attr_reader :agent_settings
|
83
90
|
attr_reader :logger
|
84
91
|
attr_reader :telemetry
|
92
|
+
attr_reader :code_tracker
|
85
93
|
attr_reader :instrumenter
|
86
|
-
attr_reader :transport
|
87
94
|
attr_reader :probe_notifier_worker
|
88
95
|
attr_reader :probe_notification_builder
|
89
96
|
attr_reader :probe_manager
|
@@ -99,6 +106,8 @@ module Datadog
|
|
99
106
|
# was replaced by a new instance, the new instance of it wouldn't have
|
100
107
|
# any of the already loaded code tracked.
|
101
108
|
def shutdown!(replacement = nil)
|
109
|
+
DI.remove_current_component(self)
|
110
|
+
|
102
111
|
probe_manager.clear_hooks
|
103
112
|
probe_manager.close
|
104
113
|
probe_notifier_worker.stop
|
@@ -166,10 +166,20 @@ module Datadog
|
|
166
166
|
# being sent out by the probe notifier worker) and creates a
|
167
167
|
# possibility of dropping payloads if the queue gets too long.
|
168
168
|
option :min_send_interval do |o|
|
169
|
-
o.type :
|
169
|
+
o.type :float
|
170
170
|
o.default 3
|
171
171
|
end
|
172
172
|
|
173
|
+
# Number of snapshots that can be stored in the probe
|
174
|
+
# notifier worker queue. Larger capacity runs the risk of
|
175
|
+
# creating snapshots that exceed the agent's request size
|
176
|
+
# limit. Smaller capacity increases the risk of dropping
|
177
|
+
# snapshots.
|
178
|
+
option :snapshot_queue_capacity do |o|
|
179
|
+
o.type :int
|
180
|
+
o.default 100
|
181
|
+
end
|
182
|
+
|
173
183
|
# Enable dynamic instrumentation in development environments.
|
174
184
|
# Currently DI does not fully implement support for code
|
175
185
|
# unloading and reloading, and is not supported in
|
@@ -178,6 +188,20 @@ module Datadog
|
|
178
188
|
o.type :bool
|
179
189
|
o.default false
|
180
190
|
end
|
191
|
+
|
192
|
+
# Enable logging of dynamic instrumentation activity.
|
193
|
+
# This is quite verbose.
|
194
|
+
option :trace_logging do |o|
|
195
|
+
o.type :bool
|
196
|
+
o.default false
|
197
|
+
|
198
|
+
# Use the same environment variable as the rest of
|
199
|
+
# dd-trace-rb logging for now. Could change to a
|
200
|
+
# dedicated environment variable in the future but
|
201
|
+
# will likely need a way to turn on remote config
|
202
|
+
# debugging (since DI uses RC for configuration).
|
203
|
+
o.env 'DD_TRACE_DEBUG'
|
204
|
+
end
|
181
205
|
end
|
182
206
|
end
|
183
207
|
end
|
@@ -5,6 +5,7 @@ Datadog::DI::Serializer.register(condition: lambda { |value| ActiveRecord::Base
|
|
5
5
|
# steep:ignore:start
|
6
6
|
value_to_serialize = {
|
7
7
|
attributes: value.attributes,
|
8
|
+
new_record: value.new_record?,
|
8
9
|
}
|
9
10
|
serializer.serialize_value(value_to_serialize, depth: depth ? depth - 1 : nil, type: value.class)
|
10
11
|
# steep:ignore:end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module DI
|
5
|
+
module Contrib
|
6
|
+
# Railtie class initializes dynamic instrumentation contrib code
|
7
|
+
# in Rails environments.
|
8
|
+
class Railtie < Rails::Railtie
|
9
|
+
initializer 'datadog.dynamic_instrumentation.initialize' do |app|
|
10
|
+
Contrib.load_now
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../core/contrib/rails/utils'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module DI
|
7
|
+
module Contrib
|
8
|
+
module_function def load_now_or_later
|
9
|
+
if Datadog::Core::Contrib::Rails::Utils.railtie_supported?
|
10
|
+
Datadog.logger.debug('di: loading contrib/railtie')
|
11
|
+
require_relative 'contrib/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
|
+
if defined?(ActiveRecord::Base)
|
22
|
+
Datadog.logger.debug('di: loading contrib/active_record')
|
23
|
+
require_relative 'contrib/active_record'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/datadog/di/error.rb
CHANGED
@@ -27,6 +27,11 @@ module Datadog
|
|
27
27
|
class DITargetNotDefined < Error
|
28
28
|
end
|
29
29
|
|
30
|
+
# Attempting to instrument a line and the file containing the line
|
31
|
+
# was loaded prior to code tracking being enabled.
|
32
|
+
class DITargetNotInRegistry < Error
|
33
|
+
end
|
34
|
+
|
30
35
|
# Raised when trying to install a probe whose installation failed
|
31
36
|
# earlier in the same process. This exception should contain the
|
32
37
|
# original exception report from initial installation attempt.
|