From 76d75c7dbda9b6bdb7ebf8d630f7d6be4e6b558b Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Mon, 2 Jan 2023 16:57:09 +0100 Subject: [PATCH 01/12] Implementation for distributed tracing --- Appraisals | 2 +- .../tracing/contrib/sidekiq/client_tracer.rb | 11 ++++- .../contrib/sidekiq/configuration/settings.rb | 1 + .../contrib/sidekiq/distributed/fetcher.rb | 17 ++++++++ .../sidekiq/distributed/propagation.rb | 40 +++++++++++++++++++ .../tracing/contrib/sidekiq/server_tracer.rb | 10 +++++ 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb create mode 100644 lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb diff --git a/Appraisals b/Appraisals index 6c76d12b644..c682611404d 100644 --- a/Appraisals +++ b/Appraisals @@ -1650,7 +1650,7 @@ elsif ruby_version?('3.2') gem 'semantic_logger', '~> 4.0' gem 'sequel' gem 'shoryuken' - gem 'sidekiq' + gem 'sidekiq', '~> 6' # TODO: Support sidekiq 7.x gem 'sneakers', '>= 2.12.0' gem 'sqlite3', '>= 1.4.2' gem 'sucker_punch' diff --git a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb index 8682b7deaa7..79e8d2bb662 100644 --- a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb @@ -2,6 +2,7 @@ require_relative '../../metadata/ext' require_relative '../analytics' +require_relative 'distributed/propagation' require_relative 'ext' require_relative 'tracing' @@ -22,7 +23,11 @@ def initialize(options = {}) def call(worker_class, job, queue, redis_pool) resource = job_resource(job) - Datadog::Tracing.trace(Ext::SPAN_PUSH, service: @sidekiq_service) do |span| + Datadog::Tracing.trace(Ext::SPAN_PUSH, service: @sidekiq_service) do |span, trace_op| + if configuration[:distributed_tracing] + propagation.inject!(trace_op, job) + end + span.resource = resource span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT) @@ -50,6 +55,10 @@ def call(worker_class, job, queue, redis_pool) def configuration Datadog.configuration.tracing[:sidekiq] end + + def propagation + Sidekiq::Distributed::Propagation::INSTANCE + end end end end diff --git a/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb b/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb index 47a905ea1e6..3b9b72a643a 100644 --- a/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb @@ -36,6 +36,7 @@ class Settings < Contrib::Configuration::Settings option :client_service_name option :error_handler, default: Tracing::SpanOperation::Events::DEFAULT_ON_ERROR option :quantize, default: {} + option :distributed_tracing, default: false end end end diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb new file mode 100644 index 00000000000..ed0ee3f4b99 --- /dev/null +++ b/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: false +# typed: false + +require_relative '../../../distributed/fetcher' + +module Datadog + module Tracing + module Contrib + module Sidekiq + module Distributed + class Fetcher < Tracing::Distributed::Fetcher + end + end + end + end + end +end diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb new file mode 100644 index 00000000000..7ea2aa77fd8 --- /dev/null +++ b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true +# typed: true + +require_relative 'fetcher' +require_relative '../../../distributed/propagation' +require_relative '../../../distributed/b3_multi' +require_relative '../../../distributed/b3_single' +require_relative '../../../distributed/datadog' +require_relative '../../../distributed/none' +require_relative '../../../distributed/trace_context' + +module Datadog + module Tracing + module Contrib + module Sidekiq + module Distributed + # Extracts and injects propagation through HTTP headers. + class Propagation < Tracing::Distributed::Propagation + def initialize + super( + propagation_styles: { + Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_MULTI_HEADER => + Tracing::Distributed::B3Multi.new(fetcher: Fetcher), + Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER => + Tracing::Distributed::B3Single.new(fetcher: Fetcher), + Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG => + Tracing::Distributed::Datadog.new(fetcher: Fetcher), + Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT => + Tracing::Distributed::TraceContext.new(fetcher: Fetcher), + Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new + }) + end + + INSTANCE = Propagation.new + end + end + end + end + end +end diff --git a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb index 5915d855369..ef300968d1d 100644 --- a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb @@ -5,6 +5,7 @@ require_relative 'ext' require_relative 'tracing' require_relative '../utils/quantization/hash' +require_relative 'distributed/propagation' module Datadog module Tracing @@ -24,6 +25,11 @@ def initialize(options = {}) def call(worker, job, queue) resource = job_resource(job) + if configuration[:distributed_tracing] + trace_digest = propagation.extract(job) + Datadog::Tracing.continue_trace!(trace_digest) + end + service = worker_config(resource, :service_name) || @sidekiq_service # DEV-2.0: Remove `tag_args`, as `quantize` can fulfill the same contract tag_args = worker_config(resource, :tag_args) || configuration[:tag_args] @@ -72,6 +78,10 @@ def call(worker, job, queue) private + def propagation + Sidekiq::Distributed::Propagation::INSTANCE + end + def quantize_args(quantize, args) quantize_options = quantize && quantize[:args] quantize_options ||= {} From 3ec5c352bfac62d4988ded9f47c8dca579e8b87b Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Mon, 2 Jan 2023 16:58:08 +0100 Subject: [PATCH 02/12] Change scope for Sidekiq::Extensions.enable_delay! --- spec/datadog/tracing/contrib/sidekiq/client_tracer_spec.rb | 3 ++- spec/datadog/tracing/contrib/sidekiq/server_tracer_spec.rb | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/spec/datadog/tracing/contrib/sidekiq/client_tracer_spec.rb b/spec/datadog/tracing/contrib/sidekiq/client_tracer_spec.rb index b1f5bf8c9b4..6bd7ab12e05 100644 --- a/spec/datadog/tracing/contrib/sidekiq/client_tracer_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/client_tracer_spec.rb @@ -19,7 +19,6 @@ end Sidekiq::Testing.server_middleware.clear - Sidekiq::Extensions.enable_delay! if Sidekiq::VERSION > '5.0.0' end it 'traces job push' do @@ -68,6 +67,8 @@ pending 'Broken in Ruby 3.1.0-preview1, see https://github.com/mperham/sidekiq/issues/5064' end + Sidekiq::Extensions.enable_delay! if Sidekiq::VERSION > '5.0.0' + stub_const( 'DelayableClass', Class.new do diff --git a/spec/datadog/tracing/contrib/sidekiq/server_tracer_spec.rb b/spec/datadog/tracing/contrib/sidekiq/server_tracer_spec.rb index 9b78d6148d7..6a79877e7c4 100644 --- a/spec/datadog/tracing/contrib/sidekiq/server_tracer_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/server_tracer_spec.rb @@ -16,8 +16,6 @@ Sidekiq::Testing.server_middleware do |chain| chain.add(Datadog::Tracing::Contrib::Sidekiq::ServerTracer) end - - Sidekiq::Extensions.enable_delay! if Sidekiq::VERSION > '5.0.0' end it 'traces async job run' do @@ -26,6 +24,7 @@ expect(spans).to have(2).items span, _push = spans + expect(span.service).to eq(tracer.default_service) expect(span.resource).to eq('EmptyWorker') expect(span.get_tag('sidekiq.job.queue')).to eq('default') @@ -184,6 +183,8 @@ def perform(id) end pending 'Broken in Ruby 3.1.0-preview1, see https://github.com/mperham/sidekiq/issues/5064' end + Sidekiq::Extensions.enable_delay! if Sidekiq::VERSION > '5.0.0' + stub_const( 'DelayableClass', Class.new do From 325cdd2615e6cf37e9741a441de712a1d665c6f9 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Mon, 2 Jan 2023 16:59:06 +0100 Subject: [PATCH 03/12] Spec for distributed tracing --- .../sidekiq/distributed_tracing_spec.rb | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb new file mode 100644 index 00000000000..30165279574 --- /dev/null +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -0,0 +1,119 @@ +# typed: ignore + +require 'datadog/tracing/contrib/support/spec_helper' + +require 'datadog/tracing/contrib/sidekiq/integration' +require 'datadog/tracing/contrib/sidekiq/client_tracer' +require 'datadog/tracing/contrib/sidekiq/server_tracer' + +require 'sidekiq/testing' +require 'sidekiq/api' + +RSpec.describe 'Sidekiq distributed tracing' do + around do |example| + Sidekiq::Testing.fake! do + Sidekiq::Testing.server_middleware.clear + Sidekiq::Testing.server_middleware do |chain| + chain.add(Datadog::Tracing::Contrib::Sidekiq::ServerTracer) + end + + example.run + end + end + + before do + Datadog.configure do |c| + c.tracing.instrument :sidekiq, distributed_tracing: true + end + end + + after do + Datadog.configuration.tracing[:sidekiq].reset! + Sidekiq::Queues.clear_all + end + + let!(:empty_worker) do + stub_const( + 'EmptyWorker', + Class.new do + include Sidekiq::Worker + def perform; end + end + ) + end + + context 'when dispatching' do + it do + EmptyWorker.perform_async + + job = EmptyWorker.jobs.first + + expect(span).to be_root_span + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('push') + expect(span.get_tag('span.kind')).to eq('producer') + + expect(job["x-datadog-trace-id"]).to eq(span.trace_id.to_s) + expect(job["x-datadog-parent-id"]).to eq(span.id.to_s) + expect(job["x-datadog-sampling-priority"]).to eq('1') + # expect(job["x-datadog-tags"]).to eq("_dd.p.dm=-0") + end + end + + context 'when receiving' do + let(:trace_id) { Datadog::Tracing::Utils.next_id } + let(:span_id) { Datadog::Tracing::Utils.next_id } + let(:jid) { '123abc' } + + it do + Sidekiq::Queues.push( + EmptyWorker.queue, + EmptyWorker.to_s, + EmptyWorker.sidekiq_options.merge( + "args" => [], + "class" => EmptyWorker.to_s, + "jid" => jid, + "x-datadog-trace-id" => trace_id.to_s, + "x-datadog-parent-id" => span_id.to_s, + "x-datadog-sampling-priority" => "1", + "x-datadog-tags" => "_dd.p.dm=-0", + ) + ) + + EmptyWorker.perform_one + + expect(span.trace_id).to eq(trace_id) + expect(span.parent_id).to eq(span_id) + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('job') + expect(span.get_tag('span.kind')).to eq('consumer') + + # "x-datadog-sampling-priority" => "1", + # "x-datadog-tags" => "_dd.p.dm=-0", + end + end + + context 'round trip' do + it do + EmptyWorker.perform_async + EmptyWorker.perform_one + + expect(spans).to have(2).items + + job_span, push_span = spans + + expect(push_span).to be_root_span + + expect(job_span.trace_id).to eq(push_span.trace_id) + expect(job_span.parent_id).to eq(push_span.id) + end + end +end From 1ecb281bdac3c3b77e882f3a9877fbaf9936dfb0 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Mon, 2 Jan 2023 22:50:39 +0100 Subject: [PATCH 04/12] Rubocop --- .../tracing/contrib/sidekiq/client_tracer.rb | 4 +--- .../tracing/contrib/sidekiq/server_tracer.rb | 4 ++++ .../sidekiq/distributed_tracing_spec.rb | 20 +++++++++---------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb index 79e8d2bb662..843f5a3e63d 100644 --- a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb @@ -24,9 +24,7 @@ def call(worker_class, job, queue, redis_pool) resource = job_resource(job) Datadog::Tracing.trace(Ext::SPAN_PUSH, service: @sidekiq_service) do |span, trace_op| - if configuration[:distributed_tracing] - propagation.inject!(trace_op, job) - end + propagation.inject!(trace_op, job) if configuration[:distributed_tracing] span.resource = resource diff --git a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb index ef300968d1d..10ceb73789e 100644 --- a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb @@ -22,6 +22,8 @@ def initialize(options = {}) @error_handler = options[:error_handler] || configuration[:error_handler] end + # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/AbcSize def call(worker, job, queue) resource = job_resource(job) @@ -74,6 +76,8 @@ def call(worker, job, queue) yield end + # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/AbcSize end private diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb index 30165279574..b4f1e549bd7 100644 --- a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -57,9 +57,9 @@ def perform; end expect(span.get_tag('operation')).to eq('push') expect(span.get_tag('span.kind')).to eq('producer') - expect(job["x-datadog-trace-id"]).to eq(span.trace_id.to_s) - expect(job["x-datadog-parent-id"]).to eq(span.id.to_s) - expect(job["x-datadog-sampling-priority"]).to eq('1') + expect(job['x-datadog-trace-id']).to eq(span.trace_id.to_s) + expect(job['x-datadog-parent-id']).to eq(span.id.to_s) + expect(job['x-datadog-sampling-priority']).to eq('1') # expect(job["x-datadog-tags"]).to eq("_dd.p.dm=-0") end end @@ -74,13 +74,13 @@ def perform; end EmptyWorker.queue, EmptyWorker.to_s, EmptyWorker.sidekiq_options.merge( - "args" => [], - "class" => EmptyWorker.to_s, - "jid" => jid, - "x-datadog-trace-id" => trace_id.to_s, - "x-datadog-parent-id" => span_id.to_s, - "x-datadog-sampling-priority" => "1", - "x-datadog-tags" => "_dd.p.dm=-0", + 'args' => [], + 'class' => EmptyWorker.to_s, + 'jid' => jid, + 'x-datadog-trace-id' => trace_id.to_s, + 'x-datadog-parent-id' => span_id.to_s, + 'x-datadog-sampling-priority' => '1', + 'x-datadog-tags' => '_dd.p.dm=-0', ) ) From de1bac232f0642c5d3a9e08d25cb7592a80c9f45 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Tue, 4 Apr 2023 15:59:12 +0200 Subject: [PATCH 05/12] Remove fetcher --- docker-compose.yml | 2 +- gemfiles/ruby_3.1.2_contrib.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_contrib_old.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_core_old.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_cucumber3.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_cucumber4.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_cucumber5.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_opentelemetry.gemfile.lock | 8 ++------ gemfiles/ruby_3.1.2_rails61_mysql2.gemfile.lock | 6 ++---- .../ruby_3.1.2_rails61_postgres.gemfile.lock | 6 ++---- ...by_3.1.2_rails61_postgres_redis.gemfile.lock | 6 ++---- ..._3.1.2_rails61_postgres_sidekiq.gemfile.lock | 6 ++---- ...y_3.1.2_rails61_semantic_logger.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_redis_3.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_redis_4.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_redis_5.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_resque2_redis3.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_resque2_redis4.gemfile.lock | 6 ++---- gemfiles/ruby_3.1.2_sinatra.gemfile.lock | 6 ++---- .../contrib/sidekiq/distributed/fetcher.rb | 17 ----------------- .../contrib/sidekiq/distributed/propagation.rb | 10 +++++----- 21 files changed, 42 insertions(+), 97 deletions(-) delete mode 100644 lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb diff --git a/docker-compose.yml b/docker-compose.yml index 7e1dc8b09b4..721162281eb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -206,7 +206,7 @@ services: TEST_POSTGRES_HOST: postgres TEST_REDIS_HOST: redis TEST_REDIS_OLD_HOST: redis_old - TEST_REDIS_OLD_PORT: 6379 + TEST_REDIS_OLD_PORT: 6380 DDTRACE_CI: true stdin_open: true tty: true diff --git a/gemfiles/ruby_3.1.2_contrib.gemfile.lock b/gemfiles/ruby_3.1.2_contrib.gemfile.lock index bc03af8f0b8..09b4f2692ec 100644 --- a/gemfiles/ruby_3.1.2_contrib.gemfile.lock +++ b/gemfiles/ruby_3.1.2_contrib.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -1571,9 +1571,7 @@ GEM king_konf (1.0.1) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) lograge (0.12.0) actionpack (>= 4) diff --git a/gemfiles/ruby_3.1.2_contrib_old.gemfile.lock b/gemfiles/ruby_3.1.2_contrib_old.gemfile.lock index 6123f09911d..cd5e3a1c6e5 100644 --- a/gemfiles/ruby_3.1.2_contrib_old.gemfile.lock +++ b/gemfiles/ruby_3.1.2_contrib_old.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -75,9 +75,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_core_old.gemfile.lock b/gemfiles/ruby_3.1.2_core_old.gemfile.lock index 639f0c44a38..3ba1bc12cba 100644 --- a/gemfiles/ruby_3.1.2_core_old.gemfile.lock +++ b/gemfiles/ruby_3.1.2_core_old.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -55,9 +55,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_cucumber3.gemfile.lock b/gemfiles/ruby_3.1.2_cucumber3.gemfile.lock index 8a440af8049..4002ed0aceb 100644 --- a/gemfiles/ruby_3.1.2_cucumber3.gemfile.lock +++ b/gemfiles/ruby_3.1.2_cucumber3.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -73,9 +73,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_cucumber4.gemfile.lock b/gemfiles/ruby_3.1.2_cucumber4.gemfile.lock index 45c92a0d771..7a535140681 100644 --- a/gemfiles/ruby_3.1.2_cucumber4.gemfile.lock +++ b/gemfiles/ruby_3.1.2_cucumber4.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -93,9 +93,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_cucumber5.gemfile.lock b/gemfiles/ruby_3.1.2_cucumber5.gemfile.lock index c85acb3f14f..0f1f8b6ebe7 100644 --- a/gemfiles/ruby_3.1.2_cucumber5.gemfile.lock +++ b/gemfiles/ruby_3.1.2_cucumber5.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -93,9 +93,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_opentelemetry.gemfile.lock b/gemfiles/ruby_3.1.2_opentelemetry.gemfile.lock index f4966ad6e6a..730390dc4bc 100644 --- a/gemfiles/ruby_3.1.2_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_3.1.2_opentelemetry.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -57,11 +57,7 @@ GEM libdatadog (2.0.0.1.0) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-darwin) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.1.2_rails61_mysql2.gemfile.lock index e6e9c83c57c..86a3e840f95 100644 --- a/gemfiles/ruby_3.1.2_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_3.1.2_rails61_mysql2.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -121,9 +121,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) lograge (0.12.0) actionpack (>= 4) diff --git a/gemfiles/ruby_3.1.2_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.1.2_rails61_postgres.gemfile.lock index be7866503c0..693a0d0b64f 100644 --- a/gemfiles/ruby_3.1.2_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_3.1.2_rails61_postgres.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -121,9 +121,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) lograge (0.12.0) actionpack (>= 4) diff --git a/gemfiles/ruby_3.1.2_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.1.2_rails61_postgres_redis.gemfile.lock index 570f7d9214d..91811f36314 100644 --- a/gemfiles/ruby_3.1.2_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_3.1.2_rails61_postgres_redis.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -121,9 +121,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) lograge (0.12.0) actionpack (>= 4) diff --git a/gemfiles/ruby_3.1.2_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.1.2_rails61_postgres_sidekiq.gemfile.lock index cff9d9db3dc..137948ebf65 100644 --- a/gemfiles/ruby_3.1.2_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_3.1.2_rails61_postgres_sidekiq.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -122,9 +122,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) lograge (0.12.0) actionpack (>= 4) diff --git a/gemfiles/ruby_3.1.2_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.1.2_rails61_semantic_logger.gemfile.lock index d539adc9865..57a991d8aeb 100644 --- a/gemfiles/ruby_3.1.2_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_3.1.2_rails61_semantic_logger.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -121,9 +121,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) loofah (2.19.1) crass (~> 1.0.2) diff --git a/gemfiles/ruby_3.1.2_redis_3.gemfile.lock b/gemfiles/ruby_3.1.2_redis_3.gemfile.lock index 0d85b904591..970a8e0c462 100644 --- a/gemfiles/ruby_3.1.2_redis_3.gemfile.lock +++ b/gemfiles/ruby_3.1.2_redis_3.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -55,9 +55,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_redis_4.gemfile.lock b/gemfiles/ruby_3.1.2_redis_4.gemfile.lock index 9908d5611ed..95c5e0c5812 100644 --- a/gemfiles/ruby_3.1.2_redis_4.gemfile.lock +++ b/gemfiles/ruby_3.1.2_redis_4.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -55,9 +55,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_redis_5.gemfile.lock b/gemfiles/ruby_3.1.2_redis_5.gemfile.lock index c0de033af84..54f4610d5a2 100644 --- a/gemfiles/ruby_3.1.2_redis_5.gemfile.lock +++ b/gemfiles/ruby_3.1.2_redis_5.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -56,9 +56,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.1.2_resque2_redis3.gemfile.lock index d1e40c568b9..6db301e9baf 100644 --- a/gemfiles/ruby_3.1.2_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_3.1.2_resque2_redis3.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -55,9 +55,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.1.2_resque2_redis4.gemfile.lock index ba89da09dad..29a32f2f20f 100644 --- a/gemfiles/ruby_3.1.2_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_3.1.2_resque2_redis4.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -56,9 +56,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/gemfiles/ruby_3.1.2_sinatra.gemfile.lock b/gemfiles/ruby_3.1.2_sinatra.gemfile.lock index 22a7b953061..c2566f5b41b 100644 --- a/gemfiles/ruby_3.1.2_sinatra.gemfile.lock +++ b/gemfiles/ruby_3.1.2_sinatra.gemfile.lock @@ -14,7 +14,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -55,9 +55,7 @@ GEM addressable (>= 2.4) libdatadog (2.0.0.1.0-aarch64-linux) libdatadog (2.0.0.1.0-x86_64-linux) - libddwaf (1.6.2.0.0-aarch64-linux) - ffi (~> 1.0) - libddwaf (1.6.2.0.0-x86_64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) memory_profiler (0.9.14) method_source (1.0.0) diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb deleted file mode 100644 index ed0ee3f4b99..00000000000 --- a/lib/datadog/tracing/contrib/sidekiq/distributed/fetcher.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: false -# typed: false - -require_relative '../../../distributed/fetcher' - -module Datadog - module Tracing - module Contrib - module Sidekiq - module Distributed - class Fetcher < Tracing::Distributed::Fetcher - end - end - end - end - end -end diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb index 7ea2aa77fd8..c486a075e28 100644 --- a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +++ b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # typed: true -require_relative 'fetcher' +require_relative '../../../distributed/fetcher' require_relative '../../../distributed/propagation' require_relative '../../../distributed/b3_multi' require_relative '../../../distributed/b3_single' @@ -20,13 +20,13 @@ def initialize super( propagation_styles: { Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_MULTI_HEADER => - Tracing::Distributed::B3Multi.new(fetcher: Fetcher), + Tracing::Distributed::B3Multi.new(fetcher: Tracing::Distributed::Fetcher), Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER => - Tracing::Distributed::B3Single.new(fetcher: Fetcher), + Tracing::Distributed::B3Single.new(fetcher: Tracing::Distributed::Fetcher), Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG => - Tracing::Distributed::Datadog.new(fetcher: Fetcher), + Tracing::Distributed::Datadog.new(fetcher: Tracing::Distributed::Fetcher), Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT => - Tracing::Distributed::TraceContext.new(fetcher: Fetcher), + Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher), Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new }) end From 651f3e412380fd15386134027b070b62bd4b4a3e Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 12:27:38 +0200 Subject: [PATCH 06/12] Remove sorbet typed comment --- lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb | 1 - .../datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb index c486a075e28..519a4772044 100644 --- a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +++ b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true -# typed: true require_relative '../../../distributed/fetcher' require_relative '../../../distributed/propagation' diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb index b4f1e549bd7..ce1f1fa7d63 100644 --- a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -1,5 +1,3 @@ -# typed: ignore - require 'datadog/tracing/contrib/support/spec_helper' require 'datadog/tracing/contrib/sidekiq/integration' From ee7f4a06474c698a6d6e23b92b5692dfbd9a8107 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 12:45:45 +0200 Subject: [PATCH 07/12] Refactor propagation instance --- lib/datadog/tracing/contrib/sidekiq/client_tracer.rb | 6 +++--- .../tracing/contrib/sidekiq/distributed/propagation.rb | 3 +-- lib/datadog/tracing/contrib/sidekiq/server_tracer.rb | 6 +++--- .../tracing/contrib/sidekiq/{tracing.rb => utils.rb} | 4 +++- 4 files changed, 10 insertions(+), 9 deletions(-) rename lib/datadog/tracing/contrib/sidekiq/{tracing.rb => utils.rb} (95%) diff --git a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb index 1222e34101b..103f264b2e8 100644 --- a/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb @@ -2,7 +2,7 @@ require_relative '../analytics' require_relative 'distributed/propagation' require_relative 'ext' -require_relative 'tracing' +require_relative 'utils' module Datadog module Tracing @@ -10,7 +10,7 @@ module Contrib module Sidekiq # Tracer is a Sidekiq client-side middleware which traces job enqueues/pushes class ClientTracer - include Tracing + include Utils def initialize(options = {}) @sidekiq_service = options[:client_service_name] || configuration[:client_service_name] @@ -55,7 +55,7 @@ def configuration end def propagation - Sidekiq::Distributed::Propagation::INSTANCE + @propagation ||= Contrib::Sidekiq::Distributed::Propagation.new end end end diff --git a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb index 519a4772044..32171aaa242 100644 --- a/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +++ b/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb @@ -7,6 +7,7 @@ require_relative '../../../distributed/datadog' require_relative '../../../distributed/none' require_relative '../../../distributed/trace_context' +require_relative '../../../configuration/ext' module Datadog module Tracing @@ -29,8 +30,6 @@ def initialize Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new }) end - - INSTANCE = Propagation.new end end end diff --git a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb index 2906f84bc96..a1c58148936 100644 --- a/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +++ b/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb @@ -1,7 +1,7 @@ require_relative '../../metadata/ext' require_relative '../analytics' require_relative 'ext' -require_relative 'tracing' +require_relative 'utils' require_relative '../utils/quantization/hash' require_relative 'distributed/propagation' @@ -11,7 +11,7 @@ module Contrib module Sidekiq # Tracer is a Sidekiq server-side middleware which traces executed jobs class ServerTracer - include Tracing + include Utils QUANTIZE_SHOW_ALL = { args: { show: :all } }.freeze @@ -83,7 +83,7 @@ def call(worker, job, queue) private def propagation - Sidekiq::Distributed::Propagation::INSTANCE + @propagation ||= Contrib::Sidekiq::Distributed::Propagation.new end def quantize_args(quantize, args) diff --git a/lib/datadog/tracing/contrib/sidekiq/tracing.rb b/lib/datadog/tracing/contrib/sidekiq/utils.rb similarity index 95% rename from lib/datadog/tracing/contrib/sidekiq/tracing.rb rename to lib/datadog/tracing/contrib/sidekiq/utils.rb index f639e73d5af..a8467a53eda 100644 --- a/lib/datadog/tracing/contrib/sidekiq/tracing.rb +++ b/lib/datadog/tracing/contrib/sidekiq/utils.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'yaml' require_relative '../../../core' @@ -8,7 +10,7 @@ module Tracing module Contrib module Sidekiq # Common functionality used by both client-side and server-side tracers. - module Tracing + module Utils protected # If class is wrapping something else, the interesting resource info From 5c213302c919f04bcb31bb7f07f97a4e8b8ff391 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 13:16:13 +0200 Subject: [PATCH 08/12] Add negative distributed tracing tests --- .../sidekiq/distributed_tracing_spec.rb | 226 ++++++++++++------ 1 file changed, 158 insertions(+), 68 deletions(-) diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb index ce1f1fa7d63..15505ff1486 100644 --- a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -19,12 +19,6 @@ end end - before do - Datadog.configure do |c| - c.tracing.instrument :sidekiq, distributed_tracing: true - end - end - after do Datadog.configuration.tracing[:sidekiq].reset! Sidekiq::Queues.clear_all @@ -40,78 +34,174 @@ def perform; end ) end - context 'when dispatching' do - it do - EmptyWorker.perform_async - - job = EmptyWorker.jobs.first - - expect(span).to be_root_span - expect(span.service).to eq(tracer.default_service) - expect(span.resource).to eq('EmptyWorker') - expect(span.get_tag('sidekiq.job.queue')).to eq('default') - expect(span.status).to eq(0) - expect(span.get_tag('component')).to eq('sidekiq') - expect(span.get_tag('operation')).to eq('push') - expect(span.get_tag('span.kind')).to eq('producer') - - expect(job['x-datadog-trace-id']).to eq(span.trace_id.to_s) - expect(job['x-datadog-parent-id']).to eq(span.id.to_s) - expect(job['x-datadog-sampling-priority']).to eq('1') - # expect(job["x-datadog-tags"]).to eq("_dd.p.dm=-0") + context 'when distributed tracing enabled' do + before do + Datadog.configure do |c| + c.tracing.instrument :sidekiq, distributed_tracing: true + end + end + + context 'when dispatching' do + it 'propagates through serialized job' do + EmptyWorker.perform_async + + job = EmptyWorker.jobs.first + + expect(span).to be_root_span + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('push') + expect(span.get_tag('span.kind')).to eq('producer') + + expect(job['x-datadog-trace-id']).to eq(span.trace_id.to_s) + expect(job['x-datadog-parent-id']).to eq(span.id.to_s) + expect(job['x-datadog-sampling-priority']).to eq('1') + # expect(job["x-datadog-tags"]).to eq("_dd.p.dm=-0") + end end - end - context 'when receiving' do - let(:trace_id) { Datadog::Tracing::Utils.next_id } - let(:span_id) { Datadog::Tracing::Utils.next_id } - let(:jid) { '123abc' } - - it do - Sidekiq::Queues.push( - EmptyWorker.queue, - EmptyWorker.to_s, - EmptyWorker.sidekiq_options.merge( - 'args' => [], - 'class' => EmptyWorker.to_s, - 'jid' => jid, - 'x-datadog-trace-id' => trace_id.to_s, - 'x-datadog-parent-id' => span_id.to_s, - 'x-datadog-sampling-priority' => '1', - 'x-datadog-tags' => '_dd.p.dm=-0', + context 'when receiving' do + let(:trace_id) { Datadog::Tracing::Utils.next_id } + let(:span_id) { Datadog::Tracing::Utils.next_id } + let(:jid) { '123abc' } + + it 'continues trace from serialized job' do + Sidekiq::Queues.push( + EmptyWorker.queue, + EmptyWorker.to_s, + EmptyWorker.sidekiq_options.merge( + 'args' => [], + 'class' => EmptyWorker.to_s, + 'jid' => jid, + 'x-datadog-trace-id' => trace_id.to_s, + 'x-datadog-parent-id' => span_id.to_s, + 'x-datadog-sampling-priority' => '1', + 'x-datadog-tags' => '_dd.p.dm=-0', + ) ) - ) - - EmptyWorker.perform_one - - expect(span.trace_id).to eq(trace_id) - expect(span.parent_id).to eq(span_id) - expect(span.service).to eq(tracer.default_service) - expect(span.resource).to eq('EmptyWorker') - expect(span.get_tag('sidekiq.job.queue')).to eq('default') - expect(span.status).to eq(0) - expect(span.get_tag('component')).to eq('sidekiq') - expect(span.get_tag('operation')).to eq('job') - expect(span.get_tag('span.kind')).to eq('consumer') - - # "x-datadog-sampling-priority" => "1", - # "x-datadog-tags" => "_dd.p.dm=-0", + + EmptyWorker.perform_one + + expect(span.trace_id).to eq(trace_id) + expect(span.parent_id).to eq(span_id) + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('job') + expect(span.get_tag('span.kind')).to eq('consumer') + + # "x-datadog-sampling-priority" => "1", + # "x-datadog-tags" => "_dd.p.dm=-0", + end + end + + context 'round trip' do + it 'creates 2 spans for a distributed trace' do + EmptyWorker.perform_async + EmptyWorker.perform_one + + expect(spans).to have(2).items + + job_span, push_span = spans + + expect(push_span).to be_root_span + + expect(job_span.trace_id).to eq(push_span.trace_id) + expect(job_span.parent_id).to eq(push_span.id) + end end end - context 'round trip' do - it do - EmptyWorker.perform_async - EmptyWorker.perform_one + context 'when distributed tracing disabled' do + before do + Datadog.configure do |c| + c.tracing.instrument :sidekiq, distributed_tracing: false + end + end + + context 'when dispatching' do + it 'does not propagate through serialized job' do + EmptyWorker.perform_async + + job = EmptyWorker.jobs.first + + expect(span).to be_root_span + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('push') + expect(span.get_tag('span.kind')).to eq('producer') + + expect(job).to_not include('x-datadog-trace-id') + expect(job).to_not include('x-datadog-parent-id') + expect(job).to_not include('x-datadog-sampling-priority') + expect(job).to_not include('x-datadog-tags') + end + end + + context 'when receiving' do + let(:trace_id) { Datadog::Tracing::Utils.next_id } + let(:span_id) { Datadog::Tracing::Utils.next_id } + let(:jid) { '123abc' } + + it 'does not continue trace from serialized job' do + Sidekiq::Queues.push( + EmptyWorker.queue, + EmptyWorker.to_s, + EmptyWorker.sidekiq_options.merge( + 'args' => [], + 'class' => EmptyWorker.to_s, + 'jid' => jid, + 'x-datadog-trace-id' => trace_id.to_s, + 'x-datadog-parent-id' => span_id.to_s, + 'x-datadog-sampling-priority' => '1', + 'x-datadog-tags' => '_dd.p.dm=-0', + ) + ) + + EmptyWorker.perform_one + + expect(span).to be_root_span + expect(span.trace_id).not_to eq(trace_id) + expect(span.parent_id).to eq(0) + expect(span.service).to eq(tracer.default_service) + expect(span.resource).to eq('EmptyWorker') + expect(span.get_tag('sidekiq.job.queue')).to eq('default') + expect(span.status).to eq(0) + expect(span.get_tag('component')).to eq('sidekiq') + expect(span.get_tag('operation')).to eq('job') + expect(span.get_tag('span.kind')).to eq('consumer') + + # "x-datadog-sampling-priority" => "1", + # "x-datadog-tags" => "_dd.p.dm=-0", + end + end + + context 'round trip' do + it 'creates 2 spans with separate traces' do + EmptyWorker.perform_async + EmptyWorker.perform_one - expect(spans).to have(2).items + expect(spans).to have(2).items - job_span, push_span = spans + job_span, push_span = spans - expect(push_span).to be_root_span + expect(push_span.trace_id).to_not eq(job_span.trace_id) + expect(push_span.get_tag('sidekiq.job.id')).to eq(job_span.get_tag('sidekiq.job.id')) - expect(job_span.trace_id).to eq(push_span.trace_id) - expect(job_span.parent_id).to eq(push_span.id) + expect(push_span).to be_root_span + expect(job_span.resource).to eq('EmptyWorker') + + expect(job_span).to be_root_span + expect(job_span.resource).to eq('EmptyWorker') + end end end end From 70319c727f7e466171482a9a2614d3ac42156a31 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 15:17:20 +0200 Subject: [PATCH 09/12] Port sidekiq test helper for testing Sidekiq 3.x --- gemfiles/ruby_2.1.10_contrib.gemfile.lock | 6 +- .../sidekiq/distributed_tracing_spec.rb | 1 + .../sidekiq/support/legacy_test_helpers.rb | 107 ++++++++++++++++++ 3 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 spec/datadog/tracing/contrib/sidekiq/support/legacy_test_helpers.rb diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile.lock b/gemfiles/ruby_2.1.10_contrib.gemfile.lock index d2adc594984..a56049504e0 100644 --- a/gemfiles/ruby_2.1.10_contrib.gemfile.lock +++ b/gemfiles/ruby_2.1.10_contrib.gemfile.lock @@ -4,7 +4,7 @@ PATH ddtrace (1.10.1) debase-ruby_core_source (>= 0.10.16, <= 3.2.0) libdatadog (~> 2.0.0.1.0) - libddwaf (~> 1.6.2.0.0) + libddwaf (~> 1.8.2.0.0) msgpack GEM @@ -124,8 +124,8 @@ GEM json (1.8.6) json-schema (2.8.1) addressable (>= 2.4) - libdatadog (2.0.0.1.0) - libddwaf (1.6.2.0.0) + libdatadog (2.0.0.1.0-aarch64-linux) + libddwaf (1.8.2.0.0-aarch64-linux) ffi (~> 1.0) makara (0.4.1) activerecord (>= 3.0.0) diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb index 15505ff1486..86e2855fb64 100644 --- a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -5,6 +5,7 @@ require 'datadog/tracing/contrib/sidekiq/server_tracer' require 'sidekiq/testing' +require_relative 'support/legacy_test_helpers' if Sidekiq::VERSION < '4' require 'sidekiq/api' RSpec.describe 'Sidekiq distributed tracing' do diff --git a/spec/datadog/tracing/contrib/sidekiq/support/legacy_test_helpers.rb b/spec/datadog/tracing/contrib/sidekiq/support/legacy_test_helpers.rb new file mode 100644 index 00000000000..2034cca0cb9 --- /dev/null +++ b/spec/datadog/tracing/contrib/sidekiq/support/legacy_test_helpers.rb @@ -0,0 +1,107 @@ +# This file is taken from Sidekiq 4.x to patch older version of Sidekiq, +# In order to make it easier for testing. +# +# https://github.com/sidekiq/sidekiq/blob/4.x/lib/sidekiq/testing.rb + +module Sidekiq + module Queues + class << self + def [](queue) + jobs_by_queue[queue] + end + + def push(queue, klass, job) + jobs_by_queue[queue] << job + jobs_by_worker[klass] << job + end + + def jobs_by_queue + @jobs_by_queue ||= Hash.new { |hash, key| hash[key] = [] } + end + + def jobs_by_worker + @jobs_by_worker ||= Hash.new { |hash, key| hash[key] = [] } + end + + def delete_for(jid, queue, klass) + jobs_by_queue[queue.to_s].delete_if { |job| job['jid'] == jid } + jobs_by_worker[klass].delete_if { |job| job['jid'] == jid } + end + + def clear_for(queue, klass) + jobs_by_queue[queue].clear + jobs_by_worker[klass].clear + end + + def clear_all + jobs_by_queue.clear + jobs_by_worker.clear + end + end + end + + module Worker + module ClassMethods + def queue + sidekiq_options['queue'] + end + + def jobs + Queues.jobs_by_worker[to_s] + end + + def clear + Queues.clear_for(queue, to_s) + end + + def drain + while jobs.any? + next_job = jobs.first + Queues.delete_for(next_job['jid'], next_job['queue'], to_s) + process_job(next_job) + end + end + + def perform_one + raise(EmptyQueueError, 'perform_one called with empty job queue') if jobs.empty? + + next_job = jobs.first + Queues.delete_for(next_job['jid'], queue, to_s) + process_job(next_job) + end + + def process_job(job) + worker = new + worker.jid = job['jid'] + worker.bid = job['bid'] if worker.respond_to?(:bid=) + Sidekiq::Testing.server_middleware.invoke(worker, job, job['queue']) do + execute_job(worker, job['args']) + end + end + + def execute_job(worker, args) + worker.perform(*args) + end + end + + class << self + def jobs + Queues.jobs_by_queue.values.flatten + end + + def clear_all + Queues.clear_all + end + + def drain_all + while jobs.any? + worker_classes = jobs.map { |job| job['class'] }.uniq + + worker_classes.each do |worker_class| + worker_class.constantize.drain + end + end + end + end + end +end From 1bfeb315a3926a62ab8870eac01bdecb7fde9fea Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 21:52:43 +0200 Subject: [PATCH 10/12] Improve tests --- .../sidekiq/distributed_tracing_spec.rb | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb index 86e2855fb64..f14d167ee34 100644 --- a/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/distributed_tracing_spec.rb @@ -60,7 +60,8 @@ def perform; end expect(job['x-datadog-trace-id']).to eq(span.trace_id.to_s) expect(job['x-datadog-parent-id']).to eq(span.id.to_s) expect(job['x-datadog-sampling-priority']).to eq('1') - # expect(job["x-datadog-tags"]).to eq("_dd.p.dm=-0") + expect(job['x-datadog-tags']).to eq('_dd.p.dm=-0') + expect(job).not_to include 'x-datadog-origin' end end @@ -79,8 +80,9 @@ def perform; end 'jid' => jid, 'x-datadog-trace-id' => trace_id.to_s, 'x-datadog-parent-id' => span_id.to_s, - 'x-datadog-sampling-priority' => '1', - 'x-datadog-tags' => '_dd.p.dm=-0', + 'x-datadog-sampling-priority' => '2', + 'x-datadog-tags' => '_dd.p.dm=-99', + 'x-datadog-origin' => 'my-origin' ) ) @@ -96,8 +98,9 @@ def perform; end expect(span.get_tag('operation')).to eq('job') expect(span.get_tag('span.kind')).to eq('consumer') - # "x-datadog-sampling-priority" => "1", - # "x-datadog-tags" => "_dd.p.dm=-0", + expect(trace.send(:meta)['_dd.p.dm']).to eq('-99') + expect(trace.sampling_priority).to eq(2) + expect(trace.origin).to eq('my-origin') end end @@ -111,6 +114,7 @@ def perform; end job_span, push_span = spans expect(push_span).to be_root_span + expect(push_span.get_tag('sidekiq.job.id')).to eq(job_span.get_tag('sidekiq.job.id')) expect(job_span.trace_id).to eq(push_span.trace_id) expect(job_span.parent_id).to eq(push_span.id) @@ -144,6 +148,7 @@ def perform; end expect(job).to_not include('x-datadog-parent-id') expect(job).to_not include('x-datadog-sampling-priority') expect(job).to_not include('x-datadog-tags') + expect(job).to_not include('x-datadog-origin') end end @@ -162,8 +167,9 @@ def perform; end 'jid' => jid, 'x-datadog-trace-id' => trace_id.to_s, 'x-datadog-parent-id' => span_id.to_s, - 'x-datadog-sampling-priority' => '1', - 'x-datadog-tags' => '_dd.p.dm=-0', + 'x-datadog-sampling-priority' => '2', + 'x-datadog-tags' => '_dd.p.dm=99', + 'x-datadog-origin' => 'my-origin' ) ) @@ -180,8 +186,9 @@ def perform; end expect(span.get_tag('operation')).to eq('job') expect(span.get_tag('span.kind')).to eq('consumer') - # "x-datadog-sampling-priority" => "1", - # "x-datadog-tags" => "_dd.p.dm=-0", + expect(trace.send(:meta)['_dd.p.dm']).to eq('-0') + expect(trace.sampling_priority).to eq(1) + expect(trace.origin).to be_nil end end From 80e29c00113742cd6e7a76594cb751e258d352ad Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Wed, 5 Apr 2023 22:29:20 +0200 Subject: [PATCH 11/12] Adding documentation --- docs/GettingStarted.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md index 267b244a41b..ffcd1d2ecb2 100644 --- a/docs/GettingStarted.md +++ b/docs/GettingStarted.md @@ -2015,6 +2015,7 @@ end | Key | Description | Default | | --- | ----------- | ------- | +| `distributed_tracing` | Enabling [distributed tracing](#distributed-tracing) creates a parent-child relationship between the `sidekiq.push` span and the `sidekiq.job` span.

**Important**: *Enabling distributed_tracing for asynchronous processing can result in drastic changes in your trace graph. Such cases include long running jobs, retried jobs, and jobs scheduled in the far future. Make sure to inspect your traces after enabling this feature.* | `false` | | `tag_args` | Enable tagging of job arguments. `true` for on, `false` for off. | `false` | | `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | | `quantize` | Hash containing options for quantization of job arguments. | `{}` | From bb84c07d771a21fab9ca9d123595e667635999d5 Mon Sep 17 00:00:00 2001 From: Tony Hsu Date: Thu, 6 Apr 2023 10:13:17 +0200 Subject: [PATCH 12/12] Cleanup --- Appraisals | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Appraisals b/Appraisals index f6359094180..fc43bd05294 100644 --- a/Appraisals +++ b/Appraisals @@ -1622,8 +1622,8 @@ elsif ruby_version?('3.0') || ruby_version?('3.1') || ruby_version?('3.2') appraise 'core-old' do gem 'dogstatsd-ruby', '~> 4' end - # ---------------------------------------------------------------------------------------------------------------------- - # ADD NEW RUBIES HERE +# ---------------------------------------------------------------------------------------------------------------------- +# ADD NEW RUBIES HERE end ruby_runtime = if defined?(RUBY_ENGINE_VERSION)