ddtrace 1.12.1 → 1.18.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 +388 -10
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
- data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -22
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +292 -27
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
- data/ext/ddtrace_profiling_native_extension/extconf.rb +40 -10
- data/ext/ddtrace_profiling_native_extension/http_transport.c +48 -16
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -1
- data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
- data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +136 -32
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +12 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +1 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +81 -50
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +40 -4
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +14 -0
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
- data/lib/datadog/appsec/assets.rb +8 -0
- data/lib/datadog/appsec/component.rb +21 -2
- data/lib/datadog/appsec/configuration/settings.rb +167 -189
- data/lib/datadog/appsec/configuration.rb +0 -79
- data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
- data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
- data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
- data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
- data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +36 -17
- data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
- data/lib/datadog/appsec/event.rb +106 -50
- data/lib/datadog/appsec/extensions.rb +1 -130
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
- data/lib/datadog/appsec/processor/actions.rb +49 -0
- data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
- data/lib/datadog/appsec/processor.rb +35 -7
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/remote.rb +17 -11
- data/lib/datadog/appsec/response.rb +82 -4
- data/lib/datadog/appsec/sample_rate.rb +21 -0
- data/lib/datadog/appsec.rb +3 -4
- data/lib/datadog/core/backport.rb +51 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
- data/lib/datadog/core/configuration/base.rb +6 -16
- data/lib/datadog/core/configuration/components.rb +15 -3
- data/lib/datadog/core/configuration/ext.rb +28 -5
- data/lib/datadog/core/configuration/option.rb +269 -21
- data/lib/datadog/core/configuration/option_definition.rb +73 -32
- data/lib/datadog/core/configuration/options.rb +27 -15
- data/lib/datadog/core/configuration/settings.rb +182 -102
- data/lib/datadog/core/configuration.rb +4 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +130 -234
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +13 -11
- data/lib/datadog/core/environment/variable_helpers.rb +0 -69
- data/lib/datadog/core/environment/yjit.rb +58 -0
- data/lib/datadog/core/error.rb +1 -0
- data/lib/datadog/core/git/ext.rb +26 -22
- data/lib/datadog/core/logging/ext.rb +3 -1
- data/lib/datadog/core/metrics/ext.rb +7 -5
- data/lib/datadog/core/remote/client/capabilities.rb +6 -1
- data/lib/datadog/core/remote/client.rb +3 -0
- data/lib/datadog/core/remote/component.rb +27 -36
- data/lib/datadog/core/remote/configuration/content.rb +28 -1
- data/lib/datadog/core/remote/configuration/repository.rb +3 -1
- data/lib/datadog/core/remote/ext.rb +1 -1
- data/lib/datadog/core/remote/negotiation.rb +19 -6
- data/lib/datadog/core/remote/transport/config.rb +60 -0
- data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
- data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
- data/lib/datadog/core/remote/transport/http/api.rb +58 -0
- data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
- data/lib/datadog/core/remote/transport/http/client.rb +48 -0
- data/lib/datadog/core/remote/transport/http/config.rb +280 -0
- data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
- data/lib/datadog/core/remote/transport/http.rb +179 -0
- data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
- data/lib/datadog/core/remote/worker.rb +4 -1
- data/lib/datadog/core/runtime/ext.rb +22 -12
- data/lib/datadog/core/runtime/metrics.rb +43 -0
- data/lib/datadog/core/telemetry/client.rb +12 -2
- data/lib/datadog/core/telemetry/collector.rb +13 -4
- data/lib/datadog/core/telemetry/emitter.rb +4 -2
- data/lib/datadog/core/telemetry/event.rb +19 -4
- data/lib/datadog/core/telemetry/ext.rb +4 -1
- data/lib/datadog/core/telemetry/heartbeat.rb +2 -4
- data/lib/datadog/core/telemetry/http/ext.rb +10 -8
- data/lib/datadog/core/telemetry/http/transport.rb +2 -0
- data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
- data/lib/datadog/core/telemetry/v2/request.rb +29 -0
- data/lib/datadog/core/transport/ext.rb +47 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
- data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
- data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
- data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
- data/lib/datadog/core/transport/http/api/map.rb +18 -0
- data/lib/datadog/core/transport/http/env.rb +62 -0
- data/lib/datadog/core/transport/http/response.rb +60 -0
- data/lib/datadog/core/transport/parcel.rb +22 -0
- data/lib/datadog/core/transport/request.rb +17 -0
- data/lib/datadog/core/transport/response.rb +64 -0
- data/lib/datadog/core/utils/duration.rb +52 -0
- data/lib/datadog/core/utils/hash.rb +47 -0
- data/lib/datadog/core/utils/network.rb +1 -1
- data/lib/datadog/core/utils/safe_dup.rb +27 -20
- data/lib/datadog/core/utils.rb +1 -1
- data/lib/datadog/core/workers/async.rb +3 -2
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/kit/appsec/events.rb +139 -89
- data/lib/datadog/kit/enable_core_dumps.rb +5 -6
- data/lib/datadog/kit/identity.rb +80 -65
- data/lib/datadog/opentelemetry/api/context.rb +10 -3
- data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
- data/lib/datadog/opentelemetry/trace.rb +58 -0
- data/lib/datadog/opentelemetry.rb +1 -0
- data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
- data/lib/datadog/opentracer.rb +9 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -17
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +69 -94
- data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
- data/lib/datadog/profiling/exporter.rb +5 -1
- data/lib/datadog/profiling/ext.rb +0 -12
- data/lib/datadog/profiling/flush.rb +7 -5
- data/lib/datadog/profiling/http_transport.rb +19 -6
- data/lib/datadog/profiling/load_native_extension.rb +7 -1
- data/lib/datadog/profiling/native_extension.rb +0 -21
- data/lib/datadog/profiling/profiler.rb +36 -13
- data/lib/datadog/profiling/scheduler.rb +16 -9
- data/lib/datadog/profiling.rb +16 -78
- data/lib/datadog/tracing/component.rb +70 -11
- data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
- data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
- data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
- data/lib/datadog/tracing/configuration/ext.rb +40 -32
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +134 -98
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -23
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -11
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
- data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -15
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -16
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/aws/ext.rb +37 -24
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +20 -7
- data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -11
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -14
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -15
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
- data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +19 -10
- data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
- data/lib/datadog/tracing/contrib/ext.rb +26 -1
- data/lib/datadog/tracing/contrib/extensions.rb +32 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +20 -10
- data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +21 -5
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +8 -6
- data/lib/datadog/tracing/contrib/grape/ext.rb +16 -14
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +8 -6
- data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -5
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +39 -9
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
- data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -13
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/http/ext.rb +16 -9
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -9
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -9
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +20 -16
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -14
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -10
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -6
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +52 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +37 -0
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +22 -14
- data/lib/datadog/tracing/contrib/pg/ext.rb +22 -19
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -5
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/presto/ext.rb +25 -20
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +12 -8
- data/lib/datadog/tracing/contrib/qless/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -12
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
- data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -12
- data/lib/datadog/tracing/contrib/rack/ext.rb +18 -16
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +8 -49
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +19 -15
- data/lib/datadog/tracing/contrib/rails/ext.rb +7 -5
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
- data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +13 -10
- data/lib/datadog/tracing/contrib/rake/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +17 -9
- data/lib/datadog/tracing/contrib/redis/ext.rb +22 -15
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
- data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/resque/ext.rb +9 -7
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +18 -11
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -30
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -9
- data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +21 -19
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -13
- data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +29 -12
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
- data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
- data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/datadog.rb +0 -1
- data/lib/datadog/tracing/distributed/propagation.rb +35 -34
- data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
- data/lib/datadog/tracing/metadata/ext.rb +9 -6
- data/lib/datadog/tracing/metadata/tagging.rb +3 -3
- data/lib/datadog/tracing/remote.rb +78 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +29 -0
- data/lib/datadog/tracing/span_operation.rb +3 -15
- data/lib/datadog/tracing/sync_writer.rb +3 -3
- data/lib/datadog/tracing/trace_digest.rb +31 -0
- data/lib/datadog/tracing/trace_operation.rb +16 -3
- data/lib/datadog/tracing/trace_segment.rb +5 -2
- data/lib/datadog/tracing/tracer.rb +12 -1
- data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
- data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
- data/lib/datadog/tracing/transport/http/api.rb +43 -0
- data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
- data/lib/datadog/tracing/transport/http/client.rb +57 -0
- data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
- data/lib/datadog/tracing/transport/http/traces.rb +152 -0
- data/lib/datadog/tracing/transport/http.rb +124 -0
- data/lib/datadog/tracing/transport/io/client.rb +89 -0
- data/lib/datadog/tracing/transport/io/response.rb +27 -0
- data/lib/datadog/tracing/transport/io/traces.rb +101 -0
- data/lib/datadog/tracing/transport/io.rb +30 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
- data/lib/datadog/tracing/transport/statistics.rb +77 -0
- data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
- data/lib/datadog/tracing/transport/traces.rb +224 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
- data/lib/datadog/tracing/workers.rb +4 -2
- data/lib/datadog/tracing/writer.rb +5 -2
- data/lib/ddtrace/transport/ext.rb +22 -14
- data/lib/ddtrace/version.rb +9 -12
- data/lib/ddtrace.rb +1 -1
- metadata +101 -93
- data/lib/datadog/ci/configuration/components.rb +0 -32
- data/lib/datadog/ci/configuration/settings.rb +0 -53
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
- data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
- data/lib/datadog/ci/ext/app_types.rb +0 -9
- data/lib/datadog/ci/ext/environment.rb +0 -575
- data/lib/datadog/ci/ext/settings.rb +0 -10
- data/lib/datadog/ci/ext/test.rb +0 -35
- data/lib/datadog/ci/extensions.rb +0 -19
- data/lib/datadog/ci/flush.rb +0 -38
- data/lib/datadog/ci/test.rb +0 -81
- data/lib/datadog/ci.rb +0 -20
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
- data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
- data/lib/datadog/core/configuration/option_set.rb +0 -10
- data/lib/datadog/core/transport/config.rb +0 -58
- data/lib/datadog/core/transport/http/api.rb +0 -57
- data/lib/datadog/core/transport/http/client.rb +0 -45
- data/lib/datadog/core/transport/http/config.rb +0 -268
- data/lib/datadog/core/transport/http/negotiation.rb +0 -144
- data/lib/datadog/core/transport/http.rb +0 -169
- data/lib/datadog/core/utils/object_set.rb +0 -43
- data/lib/datadog/core/utils/string_table.rb +0 -47
- data/lib/datadog/profiling/backtrace_location.rb +0 -34
- data/lib/datadog/profiling/buffer.rb +0 -43
- data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
- data/lib/datadog/profiling/encoding/profile.rb +0 -41
- data/lib/datadog/profiling/event.rb +0 -15
- data/lib/datadog/profiling/events/stack.rb +0 -82
- data/lib/datadog/profiling/old_recorder.rb +0 -107
- data/lib/datadog/profiling/pprof/builder.rb +0 -125
- data/lib/datadog/profiling/pprof/converter.rb +0 -102
- data/lib/datadog/profiling/pprof/message_set.rb +0 -16
- data/lib/datadog/profiling/pprof/payload.rb +0 -20
- data/lib/datadog/profiling/pprof/pprof.proto +0 -212
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
- data/lib/datadog/profiling/pprof/string_table.rb +0 -12
- data/lib/datadog/profiling/pprof/template.rb +0 -118
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
- data/lib/ddtrace/transport/http/api/instance.rb +0 -35
- data/lib/ddtrace/transport/http/api/map.rb +0 -16
- data/lib/ddtrace/transport/http/api/spec.rb +0 -17
- data/lib/ddtrace/transport/http/api.rb +0 -39
- data/lib/ddtrace/transport/http/builder.rb +0 -176
- data/lib/ddtrace/transport/http/client.rb +0 -52
- data/lib/ddtrace/transport/http/env.rb +0 -58
- data/lib/ddtrace/transport/http/response.rb +0 -58
- data/lib/ddtrace/transport/http/statistics.rb +0 -43
- data/lib/ddtrace/transport/http/traces.rb +0 -144
- data/lib/ddtrace/transport/http.rb +0 -117
- data/lib/ddtrace/transport/io/client.rb +0 -85
- data/lib/ddtrace/transport/io/response.rb +0 -25
- data/lib/ddtrace/transport/io/traces.rb +0 -99
- data/lib/ddtrace/transport/io.rb +0 -28
- data/lib/ddtrace/transport/parcel.rb +0 -20
- data/lib/ddtrace/transport/request.rb +0 -15
- data/lib/ddtrace/transport/response.rb +0 -60
- data/lib/ddtrace/transport/serializable_trace.rb +0 -122
- data/lib/ddtrace/transport/statistics.rb +0 -75
- data/lib/ddtrace/transport/trace_formatter.rb +0 -198
- data/lib/ddtrace/transport/traces.rb +0 -216
data/lib/datadog/kit/identity.rb
CHANGED
|
@@ -6,84 +6,99 @@ module Datadog
|
|
|
6
6
|
module Kit
|
|
7
7
|
# Tracking identity via traces
|
|
8
8
|
module Identity
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
9
|
+
class << self
|
|
10
|
+
# Attach user information to the trace
|
|
11
|
+
#
|
|
12
|
+
# @param trace [TraceOperation] Trace to attach data to. Defaults to
|
|
13
|
+
# active trace.
|
|
14
|
+
# @param span [SpanOperation] Span to attach data to. Defaults to
|
|
15
|
+
# active span on trace. Note that this should be a service entry span.
|
|
16
|
+
# When AppSec is enabled, the expected span and trace are automatically
|
|
17
|
+
# used as defaults.
|
|
18
|
+
# @param id [String] Mandatory. Username or client id extracted
|
|
19
|
+
# from the access token or Authorization header in the inbound request
|
|
20
|
+
# from outside the system.
|
|
21
|
+
# @param email [String] Email of the authenticated user associated
|
|
22
|
+
# to the trace.
|
|
23
|
+
# @param name [String] User-friendly name. To be displayed in the
|
|
24
|
+
# UI if set.
|
|
25
|
+
# @param session_id [String] Session ID of the authenticated user.
|
|
26
|
+
# @param role [String] Actual/assumed role the client is making
|
|
27
|
+
# the request under extracted from token or application security
|
|
28
|
+
# context.
|
|
29
|
+
# @param scope [String] Scopes or granted authorities the client
|
|
30
|
+
# currently possesses extracted from token or application security
|
|
31
|
+
# context. The value would come from the scope associated with an OAuth
|
|
32
|
+
# 2.0 Access Token or an attribute value in a SAML 2.0 Assertion.
|
|
33
|
+
# @param others [Hash<Symbol, String>] Additional free-form
|
|
34
|
+
# user information to attach to the trace.
|
|
35
|
+
#
|
|
36
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
37
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
38
|
+
def set_user(
|
|
39
|
+
trace = nil, span = nil, id:, email: nil, name: nil, session_id: nil, role: nil, scope: nil, **others
|
|
40
|
+
)
|
|
41
|
+
raise ArgumentError, 'missing required key: :id' if id.nil?
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
# enforce types
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
raise TypeError, ':id must be a String' unless id.is_a?(String)
|
|
46
|
+
raise TypeError, ':email must be a String' unless email.nil? || email.is_a?(String)
|
|
47
|
+
raise TypeError, ':name must be a String' unless name.nil? || name.is_a?(String)
|
|
48
|
+
raise TypeError, ':session_id must be a String' unless session_id.nil? || session_id.is_a?(String)
|
|
49
|
+
raise TypeError, ':role must be a String' unless role.nil? || role.is_a?(String)
|
|
50
|
+
raise TypeError, ':scope must be a String' unless scope.nil? || scope.is_a?(String)
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
others.each do |k, v|
|
|
53
|
+
raise TypeError, "#{k.inspect} must be a String" unless v.nil? || v.is_a?(String)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
set_trace_and_span_context('set_user', trace, span) do |_active_trace, active_span|
|
|
57
|
+
# set tags once data is known consistent
|
|
58
|
+
active_span.set_tag('usr.id', id)
|
|
59
|
+
active_span.set_tag('usr.email', email) unless email.nil?
|
|
60
|
+
active_span.set_tag('usr.name', name) unless name.nil?
|
|
61
|
+
active_span.set_tag('usr.session_id', session_id) unless session_id.nil?
|
|
62
|
+
active_span.set_tag('usr.role', role) unless role.nil?
|
|
63
|
+
active_span.set_tag('usr.scope', scope) unless scope.nil?
|
|
55
64
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
others.each do |k, v|
|
|
66
|
+
active_span.set_tag("usr.#{k}", v) unless v.nil?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if Datadog::AppSec.active_scope
|
|
70
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(id)
|
|
71
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
59
74
|
end
|
|
75
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
76
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
60
77
|
|
|
61
|
-
|
|
62
|
-
span ||= trace.active_span || Datadog::Tracing.active_span
|
|
78
|
+
private
|
|
63
79
|
|
|
64
|
-
|
|
80
|
+
def set_trace_and_span_context(method, trace = nil, span = nil)
|
|
81
|
+
if (appsec_scope = Datadog::AppSec.active_scope)
|
|
82
|
+
trace = appsec_scope.trace
|
|
83
|
+
span = appsec_scope.service_entry_span
|
|
84
|
+
end
|
|
65
85
|
|
|
66
|
-
|
|
86
|
+
trace ||= Datadog::Tracing.active_trace
|
|
87
|
+
span ||= trace && trace.active_span || Datadog::Tracing.active_span
|
|
67
88
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
89
|
+
unless trace && span
|
|
90
|
+
Datadog.logger.debug(
|
|
91
|
+
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
|
|
92
|
+
' to track this events'
|
|
93
|
+
)
|
|
94
|
+
return
|
|
95
|
+
end
|
|
74
96
|
|
|
75
|
-
|
|
76
|
-
span.set_tag("usr.#{k}", v) unless v.nil?
|
|
77
|
-
end
|
|
97
|
+
raise ArgumentError, "span #{span.span_id} does not belong to trace #{trace.id}" if trace.id != span.trace_id
|
|
78
98
|
|
|
79
|
-
|
|
80
|
-
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(id)
|
|
81
|
-
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
99
|
+
yield(trace, span)
|
|
82
100
|
end
|
|
83
101
|
end
|
|
84
|
-
# rubocop:enable Metrics/AbcSize
|
|
85
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
|
86
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
87
102
|
end
|
|
88
103
|
end
|
|
89
104
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative 'trace/span'
|
|
4
4
|
require_relative '../../tracing/trace_operation'
|
|
5
|
+
require_relative '../trace'
|
|
5
6
|
|
|
6
7
|
module Datadog
|
|
7
8
|
module OpenTelemetry
|
|
@@ -66,9 +67,15 @@ module Datadog
|
|
|
66
67
|
# @param [Object] value Object to be stored under key
|
|
67
68
|
# @return [Context]
|
|
68
69
|
def set_values(values)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
trace
|
|
70
|
+
if (current_span = values[CURRENT_SPAN_KEY]) && current_span.datadog_trace
|
|
71
|
+
# Because `#set_value` returns new context, we have to create
|
|
72
|
+
# a new copy of the active trace to ensure there's no conflict with
|
|
73
|
+
# other users of the active trace.
|
|
74
|
+
# It effectively becomes an internal trace propagation.
|
|
75
|
+
trace = Datadog::OpenTelemetry::Trace.start_trace_copy(
|
|
76
|
+
current_span.datadog_trace,
|
|
77
|
+
parent_span: current_span.datadog_span
|
|
78
|
+
)
|
|
72
79
|
end
|
|
73
80
|
|
|
74
81
|
existing_values = @trace && @trace.otel_values || {}
|
|
@@ -81,8 +81,9 @@ module Datadog
|
|
|
81
81
|
private
|
|
82
82
|
|
|
83
83
|
# Converts the {Numeric} Datadog id object to OpenTelemetry's byte array format.
|
|
84
|
+
# This method currently converts an unsigned 64-bit Integer to a binary String.
|
|
84
85
|
def to_otel_id(dd_id)
|
|
85
|
-
Array(dd_id).pack('
|
|
86
|
+
Array(dd_id).pack('Q')
|
|
86
87
|
end
|
|
87
88
|
end
|
|
88
89
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'trace/span'
|
|
4
|
+
|
|
3
5
|
module Datadog
|
|
4
6
|
module OpenTelemetry
|
|
5
7
|
module SDK
|
|
@@ -27,7 +29,7 @@ module Datadog
|
|
|
27
29
|
#
|
|
28
30
|
# @param [Span] span the {Span} that just ended.
|
|
29
31
|
def on_finish(span)
|
|
30
|
-
span.datadog_span.finish
|
|
32
|
+
span.datadog_span.finish(ns_to_time(span.end_timestamp))
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
# Export all ended spans to the configured `Exporter` that have not yet
|
|
@@ -76,15 +78,56 @@ module Datadog
|
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
def start_datadog_span(span)
|
|
79
|
-
|
|
81
|
+
attributes = span.attributes.dup # Dup to allow modification of frozen Hash
|
|
82
|
+
|
|
83
|
+
name, kwargs = span_arguments(span, attributes)
|
|
80
84
|
|
|
81
|
-
|
|
82
|
-
tags[Tracing::Metadata::Ext::TAG_KIND] = kind
|
|
85
|
+
datadog_span = Tracing.trace(name, **kwargs)
|
|
83
86
|
|
|
84
|
-
datadog_span = Tracing.trace(span.name, tags: tags)
|
|
85
87
|
datadog_span.set_error([nil, span.status.description]) unless span.status.ok?
|
|
88
|
+
datadog_span.set_tags(span.attributes)
|
|
89
|
+
|
|
86
90
|
datadog_span
|
|
87
91
|
end
|
|
92
|
+
|
|
93
|
+
# Some special attributes can override Datadog Span fields
|
|
94
|
+
def span_arguments(span, attributes)
|
|
95
|
+
if attributes.key?('analytics.event') && (analytics_event = attributes['analytics.event']).respond_to?(:casecmp)
|
|
96
|
+
attributes[Tracing::Metadata::Ext::Analytics::TAG_SAMPLE_RATE] = analytics_event.casecmp('true') == 0 ? 1 : 0
|
|
97
|
+
end
|
|
98
|
+
attributes[Tracing::Metadata::Ext::TAG_KIND] = span.kind || 'internal'
|
|
99
|
+
|
|
100
|
+
kwargs = { start_time: ns_to_time(span.start_timestamp) }
|
|
101
|
+
|
|
102
|
+
name = if attributes.key?('operation.name')
|
|
103
|
+
attributes['operation.name']
|
|
104
|
+
elsif (rich_name = Datadog::OpenTelemetry::Trace::Span.enrich_name(span.kind, attributes))
|
|
105
|
+
rich_name.downcase
|
|
106
|
+
else
|
|
107
|
+
span.kind
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
kwargs[:resource] = attributes.key?('resource.name') ? attributes['resource.name'] : span.name
|
|
111
|
+
kwargs[:service] = attributes['service.name'] if attributes.key?('service.name')
|
|
112
|
+
kwargs[:type] = attributes['span.type'] if attributes.key?('span.type')
|
|
113
|
+
|
|
114
|
+
attributes.reject! { |key, _| OpenTelemetry::Trace::Span::DATADOG_SPAN_ATTRIBUTE_OVERRIDES.include?(key) }
|
|
115
|
+
|
|
116
|
+
# DEV: There's no `flat_map!`; we have to split it into two operations
|
|
117
|
+
attributes = attributes.map do |key, value|
|
|
118
|
+
Datadog::OpenTelemetry::Trace::Span.serialize_attribute(key, value)
|
|
119
|
+
end
|
|
120
|
+
attributes.flatten!(1)
|
|
121
|
+
|
|
122
|
+
kwargs[:tags] = attributes
|
|
123
|
+
|
|
124
|
+
[name, kwargs]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# From nanoseconds, used by OpenTelemetry, to a {Time} object, used by the Datadog Tracer.
|
|
128
|
+
def ns_to_time(timestamp_ns)
|
|
129
|
+
Time.at(timestamp_ns / 1000000000.0)
|
|
130
|
+
end
|
|
88
131
|
end
|
|
89
132
|
end
|
|
90
133
|
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenTelemetry
|
|
5
|
+
module Trace
|
|
6
|
+
# Stores associated Datadog entities to the OpenTelemetry Span.
|
|
7
|
+
module Span
|
|
8
|
+
# Attributes are equivalent to span tags and metrics.
|
|
9
|
+
def set_attribute(key, value)
|
|
10
|
+
res = super
|
|
11
|
+
# Attributes can get dropped or their values truncated by `super`
|
|
12
|
+
datadog_set_attribute(key)
|
|
13
|
+
res
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# `alias` performed to match {OpenTelemetry::SDK::Trace::Span} aliasing upstream
|
|
17
|
+
alias []= set_attribute
|
|
18
|
+
|
|
19
|
+
# Attributes are equivalent to span tags and metrics.
|
|
20
|
+
def add_attributes(attributes)
|
|
21
|
+
res = super
|
|
22
|
+
# Attributes can get dropped or their values truncated by `super`
|
|
23
|
+
attributes.each { |key, _| datadog_set_attribute(key) }
|
|
24
|
+
res
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Captures changes to span error state.
|
|
28
|
+
def status=(s)
|
|
29
|
+
super
|
|
30
|
+
|
|
31
|
+
return unless status # Return if status are currently disabled by OpenTelemetry.
|
|
32
|
+
return unless (span = datadog_span)
|
|
33
|
+
|
|
34
|
+
# Status code can only change into an error state.
|
|
35
|
+
# Other change operations should be ignored.
|
|
36
|
+
span.set_error(status.description) if status && status.code == ::OpenTelemetry::Trace::Status::ERROR
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Serialize values into Datadog span tags and metrics.
|
|
40
|
+
# Notably, arrays are exploded into many keys, each with
|
|
41
|
+
# a numeric suffix representing the array index, for example:
|
|
42
|
+
# `'foo' => ['a','b']` becomes `'foo.0' => 'a', 'foo.1' => 'b'`
|
|
43
|
+
def self.serialize_attribute(key, value)
|
|
44
|
+
if value.is_a?(Array)
|
|
45
|
+
value.flat_map.with_index do |v, idx|
|
|
46
|
+
serialize_attribute("#{key}.#{idx}", v)
|
|
47
|
+
end
|
|
48
|
+
elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
|
49
|
+
[[key, value.to_s]]
|
|
50
|
+
else
|
|
51
|
+
[[key, value]]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Create a meaningful Datadog operation name from the OpenTelemetry
|
|
56
|
+
# semantic convention for span kind and span attributes.
|
|
57
|
+
# @see https://opentelemetry.io/docs/specs/semconv/general/trace/
|
|
58
|
+
|
|
59
|
+
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
60
|
+
def self.enrich_name(kind, attrs)
|
|
61
|
+
if attrs.key?('http.request.method')
|
|
62
|
+
return 'http.server.request' if kind == :server
|
|
63
|
+
return 'http.client.request' if kind == :client
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
return "#{attrs['db.system']}.query" if attrs.key?('db.system') && kind == :client
|
|
67
|
+
|
|
68
|
+
if (attrs.key?('messaging.system') || attrs.key?('messaging.operation')) &&
|
|
69
|
+
[:consumer, :producer, :server, :client].include?(kind)
|
|
70
|
+
|
|
71
|
+
return "#{attrs['messaging.system']}.#{attrs['messaging.operation']}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if attrs.key?('rpc.system')
|
|
75
|
+
if attrs['rpc.system'] == 'aws-api' && kind == :client
|
|
76
|
+
service = attrs['rpc.service']
|
|
77
|
+
return "aws.#{service || 'client'}.request"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if kind == :client
|
|
81
|
+
return "#{attrs['rpc.system']}.client.request"
|
|
82
|
+
elsif kind == :server
|
|
83
|
+
return "#{attrs['rpc.system']}.server.request"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
if attrs.key?('faas.invoked_provider') && attrs.key?('faas.invoked_name') && kind == :client
|
|
88
|
+
provider = attrs['faas.invoked_provider']
|
|
89
|
+
name = attrs['faas.invoked_name']
|
|
90
|
+
return "#{provider}.#{name}.invoke"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
return "#{attrs['faas.trigger']}.invoke" if attrs.key?('faas.trigger') && kind == :server
|
|
94
|
+
|
|
95
|
+
return 'graphql.server.request' if attrs.key?('graphql.operation.type')
|
|
96
|
+
|
|
97
|
+
if kind == :server
|
|
98
|
+
protocol = attrs['network.protocol.name']
|
|
99
|
+
return protocol ? "#{protocol}.server.request" : 'server.request'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if kind == :client
|
|
103
|
+
protocol = attrs['network.protocol.name']
|
|
104
|
+
return protocol ? "#{protocol}.client.request" : 'client.request'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
kind.to_s
|
|
108
|
+
end
|
|
109
|
+
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
|
|
113
|
+
def datadog_set_attribute(key)
|
|
114
|
+
# Return if attributes are currently disabled by OpenTelemetry.
|
|
115
|
+
return unless defined?(@attributes) && @attributes
|
|
116
|
+
return unless (span = datadog_span)
|
|
117
|
+
|
|
118
|
+
# DEV: Accesses `@attributes` directly, since using `#attributes`
|
|
119
|
+
# DEV: clones the hash, causing unnecessary overhead.
|
|
120
|
+
if @attributes.key?(key)
|
|
121
|
+
# Try to find a richer operation name, unless an explicit override was provided.
|
|
122
|
+
if !@attributes.key?('operation.name') && (rich_name = Span.enrich_name(kind, @attributes))
|
|
123
|
+
span.name = rich_name.downcase
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
Span.serialize_attribute(key, @attributes[key]).each do |new_key, value|
|
|
127
|
+
override_datadog_values(span, new_key, value)
|
|
128
|
+
|
|
129
|
+
# When an attribute is used to override a Datadog Span property,
|
|
130
|
+
# it should NOT be set as a Datadog Span tag.
|
|
131
|
+
span.set_tag(new_key, value) unless DATADOG_SPAN_ATTRIBUTE_OVERRIDES.include?(new_key)
|
|
132
|
+
end
|
|
133
|
+
else
|
|
134
|
+
span.clear_tag(key)
|
|
135
|
+
|
|
136
|
+
if key == 'service.name'
|
|
137
|
+
# By removing the service name, we set it to the fallback default,
|
|
138
|
+
# effectively removing the `service` attribute from OpenTelemetry's perspective.
|
|
139
|
+
span.service = Datadog.send(:components).tracer.default_service
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Some special attributes can override Datadog Span fields beyond tags and metrics.
|
|
145
|
+
# @return [Boolean] true if the key is a Datadog Span override attribute, false otherwise
|
|
146
|
+
def override_datadog_values(span, key, value)
|
|
147
|
+
span.name = value if key == 'operation.name'
|
|
148
|
+
span.resource = value if key == 'resource.name'
|
|
149
|
+
span.service = value if key == 'service.name'
|
|
150
|
+
span.type = value if key == 'span.type'
|
|
151
|
+
|
|
152
|
+
if key == 'analytics.event' && value.respond_to?(:casecmp)
|
|
153
|
+
Datadog::Tracing::Analytics.set_sample_rate(
|
|
154
|
+
span,
|
|
155
|
+
value.casecmp('true') == 0 ? 1 : 0
|
|
156
|
+
)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
DATADOG_SPAN_ATTRIBUTE_OVERRIDES = ['analytics.event', 'operation.name', 'resource.name', 'service.name',
|
|
161
|
+
'span.type'].freeze
|
|
162
|
+
|
|
163
|
+
::OpenTelemetry::SDK::Trace::Span.prepend(self)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../tracing/trace_digest'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module OpenTelemetry
|
|
7
|
+
# OpenTelemetry utilities related to the respective Datadog trace.
|
|
8
|
+
module Trace
|
|
9
|
+
class << self
|
|
10
|
+
# Creates a new TraceOperation object that can be attached to a new
|
|
11
|
+
# OpenTelemetry span.
|
|
12
|
+
# If `parent_span` is provided, then that span is set as the currently
|
|
13
|
+
# active parent span.
|
|
14
|
+
#
|
|
15
|
+
# @return [TraceOperation]
|
|
16
|
+
def start_trace_copy(trace, parent_span: nil)
|
|
17
|
+
digest = if parent_span
|
|
18
|
+
digest_with_parent_span(trace, parent_span)
|
|
19
|
+
else
|
|
20
|
+
trace.to_digest
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Create a new TraceOperation, attached to the current Datadog Tracer.
|
|
24
|
+
Datadog::Tracing.continue_trace!(digest)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# Creates a TraceDigest with the active span modified.
|
|
30
|
+
# This supports the implementation of `OpenTelemetry::Trace.context_with_span`,
|
|
31
|
+
# which allows you to specific any span as the arbitrary parent of a new span.
|
|
32
|
+
def digest_with_parent_span(trace, parent_span)
|
|
33
|
+
digest = trace.to_digest
|
|
34
|
+
|
|
35
|
+
Tracing::TraceDigest.new(
|
|
36
|
+
span_id: parent_span.id,
|
|
37
|
+
span_name: parent_span.name,
|
|
38
|
+
span_resource: parent_span.resource,
|
|
39
|
+
span_service: parent_span.service,
|
|
40
|
+
span_type: parent_span.type,
|
|
41
|
+
trace_distributed_tags: digest.trace_distributed_tags,
|
|
42
|
+
trace_hostname: digest.trace_hostname,
|
|
43
|
+
trace_id: digest.trace_id,
|
|
44
|
+
trace_name: digest.trace_name,
|
|
45
|
+
trace_origin: digest.trace_origin,
|
|
46
|
+
trace_process_id: digest.trace_process_id,
|
|
47
|
+
trace_resource: digest.trace_resource,
|
|
48
|
+
trace_runtime_id: digest.trace_runtime_id,
|
|
49
|
+
trace_sampling_priority: digest.trace_sampling_priority,
|
|
50
|
+
trace_service: digest.trace_service,
|
|
51
|
+
trace_state: digest.trace_state,
|
|
52
|
+
trace_state_unknown_fields: digest.trace_state_unknown_fields,
|
|
53
|
+
).freeze
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -16,6 +16,7 @@ require_relative 'opentelemetry/api/context'
|
|
|
16
16
|
# DEV: This is different from our existing OpenTracer API, but there are many safety
|
|
17
17
|
# DEV: features built into Contrib instrumentation today.
|
|
18
18
|
require_relative 'opentelemetry/sdk/configurator' if defined?(OpenTelemetry::SDK)
|
|
19
|
+
require_relative 'opentelemetry/sdk/trace/span' if defined?(OpenTelemetry::SDK)
|
|
19
20
|
|
|
20
21
|
module Datadog
|
|
21
22
|
# Datadog OpenTelemetry integration.
|
|
@@ -33,7 +33,8 @@ module Datadog
|
|
|
33
33
|
carrier[Tracing::Distributed::Datadog::ORIGIN_KEY] = digest.trace_origin
|
|
34
34
|
carrier[Tracing::Distributed::Datadog::PARENT_ID_KEY] = digest.span_id
|
|
35
35
|
carrier[Tracing::Distributed::Datadog::SAMPLING_PRIORITY_KEY] = digest.trace_sampling_priority
|
|
36
|
-
carrier[Tracing::Distributed::Datadog::TRACE_ID_KEY] =
|
|
36
|
+
carrier[Tracing::Distributed::Datadog::TRACE_ID_KEY] =
|
|
37
|
+
Datadog::Tracing::Utils::TraceId.to_low_order(digest.trace_id)
|
|
37
38
|
|
|
38
39
|
nil
|
|
39
40
|
end
|
data/lib/datadog/opentracer.rb
CHANGED
|
@@ -22,3 +22,12 @@ require_relative 'opentracer/global_tracer'
|
|
|
22
22
|
|
|
23
23
|
# Modify the OpenTracing module functions
|
|
24
24
|
::OpenTracing.singleton_class.prepend(Datadog::OpenTracer::GlobalTracer)
|
|
25
|
+
|
|
26
|
+
module Datadog
|
|
27
|
+
# Datadog OpenTracing integration.
|
|
28
|
+
# DEV: This module should be named `Datadog::OpenTracing` to match the gem (`opentracing`).
|
|
29
|
+
module OpenTracer
|
|
30
|
+
# Used by Telemetry to decide if OpenTracing instrumentation is enabled
|
|
31
|
+
LOADED = true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -14,23 +14,15 @@ module Datadog
|
|
|
14
14
|
public
|
|
15
15
|
|
|
16
16
|
def initialize(
|
|
17
|
-
recorder:,
|
|
18
|
-
max_frames:,
|
|
19
|
-
tracer:,
|
|
20
|
-
endpoint_collection_enabled:,
|
|
21
17
|
gc_profiling_enabled:,
|
|
22
18
|
allocation_counting_enabled:,
|
|
23
19
|
no_signals_workaround_enabled:,
|
|
24
|
-
thread_context_collector
|
|
25
|
-
recorder: recorder,
|
|
26
|
-
max_frames: max_frames,
|
|
27
|
-
tracer: tracer,
|
|
28
|
-
endpoint_collection_enabled: endpoint_collection_enabled,
|
|
29
|
-
),
|
|
20
|
+
thread_context_collector:,
|
|
30
21
|
idle_sampling_helper: IdleSamplingHelper.new,
|
|
31
22
|
# **NOTE**: This should only be used for testing; disabling the dynamic sampling rate will increase the
|
|
32
23
|
# profiler overhead!
|
|
33
|
-
dynamic_sampling_rate_enabled: true
|
|
24
|
+
dynamic_sampling_rate_enabled: true,
|
|
25
|
+
allocation_sample_every: 0 # Currently only for testing; Setting this to > 0 can add a lot of overhead!
|
|
34
26
|
)
|
|
35
27
|
unless dynamic_sampling_rate_enabled
|
|
36
28
|
Datadog.logger.warn(
|
|
@@ -38,6 +30,13 @@ module Datadog
|
|
|
38
30
|
)
|
|
39
31
|
end
|
|
40
32
|
|
|
33
|
+
if allocation_counting_enabled && allocation_sample_every > 0
|
|
34
|
+
Datadog.logger.warn(
|
|
35
|
+
"Enabled experimental allocation profiling: allocation_sample_every=#{allocation_sample_every}. This is " \
|
|
36
|
+
'experimental, not recommended, and will increase overhead!'
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
41
40
|
self.class._native_initialize(
|
|
42
41
|
self,
|
|
43
42
|
thread_context_collector,
|
|
@@ -46,6 +45,7 @@ module Datadog
|
|
|
46
45
|
allocation_counting_enabled,
|
|
47
46
|
no_signals_workaround_enabled,
|
|
48
47
|
dynamic_sampling_rate_enabled,
|
|
48
|
+
allocation_sample_every,
|
|
49
49
|
)
|
|
50
50
|
@worker_thread = nil
|
|
51
51
|
@failure_exception = nil
|
|
@@ -53,7 +53,7 @@ module Datadog
|
|
|
53
53
|
@idle_sampling_helper = idle_sampling_helper
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
def start
|
|
56
|
+
def start(on_failure_proc: nil)
|
|
57
57
|
@start_stop_mutex.synchronize do
|
|
58
58
|
return if @worker_thread && @worker_thread.alive?
|
|
59
59
|
|
|
@@ -74,18 +74,17 @@ module Datadog
|
|
|
74
74
|
'CpuAndWallTimeWorker thread error. ' \
|
|
75
75
|
"Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
|
|
76
76
|
)
|
|
77
|
+
on_failure_proc&.call
|
|
77
78
|
end
|
|
78
79
|
end
|
|
80
|
+
@worker_thread.name = self.class.name # Repeated from above to make sure thread gets named asap
|
|
81
|
+
@worker_thread.thread_variable_set(:fork_safe, true)
|
|
79
82
|
end
|
|
80
83
|
|
|
81
84
|
true
|
|
82
85
|
end
|
|
83
86
|
|
|
84
|
-
|
|
85
|
-
# Can be removed once we remove OldStack.
|
|
86
|
-
def enabled=(_); end
|
|
87
|
-
|
|
88
|
-
def stop(*_)
|
|
87
|
+
def stop
|
|
89
88
|
@start_stop_mutex.synchronize do
|
|
90
89
|
Datadog.logger.debug('Requesting CpuAndWallTimeWorker thread shut down')
|
|
91
90
|
|
|
@@ -42,12 +42,14 @@ module Datadog
|
|
|
42
42
|
)
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
+
@worker_thread.name = self.class.name # Repeated from above to make sure thread gets named asap
|
|
46
|
+
@worker_thread.thread_variable_set(:fork_safe, true)
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
true
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
def stop
|
|
52
|
+
def stop
|
|
51
53
|
@start_stop_mutex.synchronize do
|
|
52
54
|
Datadog.logger.debug('Requesting IdleSamplingHelper thread shut down')
|
|
53
55
|
|