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
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require_relative '../core/environment/identity'
|
4
4
|
require_relative '../core/utils'
|
5
|
-
require_relative 'tracer'
|
6
5
|
require_relative 'event'
|
7
6
|
require_relative 'metadata/tagging'
|
8
7
|
require_relative 'sampling/ext'
|
@@ -37,9 +36,11 @@ module Datadog
|
|
37
36
|
:rule_sample_rate,
|
38
37
|
:sample_rate,
|
39
38
|
:sampling_priority,
|
40
|
-
:remote_parent
|
39
|
+
:remote_parent,
|
40
|
+
:baggage
|
41
41
|
|
42
42
|
attr_reader \
|
43
|
+
:logger,
|
43
44
|
:active_span_count,
|
44
45
|
:active_span,
|
45
46
|
:id,
|
@@ -55,6 +56,7 @@ module Datadog
|
|
55
56
|
:service
|
56
57
|
|
57
58
|
def initialize(
|
59
|
+
logger: Datadog.logger,
|
58
60
|
agent_sample_rate: nil,
|
59
61
|
events: nil,
|
60
62
|
hostname: nil,
|
@@ -71,19 +73,22 @@ module Datadog
|
|
71
73
|
sampling_priority: nil,
|
72
74
|
service: nil,
|
73
75
|
profiling_enabled: nil,
|
76
|
+
apm_tracing_enabled: nil,
|
74
77
|
tags: nil,
|
75
78
|
metrics: nil,
|
76
79
|
trace_state: nil,
|
77
80
|
trace_state_unknown_fields: nil,
|
78
81
|
remote_parent: false,
|
79
|
-
tracer: nil
|
80
|
-
|
82
|
+
tracer: nil, # DEV-3.0: deprecated, remove in 3.0
|
83
|
+
baggage: nil
|
81
84
|
)
|
85
|
+
@logger = logger
|
86
|
+
|
82
87
|
# Attributes
|
83
88
|
@id = id || Tracing::Utils::TraceId.next_id
|
84
89
|
@max_length = max_length || DEFAULT_MAX_LENGTH
|
85
90
|
@parent_span_id = parent_span_id
|
86
|
-
@sampled = sampled.nil?
|
91
|
+
@sampled = sampled.nil? || sampled
|
87
92
|
@remote_parent = remote_parent
|
88
93
|
|
89
94
|
# Tags
|
@@ -98,9 +103,10 @@ module Datadog
|
|
98
103
|
@sampling_priority = sampling_priority
|
99
104
|
@service = service
|
100
105
|
@profiling_enabled = profiling_enabled
|
106
|
+
@apm_tracing_enabled = apm_tracing_enabled
|
101
107
|
@trace_state = trace_state
|
102
108
|
@trace_state_unknown_fields = trace_state_unknown_fields
|
103
|
-
@
|
109
|
+
@baggage = baggage
|
104
110
|
|
105
111
|
# Generic tags
|
106
112
|
set_tags(tags) if tags
|
@@ -173,6 +179,12 @@ module Datadog
|
|
173
179
|
super || (root_span && root_span.get_metric(key))
|
174
180
|
end
|
175
181
|
|
182
|
+
def set_distributed_source(product_bit)
|
183
|
+
source = get_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16) || 0
|
184
|
+
source |= product_bit
|
185
|
+
set_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE, format('%02X', source))
|
186
|
+
end
|
187
|
+
|
176
188
|
def tags
|
177
189
|
all_tags = {}
|
178
190
|
all_tags.merge!(root_span&.tags || {}) if root_span
|
@@ -194,6 +206,7 @@ module Datadog
|
|
194
206
|
|
195
207
|
def measure(
|
196
208
|
op_name,
|
209
|
+
logger: Datadog.logger,
|
197
210
|
events: nil,
|
198
211
|
on_error: nil,
|
199
212
|
resource: nil,
|
@@ -207,7 +220,9 @@ module Datadog
|
|
207
220
|
# Don't allow more span measurements if the
|
208
221
|
# trace is already completed. Prevents multiple
|
209
222
|
# root spans with parent_span_id = 0.
|
210
|
-
return yield(
|
223
|
+
return yield( # rubocop:disable Style/MultilineIfModifier
|
224
|
+
SpanOperation.new(op_name, logger: logger),
|
225
|
+
TraceOperation.new(logger: logger)) if finished? || full?
|
211
226
|
|
212
227
|
# Create new span
|
213
228
|
span_op = build_span(
|
@@ -228,6 +243,7 @@ module Datadog
|
|
228
243
|
|
229
244
|
def build_span(
|
230
245
|
op_name,
|
246
|
+
logger: Datadog.logger,
|
231
247
|
events: nil,
|
232
248
|
on_error: nil,
|
233
249
|
resource: nil,
|
@@ -249,7 +265,7 @@ module Datadog
|
|
249
265
|
parent_id = parent ? parent.id : @parent_span_id || 0
|
250
266
|
|
251
267
|
# Build events
|
252
|
-
events ||= SpanOperation::Events.new
|
268
|
+
events ||= SpanOperation::Events.new(logger: logger)
|
253
269
|
|
254
270
|
# Before start: activate the span, publish events.
|
255
271
|
events.before_start.subscribe do |span_op|
|
@@ -264,6 +280,7 @@ module Datadog
|
|
264
280
|
# Build a new span operation
|
265
281
|
SpanOperation.new(
|
266
282
|
op_name,
|
283
|
+
logger: logger,
|
267
284
|
events: events,
|
268
285
|
on_error: on_error,
|
269
286
|
parent_id: parent_id,
|
@@ -276,10 +293,10 @@ module Datadog
|
|
276
293
|
id: id
|
277
294
|
)
|
278
295
|
rescue StandardError => e
|
279
|
-
|
296
|
+
logger.debug { "Failed to build new span: #{e}" }
|
280
297
|
|
281
298
|
# Return dummy span
|
282
|
-
SpanOperation.new(op_name)
|
299
|
+
SpanOperation.new(op_name, logger: logger)
|
283
300
|
end
|
284
301
|
end
|
285
302
|
|
@@ -311,14 +328,14 @@ module Datadog
|
|
311
328
|
span_id = @active_span && @active_span.id
|
312
329
|
span_id ||= @parent_span_id unless finished?
|
313
330
|
# sample the trace_operation with the tracer
|
314
|
-
|
331
|
+
events.trace_propagated.publish(self)
|
315
332
|
|
316
333
|
TraceDigest.new(
|
317
334
|
span_id: span_id,
|
318
|
-
span_name:
|
319
|
-
span_resource:
|
320
|
-
span_service:
|
321
|
-
span_type:
|
335
|
+
span_name: @active_span && @active_span.name,
|
336
|
+
span_resource: @active_span && @active_span.resource,
|
337
|
+
span_service: @active_span && @active_span.service,
|
338
|
+
span_type: @active_span && @active_span.type,
|
322
339
|
trace_distributed_tags: distributed_tags,
|
323
340
|
trace_hostname: @hostname,
|
324
341
|
trace_id: @id,
|
@@ -331,7 +348,8 @@ module Datadog
|
|
331
348
|
trace_service: service,
|
332
349
|
trace_state: @trace_state,
|
333
350
|
trace_state_unknown_fields: @trace_state_unknown_fields,
|
334
|
-
span_remote:
|
351
|
+
span_remote: @remote_parent && @active_span.nil?,
|
352
|
+
baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
|
335
353
|
).freeze
|
336
354
|
end
|
337
355
|
|
@@ -351,22 +369,22 @@ module Datadog
|
|
351
369
|
def fork_clone
|
352
370
|
self.class.new(
|
353
371
|
agent_sample_rate: @agent_sample_rate,
|
354
|
-
events:
|
355
|
-
hostname:
|
372
|
+
events: @events && @events.dup,
|
373
|
+
hostname: @hostname && @hostname.dup,
|
356
374
|
id: @id,
|
357
375
|
max_length: @max_length,
|
358
|
-
name:
|
359
|
-
origin:
|
376
|
+
name: name && name.dup,
|
377
|
+
origin: @origin && @origin.dup,
|
360
378
|
parent_span_id: (@active_span && @active_span.id) || @parent_span_id,
|
361
379
|
rate_limiter_rate: @rate_limiter_rate,
|
362
|
-
resource:
|
380
|
+
resource: resource && resource.dup,
|
363
381
|
rule_sample_rate: @rule_sample_rate,
|
364
382
|
sample_rate: @sample_rate,
|
365
383
|
sampled: @sampled,
|
366
384
|
sampling_priority: @sampling_priority,
|
367
|
-
service:
|
368
|
-
trace_state:
|
369
|
-
trace_state_unknown_fields:
|
385
|
+
service: service && service.dup,
|
386
|
+
trace_state: @trace_state && @trace_state.dup,
|
387
|
+
trace_state_unknown_fields: @trace_state_unknown_fields && @trace_state_unknown_fields.dup,
|
370
388
|
tags: meta.dup,
|
371
389
|
metrics: metrics.dup,
|
372
390
|
remote_parent: @remote_parent
|
@@ -380,12 +398,14 @@ module Datadog
|
|
380
398
|
attr_reader \
|
381
399
|
:span_before_start,
|
382
400
|
:span_finished,
|
383
|
-
:trace_finished
|
401
|
+
:trace_finished,
|
402
|
+
:trace_propagated
|
384
403
|
|
385
404
|
def initialize
|
386
405
|
@span_before_start = SpanBeforeStart.new
|
387
406
|
@span_finished = SpanFinished.new
|
388
407
|
@trace_finished = TraceFinished.new
|
408
|
+
@trace_propagated = TracePropagated.new
|
389
409
|
end
|
390
410
|
|
391
411
|
# Triggered before a span starts.
|
@@ -402,6 +422,13 @@ module Datadog
|
|
402
422
|
end
|
403
423
|
end
|
404
424
|
|
425
|
+
# Triggered when trace is being propagated between applications or contexts
|
426
|
+
class TracePropagated < Tracing::Event
|
427
|
+
def initialize
|
428
|
+
super(:trace_propagated)
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
405
432
|
# Triggered when the trace finishes, regardless of error.
|
406
433
|
class TraceFinished < Tracing::Event
|
407
434
|
def initialize
|
@@ -454,7 +481,7 @@ module Datadog
|
|
454
481
|
# Publish :span_before_start event
|
455
482
|
events.span_before_start.publish(span_op, self)
|
456
483
|
rescue StandardError => e
|
457
|
-
|
484
|
+
logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
458
485
|
end
|
459
486
|
end
|
460
487
|
|
@@ -478,7 +505,7 @@ module Datadog
|
|
478
505
|
# Publish :trace_finished event
|
479
506
|
events.trace_finished.publish(self) if finished?
|
480
507
|
rescue StandardError => e
|
481
|
-
|
508
|
+
logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
482
509
|
end
|
483
510
|
end
|
484
511
|
|
@@ -510,6 +537,7 @@ module Datadog
|
|
510
537
|
metrics: metrics,
|
511
538
|
root_span_id: !partial ? root_span && root_span.id : nil,
|
512
539
|
profiling_enabled: @profiling_enabled,
|
540
|
+
apm_tracing_enabled: @apm_tracing_enabled
|
513
541
|
)
|
514
542
|
end
|
515
543
|
|
@@ -34,7 +34,8 @@ module Datadog
|
|
34
34
|
:sampling_decision_maker,
|
35
35
|
:sampling_priority,
|
36
36
|
:service,
|
37
|
-
:profiling_enabled
|
37
|
+
:profiling_enabled,
|
38
|
+
:apm_tracing_enabled
|
38
39
|
|
39
40
|
# rubocop:disable Metrics/CyclomaticComplexity
|
40
41
|
# rubocop:disable Metrics/PerceivedComplexity
|
@@ -58,7 +59,8 @@ module Datadog
|
|
58
59
|
service: nil,
|
59
60
|
tags: nil,
|
60
61
|
metrics: nil,
|
61
|
-
profiling_enabled: nil
|
62
|
+
profiling_enabled: nil,
|
63
|
+
apm_tracing_enabled: nil
|
62
64
|
)
|
63
65
|
@id = id
|
64
66
|
@root_span_id = root_span_id
|
@@ -85,6 +87,7 @@ module Datadog
|
|
85
87
|
@sampling_priority = sampling_priority || sampling_priority_tag
|
86
88
|
@service = Core::Utils::SafeDup.frozen_or_dup(service || service_tag)
|
87
89
|
@profiling_enabled = profiling_enabled
|
90
|
+
@apm_tracing_enabled = apm_tracing_enabled
|
88
91
|
end
|
89
92
|
# rubocop:enable Metrics/PerceivedComplexity
|
90
93
|
# rubocop:enable Metrics/CyclomaticComplexity
|
@@ -128,8 +131,7 @@ module Datadog
|
|
128
131
|
end
|
129
132
|
|
130
133
|
def sampled?
|
131
|
-
|
132
|
-
|| sampling_priority == Sampling::Ext::Priority::USER_KEEP
|
134
|
+
[Sampling::Ext::Priority::AUTO_KEEP, Sampling::Ext::Priority::USER_KEEP].include?(sampling_priority)
|
133
135
|
end
|
134
136
|
|
135
137
|
# Returns the high order part of the trace id as a hexadecimal string; the most significant 64 bits.
|
@@ -273,7 +273,7 @@ module Datadog
|
|
273
273
|
# Sample a span, tagging the trace as appropriate.
|
274
274
|
def sample_trace(trace_op)
|
275
275
|
begin
|
276
|
-
@sampler.sample!(trace_op)
|
276
|
+
@sampler.sample!(trace_op) if trace_op.sampling_priority.nil?
|
277
277
|
rescue StandardError => e
|
278
278
|
SAMPLE_TRACE_LOG_ONLY_ONCE.run do
|
279
279
|
logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
|
@@ -338,24 +338,32 @@ module Datadog
|
|
338
338
|
hostname = hostname && !hostname.empty? ? hostname : nil
|
339
339
|
|
340
340
|
if digest
|
341
|
+
sampling_priority = if propagate_sampling_priority?(upstream_tags: digest.trace_distributed_tags)
|
342
|
+
digest.trace_sampling_priority
|
343
|
+
end
|
341
344
|
TraceOperation.new(
|
345
|
+
logger: logger,
|
342
346
|
hostname: hostname,
|
343
347
|
profiling_enabled: profiling_enabled,
|
348
|
+
apm_tracing_enabled: apm_tracing_enabled,
|
344
349
|
id: digest.trace_id,
|
345
350
|
origin: digest.trace_origin,
|
346
351
|
parent_span_id: digest.span_id,
|
347
|
-
sampling_priority:
|
352
|
+
sampling_priority: sampling_priority,
|
348
353
|
# Distributed tags are just regular trace tags with special meaning to Datadog
|
349
354
|
tags: digest.trace_distributed_tags,
|
350
355
|
trace_state: digest.trace_state,
|
351
356
|
trace_state_unknown_fields: digest.trace_state_unknown_fields,
|
352
357
|
remote_parent: digest.span_remote,
|
353
|
-
tracer: self
|
358
|
+
tracer: self,
|
359
|
+
baggage: digest.baggage
|
354
360
|
)
|
355
361
|
else
|
356
362
|
TraceOperation.new(
|
363
|
+
logger: logger,
|
357
364
|
hostname: hostname,
|
358
365
|
profiling_enabled: profiling_enabled,
|
366
|
+
apm_tracing_enabled: apm_tracing_enabled,
|
359
367
|
remote_parent: false,
|
360
368
|
tracer: self
|
361
369
|
)
|
@@ -370,7 +378,12 @@ module Datadog
|
|
370
378
|
event_span_op.service ||= @default_service
|
371
379
|
end
|
372
380
|
|
381
|
+
events.trace_propagated.subscribe do |event_trace_op|
|
382
|
+
sample_trace(event_trace_op)
|
383
|
+
end
|
384
|
+
|
373
385
|
events.span_finished.subscribe do |event_span, event_trace_op|
|
386
|
+
sample_trace(trace_op) if event_trace_op.sampling_priority.nil?
|
374
387
|
sample_span(event_trace_op, event_span)
|
375
388
|
flush_trace(event_trace_op)
|
376
389
|
end
|
@@ -404,12 +417,13 @@ module Datadog
|
|
404
417
|
)
|
405
418
|
trace = _trace || start_trace(continue_from: continue_from)
|
406
419
|
|
407
|
-
events = SpanOperation::Events.new
|
420
|
+
events = SpanOperation::Events.new(logger: logger)
|
408
421
|
|
409
422
|
if block
|
410
423
|
# Ignore start time if a block has been given
|
411
424
|
trace.measure(
|
412
425
|
name,
|
426
|
+
logger: logger,
|
413
427
|
events: events,
|
414
428
|
on_error: on_error,
|
415
429
|
resource: resource,
|
@@ -423,6 +437,7 @@ module Datadog
|
|
423
437
|
# Return the new span
|
424
438
|
span = trace.build_span(
|
425
439
|
name,
|
440
|
+
logger: logger,
|
426
441
|
events: events,
|
427
442
|
on_error: on_error,
|
428
443
|
resource: resource,
|
@@ -506,7 +521,6 @@ module Datadog
|
|
506
521
|
|
507
522
|
# Flush finished spans from the trace buffer, send them to writer.
|
508
523
|
def flush_trace(trace_op)
|
509
|
-
sample_trace(trace_op) unless trace_op.sampling_priority
|
510
524
|
begin
|
511
525
|
trace = @trace_flush.consume!(trace_op)
|
512
526
|
write(trace) if trace && !trace.empty?
|
@@ -535,20 +549,50 @@ module Datadog
|
|
535
549
|
|
536
550
|
# TODO: Make these dummy objects singletons to preserve memory.
|
537
551
|
def skip_trace(name)
|
538
|
-
span = SpanOperation.new(name)
|
552
|
+
span = SpanOperation.new(name, logger: logger)
|
539
553
|
|
540
554
|
if block_given?
|
541
|
-
trace = TraceOperation.new
|
555
|
+
trace = TraceOperation.new(logger: logger)
|
542
556
|
yield(span, trace)
|
543
557
|
else
|
544
558
|
span
|
545
559
|
end
|
546
560
|
end
|
547
561
|
|
562
|
+
# Decide whether upstream sampling priority should be propagated, by taking into account
|
563
|
+
# the upstream tags and the configuration.
|
564
|
+
# We should always propagate if APM is enabled.
|
565
|
+
#
|
566
|
+
# e.g.: upstream tags containing dd.p.ts: 02, and appsec is enabled, return true.
|
567
|
+
def propagate_sampling_priority?(upstream_tags:)
|
568
|
+
return true if apm_tracing_enabled
|
569
|
+
|
570
|
+
if upstream_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)
|
571
|
+
appsec_bit = upstream_tags[Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE].to_i(16) &
|
572
|
+
Datadog::AppSec::Ext::PRODUCT_BIT
|
573
|
+
return appsec_enabled if appsec_bit != 0
|
574
|
+
end
|
575
|
+
|
576
|
+
false
|
577
|
+
end
|
578
|
+
|
548
579
|
def profiling_enabled
|
549
580
|
@profiling_enabled ||=
|
550
581
|
!!(defined?(Datadog::Profiling) && Datadog::Profiling.respond_to?(:enabled?) && Datadog::Profiling.enabled?)
|
551
582
|
end
|
583
|
+
|
584
|
+
def appsec_enabled
|
585
|
+
@appsec_enabled ||= Datadog.configuration.appsec.enabled
|
586
|
+
end
|
587
|
+
|
588
|
+
# Due to APM Tracing (the product) and Tracing (the transport) being intertwined, we cannot completely disabled APM
|
589
|
+
# without also disabling the tracer. When setting `@apm_tracing_enabled` to `false`, it does not disable the tracer,
|
590
|
+
# but rather only sends heartbeat traces (1 per minutes), so that the service is considered alive in the backend.
|
591
|
+
# Other products (like ASM) can then set the sampling priority of their traces to `MANUAL_KEEP`,
|
592
|
+
# effectively allowing standalone products to work without APM.
|
593
|
+
def apm_tracing_enabled
|
594
|
+
@apm_tracing_enabled ||= Datadog.configuration.apm.tracing.enabled
|
595
|
+
end
|
552
596
|
end
|
553
597
|
end
|
554
598
|
end
|
@@ -22,14 +22,14 @@ module Datadog
|
|
22
22
|
|
23
23
|
def defaults
|
24
24
|
Core::Transport::HTTP::API::Map[
|
25
|
-
V4 => Spec.new do |s|
|
25
|
+
V4 => Traces::API::Spec.new do |s|
|
26
26
|
s.traces = Traces::API::Endpoint.new(
|
27
27
|
'/v0.4/traces',
|
28
28
|
Core::Encoding::MsgpackEncoder,
|
29
29
|
service_rates: true
|
30
30
|
)
|
31
31
|
end,
|
32
|
-
V3 => Spec.new do |s|
|
32
|
+
V3 => Traces::API::Spec.new do |s|
|
33
33
|
s.traces = Traces::API::Endpoint.new(
|
34
34
|
'/v0.3/traces',
|
35
35
|
Core::Encoding::MsgpackEncoder
|
@@ -37,14 +37,6 @@ module Datadog
|
|
37
37
|
end,
|
38
38
|
].with_fallbacks(V4 => V3)
|
39
39
|
end
|
40
|
-
|
41
|
-
class Instance < Core::Transport::HTTP::API::Instance
|
42
|
-
include Traces::API::Instance
|
43
|
-
end
|
44
|
-
|
45
|
-
class Spec < Core::Transport::HTTP::API::Spec
|
46
|
-
include Traces::API::Spec
|
47
|
-
end
|
48
40
|
end
|
49
41
|
end
|
50
42
|
end
|
@@ -12,10 +12,11 @@ module Datadog
|
|
12
12
|
class Client
|
13
13
|
include Datadog::Tracing::Transport::HTTP::Statistics
|
14
14
|
|
15
|
-
attr_reader :api
|
15
|
+
attr_reader :api, :logger
|
16
16
|
|
17
|
-
def initialize(api)
|
17
|
+
def initialize(api, logger: Datadog.logger)
|
18
18
|
@api = api
|
19
|
+
@logger = logger
|
19
20
|
end
|
20
21
|
|
21
22
|
def send_request(request, &block)
|
@@ -36,10 +37,10 @@ module Datadog
|
|
36
37
|
|
37
38
|
# Log error
|
38
39
|
if stats.consecutive_errors > 0
|
39
|
-
|
40
|
+
logger.debug(message)
|
40
41
|
else
|
41
42
|
# Not to report telemetry logs
|
42
|
-
|
43
|
+
logger.error(message)
|
43
44
|
end
|
44
45
|
|
45
46
|
# Update statistics
|
@@ -6,6 +6,8 @@ require_relative '../traces'
|
|
6
6
|
require_relative 'client'
|
7
7
|
require_relative '../../../core/transport/http/response'
|
8
8
|
require_relative '../../../core/transport/http/api/endpoint'
|
9
|
+
require_relative '../../../core/transport/http/api/spec'
|
10
|
+
require_relative '../../../core/transport/http/api/instance'
|
9
11
|
|
10
12
|
module Datadog
|
11
13
|
module Tracing
|
@@ -35,16 +37,12 @@ module Datadog
|
|
35
37
|
end
|
36
38
|
|
37
39
|
module API
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
def traces=(endpoint)
|
43
|
-
@traces = endpoint
|
44
|
-
end
|
40
|
+
# HTTP API Spec
|
41
|
+
class Spec < Core::Transport::HTTP::API::Spec
|
42
|
+
attr_accessor :traces
|
45
43
|
|
46
44
|
def send_traces(env, &block)
|
47
|
-
raise
|
45
|
+
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
|
48
46
|
|
49
47
|
traces.call(env, &block)
|
50
48
|
end
|
@@ -52,47 +50,21 @@ module Datadog
|
|
52
50
|
def encoder
|
53
51
|
traces.encoder
|
54
52
|
end
|
55
|
-
|
56
|
-
# Raised when traces sent but no traces endpoint is defined
|
57
|
-
class NoTraceEndpointDefinedError < StandardError
|
58
|
-
attr_reader :spec
|
59
|
-
|
60
|
-
def initialize(spec)
|
61
|
-
super
|
62
|
-
|
63
|
-
@spec = spec
|
64
|
-
end
|
65
|
-
|
66
|
-
def message
|
67
|
-
'No trace endpoint is defined for API specification!'
|
68
|
-
end
|
69
|
-
end
|
70
53
|
end
|
71
54
|
|
72
|
-
#
|
73
|
-
|
55
|
+
# HTTP API Instance
|
56
|
+
class Instance < Core::Transport::HTTP::API::Instance
|
74
57
|
def send_traces(env)
|
75
|
-
|
58
|
+
unless spec.is_a?(Traces::API::Spec)
|
59
|
+
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
|
60
|
+
'traces', self
|
61
|
+
)
|
62
|
+
end
|
76
63
|
|
77
64
|
spec.send_traces(env) do |request_env|
|
78
65
|
call(request_env)
|
79
66
|
end
|
80
67
|
end
|
81
|
-
|
82
|
-
# Raised when traces sent to API that does not support traces
|
83
|
-
class TracesNotSupportedError < StandardError
|
84
|
-
attr_reader :spec
|
85
|
-
|
86
|
-
def initialize(spec)
|
87
|
-
super
|
88
|
-
|
89
|
-
@spec = spec
|
90
|
-
end
|
91
|
-
|
92
|
-
def message
|
93
|
-
'Traces not supported for this API!'
|
94
|
-
end
|
95
|
-
end
|
96
68
|
end
|
97
69
|
|
98
70
|
# Endpoint for submitting trace data
|
@@ -14,62 +14,29 @@ module Datadog
|
|
14
14
|
module HTTP
|
15
15
|
module_function
|
16
16
|
|
17
|
-
# Builds a new Transport::HTTP::Client
|
18
|
-
def new(klass, &block)
|
19
|
-
Core::Transport::HTTP.build(
|
20
|
-
api_instance_class: API::Instance, &block
|
21
|
-
).to_transport(klass)
|
22
|
-
end
|
23
|
-
|
24
17
|
# Builds a new Transport::HTTP::Client with default settings
|
25
18
|
# Pass a block to override any settings.
|
26
19
|
def default(
|
27
20
|
agent_settings:,
|
28
|
-
|
21
|
+
logger: Datadog.logger,
|
22
|
+
api_version: nil,
|
23
|
+
headers: nil
|
29
24
|
)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
Core::Transport::HTTP.build(
|
26
|
+
api_instance_class: Traces::API::Instance,
|
27
|
+
agent_settings: agent_settings,
|
28
|
+
logger: logger,
|
29
|
+
api_version: api_version,
|
30
|
+
headers: headers
|
31
|
+
) do |transport|
|
34
32
|
apis = API.defaults
|
35
33
|
|
36
34
|
transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
|
37
35
|
transport.api API::V3, apis[API::V3]
|
38
36
|
|
39
|
-
# Apply any settings given by options
|
40
|
-
unless options.empty?
|
41
|
-
transport.default_api = options[:api_version] if options.key?(:api_version)
|
42
|
-
transport.headers options[:headers] if options.key?(:headers)
|
43
|
-
end
|
44
|
-
|
45
37
|
# Call block to apply any customization, if provided
|
46
38
|
yield(transport) if block_given?
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def default_headers
|
51
|
-
{
|
52
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
|
53
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
|
54
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
|
55
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
|
56
|
-
Datadog::Core::Environment::Ext::LANG_INTERPRETER,
|
57
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
|
58
|
-
Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
|
59
|
-
Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
|
60
|
-
}.tap do |headers|
|
61
|
-
# Add container ID, if present.
|
62
|
-
container_id = Datadog::Core::Environment::Container.container_id
|
63
|
-
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
|
64
|
-
# Pretend that stats computation are already done by the client
|
65
|
-
if Datadog.configuration.appsec.standalone.enabled
|
66
|
-
headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def default_adapter
|
72
|
-
Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
39
|
+
end.to_transport(Transport::Traces::Transport)
|
73
40
|
end
|
74
41
|
end
|
75
42
|
end
|
@@ -69,7 +69,7 @@ module Datadog
|
|
69
69
|
def to_msgpack(packer = nil)
|
70
70
|
packer ||= MessagePack::Packer.new
|
71
71
|
|
72
|
-
number_of_elements_to_write =
|
72
|
+
number_of_elements_to_write = 12
|
73
73
|
|
74
74
|
number_of_elements_to_write += 1 if span.events.any? && @native_events_supported
|
75
75
|
|
@@ -117,6 +117,8 @@ module Datadog
|
|
117
117
|
packer.write(span.meta)
|
118
118
|
packer.write('metrics')
|
119
119
|
packer.write(span.metrics)
|
120
|
+
packer.write('meta_struct')
|
121
|
+
packer.write(span.metastruct)
|
120
122
|
packer.write('span_links')
|
121
123
|
packer.write(span.links.map(&:to_hash))
|
122
124
|
packer.write('error')
|
@@ -59,6 +59,7 @@ module Datadog
|
|
59
59
|
tag_high_order_trace_id!
|
60
60
|
tag_sampling_priority!
|
61
61
|
tag_profiling_enabled!
|
62
|
+
tag_apm_tracing_disabled!
|
62
63
|
|
63
64
|
if first_span
|
64
65
|
tag_git_repository_url!
|
@@ -196,6 +197,12 @@ module Datadog
|
|
196
197
|
)
|
197
198
|
end
|
198
199
|
|
200
|
+
def tag_apm_tracing_disabled!
|
201
|
+
return if trace.apm_tracing_enabled
|
202
|
+
|
203
|
+
root_span.set_tag(Tracing::Metadata::Ext::TAG_APM_ENABLED, 0)
|
204
|
+
end
|
205
|
+
|
199
206
|
def tag_git_repository_url!
|
200
207
|
return if git_repository_url.nil?
|
201
208
|
|