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
@@ -17,14 +17,13 @@ module Datadog
|
|
17
17
|
DEFAULT_BUFFER_MAX_SIZE = 1000
|
18
18
|
APP_STARTED_EVENT_RETRIES = 10
|
19
19
|
|
20
|
-
TELEMETRY_STARTED_ONCE = Utils::OnlyOnceSuccessful.new(APP_STARTED_EVENT_RETRIES)
|
21
|
-
|
22
20
|
def initialize(
|
23
21
|
heartbeat_interval_seconds:,
|
24
22
|
metrics_aggregation_interval_seconds:,
|
25
23
|
emitter:,
|
26
24
|
metrics_manager:,
|
27
25
|
dependency_collection:,
|
26
|
+
logger:,
|
28
27
|
enabled: true,
|
29
28
|
shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT,
|
30
29
|
buffer_size: DEFAULT_BUFFER_MAX_SIZE
|
@@ -32,6 +31,7 @@ module Datadog
|
|
32
31
|
@emitter = emitter
|
33
32
|
@metrics_manager = metrics_manager
|
34
33
|
@dependency_collection = dependency_collection
|
34
|
+
@logger = logger
|
35
35
|
|
36
36
|
@ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i
|
37
37
|
@current_ticks = 0
|
@@ -46,12 +46,25 @@ module Datadog
|
|
46
46
|
@buffer_size = buffer_size
|
47
47
|
|
48
48
|
self.buffer = buffer_klass.new(@buffer_size)
|
49
|
+
|
50
|
+
@initial_event_once = Utils::OnlyOnceSuccessful.new(APP_STARTED_EVENT_RETRIES)
|
49
51
|
end
|
50
52
|
|
51
|
-
|
53
|
+
attr_reader :logger
|
54
|
+
attr_reader :initial_event_once
|
55
|
+
attr_reader :initial_event
|
56
|
+
|
57
|
+
# Returns true if worker thread is successfully started,
|
58
|
+
# false if worker thread was not started but telemetry is enabled,
|
59
|
+
# nil if telemetry is disabled.
|
60
|
+
def start(initial_event)
|
52
61
|
return if !enabled? || forked?
|
53
62
|
|
63
|
+
@initial_event = initial_event
|
64
|
+
|
54
65
|
# starts async worker
|
66
|
+
# perform should return true if thread was actually started,
|
67
|
+
# false otherwise
|
55
68
|
perform
|
56
69
|
end
|
57
70
|
|
@@ -61,18 +74,60 @@ module Datadog
|
|
61
74
|
super
|
62
75
|
end
|
63
76
|
|
77
|
+
# Returns true if event was enqueued, nil if not.
|
78
|
+
# While returning false may seem more reasonable, the only reason
|
79
|
+
# for not enqueueing event (presently) is that telemetry is disabled
|
80
|
+
# altogether, and in this case other methods return nil.
|
64
81
|
def enqueue(event)
|
65
82
|
return if !enabled? || forked?
|
66
83
|
|
67
84
|
buffer.push(event)
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def sent_initial_event?
|
89
|
+
initial_event_once.success?
|
90
|
+
end
|
91
|
+
|
92
|
+
def failed_initial_event?
|
93
|
+
initial_event_once.failed?
|
68
94
|
end
|
69
95
|
|
70
|
-
def
|
71
|
-
|
96
|
+
def need_initial_event?
|
97
|
+
!sent_initial_event? && !failed_initial_event?
|
72
98
|
end
|
73
99
|
|
74
|
-
|
75
|
-
|
100
|
+
# Wait for the worker to send out all events that have already
|
101
|
+
# been queued, up to 15 seconds. Returns whether all events have
|
102
|
+
# been flushed.
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
def flush
|
106
|
+
return true unless enabled? || !run_loop?
|
107
|
+
|
108
|
+
started = Utils::Time.get_time
|
109
|
+
loop do
|
110
|
+
# The AppStarted event is triggered by the worker itself,
|
111
|
+
# from the worker thread. As such the main thread has no way
|
112
|
+
# to delay itself until that event is queued and we need some
|
113
|
+
# way to wait until that event is sent out to assert on it in
|
114
|
+
# the test suite. Check the run once flag which *should*
|
115
|
+
# indicate the event has been queued (at which point our queue
|
116
|
+
# depth check should waint until it's sent).
|
117
|
+
# This is still a hack because the flag can be overridden
|
118
|
+
# either way with or without the event being sent out.
|
119
|
+
# Note that if the AppStarted sending fails, this check
|
120
|
+
# will return false and flushing will be blocked until the
|
121
|
+
# 15 second timeout.
|
122
|
+
# Note that the first wait interval between telemetry event
|
123
|
+
# sending is 10 seconds, the timeout needs to be strictly
|
124
|
+
# greater than that.
|
125
|
+
return true if buffer.empty? && !in_iteration? && sent_initial_event?
|
126
|
+
|
127
|
+
sleep 0.5
|
128
|
+
|
129
|
+
return false if Utils::Time.get_time - started > 15
|
130
|
+
end
|
76
131
|
end
|
77
132
|
|
78
133
|
private
|
@@ -80,11 +135,26 @@ module Datadog
|
|
80
135
|
def perform(*events)
|
81
136
|
return if !enabled? || forked?
|
82
137
|
|
83
|
-
|
138
|
+
if need_initial_event?
|
139
|
+
started!
|
140
|
+
unless sent_initial_event?
|
141
|
+
# We still haven't succeeded in sending the started event,
|
142
|
+
# which will make flush_events do nothing - but the events
|
143
|
+
# given to us as the parameter have already been removed
|
144
|
+
# from the queue.
|
145
|
+
# Put the events back to the front of the queue to not
|
146
|
+
# lose them.
|
147
|
+
buffer.unshift(*events)
|
148
|
+
return
|
149
|
+
end
|
150
|
+
end
|
84
151
|
|
85
152
|
metric_events = @metrics_manager.flush!
|
86
153
|
events = [] if events.nil?
|
87
|
-
|
154
|
+
events += metric_events
|
155
|
+
if events.any?
|
156
|
+
flush_events(events)
|
157
|
+
end
|
88
158
|
|
89
159
|
@current_ticks += 1
|
90
160
|
return if @current_ticks < @ticks_per_heartbeat
|
@@ -94,15 +164,14 @@ module Datadog
|
|
94
164
|
end
|
95
165
|
|
96
166
|
def flush_events(events)
|
97
|
-
|
98
|
-
return if !enabled? || !sent_started_event?
|
167
|
+
events = deduplicate_logs(events)
|
99
168
|
|
100
|
-
|
169
|
+
logger.debug { "Sending #{events&.count} telemetry events" }
|
101
170
|
send_event(Event::MessageBatch.new(events))
|
102
171
|
end
|
103
172
|
|
104
173
|
def heartbeat!
|
105
|
-
return if !enabled? || !
|
174
|
+
return if !enabled? || !sent_initial_event?
|
106
175
|
|
107
176
|
send_event(Event::AppHeartbeat.new)
|
108
177
|
end
|
@@ -110,26 +179,29 @@ module Datadog
|
|
110
179
|
def started!
|
111
180
|
return unless enabled?
|
112
181
|
|
113
|
-
|
114
|
-
|
115
|
-
disable!
|
116
|
-
return
|
117
|
-
end
|
118
|
-
|
119
|
-
TELEMETRY_STARTED_ONCE.run do
|
120
|
-
res = send_event(Event::AppStarted.new)
|
182
|
+
initial_event_once.run do
|
183
|
+
res = send_event(initial_event)
|
121
184
|
|
122
185
|
if res.ok?
|
123
|
-
|
186
|
+
logger.debug { "Telemetry initial event (#{initial_event.type}) is successfully sent" }
|
124
187
|
|
125
|
-
|
188
|
+
# TODO Dependencies loaded event should probably check for new
|
189
|
+
# dependencies and send the new ones.
|
190
|
+
# System tests demand only one instance of this event per
|
191
|
+
# dependency.
|
192
|
+
send_event(Event::AppDependenciesLoaded.new) if @dependency_collection && initial_event.class.eql?(Telemetry::Event::AppStarted) # standard:disable Style/ClassEqualityComparison:
|
126
193
|
|
127
194
|
true
|
128
195
|
else
|
129
|
-
|
196
|
+
logger.debug("Error sending telemetry initial event (#{initial_event.type}), retry after heartbeat interval...")
|
130
197
|
false
|
131
198
|
end
|
132
199
|
end
|
200
|
+
|
201
|
+
if failed_initial_event?
|
202
|
+
logger.debug { "Telemetry initial event (#{initial_event.type}) exhausted retries, disabling telemetry worker" }
|
203
|
+
disable!
|
204
|
+
end
|
133
205
|
end
|
134
206
|
|
135
207
|
def send_event(event)
|
@@ -164,9 +236,40 @@ module Datadog
|
|
164
236
|
def disable_on_not_found!(response)
|
165
237
|
return unless response.not_found?
|
166
238
|
|
167
|
-
|
239
|
+
logger.debug('Agent does not support telemetry; disabling future telemetry events.')
|
168
240
|
disable!
|
169
241
|
end
|
242
|
+
|
243
|
+
# Deduplicate logs by counting the number of repeated occurrences of the same log
|
244
|
+
# entry and replacing them with a single entry with the calculated `count` value.
|
245
|
+
# Non-log events are unchanged.
|
246
|
+
def deduplicate_logs(events)
|
247
|
+
return events if events.empty?
|
248
|
+
|
249
|
+
all_logs = []
|
250
|
+
other_events = events.reject do |event|
|
251
|
+
if event.is_a?(Event::Log)
|
252
|
+
all_logs << event
|
253
|
+
true
|
254
|
+
else
|
255
|
+
false
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
return events if all_logs.empty?
|
260
|
+
|
261
|
+
uniq_logs = all_logs.group_by(&:itself).map do |_, logs|
|
262
|
+
log = logs.first
|
263
|
+
if logs.size > 1
|
264
|
+
# New log event with a count of repeated occurrences
|
265
|
+
Event::Log.new(message: log.message, level: log.level, stack_trace: log.stack_trace, count: logs.size)
|
266
|
+
else
|
267
|
+
log
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
other_events + uniq_logs
|
272
|
+
end
|
170
273
|
end
|
171
274
|
end
|
172
275
|
end
|
@@ -1,12 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Datadog
|
4
|
-
module
|
4
|
+
module Core
|
5
5
|
module Transport
|
6
6
|
module HTTP
|
7
7
|
module API
|
8
8
|
# An API configured with adapter and routes
|
9
9
|
class Instance
|
10
|
+
# Raised when an endpoint is invoked on an API that is not the
|
11
|
+
# of expected API class for that endpoint.
|
12
|
+
class EndpointNotSupportedError < StandardError
|
13
|
+
attr_reader :spec, :endpoint_name
|
14
|
+
|
15
|
+
def initialize(endpoint_name, spec)
|
16
|
+
@spec = spec
|
17
|
+
@endpoint_name = endpoint_name
|
18
|
+
|
19
|
+
super(message)
|
20
|
+
end
|
21
|
+
|
22
|
+
def message
|
23
|
+
"#{endpoint_name} not supported for this API!"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
10
27
|
attr_reader \
|
11
28
|
:adapter,
|
12
29
|
:headers,
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module Core
|
5
|
+
module Transport
|
6
|
+
module HTTP
|
7
|
+
module API
|
8
|
+
# Specification for an HTTP API
|
9
|
+
# Defines behaviors without specific configuration details.
|
10
|
+
class Spec
|
11
|
+
# Raised when an endpoint is invoked on an API that did not
|
12
|
+
# define that endpoint.
|
13
|
+
class EndpointNotDefinedError < StandardError
|
14
|
+
attr_reader :spec, :endpoint_name
|
15
|
+
|
16
|
+
def initialize(endpoint_name, spec)
|
17
|
+
@spec = spec
|
18
|
+
@endpoint_name = endpoint_name
|
19
|
+
|
20
|
+
super(message)
|
21
|
+
end
|
22
|
+
|
23
|
+
def message
|
24
|
+
"No #{endpoint_name} endpoint is defined for API specification!"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
yield(self) if block_given?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative 'api/instance'
|
7
|
-
require_relative 'client'
|
3
|
+
require_relative '../../configuration/agent_settings_resolver'
|
4
|
+
require_relative 'adapters/registry'
|
5
|
+
require_relative 'api/map'
|
8
6
|
|
9
7
|
module Datadog
|
10
|
-
module
|
8
|
+
module Core
|
11
9
|
module Transport
|
12
10
|
module HTTP
|
13
11
|
# Builds new instances of Transport::HTTP::Client
|
@@ -15,13 +13,15 @@ module Datadog
|
|
15
13
|
REGISTRY = Datadog::Core::Transport::HTTP::Adapters::Registry.new
|
16
14
|
|
17
15
|
attr_reader \
|
16
|
+
:api_instance_class,
|
18
17
|
:apis,
|
19
18
|
:api_options,
|
20
19
|
:default_adapter,
|
21
20
|
:default_api,
|
22
|
-
:default_headers
|
21
|
+
:default_headers,
|
22
|
+
:logger
|
23
23
|
|
24
|
-
def initialize
|
24
|
+
def initialize(api_instance_class:, logger: Datadog.logger)
|
25
25
|
# Global settings
|
26
26
|
@default_adapter = nil
|
27
27
|
@default_headers = {}
|
@@ -33,24 +33,27 @@ module Datadog
|
|
33
33
|
# API settings
|
34
34
|
@api_options = {}
|
35
35
|
|
36
|
+
@api_instance_class = api_instance_class
|
37
|
+
@logger = logger
|
38
|
+
|
36
39
|
yield(self) if block_given?
|
37
40
|
end
|
38
41
|
|
39
42
|
def adapter(config, *args, **kwargs)
|
40
43
|
@default_adapter = case config
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
44
|
+
when Core::Configuration::AgentSettingsResolver::AgentSettings
|
45
|
+
registry_klass = REGISTRY.get(config.adapter)
|
46
|
+
raise UnknownAdapterError, config.adapter if registry_klass.nil?
|
47
|
+
|
48
|
+
registry_klass.build(config)
|
49
|
+
when Symbol
|
50
|
+
registry_klass = REGISTRY.get(config)
|
51
|
+
raise UnknownAdapterError, config if registry_klass.nil?
|
52
|
+
|
53
|
+
registry_klass.new(*args, **kwargs)
|
54
|
+
else
|
55
|
+
config
|
56
|
+
end
|
54
57
|
end
|
55
58
|
|
56
59
|
def headers(values = {})
|
@@ -82,11 +85,10 @@ module Datadog
|
|
82
85
|
@default_api = key
|
83
86
|
end
|
84
87
|
|
85
|
-
def to_transport
|
88
|
+
def to_transport(klass)
|
86
89
|
raise NoDefaultApiError if @default_api.nil?
|
87
90
|
|
88
|
-
|
89
|
-
Transport::Traces::Transport.new(to_api_instances, @default_api)
|
91
|
+
klass.new(to_api_instances, @default_api, logger: logger)
|
90
92
|
end
|
91
93
|
|
92
94
|
def to_api_instances
|
@@ -117,28 +119,48 @@ module Datadog
|
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
120
|
-
def api_instance_class
|
121
|
-
API::Instance
|
122
|
-
end
|
123
|
-
|
124
122
|
# Raised when the API key does not match known APIs.
|
125
123
|
class UnknownApiError < StandardError
|
124
|
+
attr_reader :key
|
125
|
+
|
126
126
|
def initialize(key)
|
127
|
-
super(
|
127
|
+
super()
|
128
|
+
|
129
|
+
@key = key
|
130
|
+
end
|
131
|
+
|
132
|
+
def message
|
133
|
+
"Unknown transport API '#{key}'!"
|
128
134
|
end
|
129
135
|
end
|
130
136
|
|
131
137
|
# Raised when the identifier cannot be matched to an adapter.
|
132
138
|
class UnknownAdapterError < StandardError
|
139
|
+
attr_reader :type
|
140
|
+
|
133
141
|
def initialize(type)
|
134
|
-
super(
|
142
|
+
super()
|
143
|
+
|
144
|
+
@type = type
|
145
|
+
end
|
146
|
+
|
147
|
+
def message
|
148
|
+
"Unknown transport adapter '#{type}'!"
|
135
149
|
end
|
136
150
|
end
|
137
151
|
|
138
152
|
# Raised when an adapter cannot be resolved for an API instance.
|
139
153
|
class NoAdapterForApiError < StandardError
|
154
|
+
attr_reader :key
|
155
|
+
|
140
156
|
def initialize(key)
|
141
|
-
super(
|
157
|
+
super()
|
158
|
+
|
159
|
+
@key = key
|
160
|
+
end
|
161
|
+
|
162
|
+
def message
|
163
|
+
"No adapter resolved for transport API '#{key}'!"
|
142
164
|
end
|
143
165
|
end
|
144
166
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'http/builder'
|
4
|
+
require_relative 'http/adapters/net'
|
5
|
+
require_relative 'http/adapters/unix_socket'
|
6
|
+
require_relative 'http/adapters/test'
|
7
|
+
|
8
|
+
module Datadog
|
9
|
+
module Core
|
10
|
+
module Transport
|
11
|
+
# HTTP transport
|
12
|
+
module HTTP
|
13
|
+
# Add adapters to registry
|
14
|
+
Builder::REGISTRY.set(
|
15
|
+
Transport::HTTP::Adapters::Net,
|
16
|
+
Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
17
|
+
)
|
18
|
+
Builder::REGISTRY.set(
|
19
|
+
Transport::HTTP::Adapters::Test,
|
20
|
+
Transport::Ext::Test::ADAPTER
|
21
|
+
)
|
22
|
+
Builder::REGISTRY.set(
|
23
|
+
Transport::HTTP::Adapters::UnixSocket,
|
24
|
+
Transport::Ext::UnixSocket::ADAPTER
|
25
|
+
)
|
26
|
+
|
27
|
+
module_function
|
28
|
+
|
29
|
+
# Helper function that delegates to Builder.new
|
30
|
+
# but is under HTTP namespace so that client code requires this file
|
31
|
+
# to get the adapters configured, and not the builder directly.
|
32
|
+
def build(api_instance_class:, agent_settings:, logger: Datadog.logger, api_version: nil, headers: nil, &block)
|
33
|
+
Builder.new(api_instance_class: api_instance_class, logger: logger) do |transport|
|
34
|
+
transport.adapter(agent_settings)
|
35
|
+
transport.headers(default_headers)
|
36
|
+
|
37
|
+
# The caller must define APIs before we set the default API.
|
38
|
+
yield transport
|
39
|
+
|
40
|
+
# Apply any settings given by options
|
41
|
+
transport.default_api = api_version if api_version
|
42
|
+
transport.headers(headers) if headers
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_headers
|
47
|
+
{
|
48
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
|
49
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG =>
|
50
|
+
Datadog::Core::Environment::Ext::LANG,
|
51
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION =>
|
52
|
+
Datadog::Core::Environment::Ext::LANG_VERSION,
|
53
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
|
54
|
+
Datadog::Core::Environment::Ext::LANG_INTERPRETER,
|
55
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR =>
|
56
|
+
Core::Environment::Ext::LANG_ENGINE,
|
57
|
+
Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
|
58
|
+
Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
|
59
|
+
}.tap do |headers|
|
60
|
+
# Add container ID, if present.
|
61
|
+
if (container_id = Datadog::Core::Environment::Container.container_id)
|
62
|
+
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id
|
63
|
+
end
|
64
|
+
# TODO: inject configuration rather than reading from global here
|
65
|
+
unless Datadog.configuration.apm.tracing.enabled
|
66
|
+
# Sending this header to the agent will disable metrics computation (and billing) on the agent side
|
67
|
+
# by pretending it has already been done on the library side.
|
68
|
+
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -51,13 +51,13 @@ module Datadog
|
|
51
51
|
def fork
|
52
52
|
# If a block is provided, it must be wrapped to trigger callbacks.
|
53
53
|
child_block = if block_given?
|
54
|
-
|
55
|
-
|
54
|
+
proc do
|
55
|
+
AtForkMonkeyPatch.run_at_fork_blocks(:child)
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
# Invoke original block
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
end
|
61
61
|
|
62
62
|
# Start fork
|
63
63
|
# If a block is provided, use the wrapped version.
|
@@ -7,42 +7,42 @@ module Datadog
|
|
7
7
|
module Duration
|
8
8
|
def self.call(value, base: :s)
|
9
9
|
cast = if value.include?('.')
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
method(:Float)
|
11
|
+
else
|
12
|
+
method(:Integer)
|
13
|
+
end
|
14
14
|
|
15
15
|
scale = case base
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
when :s
|
17
|
+
1_000_000_000
|
18
|
+
when :ms
|
19
|
+
1_000_000
|
20
|
+
when :us
|
21
|
+
1000
|
22
|
+
when :ns
|
23
|
+
1
|
24
|
+
else
|
25
|
+
raise ArgumentError, "invalid base: #{base.inspect}"
|
26
|
+
end
|
27
27
|
|
28
28
|
result = case value
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
29
|
+
when /^(\d+(?:\.\d+)?)h$/
|
30
|
+
cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
|
31
|
+
when /^(\d+(?:\.\d+)?)m$/
|
32
|
+
cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
|
33
|
+
when /^(\d+(?:\.\d+)?)s$/
|
34
|
+
cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
|
35
|
+
when /^(\d+(?:\.\d+)?)ms$/
|
36
|
+
cast.call(Regexp.last_match(1)) * 1_000_000 / scale
|
37
|
+
when /^(\d+(?:\.\d+)?)us$/
|
38
|
+
cast.call(Regexp.last_match(1)) * 1_000 / scale
|
39
|
+
when /^(\d+(?:\.\d+)?)ns$/
|
40
|
+
cast.call(Regexp.last_match(1)) / scale
|
41
|
+
when /^(\d+(?:\.\d+)?)$/
|
42
|
+
cast.call(Regexp.last_match(1))
|
43
|
+
else
|
44
|
+
raise ArgumentError, "invalid duration: #{value.inspect}"
|
45
|
+
end
|
46
46
|
# @type var result: Numeric
|
47
47
|
result.round
|
48
48
|
end
|
@@ -47,12 +47,12 @@ module Datadog
|
|
47
47
|
# This wrapper prevents this by initializing the fork PID when the object is created.
|
48
48
|
if RUBY_VERSION >= '3'
|
49
49
|
def initialize(*args, **kwargs, &block)
|
50
|
-
super
|
50
|
+
super
|
51
51
|
update_fork_pid!
|
52
52
|
end
|
53
53
|
else
|
54
54
|
def initialize(*args, &block)
|
55
|
-
super
|
55
|
+
super
|
56
56
|
update_fork_pid!
|
57
57
|
end
|
58
58
|
end
|