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
@@ -19,23 +19,143 @@ module Datadog
|
|
19
19
|
# @return [Integer]
|
20
20
|
attr_reader :time_unix_nano
|
21
21
|
|
22
|
+
# TODO: Accept {Time} as the time_unix_nano parameter, possibly in addition to the current nano integer.
|
22
23
|
def initialize(
|
23
24
|
name,
|
24
25
|
attributes: nil,
|
25
26
|
time_unix_nano: nil
|
26
27
|
)
|
27
28
|
@name = name
|
28
|
-
|
29
|
+
|
30
|
+
@attributes = attributes.dup || {}
|
31
|
+
validate_attributes!(@attributes)
|
32
|
+
@attributes.transform_keys!(&:to_s)
|
33
|
+
|
29
34
|
# OpenTelemetry SDK stores span event timestamps in nanoseconds (not seconds).
|
30
35
|
# We will do the same here to avoid unnecessary conversions and inconsistencies.
|
31
|
-
@time_unix_nano = time_unix_nano || (Time.now.to_r * 1_000_000_000).to_i
|
36
|
+
@time_unix_nano = time_unix_nano || (Core::Utils::Time.now.to_r * 1_000_000_000).to_i
|
32
37
|
end
|
33
38
|
|
39
|
+
# Converts the span event into a hash to be used by with the span tag serialization
|
40
|
+
# (`span.set_tag('events) = [event.to_hash]`). This serialization format has the drawback
|
41
|
+
# of being limiting span events to the size limit of a span tag.
|
42
|
+
# All Datadog agents support this format.
|
34
43
|
def to_hash
|
35
|
-
h = { name
|
36
|
-
h[
|
44
|
+
h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
|
45
|
+
h['attributes'] = @attributes unless @attributes.empty?
|
46
|
+
h
|
47
|
+
end
|
48
|
+
|
49
|
+
# Converts the span event into a hash to be used by the MessagePack serialization as a
|
50
|
+
# top-level span field (span.span_events = [event.to_native_format]).
|
51
|
+
# This serialization format removes the serialization limitations of the `span.set_tag('events)` approach,
|
52
|
+
# but is only supported by newer version of the Datadog agent.
|
53
|
+
def to_native_format
|
54
|
+
h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
|
55
|
+
|
56
|
+
attr = {}
|
57
|
+
@attributes.each do |key, value|
|
58
|
+
attr[key] = if value.is_a?(Array)
|
59
|
+
{ type: ARRAY_TYPE, array_value: value.map { |v| serialize_native_attribute(v) } }
|
60
|
+
else
|
61
|
+
serialize_native_attribute(value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
h['attributes'] = attr unless @attributes.empty?
|
66
|
+
|
37
67
|
h
|
38
68
|
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
MIN_INT64_SIGNED = -2**63
|
73
|
+
MAX_INT64_SIGNED = 2 << 63 - 1
|
74
|
+
|
75
|
+
# Checks the attributes hash to ensure it only contains serializable values.
|
76
|
+
# Invalid values are removed from the hash.
|
77
|
+
def validate_attributes!(attributes)
|
78
|
+
attributes.select! do |key, value|
|
79
|
+
case value
|
80
|
+
when Array
|
81
|
+
next true if value.empty?
|
82
|
+
|
83
|
+
first = value.first
|
84
|
+
case first
|
85
|
+
when String, Integer, Float
|
86
|
+
first_type = first.class
|
87
|
+
if value.all? { |v| v.is_a?(first_type) }
|
88
|
+
value.all? { |v| validate_scalar_attribute!(key, v) }
|
89
|
+
else
|
90
|
+
Datadog.logger.warn("Attribute #{key} array must be homogenous: #{value}.")
|
91
|
+
false
|
92
|
+
end
|
93
|
+
when TrueClass, FalseClass
|
94
|
+
if value.all? { |v| v.is_a?(TrueClass) || v.is_a?(FalseClass) }
|
95
|
+
value.all? { |v| validate_scalar_attribute!(key, v) }
|
96
|
+
else
|
97
|
+
Datadog.logger.warn("Attribute #{key} array must be homogenous: #{value}.")
|
98
|
+
false
|
99
|
+
end
|
100
|
+
else
|
101
|
+
Datadog.logger.warn("Attribute #{key} must be a string, number, or boolean: #{value}.")
|
102
|
+
false
|
103
|
+
end
|
104
|
+
when String, Numeric, TrueClass, FalseClass
|
105
|
+
validate_scalar_attribute!(key, value)
|
106
|
+
else
|
107
|
+
Datadog.logger.warn("Attribute #{key} must be a string, number, boolean, or array: #{value}.")
|
108
|
+
false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def validate_scalar_attribute!(key, value)
|
114
|
+
case value
|
115
|
+
when String, TrueClass, FalseClass
|
116
|
+
true
|
117
|
+
when Integer
|
118
|
+
# Cannot be larger than signed 64-bit integer
|
119
|
+
if value < MIN_INT64_SIGNED || value > MAX_INT64_SIGNED
|
120
|
+
Datadog.logger.warn("Attribute #{key} must be within the range of a signed 64-bit integer: #{value}.")
|
121
|
+
false
|
122
|
+
else
|
123
|
+
true
|
124
|
+
end
|
125
|
+
when Float
|
126
|
+
# Has to be finite
|
127
|
+
return true if value.finite?
|
128
|
+
|
129
|
+
Datadog.logger.warn("Attribute #{key} must be a finite number: #{value}.")
|
130
|
+
false
|
131
|
+
else
|
132
|
+
Datadog.logger.warn("Attribute #{key} must be a string, number, or boolean: #{value}.")
|
133
|
+
false
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
STRING_TYPE = 0
|
138
|
+
BOOLEAN_TYPE = 1
|
139
|
+
INTEGER_TYPE = 2
|
140
|
+
DOUBLE_TYPE = 3
|
141
|
+
ARRAY_TYPE = 4
|
142
|
+
|
143
|
+
# Serializes individual scalar attributes into the native format.
|
144
|
+
def serialize_native_attribute(value)
|
145
|
+
case value
|
146
|
+
when String
|
147
|
+
{ type: STRING_TYPE, string_value: value }
|
148
|
+
when TrueClass, FalseClass
|
149
|
+
{ type: BOOLEAN_TYPE, bool_value: value }
|
150
|
+
when Integer
|
151
|
+
{ type: INTEGER_TYPE, int_value: value }
|
152
|
+
when Float
|
153
|
+
{ type: DOUBLE_TYPE, double_value: value }
|
154
|
+
else
|
155
|
+
# This is technically unreachable due to the validation in #initialize.
|
156
|
+
raise ArgumentError, "Attribute must be a string, number, or boolean: #{value}."
|
157
|
+
end
|
158
|
+
end
|
39
159
|
end
|
40
160
|
end
|
41
161
|
end
|
@@ -11,6 +11,8 @@ require_relative 'event'
|
|
11
11
|
require_relative 'metadata'
|
12
12
|
require_relative 'metadata/ext'
|
13
13
|
require_relative 'span'
|
14
|
+
require_relative 'span_event'
|
15
|
+
require_relative 'span_link'
|
14
16
|
require_relative 'utils'
|
15
17
|
|
16
18
|
module Datadog
|
@@ -26,6 +28,7 @@ module Datadog
|
|
26
28
|
# Span attributes
|
27
29
|
# NOTE: In the future, we should drop the me
|
28
30
|
attr_reader \
|
31
|
+
:logger,
|
29
32
|
:end_time,
|
30
33
|
:id,
|
31
34
|
:name,
|
@@ -35,10 +38,12 @@ module Datadog
|
|
35
38
|
:start_time,
|
36
39
|
:trace_id,
|
37
40
|
:type
|
41
|
+
|
38
42
|
attr_accessor :links, :status, :span_events
|
39
43
|
|
40
44
|
def initialize(
|
41
45
|
name,
|
46
|
+
logger: Datadog.logger,
|
42
47
|
events: nil,
|
43
48
|
on_error: nil,
|
44
49
|
parent_id: 0,
|
@@ -52,6 +57,8 @@ module Datadog
|
|
52
57
|
span_events: nil,
|
53
58
|
id: nil
|
54
59
|
)
|
60
|
+
@logger = logger
|
61
|
+
|
55
62
|
# Ensure dynamically created strings are UTF-8 encoded.
|
56
63
|
#
|
57
64
|
# All strings created in Ruby land are UTF-8. The only sources of non-UTF-8 string are:
|
@@ -88,11 +95,17 @@ module Datadog
|
|
88
95
|
set_tags(tags) if tags
|
89
96
|
|
90
97
|
# Some other SpanOperation-specific behavior
|
91
|
-
@events = events || Events.new
|
98
|
+
@events = events || Events.new(logger: logger)
|
92
99
|
@span = nil
|
93
100
|
|
94
|
-
|
95
|
-
|
101
|
+
if on_error.nil?
|
102
|
+
# Nothing, default error handler is already set up.
|
103
|
+
elsif on_error.is_a?(Proc)
|
104
|
+
# Subscribe :on_error event
|
105
|
+
@events.on_error.wrap_default(&on_error)
|
106
|
+
else
|
107
|
+
logger.warn("on_error argument to SpanOperation ignored because is not a Proc: #{on_error}")
|
108
|
+
end
|
96
109
|
|
97
110
|
# Start the span with start time, if given.
|
98
111
|
start(start_time) if start_time
|
@@ -128,6 +141,10 @@ module Datadog
|
|
128
141
|
@resource = resource.nil? ? nil : Core::Utils.utf8_encode(resource) # Allow this to be explicitly set to nil
|
129
142
|
end
|
130
143
|
|
144
|
+
def get_collector_or_initialize
|
145
|
+
@collector ||= yield
|
146
|
+
end
|
147
|
+
|
131
148
|
def measure
|
132
149
|
raise ArgumentError, 'Must provide block to measure!' unless block_given?
|
133
150
|
# TODO: Should we just invoke the block and skip tracing instead?
|
@@ -141,7 +158,7 @@ module Datadog
|
|
141
158
|
begin
|
142
159
|
start
|
143
160
|
rescue StandardError => e
|
144
|
-
|
161
|
+
logger.debug { "Failed to start span: #{e}" }
|
145
162
|
ensure
|
146
163
|
# We should yield to the provided block when possible, as this
|
147
164
|
# block is application code that we don't want to hinder.
|
@@ -159,7 +176,7 @@ module Datadog
|
|
159
176
|
# Stop the span first, so timing is a more accurate.
|
160
177
|
# If the span failed to start, timing may be inaccurate,
|
161
178
|
# but this is not really a serious concern.
|
162
|
-
stop
|
179
|
+
stop(exception: e)
|
163
180
|
|
164
181
|
# Trigger the on_error event
|
165
182
|
events.on_error.publish(self, e)
|
@@ -197,7 +214,10 @@ module Datadog
|
|
197
214
|
end
|
198
215
|
|
199
216
|
# Mark the span stopped at the current time
|
200
|
-
|
217
|
+
#
|
218
|
+
# steep:ignore:start
|
219
|
+
# Steep issue fixed in https://github.com/soutaro/steep/pull/1467
|
220
|
+
def stop(stop_time = nil, exception: nil)
|
201
221
|
# A span should not be stopped twice. Note that this is not thread-safe,
|
202
222
|
# stop is called from multiple threads, a given span might be stopped
|
203
223
|
# several times. Again, one should not do this, so this test is more a
|
@@ -215,10 +235,11 @@ module Datadog
|
|
215
235
|
@duration_end = stop_time.nil? ? duration_marker : nil
|
216
236
|
|
217
237
|
# Trigger after_stop event
|
218
|
-
events.after_stop.publish(self)
|
238
|
+
events.after_stop.publish(self, exception)
|
219
239
|
|
220
240
|
self
|
221
241
|
end
|
242
|
+
# steep:ignore:end
|
222
243
|
|
223
244
|
# Return whether the duration is started or not
|
224
245
|
def started?
|
@@ -230,6 +251,10 @@ module Datadog
|
|
230
251
|
!@end_time.nil?
|
231
252
|
end
|
232
253
|
|
254
|
+
def root?
|
255
|
+
parent_id == 0
|
256
|
+
end
|
257
|
+
|
233
258
|
# for backwards compatibility
|
234
259
|
def start_time=(time)
|
235
260
|
time.tap { start(time) }
|
@@ -263,7 +288,8 @@ module Datadog
|
|
263
288
|
|
264
289
|
def duration
|
265
290
|
return @duration_end - @duration_start if @duration_start && @duration_end
|
266
|
-
|
291
|
+
|
292
|
+
@end_time - @start_time if @start_time && @end_time
|
267
293
|
end
|
268
294
|
|
269
295
|
def set_error(e)
|
@@ -283,6 +309,7 @@ module Datadog
|
|
283
309
|
id: @id,
|
284
310
|
meta: meta,
|
285
311
|
metrics: metrics,
|
312
|
+
metastruct: metastruct,
|
286
313
|
name: @name,
|
287
314
|
parent_id: @parent_id,
|
288
315
|
resource: @resource,
|
@@ -322,12 +349,15 @@ module Datadog
|
|
322
349
|
q.text "#{key} => #{value}"
|
323
350
|
end
|
324
351
|
end
|
325
|
-
q.group(2, 'Metrics: [',
|
352
|
+
q.group(2, 'Metrics: [', "]\n") do
|
326
353
|
q.breakable
|
327
354
|
q.seplist metrics.each do |key, value|
|
328
355
|
q.text "#{key} => #{value}"
|
329
356
|
end
|
330
357
|
end
|
358
|
+
q.group(2, 'Metastruct: [', ']') do
|
359
|
+
metastruct.pretty_print(q)
|
360
|
+
end
|
331
361
|
end
|
332
362
|
end
|
333
363
|
|
@@ -338,11 +368,13 @@ module Datadog
|
|
338
368
|
DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
|
339
369
|
|
340
370
|
attr_reader \
|
371
|
+
:logger,
|
341
372
|
:after_finish,
|
342
373
|
:after_stop,
|
343
374
|
:before_start
|
344
375
|
|
345
|
-
def initialize(on_error: nil)
|
376
|
+
def initialize(logger: Datadog.logger, on_error: nil)
|
377
|
+
@logger = logger
|
346
378
|
@after_finish = AfterFinish.new
|
347
379
|
@after_stop = AfterStop.new
|
348
380
|
@before_start = BeforeStart.new
|
@@ -351,7 +383,7 @@ module Datadog
|
|
351
383
|
# This event is lazily initialized as error paths
|
352
384
|
# are normally less common that non-error paths.
|
353
385
|
def on_error
|
354
|
-
@on_error ||= OnError.new(DEFAULT_ON_ERROR)
|
386
|
+
@on_error ||= OnError.new(DEFAULT_ON_ERROR, logger: logger)
|
355
387
|
end
|
356
388
|
|
357
389
|
# Triggered when the span is finished, regardless of error.
|
@@ -377,10 +409,13 @@ module Datadog
|
|
377
409
|
|
378
410
|
# Triggered when the span raises an error during measurement.
|
379
411
|
class OnError
|
380
|
-
def initialize(default)
|
412
|
+
def initialize(default, logger: Datadog.logger)
|
381
413
|
@handler = default
|
414
|
+
@logger = logger
|
382
415
|
end
|
383
416
|
|
417
|
+
attr_reader :logger
|
418
|
+
|
384
419
|
# Call custom error handler but fallback to default behavior on failure.
|
385
420
|
|
386
421
|
# DEV: Revisit this before full 1.0 release.
|
@@ -394,9 +429,9 @@ module Datadog
|
|
394
429
|
begin
|
395
430
|
yield(op, error)
|
396
431
|
rescue StandardError => e
|
397
|
-
|
432
|
+
logger.debug do
|
398
433
|
"Custom on_error handler #{@handler} failed, using fallback behavior. \
|
399
|
-
Cause: #{e.class
|
434
|
+
Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
|
400
435
|
end
|
401
436
|
|
402
437
|
original.call(op, error) if original
|
@@ -408,8 +443,8 @@ module Datadog
|
|
408
443
|
begin
|
409
444
|
@handler.call(*args)
|
410
445
|
rescue StandardError => e
|
411
|
-
|
412
|
-
"Error in on_error handler '#{@default}': #{e.class
|
446
|
+
logger.debug do
|
447
|
+
"Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
|
413
448
|
end
|
414
449
|
end
|
415
450
|
|
@@ -450,6 +485,7 @@ module Datadog
|
|
450
485
|
id: @id,
|
451
486
|
meta: Core::Utils::SafeDup.frozen_or_dup(meta),
|
452
487
|
metrics: Core::Utils::SafeDup.frozen_or_dup(metrics),
|
488
|
+
metastruct: Core::Utils::SafeDup.frozen_or_dup(metastruct),
|
453
489
|
parent_id: @parent_id,
|
454
490
|
resource: @resource,
|
455
491
|
service: @service,
|
@@ -17,18 +17,22 @@ module Datadog
|
|
17
17
|
# @public_api
|
18
18
|
class SyncWriter
|
19
19
|
attr_reader \
|
20
|
+
:logger,
|
20
21
|
:events,
|
21
|
-
:transport
|
22
|
+
:transport,
|
23
|
+
:agent_settings
|
22
24
|
|
23
25
|
# @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
|
24
26
|
# If provided, overrides `transport_options` and `agent_settings`.
|
25
27
|
# @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
|
26
28
|
# @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
|
27
29
|
# the default transport instance.
|
28
|
-
def initialize(transport: nil, transport_options: {}, agent_settings: nil)
|
30
|
+
def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
|
31
|
+
@logger = logger
|
32
|
+
@agent_settings = agent_settings
|
33
|
+
|
29
34
|
@transport = transport || begin
|
30
|
-
|
31
|
-
Transport::HTTP.default(**transport_options)
|
35
|
+
Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
|
32
36
|
end
|
33
37
|
|
34
38
|
@events = Writer::Events.new
|
@@ -40,7 +44,7 @@ module Datadog
|
|
40
44
|
def write(trace)
|
41
45
|
flush_trace(trace)
|
42
46
|
rescue => e
|
43
|
-
|
47
|
+
logger.debug(e)
|
44
48
|
end
|
45
49
|
|
46
50
|
# Does nothing.
|
@@ -80,6 +80,9 @@ module Datadog
|
|
80
80
|
# This allows later propagation to include those unknown fields, as they can represent future versions of the spec
|
81
81
|
# sending data through this service. This value ends in a trailing `;` to facilitate serialization.
|
82
82
|
# @return [String]
|
83
|
+
# @!attribute [r] baggage
|
84
|
+
# The W3C "baggage" extracted from a distributed context. This field is a hash of key/value pairs.
|
85
|
+
# @return [Hash<String,String>]
|
83
86
|
# TODO: The documentation for the last attribute above won't be rendered.
|
84
87
|
# TODO: This might be a YARD bug as adding an attribute, making it now second-last attribute, renders correctly.
|
85
88
|
attr_reader \
|
@@ -102,7 +105,8 @@ module Datadog
|
|
102
105
|
:trace_flags,
|
103
106
|
:trace_state,
|
104
107
|
:trace_state_unknown_fields,
|
105
|
-
:span_remote
|
108
|
+
:span_remote,
|
109
|
+
:baggage
|
106
110
|
|
107
111
|
def initialize(
|
108
112
|
span_id: nil,
|
@@ -124,7 +128,8 @@ module Datadog
|
|
124
128
|
trace_flags: nil,
|
125
129
|
trace_state: nil,
|
126
130
|
trace_state_unknown_fields: nil,
|
127
|
-
span_remote: true
|
131
|
+
span_remote: true,
|
132
|
+
baggage: nil
|
128
133
|
)
|
129
134
|
@span_id = span_id
|
130
135
|
@span_name = span_name && span_name.dup.freeze
|
@@ -146,6 +151,7 @@ module Datadog
|
|
146
151
|
@trace_state = trace_state && trace_state.dup.freeze
|
147
152
|
@trace_state_unknown_fields = trace_state_unknown_fields && trace_state_unknown_fields.dup.freeze
|
148
153
|
@span_remote = span_remote
|
154
|
+
@baggage = baggage && baggage.dup.freeze
|
149
155
|
freeze
|
150
156
|
end
|
151
157
|
|
@@ -177,6 +183,7 @@ module Datadog
|
|
177
183
|
trace_state: trace_state,
|
178
184
|
trace_state_unknown_fields: trace_state_unknown_fields,
|
179
185
|
span_remote: span_remote,
|
186
|
+
baggage: baggage
|
180
187
|
}.merge!(field_value_pairs)
|
181
188
|
)
|
182
189
|
end
|
@@ -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,
|
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,11 @@ 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
|
@tracer = tracer
|
110
|
+
@baggage = baggage
|
104
111
|
|
105
112
|
# Generic tags
|
106
113
|
set_tags(tags) if tags
|
@@ -173,6 +180,12 @@ module Datadog
|
|
173
180
|
super || (root_span && root_span.get_metric(key))
|
174
181
|
end
|
175
182
|
|
183
|
+
def set_distributed_source(product_bit)
|
184
|
+
source = get_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16) || 0
|
185
|
+
source |= product_bit
|
186
|
+
set_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE, format('%02X', source))
|
187
|
+
end
|
188
|
+
|
176
189
|
def tags
|
177
190
|
all_tags = {}
|
178
191
|
all_tags.merge!(root_span&.tags || {}) if root_span
|
@@ -194,6 +207,7 @@ module Datadog
|
|
194
207
|
|
195
208
|
def measure(
|
196
209
|
op_name,
|
210
|
+
logger: Datadog.logger,
|
197
211
|
events: nil,
|
198
212
|
on_error: nil,
|
199
213
|
resource: nil,
|
@@ -207,7 +221,9 @@ module Datadog
|
|
207
221
|
# Don't allow more span measurements if the
|
208
222
|
# trace is already completed. Prevents multiple
|
209
223
|
# root spans with parent_span_id = 0.
|
210
|
-
return yield(
|
224
|
+
return yield( # rubocop:disable Style/MultilineIfModifier
|
225
|
+
SpanOperation.new(op_name, logger: logger),
|
226
|
+
TraceOperation.new(logger: logger)) if finished? || full?
|
211
227
|
|
212
228
|
# Create new span
|
213
229
|
span_op = build_span(
|
@@ -228,6 +244,7 @@ module Datadog
|
|
228
244
|
|
229
245
|
def build_span(
|
230
246
|
op_name,
|
247
|
+
logger: Datadog.logger,
|
231
248
|
events: nil,
|
232
249
|
on_error: nil,
|
233
250
|
resource: nil,
|
@@ -249,7 +266,7 @@ module Datadog
|
|
249
266
|
parent_id = parent ? parent.id : @parent_span_id || 0
|
250
267
|
|
251
268
|
# Build events
|
252
|
-
events ||= SpanOperation::Events.new
|
269
|
+
events ||= SpanOperation::Events.new(logger: logger)
|
253
270
|
|
254
271
|
# Before start: activate the span, publish events.
|
255
272
|
events.before_start.subscribe do |span_op|
|
@@ -264,6 +281,7 @@ module Datadog
|
|
264
281
|
# Build a new span operation
|
265
282
|
SpanOperation.new(
|
266
283
|
op_name,
|
284
|
+
logger: logger,
|
267
285
|
events: events,
|
268
286
|
on_error: on_error,
|
269
287
|
parent_id: parent_id,
|
@@ -276,10 +294,10 @@ module Datadog
|
|
276
294
|
id: id
|
277
295
|
)
|
278
296
|
rescue StandardError => e
|
279
|
-
|
297
|
+
logger.debug { "Failed to build new span: #{e}" }
|
280
298
|
|
281
299
|
# Return dummy span
|
282
|
-
SpanOperation.new(op_name)
|
300
|
+
SpanOperation.new(op_name, logger: logger)
|
283
301
|
end
|
284
302
|
end
|
285
303
|
|
@@ -315,10 +333,10 @@ module Datadog
|
|
315
333
|
|
316
334
|
TraceDigest.new(
|
317
335
|
span_id: span_id,
|
318
|
-
span_name:
|
319
|
-
span_resource:
|
320
|
-
span_service:
|
321
|
-
span_type:
|
336
|
+
span_name: @active_span && @active_span.name,
|
337
|
+
span_resource: @active_span && @active_span.resource,
|
338
|
+
span_service: @active_span && @active_span.service,
|
339
|
+
span_type: @active_span && @active_span.type,
|
322
340
|
trace_distributed_tags: distributed_tags,
|
323
341
|
trace_hostname: @hostname,
|
324
342
|
trace_id: @id,
|
@@ -331,7 +349,8 @@ module Datadog
|
|
331
349
|
trace_service: service,
|
332
350
|
trace_state: @trace_state,
|
333
351
|
trace_state_unknown_fields: @trace_state_unknown_fields,
|
334
|
-
span_remote:
|
352
|
+
span_remote: @remote_parent && @active_span.nil?,
|
353
|
+
baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
|
335
354
|
).freeze
|
336
355
|
end
|
337
356
|
|
@@ -351,22 +370,22 @@ module Datadog
|
|
351
370
|
def fork_clone
|
352
371
|
self.class.new(
|
353
372
|
agent_sample_rate: @agent_sample_rate,
|
354
|
-
events:
|
355
|
-
hostname:
|
373
|
+
events: @events && @events.dup,
|
374
|
+
hostname: @hostname && @hostname.dup,
|
356
375
|
id: @id,
|
357
376
|
max_length: @max_length,
|
358
|
-
name:
|
359
|
-
origin:
|
377
|
+
name: name && name.dup,
|
378
|
+
origin: @origin && @origin.dup,
|
360
379
|
parent_span_id: (@active_span && @active_span.id) || @parent_span_id,
|
361
380
|
rate_limiter_rate: @rate_limiter_rate,
|
362
|
-
resource:
|
381
|
+
resource: resource && resource.dup,
|
363
382
|
rule_sample_rate: @rule_sample_rate,
|
364
383
|
sample_rate: @sample_rate,
|
365
384
|
sampled: @sampled,
|
366
385
|
sampling_priority: @sampling_priority,
|
367
|
-
service:
|
368
|
-
trace_state:
|
369
|
-
trace_state_unknown_fields:
|
386
|
+
service: service && service.dup,
|
387
|
+
trace_state: @trace_state && @trace_state.dup,
|
388
|
+
trace_state_unknown_fields: @trace_state_unknown_fields && @trace_state_unknown_fields.dup,
|
370
389
|
tags: meta.dup,
|
371
390
|
metrics: metrics.dup,
|
372
391
|
remote_parent: @remote_parent
|
@@ -454,7 +473,7 @@ module Datadog
|
|
454
473
|
# Publish :span_before_start event
|
455
474
|
events.span_before_start.publish(span_op, self)
|
456
475
|
rescue StandardError => e
|
457
|
-
|
476
|
+
logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
458
477
|
end
|
459
478
|
end
|
460
479
|
|
@@ -478,7 +497,7 @@ module Datadog
|
|
478
497
|
# Publish :trace_finished event
|
479
498
|
events.trace_finished.publish(self) if finished?
|
480
499
|
rescue StandardError => e
|
481
|
-
|
500
|
+
logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
482
501
|
end
|
483
502
|
end
|
484
503
|
|
@@ -510,6 +529,7 @@ module Datadog
|
|
510
529
|
metrics: metrics,
|
511
530
|
root_span_id: !partial ? root_span && root_span.id : nil,
|
512
531
|
profiling_enabled: @profiling_enabled,
|
532
|
+
apm_tracing_enabled: @apm_tracing_enabled
|
513
533
|
)
|
514
534
|
end
|
515
535
|
|