ddtrace 1.2.0 → 1.10.1
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 +442 -2
- data/LICENSE-3rdparty.csv +4 -0
- data/README.md +2 -2
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +20 -4
- data/ext/ddtrace_profiling_loader/extconf.rb +21 -3
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +46 -3
- data/ext/ddtrace_profiling_native_extension/clock_id.h +21 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +33 -2
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +821 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +186 -85
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +13 -2
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +978 -0
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +14 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +54 -34
- data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +127 -121
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +25 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +82 -37
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +189 -139
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +15 -6
- data/ext/ddtrace_profiling_native_extension/profiling.c +221 -5
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +57 -1
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +489 -45
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +12 -35
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +1722 -636
- data/lib/datadog/appsec/assets/waf_rules/strict.json +366 -74
- data/lib/datadog/appsec/assets.rb +2 -4
- data/lib/datadog/appsec/autoload.rb +5 -10
- data/lib/datadog/appsec/component.rb +41 -0
- data/lib/datadog/appsec/configuration/settings.rb +46 -24
- data/lib/datadog/appsec/configuration.rb +12 -4
- data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -4
- data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -3
- data/lib/datadog/appsec/contrib/integration.rb +0 -2
- data/lib/datadog/appsec/contrib/patcher.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -4
- data/lib/datadog/appsec/contrib/rack/ext.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +97 -0
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +117 -110
- data/lib/datadog/appsec/contrib/rack/integration.rb +5 -7
- data/lib/datadog/appsec/contrib/rack/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +31 -38
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +21 -22
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +21 -22
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +9 -7
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +80 -39
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -4
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/framework.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +45 -40
- data/lib/datadog/appsec/contrib/rails/integration.rb +5 -7
- data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -16
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +24 -23
- data/lib/datadog/appsec/contrib/rails/request.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -4
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -2
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +82 -75
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -6
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +33 -18
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +21 -20
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +0 -2
- data/lib/datadog/appsec/event.rb +8 -16
- data/lib/datadog/appsec/ext.rb +9 -0
- data/lib/datadog/appsec/extensions.rb +51 -23
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +26 -6
- data/lib/datadog/appsec/instrumentation.rb +9 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +86 -0
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +61 -0
- data/lib/datadog/appsec/monitor.rb +11 -0
- data/lib/datadog/appsec/processor.rb +110 -31
- data/lib/datadog/appsec/rate_limiter.rb +0 -2
- data/lib/datadog/appsec/reactive/address_hash.rb +6 -2
- data/lib/datadog/appsec/reactive/engine.rb +12 -9
- data/lib/datadog/appsec/reactive/operation.rb +22 -5
- data/lib/datadog/appsec/reactive/subscriber.rb +2 -1
- data/lib/datadog/appsec/response.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +199 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +85 -0
- data/lib/datadog/appsec/utils/http.rb +9 -0
- data/lib/datadog/appsec/utils.rb +7 -0
- data/lib/datadog/appsec.rb +25 -7
- data/lib/datadog/ci/configuration/components.rb +1 -3
- data/lib/datadog/ci/configuration/settings.rb +1 -3
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -4
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -7
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -3
- data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -6
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -4
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -4
- data/lib/datadog/ci/contrib/rspec/example.rb +5 -7
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/integration.rb +4 -6
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -4
- data/lib/datadog/ci/ext/app_types.rb +0 -2
- data/lib/datadog/ci/ext/environment.rb +77 -41
- data/lib/datadog/ci/ext/settings.rb +0 -2
- data/lib/datadog/ci/ext/test.rb +0 -2
- data/lib/datadog/ci/extensions.rb +4 -6
- data/lib/datadog/ci/flush.rb +2 -4
- data/lib/datadog/ci/test.rb +3 -5
- data/lib/datadog/ci.rb +6 -8
- data/lib/datadog/core/buffer/cruby.rb +1 -3
- data/lib/datadog/core/buffer/random.rb +0 -2
- data/lib/datadog/core/buffer/thread_safe.rb +1 -3
- data/lib/datadog/core/chunker.rb +0 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -28
- data/lib/datadog/core/configuration/base.rb +14 -4
- data/lib/datadog/core/configuration/components.rb +31 -299
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -2
- data/lib/datadog/core/configuration/ext.rb +24 -0
- data/lib/datadog/core/configuration/option.rb +0 -2
- data/lib/datadog/core/configuration/option_definition.rb +12 -5
- data/lib/datadog/core/configuration/option_definition_set.rb +1 -3
- data/lib/datadog/core/configuration/option_set.rb +0 -2
- data/lib/datadog/core/configuration/options.rb +3 -5
- data/lib/datadog/core/configuration/settings.rb +87 -257
- data/lib/datadog/core/configuration.rb +9 -10
- data/lib/datadog/core/diagnostics/environment_logger.rb +10 -7
- data/lib/datadog/core/diagnostics/health.rb +4 -24
- data/lib/datadog/core/encoding.rb +0 -4
- data/lib/datadog/core/environment/cgroup.rb +1 -5
- data/lib/datadog/core/environment/class_count.rb +0 -2
- data/lib/datadog/core/environment/container.rb +1 -5
- data/lib/datadog/core/environment/ext.rb +1 -3
- data/lib/datadog/core/environment/gc.rb +0 -2
- data/lib/datadog/core/environment/identity.rb +2 -4
- data/lib/datadog/core/environment/platform.rb +1 -3
- data/lib/datadog/core/environment/socket.rb +1 -3
- data/lib/datadog/core/environment/thread_count.rb +0 -2
- data/lib/datadog/core/environment/variable_helpers.rb +58 -12
- data/lib/datadog/core/environment/vm_cache.rb +17 -2
- data/lib/datadog/core/error.rb +1 -3
- data/lib/datadog/core/extensions.rb +1 -3
- data/lib/datadog/core/git/ext.rb +0 -2
- data/lib/datadog/core/header_collection.rb +41 -0
- data/lib/datadog/core/logger.rb +0 -2
- data/lib/datadog/core/metrics/client.rb +10 -11
- data/lib/datadog/core/metrics/ext.rb +0 -4
- data/lib/datadog/core/metrics/helpers.rb +0 -2
- data/lib/datadog/core/metrics/logging.rb +0 -2
- data/lib/datadog/core/metrics/metric.rb +0 -2
- data/lib/datadog/core/metrics/options.rb +3 -5
- data/lib/datadog/core/pin.rb +0 -2
- data/lib/datadog/core/runtime/ext.rb +3 -3
- data/lib/datadog/core/runtime/metrics.rb +27 -13
- data/lib/datadog/core/telemetry/client.rb +77 -0
- data/lib/datadog/core/telemetry/collector.rb +231 -0
- data/lib/datadog/core/telemetry/emitter.rb +46 -0
- data/lib/datadog/core/telemetry/event.rb +67 -0
- data/lib/datadog/core/telemetry/ext.rb +9 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +111 -0
- data/lib/datadog/core/telemetry/http/env.rb +18 -0
- data/lib/datadog/core/telemetry/http/ext.rb +20 -0
- data/lib/datadog/core/telemetry/http/response.rb +64 -0
- data/lib/datadog/core/telemetry/http/transport.rb +51 -0
- data/lib/datadog/core/telemetry/v1/app_event.rb +50 -0
- data/lib/datadog/core/telemetry/v1/application.rb +86 -0
- data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
- data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
- data/lib/datadog/core/telemetry/v1/host.rb +51 -0
- data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
- data/lib/datadog/core/telemetry/v1/product.rb +28 -0
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
- data/lib/datadog/core/utils/compression.rb +5 -3
- data/lib/datadog/core/utils/forking.rb +0 -2
- data/lib/datadog/core/utils/network.rb +140 -0
- data/lib/datadog/core/utils/object_set.rb +1 -3
- data/lib/datadog/core/utils/only_once.rb +0 -2
- data/lib/datadog/core/utils/safe_dup.rb +0 -2
- data/lib/datadog/core/utils/sequence.rb +5 -2
- data/lib/datadog/core/utils/string_table.rb +1 -3
- data/lib/datadog/core/utils/time.rb +3 -7
- data/lib/datadog/core/utils.rb +1 -24
- data/lib/datadog/core/vendor/ipaddr.rb +78 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -4
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -5
- data/lib/datadog/core/worker.rb +0 -2
- data/lib/datadog/core/workers/async.rb +1 -5
- data/lib/datadog/core/workers/interval_loop.rb +0 -2
- data/lib/datadog/core/workers/polling.rb +2 -4
- data/lib/datadog/core/workers/queue.rb +0 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +4 -6
- data/lib/datadog/core.rb +21 -56
- data/lib/datadog/kit/appsec/events.rb +74 -0
- data/lib/datadog/kit/enable_core_dumps.rb +6 -6
- data/lib/datadog/kit/identity.rb +15 -8
- data/lib/datadog/kit.rb +1 -3
- data/lib/datadog/opentelemetry/api/context.rb +186 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +91 -0
- data/lib/datadog/opentelemetry.rb +47 -0
- data/lib/datadog/opentracer/binary_propagator.rb +0 -2
- data/lib/datadog/opentracer/carrier.rb +0 -2
- data/lib/datadog/opentracer/distributed_headers.rb +7 -11
- data/lib/datadog/opentracer/global_tracer.rb +0 -2
- data/lib/datadog/opentracer/propagator.rb +0 -2
- data/lib/datadog/opentracer/rack_propagator.rb +10 -11
- data/lib/datadog/opentracer/scope.rb +0 -2
- data/lib/datadog/opentracer/scope_manager.rb +0 -2
- data/lib/datadog/opentracer/span.rb +1 -3
- data/lib/datadog/opentracer/span_context.rb +0 -2
- data/lib/datadog/opentracer/span_context_factory.rb +0 -2
- data/lib/datadog/opentracer/text_map_propagator.rb +13 -14
- data/lib/datadog/opentracer/thread_local_scope.rb +0 -2
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -3
- data/lib/datadog/opentracer/tracer.rb +23 -23
- data/lib/datadog/opentracer.rb +16 -18
- data/lib/datadog/profiling/backtrace_location.rb +0 -2
- data/lib/datadog/profiling/buffer.rb +3 -5
- data/lib/datadog/profiling/collectors/code_provenance.rb +0 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +96 -0
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +12 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +66 -0
- data/lib/datadog/profiling/collectors/old_stack.rb +16 -13
- data/lib/datadog/profiling/collectors/stack.rb +3 -10
- data/lib/datadog/profiling/collectors/thread_context.rb +46 -0
- data/lib/datadog/profiling/component.rb +161 -0
- data/lib/datadog/profiling/encoding/profile.rb +1 -3
- data/lib/datadog/profiling/event.rb +0 -2
- data/lib/datadog/profiling/events/stack.rb +1 -3
- data/lib/datadog/profiling/exporter.rb +23 -14
- data/lib/datadog/profiling/ext/forking.rb +36 -39
- data/lib/datadog/profiling/ext.rb +1 -2
- data/lib/datadog/profiling/flush.rb +0 -5
- data/lib/datadog/profiling/http_transport.rb +5 -6
- data/lib/datadog/profiling/load_native_extension.rb +0 -2
- data/lib/datadog/profiling/native_extension.rb +0 -2
- data/lib/datadog/profiling/old_recorder.rb +8 -7
- data/lib/datadog/profiling/pprof/builder.rb +4 -6
- data/lib/datadog/profiling/pprof/converter.rb +1 -3
- data/lib/datadog/profiling/pprof/message_set.rb +1 -3
- data/lib/datadog/profiling/pprof/payload.rb +0 -2
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -2
- data/lib/datadog/profiling/pprof/stack_sample.rb +4 -6
- data/lib/datadog/profiling/pprof/string_table.rb +1 -3
- data/lib/datadog/profiling/pprof/template.rb +5 -7
- data/lib/datadog/profiling/preload.rb +1 -3
- data/lib/datadog/profiling/profiler.rb +7 -2
- data/lib/datadog/profiling/scheduler.rb +8 -12
- data/lib/datadog/profiling/stack_recorder.rb +49 -8
- data/lib/datadog/profiling/tag_builder.rb +5 -2
- data/lib/datadog/profiling/tasks/exec.rb +0 -2
- data/lib/datadog/profiling/tasks/help.rb +0 -2
- data/lib/datadog/profiling/tasks/setup.rb +2 -11
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -4
- data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -3
- data/lib/datadog/profiling.rb +67 -27
- data/lib/datadog/tracing/analytics.rb +1 -3
- data/lib/datadog/tracing/buffer.rb +5 -9
- data/lib/datadog/tracing/client_ip.rb +61 -0
- data/lib/datadog/tracing/component.rb +176 -0
- data/lib/datadog/tracing/configuration/ext.rb +49 -6
- data/lib/datadog/tracing/configuration/settings.rb +451 -0
- data/lib/datadog/tracing/context.rb +1 -3
- data/lib/datadog/tracing/context_provider.rb +2 -4
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -7
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -6
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -5
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -6
- data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -6
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -6
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -5
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -5
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -5
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -4
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -3
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -3
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -7
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -7
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -4
- data/lib/datadog/tracing/contrib/action_view/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -4
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -4
- data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -3
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/active_job/event.rb +3 -5
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/events.rb +6 -8
- data/lib/datadog/tracing/contrib/active_job/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -4
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -6
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -7
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -6
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -3
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -6
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -8
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -4
- data/lib/datadog/tracing/contrib/active_record/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -8
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -4
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -11
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -3
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/active_support/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -7
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -3
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -3
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/analytics.rb +1 -3
- data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -6
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -5
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -6
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -7
- data/lib/datadog/tracing/contrib/aws/services.rb +0 -4
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -5
- data/lib/datadog/tracing/contrib/configurable.rb +2 -4
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -3
- data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -6
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -5
- data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +10 -7
- data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -3
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -4
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +11 -6
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -5
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -9
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -5
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -5
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -9
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -6
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -9
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/extensions.rb +5 -5
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -5
- data/lib/datadog/tracing/contrib/faraday/connection.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -10
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -7
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -9
- data/lib/datadog/tracing/contrib/grape/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -6
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/graphql/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -5
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -19
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -6
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +42 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/grpc/integration.rb +11 -6
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -8
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +45 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +20 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +42 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +21 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +39 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +42 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -4
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -5
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +37 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/http/integration.rb +6 -8
- data/lib/datadog/tracing/contrib/http/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -11
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -11
- data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/event.rb +4 -5
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -5
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -5
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -6
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -6
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -6
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -6
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -4
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -4
- data/lib/datadog/tracing/contrib/kafka/events.rb +9 -11
- data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/lograge/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -5
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -2
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -5
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -3
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -6
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -4
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -7
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/patchable.rb +0 -2
- data/lib/datadog/tracing/contrib/patcher.rb +16 -6
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +17 -4
- data/lib/datadog/tracing/contrib/pg/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +78 -41
- data/lib/datadog/tracing/contrib/pg/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -5
- data/lib/datadog/tracing/contrib/presto/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -6
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +31 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +26 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +45 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/qless/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -5
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +5 -5
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -4
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/que/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/que/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/que/patcher.rb +1 -3
- data/lib/datadog/tracing/contrib/que/tracer.rb +5 -3
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/racecar/event.rb +5 -7
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -5
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -4
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -5
- data/lib/datadog/tracing/contrib/racecar/events.rb +3 -5
- data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/rack/ext.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +170 -78
- data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -4
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -3
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/framework.rb +16 -23
- data/lib/datadog/tracing/contrib/rails/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -4
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -4
- data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -10
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -5
- data/lib/datadog/tracing/contrib/rails/utils.rb +1 -3
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +16 -3
- data/lib/datadog/tracing/contrib/rake/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -9
- data/lib/datadog/tracing/contrib/rake/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -6
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -3
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -5
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -28
- data/lib/datadog/tracing/contrib/redis/integration.rb +37 -6
- data/lib/datadog/tracing/contrib/redis/patcher.rb +56 -14
- data/lib/datadog/tracing/contrib/redis/quantize.rb +11 -10
- data/lib/datadog/tracing/contrib/redis/tags.rb +12 -12
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +70 -0
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/registerable.rb +0 -2
- data/lib/datadog/tracing/contrib/registry.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/resque/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +7 -6
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +8 -5
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -5
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +6 -7
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -7
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -7
- data/lib/datadog/tracing/contrib/sequel/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -4
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -3
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +11 -7
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -5
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -2
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -9
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +23 -3
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +7 -8
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +55 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +12 -8
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -4
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -27
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -5
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -4
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -3
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +6 -9
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -90
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -18
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -6
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +7 -5
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -4
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -4
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -5
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -8
- data/lib/datadog/tracing/contrib/utils/database.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -14
- data/lib/datadog/tracing/contrib.rb +50 -50
- data/lib/datadog/tracing/correlation.rb +16 -4
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -8
- data/lib/datadog/tracing/diagnostics/health.rb +38 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +72 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +68 -0
- data/lib/datadog/tracing/distributed/datadog.rb +200 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +19 -16
- data/lib/datadog/tracing/distributed/helpers.rb +27 -40
- data/lib/datadog/tracing/distributed/none.rb +18 -0
- data/lib/datadog/tracing/distributed/propagation.rb +126 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +373 -0
- data/lib/datadog/tracing/event.rb +1 -3
- data/lib/datadog/tracing/flush.rb +57 -37
- data/lib/datadog/tracing/metadata/analytics.rb +2 -4
- data/lib/datadog/tracing/metadata/errors.rb +2 -4
- data/lib/datadog/tracing/metadata/ext.rb +18 -12
- data/lib/datadog/tracing/metadata/tagging.rb +17 -4
- data/lib/datadog/tracing/metadata.rb +3 -5
- data/lib/datadog/tracing/pipeline/span_filter.rb +10 -8
- data/lib/datadog/tracing/pipeline/span_processor.rb +0 -2
- data/lib/datadog/tracing/pipeline.rb +3 -5
- data/lib/datadog/tracing/propagation/http.rb +3 -100
- data/lib/datadog/tracing/runtime/metrics.rb +1 -3
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -3
- data/lib/datadog/tracing/sampling/ext.rb +30 -1
- data/lib/datadog/tracing/sampling/matcher.rb +0 -2
- data/lib/datadog/tracing/sampling/priority_sampler.rb +62 -11
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -13
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -10
- data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -3
- data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -12
- data/lib/datadog/tracing/sampling/rule.rb +3 -5
- data/lib/datadog/tracing/sampling/rule_sampler.rb +8 -9
- data/lib/datadog/tracing/sampling/sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +9 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
- data/lib/datadog/tracing/span.rb +6 -24
- data/lib/datadog/tracing/span_operation.rb +11 -14
- data/lib/datadog/tracing/sync_writer.rb +5 -7
- data/lib/datadog/tracing/trace_digest.rb +88 -4
- data/lib/datadog/tracing/trace_operation.rb +60 -17
- data/lib/datadog/tracing/trace_segment.rb +20 -10
- data/lib/datadog/tracing/tracer.rb +49 -23
- data/lib/datadog/tracing/utils.rb +81 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +9 -11
- data/lib/datadog/tracing/workers.rb +3 -5
- data/lib/datadog/tracing/writer.rb +12 -7
- data/lib/datadog/tracing.rb +8 -10
- data/lib/ddtrace/auto_instrument.rb +9 -4
- data/lib/ddtrace/auto_instrument_base.rb +0 -2
- data/lib/ddtrace/profiling/preload.rb +0 -2
- data/lib/ddtrace/transport/ext.rb +7 -3
- data/lib/ddtrace/transport/http/adapters/net.rb +3 -4
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -2
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -3
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -2
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -2
- data/lib/ddtrace/transport/http/api/instance.rb +0 -2
- data/lib/ddtrace/transport/http/api/map.rb +1 -3
- data/lib/ddtrace/transport/http/api/spec.rb +0 -2
- data/lib/ddtrace/transport/http/api.rb +4 -6
- data/lib/ddtrace/transport/http/builder.rb +5 -7
- data/lib/ddtrace/transport/http/client.rb +2 -4
- data/lib/ddtrace/transport/http/env.rb +0 -2
- data/lib/ddtrace/transport/http/response.rb +1 -3
- data/lib/ddtrace/transport/http/statistics.rb +1 -3
- data/lib/ddtrace/transport/http/traces.rb +6 -8
- data/lib/ddtrace/transport/http.rb +11 -12
- data/lib/ddtrace/transport/io/client.rb +2 -4
- data/lib/ddtrace/transport/io/response.rb +1 -3
- data/lib/ddtrace/transport/io/traces.rb +3 -7
- data/lib/ddtrace/transport/io.rb +3 -5
- data/lib/ddtrace/transport/parcel.rb +0 -4
- data/lib/ddtrace/transport/request.rb +0 -2
- data/lib/ddtrace/transport/response.rb +0 -2
- data/lib/ddtrace/transport/serializable_trace.rb +9 -5
- data/lib/ddtrace/transport/statistics.rb +2 -4
- data/lib/ddtrace/transport/trace_formatter.rb +21 -12
- data/lib/ddtrace/transport/traces.rb +9 -9
- data/lib/ddtrace/version.rb +2 -4
- data/lib/ddtrace.rb +6 -10
- metadata +131 -50
- data/.editorconfig +0 -22
- data/.gitignore +0 -58
- data/CONTRIBUTING.md +0 -81
- data/ddtrace.gemspec +0 -71
- data/docs/0.x-trace.png +0 -0
- data/docs/1.0-trace.png +0 -0
- data/docs/AutoInstrumentation.md +0 -36
- data/docs/Deprecation.md +0 -8
- data/docs/DevelopmentGuide.md +0 -259
- data/docs/GettingStarted.md +0 -2712
- data/docs/ProfilingDevelopment.md +0 -109
- data/docs/PublicApi.md +0 -14
- data/docs/UpgradeGuide.md +0 -736
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +0 -269
- data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +0 -13
- data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
- data/lib/datadog/appsec/contrib/rack/request.rb +0 -58
- data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +0 -42
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -112
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
- data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
- data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
- data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
- data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
- data/lib/datadog/tracing/propagation/grpc.rb +0 -98
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../configuration/ext'
|
|
4
|
+
require_relative '../trace_digest'
|
|
5
|
+
require_relative '../trace_operation'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Tracing
|
|
9
|
+
module Distributed
|
|
10
|
+
# Provides extraction and injection of distributed trace data.
|
|
11
|
+
class Propagation
|
|
12
|
+
# DEV: This class should receive the value for
|
|
13
|
+
# DEV: `Datadog.configuration.tracing.distributed_tracing.propagation_inject_style`
|
|
14
|
+
# DEV: at initialization time, instead of constantly reading global values.
|
|
15
|
+
# DEV: This means this class should be reconfigured on `Datadog.configure` calls, thus
|
|
16
|
+
# DEV: singleton instances should not used as they will become stale.
|
|
17
|
+
#
|
|
18
|
+
# @param propagation_styles [Hash<String,Object>]
|
|
19
|
+
def initialize(propagation_styles:)
|
|
20
|
+
@propagation_styles = propagation_styles
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# inject! populates the env with span ID, trace ID and sampling priority
|
|
24
|
+
#
|
|
25
|
+
# This method will never raise errors, but instead log them to `Datadog.logger`.
|
|
26
|
+
#
|
|
27
|
+
# DEV-2.0: inject! should work without arguments, injecting the active_trace's digest
|
|
28
|
+
# DEV-2.0: and returning a new Hash with the injected data.
|
|
29
|
+
# DEV-2.0: inject! should also accept either a `trace` or a `digest`, as a `trace`
|
|
30
|
+
# DEV-2.0: argument is the common use case, but also allows us to set error tags in the `trace`
|
|
31
|
+
# DEV-2.0: if needed.
|
|
32
|
+
# DEV-2.0: Ideally, we'd have a separate stream to report tracer errors and never
|
|
33
|
+
# DEV-2.0: touch the active span.
|
|
34
|
+
#
|
|
35
|
+
# @param digest [TraceDigest]
|
|
36
|
+
# @param data [Hash]
|
|
37
|
+
# @return [Boolean] `true` if injected successfully, `false` if no propagation style is configured
|
|
38
|
+
# @return [nil] in case of error, see `Datadog.logger` output for details.
|
|
39
|
+
def inject!(digest, data)
|
|
40
|
+
if digest.nil?
|
|
41
|
+
::Datadog.logger.debug('Cannot inject distributed trace data: digest is nil.')
|
|
42
|
+
return nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
digest = digest.to_digest if digest.respond_to?(:to_digest)
|
|
46
|
+
|
|
47
|
+
result = false
|
|
48
|
+
|
|
49
|
+
# Inject all configured propagation styles
|
|
50
|
+
::Datadog.configuration.tracing.distributed_tracing.propagation_inject_style.each do |style|
|
|
51
|
+
propagator = @propagation_styles[style]
|
|
52
|
+
begin
|
|
53
|
+
if propagator
|
|
54
|
+
propagator.inject!(digest, data)
|
|
55
|
+
result = true
|
|
56
|
+
end
|
|
57
|
+
rescue => e
|
|
58
|
+
result = nil
|
|
59
|
+
::Datadog.logger.error(
|
|
60
|
+
"Error injecting distributed trace data. Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# extract returns {TraceDigest} containing the distributed trace information.
|
|
69
|
+
# sampling priority defined in data.
|
|
70
|
+
#
|
|
71
|
+
# This method will never raise errors, but instead log them to `Datadog.logger`.
|
|
72
|
+
#
|
|
73
|
+
# @param data [Hash]
|
|
74
|
+
def extract(data)
|
|
75
|
+
trace_digest = nil
|
|
76
|
+
dd_trace_digest = nil
|
|
77
|
+
|
|
78
|
+
::Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
|
|
79
|
+
propagator = @propagation_styles[style]
|
|
80
|
+
next if propagator.nil?
|
|
81
|
+
|
|
82
|
+
begin
|
|
83
|
+
extracted_trace_digest = propagator.extract(data)
|
|
84
|
+
rescue => e
|
|
85
|
+
::Datadog.logger.error(
|
|
86
|
+
'Error extracting distributed trace data. ' \
|
|
87
|
+
"Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
88
|
+
)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Skip if no valid data was found
|
|
92
|
+
next if extracted_trace_digest.nil?
|
|
93
|
+
|
|
94
|
+
# Keep track of the Datadog extracted digest, we want to return it if we have it.
|
|
95
|
+
if extracted_trace_digest && style == Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG
|
|
96
|
+
dd_trace_digest = extracted_trace_digest
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# No previously extracted trace data, use the one we just extracted
|
|
100
|
+
if trace_digest.nil?
|
|
101
|
+
trace_digest = extracted_trace_digest
|
|
102
|
+
else
|
|
103
|
+
unless trace_digest.trace_id == extracted_trace_digest.trace_id \
|
|
104
|
+
&& trace_digest.span_id == extracted_trace_digest.span_id
|
|
105
|
+
# We have two mismatched propagation contexts
|
|
106
|
+
::Datadog.logger.debug do
|
|
107
|
+
'Cannot extract distributed trace data: extracted styles differ, ' \
|
|
108
|
+
"#{trace_digest.trace_id} != #{extracted_trace_digest.trace_id} && " \
|
|
109
|
+
"#{trace_digest.span_id} != #{extracted_trace_digest.span_id}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# It's safer to create a new context than to attach ourselves to the wrong context
|
|
113
|
+
return TraceDigest.new # Early return from the whole method
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Return the extracted trace digest if we found one or else a new empty digest.
|
|
119
|
+
# Always return the Datadog trace digest if one exists since it has more
|
|
120
|
+
# information than the B3 digest, e.g. origin, priority sampling values.
|
|
121
|
+
dd_trace_digest || trace_digest || nil
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Distributed
|
|
6
|
+
# W3C Trace Context propagator implementation, version 00.
|
|
7
|
+
# The trace is propagated through two fields: `traceparent` and `tracestate`.
|
|
8
|
+
# @see https://www.w3.org/TR/trace-context/
|
|
9
|
+
class TraceContext
|
|
10
|
+
TRACEPARENT_KEY = 'traceparent'
|
|
11
|
+
TRACESTATE_KEY = 'tracestate'
|
|
12
|
+
SPEC_VERSION = '00'
|
|
13
|
+
|
|
14
|
+
def initialize(
|
|
15
|
+
fetcher:,
|
|
16
|
+
traceparent_key: TRACEPARENT_KEY,
|
|
17
|
+
tracestate_key: TRACESTATE_KEY
|
|
18
|
+
)
|
|
19
|
+
@fetcher = fetcher
|
|
20
|
+
@traceparent_key = traceparent_key
|
|
21
|
+
@tracestate_key = tracestate_key
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def inject!(digest, data)
|
|
25
|
+
return if digest.nil?
|
|
26
|
+
|
|
27
|
+
if (traceparent = build_traceparent(digest))
|
|
28
|
+
data[@traceparent_key] = traceparent
|
|
29
|
+
|
|
30
|
+
if (tracestate = build_tracestate(digest))
|
|
31
|
+
data[@tracestate_key] = tracestate
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
data
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def extract(data)
|
|
39
|
+
fetcher = @fetcher.new(data)
|
|
40
|
+
|
|
41
|
+
trace_id, parent_id, sampled, trace_flags = extract_traceparent(fetcher[@traceparent_key])
|
|
42
|
+
|
|
43
|
+
return unless trace_id # Could not parse traceparent
|
|
44
|
+
|
|
45
|
+
tracestate, sampling_priority, origin, tags, unknown_fields = extract_tracestate(fetcher[@tracestate_key])
|
|
46
|
+
|
|
47
|
+
sampling_priority = parse_priority_sampling(sampled, sampling_priority)
|
|
48
|
+
|
|
49
|
+
TraceDigest.new(
|
|
50
|
+
span_id: parent_id,
|
|
51
|
+
trace_id: trace_id,
|
|
52
|
+
trace_origin: origin,
|
|
53
|
+
trace_sampling_priority: sampling_priority,
|
|
54
|
+
trace_distributed_tags: tags,
|
|
55
|
+
trace_flags: trace_flags,
|
|
56
|
+
trace_state: tracestate,
|
|
57
|
+
trace_state_unknown_fields: unknown_fields,
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
# Refinements to ensure newer rubies do not suffer performance impact
|
|
64
|
+
# by needing to use older APIs.
|
|
65
|
+
module Refine
|
|
66
|
+
# Backport `Regexp::match?` because it is measurably the most performant
|
|
67
|
+
# way to check if a string matches a regular expression.
|
|
68
|
+
unless Regexp.method_defined?(:match?)
|
|
69
|
+
refine ::Regexp do
|
|
70
|
+
def match?(*args)
|
|
71
|
+
!match(*args).nil?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
unless String.method_defined?(:delete_prefix)
|
|
77
|
+
refine ::String do
|
|
78
|
+
def delete_prefix(prefix)
|
|
79
|
+
prefix = prefix.to_s
|
|
80
|
+
if rindex(prefix, 0)
|
|
81
|
+
self[prefix.length..-1]
|
|
82
|
+
else
|
|
83
|
+
dup
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
using Refine
|
|
90
|
+
|
|
91
|
+
# @see https://www.w3.org/TR/trace-context/#traceparent-header
|
|
92
|
+
def build_traceparent(digest)
|
|
93
|
+
build_traceparent_string(
|
|
94
|
+
digest.trace_id,
|
|
95
|
+
digest.span_id,
|
|
96
|
+
build_trace_flags(digest)
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# For the current version (00), the traceparent has the following format:
|
|
101
|
+
#
|
|
102
|
+
# `"#{version}-#{trace_id}-#{parent_id}-#{trace_flags}"`
|
|
103
|
+
#
|
|
104
|
+
# Where:
|
|
105
|
+
# * `version`: 2 hex-encoded digits, zero padded.
|
|
106
|
+
# * `trace_id`: 32 hex-encoded digits, zero padded.
|
|
107
|
+
# * `parent_id`: 16 hex-encoded digits, zero padded.
|
|
108
|
+
# * `trace_flags`: 2 hex-encoded digits, zero padded.
|
|
109
|
+
#
|
|
110
|
+
# All hex values should be lowercase.
|
|
111
|
+
#
|
|
112
|
+
# @param trace_id [Integer] 128-bit
|
|
113
|
+
# @param parent_id [Integer] 64-bit
|
|
114
|
+
# @param trace_flags [Integer] 8-bit
|
|
115
|
+
def build_traceparent_string(trace_id, parent_id, trace_flags)
|
|
116
|
+
"00-#{format('%032x', trace_id)}-#{format('%016x', parent_id)}-#{format('%02x', trace_flags)}"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Sets the trace flag to an existing `trace_flags`.
|
|
120
|
+
def build_trace_flags(digest)
|
|
121
|
+
trace_flags = digest.trace_flags || DEFAULT_TRACE_FLAGS
|
|
122
|
+
|
|
123
|
+
if digest.trace_sampling_priority
|
|
124
|
+
if Tracing::Sampling::PrioritySampler.sampled?(digest.trace_sampling_priority)
|
|
125
|
+
trace_flags |= TRACE_FLAGS_SAMPLED
|
|
126
|
+
else
|
|
127
|
+
trace_flags &= ~TRACE_FLAGS_SAMPLED
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
trace_flags
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# @see https://www.w3.org/TR/trace-context/#tracestate-header
|
|
135
|
+
def build_tracestate(digest)
|
|
136
|
+
tracestate = String.new('dd=')
|
|
137
|
+
tracestate << "s:#{digest.trace_sampling_priority};" if digest.trace_sampling_priority
|
|
138
|
+
tracestate << "o:#{serialize_origin(digest.trace_origin)};" if digest.trace_origin
|
|
139
|
+
|
|
140
|
+
if digest.trace_distributed_tags
|
|
141
|
+
digest.trace_distributed_tags.each do |name, value|
|
|
142
|
+
tag = "t.#{serialize_tag_key(name)}:#{serialize_tag_value(value)};"
|
|
143
|
+
|
|
144
|
+
# If tracestate size limit is exceed, drop the remaining data.
|
|
145
|
+
# String#bytesize is used because only ASCII characters are allowed.
|
|
146
|
+
#
|
|
147
|
+
# We add 1 to the limit because of the trailing comma, which will be removed before returning.
|
|
148
|
+
break if tracestate.bytesize + tag.bytesize > (TRACESTATE_VALUE_SIZE_LIMIT + 1)
|
|
149
|
+
|
|
150
|
+
tracestate << tag
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
tracestate << digest.trace_state_unknown_fields if digest.trace_state_unknown_fields
|
|
155
|
+
|
|
156
|
+
# Is there any Datadog-specific information to propagate.
|
|
157
|
+
# Check for > 3 size because the empty prefix `dd=` has 3 characters.
|
|
158
|
+
if tracestate.size > 3
|
|
159
|
+
# Propagate upstream tracestate with `dd=...` appended to the list
|
|
160
|
+
tracestate.chop! # Removes trailing `;` from Datadog trace state string.
|
|
161
|
+
|
|
162
|
+
if digest.trace_state
|
|
163
|
+
# Delete existing `dd=` tracestate fields, if present.
|
|
164
|
+
vendors = split_tracestate(digest.trace_state)
|
|
165
|
+
vendors.reject! { |v| v.start_with?('dd=') }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
if vendors && !vendors.empty?
|
|
169
|
+
# Ensure the list has at most 31 elements, as we need to prepend Datadog's
|
|
170
|
+
# entry and the limit is 32 elements total.
|
|
171
|
+
vendors = vendors[0..30]
|
|
172
|
+
"#{tracestate},#{vendors.join(',')}"
|
|
173
|
+
else
|
|
174
|
+
tracestate.to_s
|
|
175
|
+
end
|
|
176
|
+
else
|
|
177
|
+
digest.trace_state # Propagate upstream tracestate with no Datadog changes
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# If any characters in <origin_value> are invalid, replace each invalid character with 0x5F (underscore).
|
|
182
|
+
# Invalid characters are: characters outside the ASCII range 0x20 to 0x7E, 0x2C (comma), and 0x3D (equals).
|
|
183
|
+
def serialize_origin(value)
|
|
184
|
+
# DEV: It's unlikely that characters will be out of range, as they mostly
|
|
185
|
+
# DEV: come from Datadog-controlled sources.
|
|
186
|
+
# DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
|
|
187
|
+
if INVALID_ORIGIN_CHARS.match?(value)
|
|
188
|
+
value.gsub(INVALID_ORIGIN_CHARS, '_')
|
|
189
|
+
else
|
|
190
|
+
value
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Serialize `_dd.p.{key}` by first removing the `_dd.p.` prefix.
|
|
195
|
+
# Then replacing invalid characters with `_`.
|
|
196
|
+
def serialize_tag_key(name)
|
|
197
|
+
key = name.delete_prefix(Tracing::Metadata::Ext::Distributed::TAGS_PREFIX)
|
|
198
|
+
|
|
199
|
+
# DEV: It's unlikely that characters will be out of range, as they mostly
|
|
200
|
+
# DEV: come from Datadog-controlled sources.
|
|
201
|
+
# DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
|
|
202
|
+
if INVALID_TAG_KEY_CHARS.match?(key)
|
|
203
|
+
key.gsub(INVALID_TAG_KEY_CHARS, '_')
|
|
204
|
+
else
|
|
205
|
+
key
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Replaces invalid characters with `_`, then replaces `=` with `:`.
|
|
210
|
+
def serialize_tag_value(value)
|
|
211
|
+
# DEV: It's unlikely that characters will be out of range, as they mostly
|
|
212
|
+
# DEV: come from Datadog-controlled sources.
|
|
213
|
+
# DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
|
|
214
|
+
ret = if INVALID_TAG_VALUE_CHARS.match?(value)
|
|
215
|
+
value.gsub(INVALID_TAG_VALUE_CHARS, '_')
|
|
216
|
+
else
|
|
217
|
+
value
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# DEV: Checking for an unlikely '=' is faster than a no-op `tr!`.
|
|
221
|
+
ret.tr!('=', ':') if ret.include?('=')
|
|
222
|
+
ret
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def extract_traceparent(traceparent)
|
|
226
|
+
trace_id, parent_id, trace_flags = parse_traceparent_string(traceparent)
|
|
227
|
+
|
|
228
|
+
# Return unless all traceparent fields are valid.
|
|
229
|
+
return unless trace_id && !trace_id.zero? && parent_id && !parent_id.zero? && trace_flags
|
|
230
|
+
|
|
231
|
+
sampled = parse_sampled_flag(trace_flags)
|
|
232
|
+
|
|
233
|
+
[trace_id, parent_id, sampled, trace_flags]
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def parse_traceparent_string(traceparent)
|
|
237
|
+
return unless traceparent
|
|
238
|
+
|
|
239
|
+
version, trace_id, parent_id, trace_flags, extra = traceparent.strip.split('-')
|
|
240
|
+
|
|
241
|
+
return if version == INVALID_VERSION
|
|
242
|
+
|
|
243
|
+
# Extra fields are not allowed in version 00, but we have to be lenient for future versions.
|
|
244
|
+
return if version == SPEC_VERSION && extra
|
|
245
|
+
|
|
246
|
+
# Invalid field sizes
|
|
247
|
+
return if version.size != 2 || trace_id.size != 32 || parent_id.size != 16 || trace_flags.size != 2
|
|
248
|
+
|
|
249
|
+
[Integer(trace_id, 16), Integer(parent_id, 16), Integer(trace_flags, 16)]
|
|
250
|
+
rescue ArgumentError # Conversion to integer failed
|
|
251
|
+
nil
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def parse_sampled_flag(trace_flags)
|
|
255
|
+
trace_flags & TRACE_FLAGS_SAMPLED
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# @return [Array<String,Integer,String,Hash>] returns 4 values: tracestate, sampling_priority, origin, tags.
|
|
259
|
+
def extract_tracestate(tracestate)
|
|
260
|
+
return unless tracestate
|
|
261
|
+
|
|
262
|
+
vendors = split_tracestate(tracestate)
|
|
263
|
+
|
|
264
|
+
# Find Datadog's `dd=` tracestate field.
|
|
265
|
+
idx = vendors.index { |v| v.start_with?('dd=') }
|
|
266
|
+
return tracestate unless idx
|
|
267
|
+
|
|
268
|
+
# Delete `dd=` prefix
|
|
269
|
+
dd_tracestate = vendors.delete_at(idx)
|
|
270
|
+
dd_tracestate.slice!(0..2)
|
|
271
|
+
|
|
272
|
+
origin, sampling_priority, tags, unknown_fields = extract_datadog_fields(dd_tracestate)
|
|
273
|
+
|
|
274
|
+
[vendors.join(','), sampling_priority, origin, tags, unknown_fields]
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def extract_datadog_fields(dd_tracestate)
|
|
278
|
+
sampling_priority = nil
|
|
279
|
+
origin = nil
|
|
280
|
+
tags = nil
|
|
281
|
+
unknown_fields = nil
|
|
282
|
+
|
|
283
|
+
# DEV: Since Ruby 2.6 `split` can receive a block, so `each` can be removed then.
|
|
284
|
+
dd_tracestate.split(';').each do |pair|
|
|
285
|
+
key, value = pair.split(':', 2)
|
|
286
|
+
case key
|
|
287
|
+
when 's'
|
|
288
|
+
sampling_priority = Integer(value) rescue nil
|
|
289
|
+
when 'o'
|
|
290
|
+
origin = value
|
|
291
|
+
when /^t\./
|
|
292
|
+
key.slice!(0..1) # Delete `t.` prefix
|
|
293
|
+
|
|
294
|
+
# Ignore the high order 64 bit trace id propagation tag to avoid confusion,
|
|
295
|
+
# the single source of truth is from traceparent
|
|
296
|
+
next if key == Tracing::Metadata::Ext::Distributed::TID
|
|
297
|
+
|
|
298
|
+
value = deserialize_tag_value(value)
|
|
299
|
+
|
|
300
|
+
tags ||= {}
|
|
301
|
+
tags["#{Tracing::Metadata::Ext::Distributed::TAGS_PREFIX}#{key}"] = value
|
|
302
|
+
else
|
|
303
|
+
unknown_fields ||= String.new
|
|
304
|
+
unknown_fields << pair
|
|
305
|
+
unknown_fields << ';'
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
[origin, sampling_priority, tags, unknown_fields]
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Restore `:` back to `=`.
|
|
313
|
+
def deserialize_tag_value(value)
|
|
314
|
+
value.tr!(':', '=')
|
|
315
|
+
value
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# If `sampled` and `sampling_priority` disagree, `sampled` overrides the decision.
|
|
319
|
+
# @return [Integer] one of the {Datadog::Tracing::Sampling::Ext::Priority} values
|
|
320
|
+
def parse_priority_sampling(sampled, sampling_priority)
|
|
321
|
+
# If both fields agree
|
|
322
|
+
if sampling_priority &&
|
|
323
|
+
(!Tracing::Sampling::PrioritySampler.sampled?(sampling_priority) && sampled == 0 || # Both drop
|
|
324
|
+
Tracing::Sampling::PrioritySampler.sampled?(sampling_priority) && sampled == 1) # Both keep
|
|
325
|
+
|
|
326
|
+
return sampling_priority # Return the richer `sampling_priority`
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
sampled # Sampled flag trumps `sampling_priority` on conflict
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
def split_tracestate(tracestate)
|
|
333
|
+
tracestate.split(/[ \t]*,[ \t]*/)[0..31]
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# Version 0xFF is invalid as per spec
|
|
337
|
+
# @see https://www.w3.org/TR/trace-context/#version
|
|
338
|
+
INVALID_VERSION = 'ff'
|
|
339
|
+
private_constant :INVALID_VERSION
|
|
340
|
+
|
|
341
|
+
# Empty 8-bit `trace-flags`.
|
|
342
|
+
# @see https://www.w3.org/TR/trace-context/#trace-flags
|
|
343
|
+
DEFAULT_TRACE_FLAGS = 0b00000000
|
|
344
|
+
private_constant :DEFAULT_TRACE_FLAGS
|
|
345
|
+
|
|
346
|
+
# Bit-mask for `trace-flags` that represents a sampled span (sampled==true).
|
|
347
|
+
# @see https://www.w3.org/TR/trace-context/#trace-flags
|
|
348
|
+
TRACE_FLAGS_SAMPLED = 0b00000001
|
|
349
|
+
private_constant :TRACE_FLAGS_SAMPLED
|
|
350
|
+
|
|
351
|
+
# The limit is inclusive: sizes *greater* than 256 are disallowed.
|
|
352
|
+
# @see https://www.w3.org/TR/trace-context/#value
|
|
353
|
+
TRACESTATE_VALUE_SIZE_LIMIT = 256
|
|
354
|
+
private_constant :TRACESTATE_VALUE_SIZE_LIMIT
|
|
355
|
+
|
|
356
|
+
# Replace all characters with `_`, except ASCII characters 0x20-0x7E.
|
|
357
|
+
# Additionally, `,`, ';', and `=` must also be replaced by `_`.
|
|
358
|
+
INVALID_ORIGIN_CHARS = /[\u0000-\u0019,;=\u007F-\u{10FFFF}]/.freeze
|
|
359
|
+
private_constant :INVALID_ORIGIN_CHARS
|
|
360
|
+
|
|
361
|
+
# Replace all characters with `_`, except ASCII characters 0x21-0x7E.
|
|
362
|
+
# Additionally, `,` and `=` must also be replaced by `_`.
|
|
363
|
+
INVALID_TAG_KEY_CHARS = /[\u0000-\u0020,=\u007F-\u{10FFFF}]/.freeze
|
|
364
|
+
private_constant :INVALID_TAG_KEY_CHARS
|
|
365
|
+
|
|
366
|
+
# Replace all characters with `_`, except ASCII characters 0x20-0x7E.
|
|
367
|
+
# Additionally, `,`, ':' and `;` must also be replaced by `_`.
|
|
368
|
+
INVALID_TAG_VALUE_CHARS = /[\u0000-\u001F,:;\u007F-\u{10FFFF}]/.freeze
|
|
369
|
+
private_constant :INVALID_TAG_VALUE_CHARS
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
end
|
|
@@ -1,73 +1,93 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
|
|
3
1
|
module Datadog
|
|
4
2
|
module Tracing
|
|
5
3
|
module Flush
|
|
6
|
-
# Consumes
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
# Consumes and returns a {TraceSegment} to be flushed, from
|
|
5
|
+
# the provided {TraceSegment}.
|
|
6
|
+
#
|
|
7
|
+
# Only finished spans are consumed. Any spans consumed are
|
|
8
|
+
# removed from +trace_op+ as a side effect. Unfinished spans are
|
|
9
|
+
# unaffected.
|
|
10
|
+
#
|
|
11
|
+
# @abstract
|
|
12
|
+
class Base
|
|
13
|
+
# Consumes and returns a {TraceSegment} to be flushed, from
|
|
14
|
+
# the provided {TraceSegment}.
|
|
10
15
|
#
|
|
11
|
-
#
|
|
16
|
+
# Only finished spans are consumed. Any spans consumed are
|
|
17
|
+
# removed from +trace_op+ as a side effect. Unfinished spans are
|
|
18
|
+
# unaffected.
|
|
12
19
|
#
|
|
20
|
+
# @param [TraceOperation] trace_op
|
|
13
21
|
# @return [TraceSegment] trace to be flushed, or +nil+ if the trace is not finished
|
|
14
22
|
def consume!(trace_op)
|
|
15
|
-
return unless
|
|
23
|
+
return unless flush?(trace_op)
|
|
16
24
|
|
|
17
25
|
get_trace(trace_op)
|
|
18
26
|
end
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
# Should we consume spans from the +trace_op+?
|
|
29
|
+
# @abstract
|
|
30
|
+
def flush?(trace_op)
|
|
31
|
+
raise NotImplementedError
|
|
22
32
|
end
|
|
23
33
|
|
|
24
34
|
protected
|
|
25
35
|
|
|
36
|
+
# Consumes all finished spans from trace.
|
|
37
|
+
# @return [TraceSegment]
|
|
26
38
|
def get_trace(trace_op)
|
|
27
|
-
trace_op.flush!
|
|
39
|
+
trace_op.flush! do |spans|
|
|
40
|
+
spans.select! { |span| single_sampled?(span) } unless trace_op.sampled?
|
|
41
|
+
|
|
42
|
+
spans
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Single Span Sampling has chosen to keep this span
|
|
47
|
+
# regardless of the trace-level sampling decision
|
|
48
|
+
def single_sampled?(span)
|
|
49
|
+
span.get_metric(Sampling::Span::Ext::TAG_MECHANISM) == Sampling::Ext::Mechanism::SPAN_SAMPLING_RATE
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Consumes and returns completed traces (where all spans have finished),
|
|
54
|
+
# if any, from the provided +trace_op+.
|
|
55
|
+
#
|
|
56
|
+
# Spans consumed are removed from +trace_op+ as a side effect.
|
|
57
|
+
class Finished < Base
|
|
58
|
+
# Are all spans finished?
|
|
59
|
+
def flush?(trace_op)
|
|
60
|
+
trace_op && trace_op.finished?
|
|
28
61
|
end
|
|
29
62
|
end
|
|
30
63
|
|
|
31
|
-
#
|
|
32
|
-
|
|
64
|
+
# Consumes and returns completed or partially completed
|
|
65
|
+
# traces from the provided +trace_op+, if any.
|
|
66
|
+
#
|
|
67
|
+
# Partial trace flushing avoids large traces residing in memory for too long.
|
|
68
|
+
#
|
|
69
|
+
# Partially completed traces, where not all spans have finished,
|
|
70
|
+
# will only be returned if there are at least
|
|
71
|
+
# +@min_spans_for_partial+ finished spans.
|
|
72
|
+
#
|
|
73
|
+
# Spans consumed are removed from +trace_op+ as a side effect.
|
|
74
|
+
class Partial < Base
|
|
33
75
|
# Start flushing partial trace after this many active spans in one trace
|
|
34
76
|
DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH = 500
|
|
35
77
|
|
|
36
78
|
attr_reader :min_spans_for_partial
|
|
37
79
|
|
|
38
80
|
def initialize(options = {})
|
|
81
|
+
super()
|
|
39
82
|
@min_spans_for_partial = options.fetch(:min_spans_before_partial_flush, DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH)
|
|
40
83
|
end
|
|
41
84
|
|
|
42
|
-
|
|
43
|
-
# traces from the provided +trace_op+, if any.
|
|
44
|
-
#
|
|
45
|
-
# Partially completed traces, where not all spans have finished,
|
|
46
|
-
# will only be returned if there are at least
|
|
47
|
-
# +@min_spans_for_partial+ finished spans.
|
|
48
|
-
#
|
|
49
|
-
# Any spans consumed are removed from +trace_op+ as a side effect.
|
|
50
|
-
#
|
|
51
|
-
# @return [TraceSegment] partial or complete trace to be flushed, or +nil+ if no spans are finished
|
|
52
|
-
def consume!(trace_op)
|
|
53
|
-
return unless partial_flush?(trace_op)
|
|
54
|
-
|
|
55
|
-
get_trace(trace_op)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def partial_flush?(trace_op)
|
|
59
|
-
return false unless trace_op.sampled?
|
|
85
|
+
def flush?(trace_op)
|
|
60
86
|
return true if trace_op.finished?
|
|
61
87
|
return false if trace_op.finished_span_count < @min_spans_for_partial
|
|
62
88
|
|
|
63
89
|
true
|
|
64
90
|
end
|
|
65
|
-
|
|
66
|
-
protected
|
|
67
|
-
|
|
68
|
-
def get_trace(trace_op)
|
|
69
|
-
trace_op.flush!
|
|
70
|
-
end
|
|
71
91
|
end
|
|
72
92
|
end
|
|
73
93
|
end
|