datadog 2.7.1 → 2.17.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 +310 -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 +66 -56
- 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 +10 -10
- data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +314 -145
- 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 +7 -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 +61 -174
- data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
- data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +68 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -1
- data/ext/datadog_profiling_native_extension/profiling.c +19 -8
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
- data/ext/datadog_profiling_native_extension/stack_recorder.c +84 -131
- 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/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +122 -0
- data/ext/libdatadog_api/library_config.h +19 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +117 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- 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 +49 -0
- data/lib/datadog/appsec/api_security.rb +9 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
- data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
- data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +41 -33
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +152 -25
- 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 +52 -68
- 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 +26 -31
- data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
- data/lib/datadog/appsec/processor.rb +5 -4
- data/lib/datadog/appsec/remote.rb +26 -12
- data/lib/datadog/appsec/response.rb +19 -85
- data/lib/datadog/appsec/security_engine/result.rb +67 -0
- data/lib/datadog/appsec/security_engine/runner.rb +88 -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 +23 -10
- data/lib/datadog/auto_instrument.rb +3 -0
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +42 -14
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +76 -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 +79 -43
- 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 +100 -41
- data/lib/datadog/core/configuration/stable_config.rb +23 -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/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.rb +32 -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 +2 -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/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 +65 -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 +179 -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 +1 -1
- data/lib/datadog/core/telemetry/logging.rb +2 -2
- 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/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.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/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 +111 -20
- 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 +34 -8
- data/lib/datadog/di/probe_notifier_worker.rb +52 -26
- data/lib/datadog/di/redactor.rb +0 -1
- data/lib/datadog/di/remote.rb +147 -0
- data/lib/datadog/di/serializer.rb +14 -7
- 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 +67 -0
- data/lib/datadog/di/transport/http.rb +57 -0
- data/lib/datadog/di/transport/input.rb +62 -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 +1 -1
- data/lib/datadog/profiling/collectors/info.rb +3 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
- data/lib/datadog/profiling/component.rb +60 -76
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +3 -4
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +6 -85
- data/lib/datadog/profiling/load_native_extension.rb +1 -33
- data/lib/datadog/profiling/scheduler.rb +8 -1
- data/lib/datadog/profiling/stack_recorder.rb +4 -4
- data/lib/datadog/profiling/tag_builder.rb +1 -5
- 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/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/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/server_tracer.rb +1 -1
- 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 +9 -5
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +44 -24
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +60 -12
- 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 +143 -50
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
- data/ext/datadog_profiling_loader/extconf.rb +0 -60
- 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/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
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module AppSec
|
5
|
+
# A class that represents a security event of any kind. It could be an event
|
6
|
+
# representing an attack or fingerprinting results as derivatives or an API
|
7
|
+
# security check with extracted schema.
|
8
|
+
class SecurityEvent
|
9
|
+
SCHEMA_KEY_PREFIX = '_dd.appsec.s.'
|
10
|
+
FINGERPRINT_KEY_PREFIX = '_dd.appsec.fp.'
|
11
|
+
|
12
|
+
attr_reader :waf_result, :trace, :span
|
13
|
+
|
14
|
+
def initialize(waf_result, trace:, span:)
|
15
|
+
@waf_result = waf_result
|
16
|
+
@trace = trace
|
17
|
+
@span = span
|
18
|
+
end
|
19
|
+
|
20
|
+
def attack?
|
21
|
+
return @is_attack if defined?(@is_attack)
|
22
|
+
|
23
|
+
@is_attack = @waf_result.is_a?(SecurityEngine::Result::Match)
|
24
|
+
end
|
25
|
+
|
26
|
+
def schema?
|
27
|
+
return @has_schema if defined?(@has_schema)
|
28
|
+
|
29
|
+
@has_schema = @waf_result.derivatives.any? { |name, _| name.start_with?(SCHEMA_KEY_PREFIX) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def fingerprint?
|
33
|
+
return @has_fingerprint if defined?(@has_fingerprint)
|
34
|
+
|
35
|
+
@has_fingerprint = @waf_result.derivatives.any? { |name, _| name.start_with?(FINGERPRINT_KEY_PREFIX) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/datadog/appsec/utils.rb
CHANGED
data/lib/datadog/appsec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'appsec/configuration'
|
4
4
|
require_relative 'appsec/extensions'
|
5
|
-
require_relative 'appsec/
|
5
|
+
require_relative 'appsec/context'
|
6
6
|
require_relative 'appsec/ext'
|
7
7
|
require_relative 'appsec/utils'
|
8
8
|
|
@@ -14,32 +14,41 @@ module Datadog
|
|
14
14
|
Datadog.configuration.appsec.enabled
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
Datadog
|
17
|
+
def rasp_enabled?
|
18
|
+
Datadog.configuration.appsec.rasp_enabled
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
21
|
+
def active_context
|
22
|
+
Datadog::AppSec::Context.active
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
+
def telemetry
|
26
|
+
components.appsec&.telemetry
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
|
29
|
+
def processor
|
30
|
+
components.appsec&.processor
|
31
|
+
end
|
29
32
|
|
33
|
+
def reconfigure(ruleset:, telemetry:)
|
34
|
+
appsec_component = components.appsec
|
30
35
|
return unless appsec_component
|
31
36
|
|
32
|
-
appsec_component.reconfigure(ruleset: ruleset,
|
37
|
+
appsec_component.reconfigure(ruleset: ruleset, telemetry: telemetry)
|
33
38
|
end
|
34
39
|
|
35
40
|
def reconfigure_lock(&block)
|
36
41
|
appsec_component = components.appsec
|
37
|
-
|
38
42
|
return unless appsec_component
|
39
43
|
|
40
44
|
appsec_component.reconfigure_lock(&block)
|
41
45
|
end
|
42
46
|
|
47
|
+
def perform_api_security_check?
|
48
|
+
Datadog.configuration.appsec.api_security.enabled &&
|
49
|
+
Datadog.configuration.appsec.api_security.sample_rate.sample?
|
50
|
+
end
|
51
|
+
|
43
52
|
private
|
44
53
|
|
45
54
|
def components
|
@@ -56,7 +65,11 @@ end
|
|
56
65
|
require_relative 'appsec/contrib/rack/integration'
|
57
66
|
require_relative 'appsec/contrib/sinatra/integration'
|
58
67
|
require_relative 'appsec/contrib/rails/integration'
|
68
|
+
require_relative 'appsec/contrib/active_record/integration'
|
59
69
|
require_relative 'appsec/contrib/devise/integration'
|
60
70
|
require_relative 'appsec/contrib/graphql/integration'
|
71
|
+
require_relative 'appsec/contrib/faraday/integration'
|
72
|
+
require_relative 'appsec/contrib/excon/integration'
|
73
|
+
require_relative 'appsec/contrib/rest_client/integration'
|
61
74
|
|
62
75
|
require_relative 'appsec/autoload'
|
@@ -6,6 +6,9 @@
|
|
6
6
|
require_relative '../datadog'
|
7
7
|
require_relative 'tracing/contrib/auto_instrument'
|
8
8
|
|
9
|
+
# DI is not loaded on Ruby 2.5 and JRuby
|
10
|
+
Datadog::DI::Contrib.load_now_or_later if defined?(Datadog::DI::Contrib)
|
11
|
+
|
9
12
|
Datadog::Profiling.start_if_enabled
|
10
13
|
|
11
14
|
module Datadog
|
@@ -40,7 +40,23 @@ module Datadog
|
|
40
40
|
add_all!(underflow) unless underflow.nil?
|
41
41
|
|
42
42
|
# Iteratively replace items, to ensure pseudo-random replacement.
|
43
|
-
overflow
|
43
|
+
overflow&.each { |item| replace!(item) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def unshift(*items)
|
47
|
+
# TODO The existing concat implementation does not always append
|
48
|
+
# to the end of the buffer - if the buffer is full, a random
|
49
|
+
# item is deleted and the new item is added in the position of
|
50
|
+
# removed item.
|
51
|
+
# Therefore, if we want to preserve the item order, concat
|
52
|
+
# would also need to be changed to maintain order.
|
53
|
+
# With the existing implementation, the idea is to not move
|
54
|
+
# existing items around, which is what sets unshift apart from
|
55
|
+
# concat to begin with.
|
56
|
+
#
|
57
|
+
# Since this method currently delegates to +concat+, it does not
|
58
|
+
# have a matching definition in the thread-safe worker.
|
59
|
+
concat(items)
|
44
60
|
end
|
45
61
|
|
46
62
|
# Stored items are returned and the local buffer is reset.
|
@@ -78,7 +94,7 @@ module Datadog
|
|
78
94
|
underflow = nil
|
79
95
|
overflow = nil
|
80
96
|
|
81
|
-
overflow_size = @max_size > 0 ? (@items.length + items.length) - @max_size : 0
|
97
|
+
overflow_size = (@max_size > 0) ? (@items.length + items.length) - @max_size : 0
|
82
98
|
|
83
99
|
if overflow_size > 0
|
84
100
|
# Items will overflow
|
@@ -19,21 +19,49 @@ module Datadog
|
|
19
19
|
# Whenever there is a conflict (different configurations are provided in different orders), it MUST warn the users
|
20
20
|
# about it and pick a value based on the following priority: code > environment variable > defaults.
|
21
21
|
class AgentSettingsResolver
|
22
|
-
|
23
|
-
|
24
|
-
:ssl,
|
25
|
-
|
26
|
-
:port,
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
# Immutable container for the resulting settings
|
23
|
+
class AgentSettings
|
24
|
+
attr_reader :adapter, :ssl, :hostname, :port, :uds_path, :timeout_seconds
|
25
|
+
|
26
|
+
def initialize(adapter: nil, ssl: nil, hostname: nil, port: nil, uds_path: nil, timeout_seconds: nil)
|
27
|
+
@adapter = adapter
|
28
|
+
@ssl = ssl
|
29
|
+
@hostname = hostname
|
30
|
+
@port = port
|
31
|
+
@uds_path = uds_path
|
32
|
+
@timeout_seconds = timeout_seconds
|
33
33
|
freeze
|
34
34
|
end
|
35
|
+
|
36
|
+
def url
|
37
|
+
case adapter
|
38
|
+
when Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
39
|
+
hostname = self.hostname
|
40
|
+
hostname = "[#{hostname}]" if IPV6_REGEXP.match?(hostname)
|
41
|
+
"#{ssl ? "https" : "http"}://#{hostname}:#{port}/"
|
42
|
+
when Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
|
43
|
+
"unix://#{uds_path}"
|
44
|
+
else
|
45
|
+
raise ArgumentError, "Unexpected adapter: #{adapter}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def ==(other)
|
50
|
+
self.class == other.class &&
|
51
|
+
adapter == other.adapter &&
|
52
|
+
ssl == other.ssl &&
|
53
|
+
hostname == other.hostname &&
|
54
|
+
port == other.port &&
|
55
|
+
uds_path == other.uds_path &&
|
56
|
+
timeout_seconds == other.timeout_seconds
|
57
|
+
end
|
35
58
|
end
|
36
59
|
|
60
|
+
# IPv6 regular expression from
|
61
|
+
# https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
|
62
|
+
# Does not match IPv4 addresses.
|
63
|
+
IPV6_REGEXP = /\A(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\z)/.freeze # rubocop:disable Layout/LineLength
|
64
|
+
|
37
65
|
def self.call(settings, logger: Datadog.logger)
|
38
66
|
new(settings, logger: logger).send(:call)
|
39
67
|
end
|
@@ -130,7 +158,7 @@ module Datadog
|
|
130
158
|
value: settings.agent.timeout_seconds,
|
131
159
|
),
|
132
160
|
try_parsing_as_integer(
|
133
|
-
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} "\
|
161
|
+
friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} " \
|
134
162
|
'environment variable',
|
135
163
|
value: ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS],
|
136
164
|
)
|
@@ -310,13 +338,13 @@ module Datadog
|
|
310
338
|
log_warning(
|
311
339
|
'Configuration mismatch: values differ between ' \
|
312
340
|
"#{detected_configurations_in_priority_order
|
313
|
-
.map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(
|
341
|
+
.map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(" and ")}" \
|
314
342
|
". Using #{detected_configurations_in_priority_order.first.value.inspect} and ignoring other configuration."
|
315
343
|
)
|
316
344
|
end
|
317
345
|
|
318
346
|
def log_warning(message)
|
319
|
-
logger
|
347
|
+
logger&.warn(message)
|
320
348
|
end
|
321
349
|
|
322
350
|
def http_scheme?(uri)
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/*
|
4
|
+
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
require_relative 'agent_settings_resolver'
|
8
|
+
|
9
|
+
module Datadog
|
10
|
+
module Core
|
11
|
+
module Configuration
|
12
|
+
# Agent settings resolver for agentless operations (currently, telemetry
|
13
|
+
# in agentless mode).
|
14
|
+
#
|
15
|
+
# The terminology gets a little confusing here, but transports communicate
|
16
|
+
# with servers which are - for most components in the tracer - the
|
17
|
+
# (local) agent. Hence, "agent settings" to refer to where the server
|
18
|
+
# is located. Telemetry supports sending to the local agent but also
|
19
|
+
# implements agentless mode where it sends directly to Datadog intake
|
20
|
+
# endpoints. The agentless mode is configured using different settings,
|
21
|
+
# and this class produces AgentSettings instances when in agentless mode.
|
22
|
+
#
|
23
|
+
# Agentless settings resolver uses the following configuration sources:
|
24
|
+
#
|
25
|
+
# 1. url_override constructor parameter, if provided
|
26
|
+
# 2. Built-in default host/port/TLS settings for the backend
|
27
|
+
# intake endpoint
|
28
|
+
#
|
29
|
+
# The agentless resolver does NOT use agent settings (since it is
|
30
|
+
# for agentless operation), specifically it ignores:
|
31
|
+
#
|
32
|
+
# - c.agent.host
|
33
|
+
# - DD_AGENT_HOST
|
34
|
+
# - c.agent.port
|
35
|
+
# - DD_AGENT_PORT
|
36
|
+
#
|
37
|
+
# However, agentless resolver does respect the timeout specified via
|
38
|
+
# c.agent.timeout_seconds or DD_TRACE_AGENT_TIMEOUT_SECONDS.
|
39
|
+
class AgentlessSettingsResolver < AgentSettingsResolver
|
40
|
+
# To avoid coupling this class to telemetry, the URL override is
|
41
|
+
# taken here as a parameter instead of being read out of
|
42
|
+
# c.telemetry.agentless_url_override. For the same reason, the
|
43
|
+
# +url_override_source+ parameter should be set to the string
|
44
|
+
# "c.telemetry.agentless_url_override".
|
45
|
+
def self.call(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
|
46
|
+
new(
|
47
|
+
settings,
|
48
|
+
host_prefix: host_prefix,
|
49
|
+
url_override: url_override,
|
50
|
+
url_override_source: url_override_source,
|
51
|
+
logger: logger
|
52
|
+
).send(:call)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
attr_reader \
|
58
|
+
:host_prefix,
|
59
|
+
:url_override,
|
60
|
+
:url_override_source
|
61
|
+
|
62
|
+
def initialize(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
|
63
|
+
if url_override && url_override_source.nil?
|
64
|
+
raise ArgumentError, 'url_override_source must be provided when url_override is provided'
|
65
|
+
end
|
66
|
+
|
67
|
+
super(settings, logger: logger)
|
68
|
+
|
69
|
+
@host_prefix = host_prefix
|
70
|
+
@url_override = url_override
|
71
|
+
@url_override_source = url_override_source
|
72
|
+
end
|
73
|
+
|
74
|
+
def hostname
|
75
|
+
if should_use_uds?
|
76
|
+
nil
|
77
|
+
else
|
78
|
+
configured_hostname || "#{host_prefix}.#{settings.site}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def configured_hostname
|
83
|
+
return @configured_hostname if defined?(@configured_hostname)
|
84
|
+
|
85
|
+
if should_use_uds?
|
86
|
+
nil
|
87
|
+
else
|
88
|
+
@configured_hostname = (parsed_url.hostname if parsed_url)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def configured_port
|
93
|
+
return @configured_port if defined?(@configured_port)
|
94
|
+
|
95
|
+
@configured_port = (parsed_url.port if parsed_url)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Note that this method should always return true or false
|
99
|
+
def ssl?
|
100
|
+
if configured_hostname
|
101
|
+
configured_ssl || false
|
102
|
+
else
|
103
|
+
if should_use_uds?
|
104
|
+
false
|
105
|
+
else
|
106
|
+
# If no hostname is specified, we are communicating with the
|
107
|
+
# default Datadog intake, which uses TLS.
|
108
|
+
true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Note that this method can return nil
|
114
|
+
def configured_ssl
|
115
|
+
return @configured_ssl if defined?(@configured_ssl)
|
116
|
+
|
117
|
+
@configured_ssl = (parsed_url_ssl? if parsed_url)
|
118
|
+
end
|
119
|
+
|
120
|
+
def port
|
121
|
+
if configured_port
|
122
|
+
configured_port
|
123
|
+
else
|
124
|
+
if should_use_uds?
|
125
|
+
nil
|
126
|
+
else
|
127
|
+
# If no hostname is specified, we are communicating with the
|
128
|
+
# default Datadog intake, which exists on port 443.
|
129
|
+
443
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def mixed_http_and_uds
|
135
|
+
false
|
136
|
+
end
|
137
|
+
|
138
|
+
def configured_uds_path
|
139
|
+
return @configured_uds_path if defined?(@configured_uds_path)
|
140
|
+
|
141
|
+
parsed_url_uds_path
|
142
|
+
end
|
143
|
+
|
144
|
+
def can_use_uds?
|
145
|
+
# While in theory agentless transport could communicate via UDS,
|
146
|
+
# in practice "agentless" means we are communicating with Datadog
|
147
|
+
# infrastructure which is always remote.
|
148
|
+
# Permit UDS for proxy usage?
|
149
|
+
!configured_uds_path.nil?
|
150
|
+
end
|
151
|
+
|
152
|
+
def parsed_url
|
153
|
+
return @parsed_url if defined?(@parsed_url)
|
154
|
+
|
155
|
+
@parsed_url =
|
156
|
+
if @url_override
|
157
|
+
parsed = URI.parse(@url_override)
|
158
|
+
|
159
|
+
# Agentless URL should never refer to a UDS?
|
160
|
+
if http_scheme?(parsed) || unix_scheme?(parsed)
|
161
|
+
parsed
|
162
|
+
else
|
163
|
+
log_warning(
|
164
|
+
"Invalid URI scheme '#{parsed.scheme}' for #{url_override_source}. " \
|
165
|
+
"Ignoring the contents of #{url_override_source}."
|
166
|
+
)
|
167
|
+
nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# rubocop:enable Style/*
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'agent_settings_resolver'
|
4
|
+
require_relative 'components_state'
|
4
5
|
require_relative 'ext'
|
5
6
|
require_relative '../diagnostics/environment_logger'
|
6
7
|
require_relative '../diagnostics/health'
|
@@ -8,12 +9,15 @@ require_relative '../logger'
|
|
8
9
|
require_relative '../runtime/metrics'
|
9
10
|
require_relative '../telemetry/component'
|
10
11
|
require_relative '../workers/runtime_metrics'
|
11
|
-
|
12
12
|
require_relative '../remote/component'
|
13
13
|
require_relative '../../tracing/component'
|
14
14
|
require_relative '../../profiling/component'
|
15
15
|
require_relative '../../appsec/component'
|
16
|
+
require_relative '../../di/component'
|
17
|
+
require_relative '../../error_tracking/component'
|
16
18
|
require_relative '../crashtracking/component'
|
19
|
+
require_relative '../environment/agent_info'
|
20
|
+
require_relative '../process_discovery'
|
17
21
|
|
18
22
|
module Datadog
|
19
23
|
module Core
|
@@ -23,12 +27,12 @@ module Datadog
|
|
23
27
|
class << self
|
24
28
|
include Datadog::Tracing::Component
|
25
29
|
|
26
|
-
def build_health_metrics(settings)
|
30
|
+
def build_health_metrics(settings, logger, telemetry)
|
27
31
|
settings = settings.health_metrics
|
28
|
-
options = {
|
32
|
+
options = {enabled: settings.enabled}
|
29
33
|
options[:statsd] = settings.statsd unless settings.statsd.nil?
|
30
34
|
|
31
|
-
Core::Diagnostics::Health::Metrics.new(**options)
|
35
|
+
Core::Diagnostics::Health::Metrics.new(telemetry: telemetry, logger: logger, **options)
|
32
36
|
end
|
33
37
|
|
34
38
|
def build_logger(settings)
|
@@ -38,22 +42,24 @@ module Datadog
|
|
38
42
|
logger
|
39
43
|
end
|
40
44
|
|
41
|
-
def build_runtime_metrics(settings)
|
42
|
-
options = {
|
45
|
+
def build_runtime_metrics(settings, logger, telemetry)
|
46
|
+
options = {enabled: settings.runtime_metrics.enabled}
|
43
47
|
options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
|
44
48
|
options[:services] = [settings.service] unless settings.service.nil?
|
49
|
+
options[:experimental_runtime_id_enabled] = settings.runtime_metrics.experimental_runtime_id_enabled
|
45
50
|
|
46
|
-
Core::Runtime::Metrics.new(**options)
|
51
|
+
Core::Runtime::Metrics.new(logger: logger, telemetry: telemetry, **options)
|
47
52
|
end
|
48
53
|
|
49
|
-
def build_runtime_metrics_worker(settings)
|
54
|
+
def build_runtime_metrics_worker(settings, logger, telemetry)
|
50
55
|
# NOTE: Should we just ignore building the worker if its not enabled?
|
51
56
|
options = settings.runtime_metrics.opts.merge(
|
52
57
|
enabled: settings.runtime_metrics.enabled,
|
53
|
-
metrics: build_runtime_metrics(settings)
|
58
|
+
metrics: build_runtime_metrics(settings, logger, telemetry),
|
59
|
+
logger: logger,
|
54
60
|
)
|
55
61
|
|
56
|
-
Core::Workers::RuntimeMetrics.new(options)
|
62
|
+
Core::Workers::RuntimeMetrics.new(telemetry: telemetry, **options)
|
57
63
|
end
|
58
64
|
|
59
65
|
def build_telemetry(settings, agent_settings, logger)
|
@@ -63,7 +69,7 @@ module Datadog
|
|
63
69
|
def build_crashtracker(settings, agent_settings, logger:)
|
64
70
|
return unless settings.crashtracking.enabled
|
65
71
|
|
66
|
-
if (libdatadog_api_failure = Datadog::Core::
|
72
|
+
if (libdatadog_api_failure = Datadog::Core::LIBDATADOG_API_FAILURE)
|
67
73
|
logger.debug("Cannot enable crashtracking: #{libdatadog_api_failure}")
|
68
74
|
return
|
69
75
|
end
|
@@ -83,7 +89,10 @@ module Datadog
|
|
83
89
|
:telemetry,
|
84
90
|
:tracer,
|
85
91
|
:crashtracker,
|
86
|
-
:
|
92
|
+
:error_tracking,
|
93
|
+
:dynamic_instrumentation,
|
94
|
+
:appsec,
|
95
|
+
:agent_info
|
87
96
|
|
88
97
|
def initialize(settings)
|
89
98
|
@logger = self.class.build_logger(settings)
|
@@ -94,28 +103,39 @@ module Datadog
|
|
94
103
|
# the Core resolver from within your product/component's namespace.
|
95
104
|
agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
|
96
105
|
|
106
|
+
# Exposes agent capability information for detection by any components
|
107
|
+
@agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
|
108
|
+
|
97
109
|
@telemetry = self.class.build_telemetry(settings, agent_settings, @logger)
|
98
110
|
|
99
|
-
@remote = Remote::Component.build(settings, agent_settings, telemetry: telemetry)
|
111
|
+
@remote = Remote::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
|
100
112
|
@tracer = self.class.build_tracer(settings, agent_settings, logger: @logger)
|
101
113
|
@crashtracker = self.class.build_crashtracker(settings, agent_settings, logger: @logger)
|
102
114
|
|
103
115
|
@profiler, profiler_logger_extra = Datadog::Profiling::Component.build_profiler_component(
|
104
116
|
settings: settings,
|
105
117
|
agent_settings: agent_settings,
|
106
|
-
optional_tracer: @tracer
|
118
|
+
optional_tracer: @tracer,
|
119
|
+
logger: @logger,
|
107
120
|
)
|
108
121
|
@environment_logger_extra.merge!(profiler_logger_extra) if profiler_logger_extra
|
109
122
|
|
110
|
-
@runtime_metrics = self.class.build_runtime_metrics_worker(settings)
|
111
|
-
@health_metrics = self.class.build_health_metrics(settings)
|
123
|
+
@runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
|
124
|
+
@health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
|
112
125
|
@appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
|
126
|
+
@dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
|
127
|
+
@error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
|
128
|
+
@environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
|
129
|
+
# TODO: Re-enable this once we have updated libdatadog to 17.1
|
130
|
+
# @process_discovery_fd = Core::ProcessDiscovery.get_and_store_metadata(settings, @logger)
|
113
131
|
|
114
132
|
self.class.configure_tracing(settings)
|
115
133
|
end
|
116
134
|
|
117
135
|
# Starts up components
|
118
|
-
def startup!(settings)
|
136
|
+
def startup!(settings, old_state: nil)
|
137
|
+
telemetry.start(old_state&.telemetry_enabled?)
|
138
|
+
|
119
139
|
if settings.profiling.enabled
|
120
140
|
if profiler
|
121
141
|
profiler.start
|
@@ -126,6 +146,16 @@ module Datadog
|
|
126
146
|
end
|
127
147
|
end
|
128
148
|
|
149
|
+
if settings.remote.enabled && old_state&.remote_started?
|
150
|
+
# The library was reconfigured and previously it already started
|
151
|
+
# the remote component (i.e., it received at least one request
|
152
|
+
# through the installed Rack middleware which started the remote).
|
153
|
+
# If the new configuration also has remote enabled, start the
|
154
|
+
# new remote right away.
|
155
|
+
# remote should always be not nil here but steep doesn't know this.
|
156
|
+
remote&.start
|
157
|
+
end
|
158
|
+
|
129
159
|
Core::Diagnostics::EnvironmentLogger.collect_and_log!(@environment_logger_extra)
|
130
160
|
end
|
131
161
|
|
@@ -134,17 +164,20 @@ module Datadog
|
|
134
164
|
# and avoid tearing down parts still in use.
|
135
165
|
def shutdown!(replacement = nil)
|
136
166
|
# Shutdown remote configuration
|
137
|
-
remote
|
167
|
+
remote&.shutdown!
|
168
|
+
|
169
|
+
# Shutdown DI after remote, since remote config triggers DI operations.
|
170
|
+
dynamic_instrumentation&.shutdown!
|
138
171
|
|
139
172
|
# Decommission AppSec
|
140
|
-
appsec
|
173
|
+
appsec&.shutdown!
|
141
174
|
|
142
175
|
# Shutdown the old tracer, unless it's still being used.
|
143
176
|
# (e.g. a custom tracer instance passed in.)
|
144
|
-
tracer.shutdown! unless replacement && tracer
|
177
|
+
tracer.shutdown! unless replacement && tracer.equal?(replacement.tracer)
|
145
178
|
|
146
179
|
# Shutdown old profiler
|
147
|
-
profiler
|
180
|
+
profiler&.shutdown!
|
148
181
|
|
149
182
|
# Shutdown workers
|
150
183
|
runtime_metrics.stop(true, close_metrics: false)
|
@@ -162,21 +195,32 @@ module Datadog
|
|
162
195
|
health_metrics.statsd
|
163
196
|
].compact.uniq
|
164
197
|
|
165
|
-
new_statsd =
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
198
|
+
new_statsd = if replacement
|
199
|
+
[
|
200
|
+
replacement.runtime_metrics.metrics.statsd,
|
201
|
+
replacement.health_metrics.statsd
|
202
|
+
].compact.uniq
|
203
|
+
else
|
204
|
+
[]
|
205
|
+
end
|
173
206
|
|
174
207
|
unused_statsd = (old_statsd - (old_statsd & new_statsd))
|
175
208
|
unused_statsd.each(&:close)
|
176
209
|
|
177
|
-
# enqueue closing event before stopping telemetry so it will be
|
178
|
-
telemetry.emit_closing! unless replacement
|
179
|
-
telemetry.
|
210
|
+
# enqueue closing event before stopping telemetry so it will be sent out on shutdown
|
211
|
+
telemetry.emit_closing! unless replacement&.telemetry&.enabled
|
212
|
+
telemetry.shutdown!
|
213
|
+
|
214
|
+
# TODO: Re-enable this once we have updated libdatadog to 17.1
|
215
|
+
# Core::ProcessDiscovery._native_close_tracer_memfd(@process_discovery_fd, @logger) if @process_discovery_fd
|
216
|
+
end
|
217
|
+
|
218
|
+
# Returns the current state of various components.
|
219
|
+
def state
|
220
|
+
ComponentsState.new(
|
221
|
+
telemetry_enabled: telemetry.enabled,
|
222
|
+
remote_started: remote&.started?,
|
223
|
+
)
|
180
224
|
end
|
181
225
|
end
|
182
226
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module Core
|
5
|
+
module Configuration
|
6
|
+
# Stores the state of component tree when replacing the tree.
|
7
|
+
class ComponentsState
|
8
|
+
def initialize(telemetry_enabled:, remote_started:)
|
9
|
+
@telemetry_enabled = !!telemetry_enabled
|
10
|
+
@remote_started = !!remote_started
|
11
|
+
end
|
12
|
+
|
13
|
+
def telemetry_enabled?
|
14
|
+
@telemetry_enabled
|
15
|
+
end
|
16
|
+
|
17
|
+
def remote_started?
|
18
|
+
@remote_started
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|