datadog 2.12.1 → 2.19.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 +243 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
- data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
- data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
- data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
- data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
- data/ext/libdatadog_api/crashtracker.c +11 -12
- data/ext/libdatadog_api/crashtracker.h +5 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/extconf.rb +2 -2
- data/ext/libdatadog_api/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +164 -0
- data/ext/libdatadog_api/library_config.h +25 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +112 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +2 -2
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +24 -2
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
- data/lib/datadog/appsec/api_security/sampler.rb +59 -0
- data/lib/datadog/appsec/api_security.rb +23 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
- data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +46 -61
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +153 -30
- data/lib/datadog/appsec/context.rb +7 -7
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
- data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +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} +2 -2
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/event.rb +96 -135
- data/lib/datadog/appsec/ext.rb +4 -2
- 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/telemetry.rb +1 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
- data/lib/datadog/appsec/remote.rb +31 -59
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/engine.rb +194 -0
- data/lib/datadog/appsec/security_engine/runner.rb +13 -14
- data/lib/datadog/appsec/security_event.rb +39 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +5 -8
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +48 -31
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/ext.rb +4 -0
- data/lib/datadog/core/configuration/option.rb +81 -45
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +109 -44
- data/lib/datadog/core/configuration/stable_config.rb +22 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/agent_info.rb +4 -3
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -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 +20 -21
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
- data/lib/datadog/core/process_discovery.rb +36 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +40 -32
- data/lib/datadog/core/remote/component.rb +6 -9
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +14 -1
- data/lib/datadog/core/remote/negotiation.rb +9 -9
- data/lib/datadog/core/remote/transport/config.rb +4 -3
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -37
- data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
- data/lib/datadog/core/remote/transport/http.rb +22 -57
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/tag_builder.rb +56 -0
- data/lib/datadog/core/telemetry/component.rb +81 -52
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +5 -4
- data/lib/datadog/core/telemetry/logging.rb +11 -5
- data/lib/datadog/core/telemetry/metric.rb +8 -8
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
- data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
- data/lib/datadog/core/telemetry/transport/http.rb +63 -0
- data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
- data/lib/datadog/core/telemetry/worker.rb +90 -24
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/api/instance.rb +17 -0
- data/lib/datadog/core/transport/http/api/spec.rb +17 -0
- data/lib/datadog/core/transport/http/builder.rb +19 -17
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http.rb +39 -2
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/utils.rb +7 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +29 -12
- data/lib/datadog/core/workers/interval_loop.rb +12 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/core.rb +8 -0
- data/lib/datadog/di/boot.rb +34 -0
- data/lib/datadog/di/component.rb +0 -2
- data/lib/datadog/di/instrumenter.rb +48 -5
- data/lib/datadog/di/probe_notification_builder.rb +38 -43
- data/lib/datadog/di/probe_notifier_worker.rb +25 -17
- data/lib/datadog/di/remote.rb +2 -0
- data/lib/datadog/di/serializer.rb +10 -2
- data/lib/datadog/di/transport/diagnostics.rb +4 -3
- data/lib/datadog/di/transport/http/api.rb +2 -12
- data/lib/datadog/di/transport/http/client.rb +4 -3
- data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
- data/lib/datadog/di/transport/http/input.rb +18 -35
- data/lib/datadog/di/transport/http.rb +14 -62
- data/lib/datadog/di/transport/input.rb +14 -5
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +0 -33
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events/v2.rb +195 -0
- data/lib/datadog/kit/appsec/events.rb +12 -0
- data/lib/datadog/kit/identity.rb +5 -1
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +16 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/info.rb +44 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +8 -9
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +12 -7
- data/lib/datadog/profiling/ext.rb +0 -14
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +7 -61
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +9 -9
- data/lib/datadog/profiling/tag_builder.rb +7 -41
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/profiling.rb +7 -2
- data/lib/datadog/single_step_instrument.rb +9 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/component.rb +15 -12
- data/lib/datadog/tracing/configuration/ext.rb +7 -1
- data/lib/datadog/tracing/configuration/settings.rb +18 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -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/faraday/middleware.rb +5 -3
- 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/httpclient/instrumentation.rb +6 -16
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
- 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/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
- 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 +10 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +68 -16
- data/lib/datadog/tracing/sync_writer.rb +2 -3
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +55 -27
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +51 -7
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +5 -4
- data/lib/datadog/tracing/transport/http/traces.rb +13 -41
- data/lib/datadog/tracing/transport/http.rb +11 -44
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +26 -9
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
- data/lib/datadog/tracing/writer.rb +2 -6
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -2
- metadata +88 -23
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
- data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/telemetry/http/env.rb +0 -20
- data/lib/datadog/core/telemetry/http/ext.rb +0 -28
- data/lib/datadog/core/telemetry/http/response.rb +0 -70
- data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -52,6 +52,17 @@ module Datadog
|
|
52
52
|
# (however, Probe instances can be replaced by OpenStruct instances
|
53
53
|
# providing the same interface with not much effort).
|
54
54
|
#
|
55
|
+
# Instrumenter (this class) is responsible for building snapshots.
|
56
|
+
# This is because to capture values on method entry, those values need to
|
57
|
+
# be duplicated or serialized into immutable values to prevent their
|
58
|
+
# modification by the instrumented method. Therefore this class must
|
59
|
+
# do at least some serialization/snapshot building and to keep the code
|
60
|
+
# well-encapsulated, all serialization/snapshot building should thus be
|
61
|
+
# initiated from this class rather than downstream code.
|
62
|
+
#
|
63
|
+
# As a consequence of Instrumenter building snapshots, it should not
|
64
|
+
# expose TracePoint objects to any downstream code.
|
65
|
+
#
|
55
66
|
# @api private
|
56
67
|
class Instrumenter
|
57
68
|
def initialize(settings, serializer, logger, code_tracker: nil, telemetry: nil)
|
@@ -110,8 +121,8 @@ module Datadog
|
|
110
121
|
if rate_limiter.nil? || rate_limiter.allow?
|
111
122
|
# Arguments may be mutated by the method, therefore
|
112
123
|
# they need to be serialized prior to method invocation.
|
113
|
-
|
114
|
-
serializer.serialize_args(args, kwargs,
|
124
|
+
serialized_entry_args = if probe.capture_snapshot?
|
125
|
+
serializer.serialize_args(args, kwargs, self,
|
115
126
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
116
127
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
117
128
|
end
|
@@ -148,8 +159,10 @@ module Datadog
|
|
148
159
|
caller_locs = method_frame + caller_locations # steep:ignore
|
149
160
|
# TODO capture arguments at exit
|
150
161
|
# & is to stop steep complaints, block is always present here.
|
151
|
-
block&.call(probe: probe, rv: rv,
|
152
|
-
|
162
|
+
block&.call(probe: probe, rv: rv,
|
163
|
+
duration: duration, caller_locations: caller_locs,
|
164
|
+
target_self: self,
|
165
|
+
serialized_entry_args: serialized_entry_args)
|
153
166
|
rv
|
154
167
|
else
|
155
168
|
# stop standard from trying to mess up my code
|
@@ -298,8 +311,21 @@ module Datadog
|
|
298
311
|
probe.file == tp.path || probe.file_matches?(tp.path)
|
299
312
|
)
|
300
313
|
if rate_limiter.nil? || rate_limiter.allow?
|
314
|
+
serialized_locals = if probe.capture_snapshot?
|
315
|
+
serializer.serialize_vars(Instrumenter.get_local_variables(tp),
|
316
|
+
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
317
|
+
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
318
|
+
end
|
319
|
+
if probe.capture_snapshot?
|
320
|
+
serializer.serialize_value(tp.self,
|
321
|
+
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
322
|
+
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
|
323
|
+
end
|
301
324
|
# & is to stop steep complaints, block is always present here.
|
302
|
-
block&.call(probe: probe,
|
325
|
+
block&.call(probe: probe,
|
326
|
+
serialized_locals: serialized_locals,
|
327
|
+
target_self: tp.self,
|
328
|
+
path: tp.path, caller_locations: caller_locations)
|
303
329
|
end
|
304
330
|
end
|
305
331
|
rescue => exc
|
@@ -371,6 +397,23 @@ module Datadog
|
|
371
397
|
end
|
372
398
|
end
|
373
399
|
|
400
|
+
class << self
|
401
|
+
def get_local_variables(trace_point)
|
402
|
+
# binding appears to be constructed on access, therefore
|
403
|
+
# 1) we should attempt to cache it and
|
404
|
+
# 2) we should not call +binding+ until we actually need variable values.
|
405
|
+
binding = trace_point.binding
|
406
|
+
|
407
|
+
# steep hack - should never happen
|
408
|
+
return {} unless binding
|
409
|
+
|
410
|
+
binding.local_variables.each_with_object({}) do |name, map|
|
411
|
+
value = binding.local_variable_get(name)
|
412
|
+
map[name] = value
|
413
|
+
end
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
374
417
|
private
|
375
418
|
|
376
419
|
attr_reader :lock
|
@@ -39,60 +39,70 @@ module Datadog
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# Duration is in seconds.
|
42
|
+
# path is the actual path of the instrumented file.
|
42
43
|
def build_executed(probe,
|
43
|
-
|
44
|
-
args: nil, kwargs: nil,
|
45
|
-
|
46
|
-
|
47
|
-
raise "Cannot create snapshot because there is no trace point"
|
48
|
-
end
|
49
|
-
get_local_variables(trace_point)
|
50
|
-
end
|
51
|
-
# TODO check how many stack frames we should be keeping/sending,
|
52
|
-
# this should be all frames for enriched probes and no frames for
|
53
|
-
# non-enriched probes?
|
54
|
-
build_snapshot(probe, rv: rv, snapshot: snapshot,
|
44
|
+
path: nil, rv: nil, duration: nil, caller_locations: nil,
|
45
|
+
serialized_locals: nil, args: nil, kwargs: nil, target_self: nil,
|
46
|
+
serialized_entry_args: nil)
|
47
|
+
build_snapshot(probe, rv: rv, serialized_locals: serialized_locals,
|
55
48
|
# Actual path of the instrumented file.
|
56
|
-
path:
|
57
|
-
duration: duration,
|
49
|
+
path: path,
|
50
|
+
duration: duration,
|
51
|
+
# TODO check how many stack frames we should be keeping/sending,
|
52
|
+
# this should be all frames for enriched probes and no frames for
|
53
|
+
# non-enriched probes?
|
54
|
+
caller_locations: caller_locations,
|
55
|
+
args: args, kwargs: kwargs,
|
56
|
+
target_self: target_self,
|
58
57
|
serialized_entry_args: serialized_entry_args)
|
59
58
|
end
|
60
59
|
|
61
|
-
def build_snapshot(probe, rv: nil,
|
62
|
-
|
60
|
+
def build_snapshot(probe, rv: nil, serialized_locals: nil, path: nil,
|
61
|
+
# In Ruby everything is a method, therefore we should always have
|
62
|
+
# a target self. However, if we are not capturing a snapshot,
|
63
|
+
# there is no need to pass in the target self.
|
64
|
+
target_self: nil,
|
65
|
+
duration: nil, caller_locations: nil,
|
66
|
+
args: nil, kwargs: nil,
|
63
67
|
serialized_entry_args: nil)
|
68
|
+
if probe.capture_snapshot? && !target_self
|
69
|
+
raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
|
70
|
+
end
|
71
|
+
|
64
72
|
# TODO also verify that non-capturing probe does not pass
|
65
73
|
# snapshot or vars/args into this method
|
66
74
|
captures = if probe.capture_snapshot?
|
67
75
|
if probe.method?
|
76
|
+
return_arguments = {
|
77
|
+
"@return": serializer.serialize_value(rv,
|
78
|
+
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
79
|
+
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
|
80
|
+
self: serializer.serialize_value(target_self),
|
81
|
+
}
|
68
82
|
{
|
69
83
|
entry: {
|
70
84
|
# standard:disable all
|
71
85
|
arguments: if serialized_entry_args
|
72
86
|
serialized_entry_args
|
73
87
|
else
|
74
|
-
(args || kwargs) && serializer.serialize_args(args, kwargs,
|
88
|
+
(args || kwargs) && serializer.serialize_args(args, kwargs, target_self,
|
75
89
|
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
76
90
|
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
|
77
91
|
end,
|
78
|
-
throwable: nil,
|
79
92
|
# standard:enable all
|
80
93
|
},
|
81
94
|
return: {
|
82
|
-
arguments:
|
83
|
-
"@return": serializer.serialize_value(rv,
|
84
|
-
depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
|
85
|
-
attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
|
86
|
-
},
|
95
|
+
arguments: return_arguments,
|
87
96
|
throwable: nil,
|
88
97
|
},
|
89
98
|
}
|
90
99
|
elsif probe.line?
|
91
100
|
{
|
92
|
-
lines:
|
93
|
-
probe.line_no => {
|
94
|
-
|
95
|
-
|
101
|
+
lines: serialized_locals && {
|
102
|
+
probe.line_no => {
|
103
|
+
locals: serialized_locals,
|
104
|
+
arguments: {self: serializer.serialize_value(target_self)},
|
105
|
+
},
|
96
106
|
},
|
97
107
|
}
|
98
108
|
end
|
@@ -191,22 +201,7 @@ module Datadog
|
|
191
201
|
end
|
192
202
|
|
193
203
|
def timestamp_now
|
194
|
-
(Time.now.to_f * 1000).to_i
|
195
|
-
end
|
196
|
-
|
197
|
-
def get_local_variables(trace_point)
|
198
|
-
# binding appears to be constructed on access, therefore
|
199
|
-
# 1) we should attempt to cache it and
|
200
|
-
# 2) we should not call +binding+ until we actually need variable values.
|
201
|
-
binding = trace_point.binding
|
202
|
-
|
203
|
-
# steep hack - should never happen
|
204
|
-
return {} unless binding
|
205
|
-
|
206
|
-
binding.local_variables.each_with_object({}) do |name, map|
|
207
|
-
value = binding.local_variable_get(name)
|
208
|
-
map[name] = value
|
209
|
-
end
|
204
|
+
(Core::Utils::Time.now.to_f * 1000).to_i
|
210
205
|
end
|
211
206
|
|
212
207
|
def active_trace
|
@@ -171,7 +171,7 @@ module Datadog
|
|
171
171
|
attr_reader :last_sent
|
172
172
|
|
173
173
|
def status_transport
|
174
|
-
@status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings)
|
174
|
+
@status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings, logger: logger)
|
175
175
|
end
|
176
176
|
|
177
177
|
def do_send_status(batch)
|
@@ -179,11 +179,19 @@ module Datadog
|
|
179
179
|
end
|
180
180
|
|
181
181
|
def snapshot_transport
|
182
|
-
@snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings)
|
182
|
+
@snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger)
|
183
183
|
end
|
184
184
|
|
185
185
|
def do_send_snapshot(batch)
|
186
|
-
snapshot_transport.send_input(batch)
|
186
|
+
snapshot_transport.send_input(batch, tags)
|
187
|
+
end
|
188
|
+
|
189
|
+
def tags
|
190
|
+
# DEV: The tags could be cached but they need to be recreated
|
191
|
+
# when process forks (since the child receives new runtime IDs).
|
192
|
+
Core::TagBuilder.tags(settings).merge(
|
193
|
+
'debugger_version' => Core::Environment::Identity.gem_datadog_version,
|
194
|
+
)
|
187
195
|
end
|
188
196
|
|
189
197
|
[
|
@@ -227,20 +235,6 @@ module Datadog
|
|
227
235
|
start
|
228
236
|
end
|
229
237
|
|
230
|
-
# Determine how much longer the worker thread should sleep
|
231
|
-
# so as not to send in less than min send interval since the last send.
|
232
|
-
# Important: this method must be called when @lock is held.
|
233
|
-
#
|
234
|
-
# Returns the time remaining to sleep.
|
235
|
-
def set_sleep_remaining
|
236
|
-
now = Core::Utils::Time.get_time
|
237
|
-
@sleep_remaining = if last_sent
|
238
|
-
[last_sent + min_send_interval - now, 0].max
|
239
|
-
else
|
240
|
-
0
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
238
|
public "add_#{event_type}"
|
245
239
|
|
246
240
|
# Sends pending probe statuses or snapshots.
|
@@ -288,6 +282,20 @@ module Datadog
|
|
288
282
|
end
|
289
283
|
end
|
290
284
|
|
285
|
+
# Determine how much longer the worker thread should sleep
|
286
|
+
# so as not to send in less than min send interval since the last send.
|
287
|
+
# Important: this method must be called when @lock is held.
|
288
|
+
#
|
289
|
+
# Returns the time remaining to sleep.
|
290
|
+
def set_sleep_remaining
|
291
|
+
now = Core::Utils::Time.get_time
|
292
|
+
@sleep_remaining = if last_sent
|
293
|
+
[last_sent + min_send_interval - now, 0].max
|
294
|
+
else
|
295
|
+
0
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
291
299
|
def maybe_send
|
292
300
|
rv = maybe_send_status
|
293
301
|
maybe_send_snapshot || rv
|
data/lib/datadog/di/remote.rb
CHANGED
@@ -36,6 +36,10 @@ module Datadog
|
|
36
36
|
# efficient but there would be additional overhead from passing this
|
37
37
|
# parameter all the time and the API would get more complex.
|
38
38
|
#
|
39
|
+
# Note: "self" cannot be used as a parameter name in Ruby, therefore
|
40
|
+
# there should never be a conflict between instance variable
|
41
|
+
# serialization and method parameters.
|
42
|
+
#
|
39
43
|
# @api private
|
40
44
|
class Serializer
|
41
45
|
# Third-party library integration / custom serializers.
|
@@ -82,7 +86,11 @@ module Datadog
|
|
82
86
|
# between positional and keyword arguments. We convert positional
|
83
87
|
# arguments to keyword arguments ("arg1", "arg2", ...) and ensure
|
84
88
|
# the positional arguments are listed first.
|
85
|
-
|
89
|
+
#
|
90
|
+
# Instance variables are technically a hash just like kwargs,
|
91
|
+
# we take them as a separate parameter to avoid a hash merge
|
92
|
+
# in upstream code.
|
93
|
+
def serialize_args(args, kwargs, target_self,
|
86
94
|
depth: settings.dynamic_instrumentation.max_capture_depth,
|
87
95
|
attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count)
|
88
96
|
counter = 0
|
@@ -91,7 +99,7 @@ module Datadog
|
|
91
99
|
# Conversion to symbol is needed here to put args ahead of
|
92
100
|
# kwargs when they are merged below.
|
93
101
|
c[:"arg#{counter}"] = value
|
94
|
-
end.update(kwargs)
|
102
|
+
end.update(kwargs).update(self: target_self)
|
95
103
|
serialize_vars(combined, depth: depth, attribute_count: attribute_count)
|
96
104
|
end
|
97
105
|
|
@@ -15,12 +15,13 @@ module Datadog
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class Transport
|
18
|
-
attr_reader :client, :apis, :default_api, :current_api_id
|
18
|
+
attr_reader :client, :apis, :default_api, :current_api_id, :logger
|
19
19
|
|
20
|
-
def initialize(apis, default_api)
|
20
|
+
def initialize(apis, default_api, logger:)
|
21
21
|
@apis = apis
|
22
|
+
@logger = logger
|
22
23
|
|
23
|
-
@client = HTTP::Client.new(current_api)
|
24
|
+
@client = HTTP::Client.new(current_api, logger: logger)
|
24
25
|
end
|
25
26
|
|
26
27
|
def current_api
|
@@ -21,13 +21,13 @@ module Datadog
|
|
21
21
|
|
22
22
|
def defaults
|
23
23
|
Datadog::Core::Transport::HTTP::API::Map[
|
24
|
-
DIAGNOSTICS => Spec.new do |s|
|
24
|
+
DIAGNOSTICS => Diagnostics::API::Spec.new do |s|
|
25
25
|
s.diagnostics = Diagnostics::API::Endpoint.new(
|
26
26
|
'/debugger/v1/diagnostics',
|
27
27
|
Core::Encoding::JSONEncoder,
|
28
28
|
)
|
29
29
|
end,
|
30
|
-
INPUT => Spec.new do |s|
|
30
|
+
INPUT => Input::API::Spec.new do |s|
|
31
31
|
s.input = Input::API::Endpoint.new(
|
32
32
|
'/debugger/v1/input',
|
33
33
|
Core::Encoding::JSONEncoder,
|
@@ -35,16 +35,6 @@ module Datadog
|
|
35
35
|
end,
|
36
36
|
]
|
37
37
|
end
|
38
|
-
|
39
|
-
class Instance < Core::Transport::HTTP::API::Instance
|
40
|
-
include Diagnostics::API::Instance
|
41
|
-
include Input::API::Instance
|
42
|
-
end
|
43
|
-
|
44
|
-
class Spec < Core::Transport::HTTP::API::Spec
|
45
|
-
include Diagnostics::API::Spec
|
46
|
-
include Input::API::Spec
|
47
|
-
end
|
48
38
|
end
|
49
39
|
end
|
50
40
|
end
|
@@ -14,10 +14,11 @@ module Datadog
|
|
14
14
|
module HTTP
|
15
15
|
# Routes, encodes, and sends DI data to the trace agent via HTTP.
|
16
16
|
class Client
|
17
|
-
attr_reader :api
|
17
|
+
attr_reader :api, :logger
|
18
18
|
|
19
|
-
def initialize(api)
|
19
|
+
def initialize(api, logger:)
|
20
20
|
@api = api
|
21
|
+
@logger = logger
|
21
22
|
end
|
22
23
|
|
23
24
|
def send_request(request, &block)
|
@@ -31,7 +32,7 @@ module Datadog
|
|
31
32
|
"Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
|
32
33
|
"Location: #{Array(e.backtrace).first}"
|
33
34
|
|
34
|
-
|
35
|
+
logger.debug(message)
|
35
36
|
|
36
37
|
Datadog::Core::Transport::InternalErrorResponse.new(e)
|
37
38
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../../../core/transport/http/api/instance'
|
4
|
+
require_relative '../../../core/transport/http/api/spec'
|
3
5
|
require_relative 'client'
|
4
6
|
|
5
7
|
module Datadog
|
@@ -16,55 +18,26 @@ module Datadog
|
|
16
18
|
end
|
17
19
|
|
18
20
|
module API
|
19
|
-
|
21
|
+
class Instance < Core::Transport::HTTP::API::Instance
|
20
22
|
def send_diagnostics(env)
|
21
|
-
raise
|
23
|
+
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('diagnostics', self) unless spec.is_a?(Diagnostics::API::Spec)
|
22
24
|
|
23
25
|
spec.send_diagnostics(env) do |request_env|
|
24
26
|
call(request_env)
|
25
27
|
end
|
26
28
|
end
|
27
|
-
|
28
|
-
class DiagnosticsNotSupportedError < StandardError
|
29
|
-
attr_reader :spec
|
30
|
-
|
31
|
-
def initialize(spec)
|
32
|
-
super
|
33
|
-
|
34
|
-
@spec = spec
|
35
|
-
end
|
36
|
-
|
37
|
-
def message
|
38
|
-
'Diagnostics not supported for this API!'
|
39
|
-
end
|
40
|
-
end
|
41
29
|
end
|
42
30
|
|
43
|
-
|
31
|
+
class Spec < Core::Transport::HTTP::API::Spec
|
44
32
|
attr_accessor :diagnostics
|
45
33
|
|
46
34
|
def send_diagnostics(env, &block)
|
47
|
-
raise
|
35
|
+
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('diagnostics', self) if diagnostics.nil?
|
48
36
|
|
49
37
|
diagnostics.call(env, &block)
|
50
38
|
end
|
51
|
-
|
52
|
-
class NoDiagnosticsEndpointDefinedError < StandardError
|
53
|
-
attr_reader :spec
|
54
|
-
|
55
|
-
def initialize(spec)
|
56
|
-
super
|
57
|
-
|
58
|
-
@spec = spec
|
59
|
-
end
|
60
|
-
|
61
|
-
def message
|
62
|
-
'No diagnostics endpoint is defined for API specification!'
|
63
|
-
end
|
64
|
-
end
|
65
39
|
end
|
66
40
|
|
67
|
-
# Endpoint for negotiation
|
68
41
|
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
69
42
|
attr_reader :encoder
|
70
43
|
|
@@ -79,7 +52,7 @@ module Datadog
|
|
79
52
|
)
|
80
53
|
env.form = {'event' => event_payload}
|
81
54
|
|
82
|
-
super
|
55
|
+
super
|
83
56
|
end
|
84
57
|
end
|
85
58
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../../../core/transport/http/api/instance'
|
4
|
+
require_relative '../../../core/transport/http/api/spec'
|
3
5
|
require_relative 'client'
|
4
6
|
|
5
7
|
module Datadog
|
@@ -16,55 +18,26 @@ module Datadog
|
|
16
18
|
end
|
17
19
|
|
18
20
|
module API
|
19
|
-
|
21
|
+
class Instance < Core::Transport::HTTP::API::Instance
|
20
22
|
def send_input(env)
|
21
|
-
raise
|
23
|
+
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('input', self) unless spec.is_a?(Input::API::Spec)
|
22
24
|
|
23
25
|
spec.send_input(env) do |request_env|
|
24
26
|
call(request_env)
|
25
27
|
end
|
26
28
|
end
|
27
|
-
|
28
|
-
class InputNotSupportedError < StandardError
|
29
|
-
attr_reader :spec
|
30
|
-
|
31
|
-
def initialize(spec)
|
32
|
-
super
|
33
|
-
|
34
|
-
@spec = spec
|
35
|
-
end
|
36
|
-
|
37
|
-
def message
|
38
|
-
'Input not supported for this API!'
|
39
|
-
end
|
40
|
-
end
|
41
29
|
end
|
42
30
|
|
43
|
-
|
31
|
+
class Spec < Core::Transport::HTTP::API::Spec
|
44
32
|
attr_accessor :input
|
45
33
|
|
46
34
|
def send_input(env, &block)
|
47
|
-
raise
|
35
|
+
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('input', self) if input.nil?
|
48
36
|
|
49
37
|
input.call(env, &block)
|
50
38
|
end
|
51
|
-
|
52
|
-
class NoInputEndpointDefinedError < StandardError
|
53
|
-
attr_reader :spec
|
54
|
-
|
55
|
-
def initialize(spec)
|
56
|
-
super
|
57
|
-
|
58
|
-
@spec = spec
|
59
|
-
end
|
60
|
-
|
61
|
-
def message
|
62
|
-
'No input endpoint is defined for API specification!'
|
63
|
-
end
|
64
|
-
end
|
65
39
|
end
|
66
40
|
|
67
|
-
# Endpoint for negotiation
|
68
41
|
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
69
42
|
HEADER_CONTENT_TYPE = 'Content-Type'
|
70
43
|
|
@@ -80,8 +53,18 @@ module Datadog
|
|
80
53
|
# Encode body & type
|
81
54
|
env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
|
82
55
|
env.body = env.request.parcel.data
|
83
|
-
|
84
|
-
|
56
|
+
env.query = {
|
57
|
+
# DEV: In theory we could serialize the tags here
|
58
|
+
# rather than requiring them to be pre-serialized.
|
59
|
+
# In practice the tags should be relatively static
|
60
|
+
# (they would change when process forks, and hostname
|
61
|
+
# could change at any time but probably we should ignore
|
62
|
+
# those changes), therefore serializing the tags
|
63
|
+
# every time would be wasteful.
|
64
|
+
ddtags: env.request.serialized_tags,
|
65
|
+
}
|
66
|
+
|
67
|
+
super
|
85
68
|
end
|
86
69
|
end
|
87
70
|
end
|
@@ -1,15 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'uri'
|
4
|
-
|
5
|
-
require_relative '../../core/environment/container'
|
6
|
-
require_relative '../../core/environment/ext'
|
7
|
-
require_relative '../../core/transport/ext'
|
8
3
|
require_relative 'diagnostics'
|
9
4
|
require_relative 'input'
|
10
5
|
require_relative 'http/api'
|
11
6
|
require_relative '../../core/transport/http'
|
12
|
-
require_relative '../../../datadog/version'
|
13
7
|
|
14
8
|
module Datadog
|
15
9
|
module DI
|
@@ -18,86 +12,44 @@ module Datadog
|
|
18
12
|
module HTTP
|
19
13
|
module_function
|
20
14
|
|
21
|
-
# Builds a new Transport::HTTP::Client
|
22
|
-
def new(klass, &block)
|
23
|
-
Core::Transport::HTTP.build(
|
24
|
-
api_instance_class: API::Instance, &block
|
25
|
-
).to_transport(klass)
|
26
|
-
end
|
27
|
-
|
28
15
|
# Builds a new Transport::HTTP::Client with default settings
|
29
16
|
# Pass a block to override any settings.
|
30
17
|
def diagnostics(
|
31
18
|
agent_settings:,
|
32
|
-
|
19
|
+
logger:,
|
20
|
+
api_version: nil,
|
21
|
+
headers: nil
|
33
22
|
)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
23
|
+
Core::Transport::HTTP.build(api_instance_class: Diagnostics::API::Instance,
|
24
|
+
logger: logger,
|
25
|
+
agent_settings: agent_settings, api_version: api_version, headers: headers) do |transport|
|
38
26
|
apis = API.defaults
|
39
27
|
|
40
28
|
transport.api API::DIAGNOSTICS, apis[API::DIAGNOSTICS]
|
41
29
|
|
42
|
-
# Apply any settings given by options
|
43
|
-
unless options.empty?
|
44
|
-
transport.default_api = options[:api_version] if options.key?(:api_version)
|
45
|
-
transport.headers options[:headers] if options.key?(:headers)
|
46
|
-
end
|
47
|
-
|
48
30
|
# Call block to apply any customization, if provided
|
49
31
|
yield(transport) if block_given?
|
50
|
-
end
|
32
|
+
end.to_transport(DI::Transport::Diagnostics::Transport)
|
51
33
|
end
|
52
34
|
|
53
35
|
# Builds a new Transport::HTTP::Client with default settings
|
54
36
|
# Pass a block to override any settings.
|
55
37
|
def input(
|
56
38
|
agent_settings:,
|
57
|
-
|
39
|
+
logger:,
|
40
|
+
api_version: nil,
|
41
|
+
headers: nil
|
58
42
|
)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
43
|
+
Core::Transport::HTTP.build(api_instance_class: Input::API::Instance,
|
44
|
+
logger: logger,
|
45
|
+
agent_settings: agent_settings, api_version: api_version, headers: headers) do |transport|
|
63
46
|
apis = API.defaults
|
64
47
|
|
65
48
|
transport.api API::INPUT, apis[API::INPUT]
|
66
49
|
|
67
|
-
# Apply any settings given by options
|
68
|
-
unless options.empty?
|
69
|
-
transport.default_api = options[:api_version] if options.key?(:api_version)
|
70
|
-
transport.headers options[:headers] if options.key?(:headers)
|
71
|
-
end
|
72
|
-
|
73
50
|
# Call block to apply any customization, if provided
|
74
51
|
yield(transport) if block_given?
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def default_headers
|
79
|
-
{
|
80
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
|
81
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
|
82
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
|
83
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
|
84
|
-
Datadog::Core::Environment::Ext::LANG_INTERPRETER,
|
85
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
|
86
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
|
87
|
-
Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
|
88
|
-
}.tap do |headers|
|
89
|
-
# Add container ID, if present.
|
90
|
-
container_id = Datadog::Core::Environment::Container.container_id
|
91
|
-
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
|
92
|
-
# Pretend that stats computation are already done by the client
|
93
|
-
if Datadog.configuration.appsec.standalone.enabled
|
94
|
-
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def default_adapter
|
100
|
-
Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
52
|
+
end.to_transport(DI::Transport::Input::Transport)
|
101
53
|
end
|
102
54
|
end
|
103
55
|
end
|