Loading lib/labkit/tracing/tracing_utils.rb +18 −8 Original line number Diff line number Diff line Loading @@ -23,18 +23,28 @@ module Labkit end # Obtain a tracer instance # # Returns the appropriate tracer based on connection string configuration: # - OpenTelemetry (OTLP): When GITLAB_TRACING uses otlp:// scheme # - OpenTracing: When GITLAB_TRACING uses opentracing:// scheme or not set # # Both OpenTelemetry and OpenTracing provide no-op tracers by default: # - OpenTelemetry: Uses ProxyTracerProvider until SDK is configured # - OpenTracing: Uses default no-op global_tracer # # This allows spans to be created but not exported when tracing is not initialized, # letting the application run safely while producing no trace data. def self.tracer if defined?(OpenTelemetry) && OpenTelemetry.respond_to?(:tracer_provider) provider = OpenTelemetry.tracer_provider if provider && !provider.is_a?(OpenTelemetry::Internal::ProxyTracerProvider) otel_tracer = provider.tracer("gitlab-labkit") return Adapters::OpentelemetryTracer.new(otel_tracer) end end @tracer ||= if Tracing.otlp_connection? require "opentelemetry/sdk" otel_tracer = OpenTelemetry.tracer_provider.tracer("gitlab-labkit") Adapters::OpentelemetryTracer.new(otel_tracer) else Adapters::OpentracingTracer.new(OpenTracing.global_tracer) end end # Generate a span retrospectively def self.postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil) Loading spec/labkit/tracing/tracing_utils_spec.rb +10 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,10 @@ require "opentelemetry/sdk" require "spec_helper" describe Labkit::Tracing::TracingUtils do def clear_tracer_memoization described_class.instance_variable_set(:@tracer, nil) end shared_examples "tracing implementation" do describe ".with_tracing" do let(:operation_name) { "test_operation" } Loading Loading @@ -116,6 +120,9 @@ describe Labkit::Tracing::TracingUtils do end before do clear_tracer_memoization stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "opentracing://jaeger")) allow(OpenTracing).to receive_messages(global_tracer: fake_tracer, start_active_span: fake_scope, active_span: fake_span) allow(fake_tracer).to receive_messages(start_active_span: fake_scope, start_span: fake_span, extract: nil) allow(fake_tracer).to receive(:inject) Loading Loading @@ -151,6 +158,9 @@ describe Labkit::Tracing::TracingUtils do end before do clear_tracer_memoization stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "otlp://localhost:4318")) allow(fake_tracer_provider).to receive(:tracer).and_return(fake_tracer) allow(fake_tracer).to receive(:in_span).and_yield(fake_span) allow(fake_tracer).to receive(:start_span).and_return(fake_span) Loading spec/support/tracing/shared_examples.rb +5 −5 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ RSpec.shared_examples "a tracing instrumenter" do end before do stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "opentracing://jaeger")) allow(OpenTracing).to receive(:start_active_span).and_return(fake_scope) allow(fake_raw_span).to receive_messages(set_tag: nil, log_kv: nil) end Loading @@ -118,9 +119,7 @@ RSpec.shared_examples "a tracing instrumenter" do ) end let(:fake_tracer) { instance_double(Labkit::Tracing::Adapters::OpentelemetryTracer) } let(:tracer_method_receiver) { fake_tracer } let(:tracer_method_receiver) { instance_double(Labkit::Tracing::Adapters::OpentelemetryTracer) } def expect_exception_logged_on_span(span, exception) expect(span).to receive(:set_attribute).with("error", true) Loading @@ -136,8 +135,9 @@ RSpec.shared_examples "a tracing instrumenter" do end before do allow(Labkit::Tracing::TracingUtils).to receive(:tracer).and_return(fake_tracer) allow(fake_tracer).to receive(:start_active_span).and_return(fake_scope) stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "otlp://localhost:4318")) allow(Labkit::Tracing::TracingUtils).to receive(:tracer).and_return(tracer_method_receiver) allow(tracer_method_receiver).to receive(:start_active_span).and_return(fake_scope) allow(fake_raw_span).to receive_messages(set_attribute: nil, add_event: nil, finish: nil) end Loading Loading
lib/labkit/tracing/tracing_utils.rb +18 −8 Original line number Diff line number Diff line Loading @@ -23,18 +23,28 @@ module Labkit end # Obtain a tracer instance # # Returns the appropriate tracer based on connection string configuration: # - OpenTelemetry (OTLP): When GITLAB_TRACING uses otlp:// scheme # - OpenTracing: When GITLAB_TRACING uses opentracing:// scheme or not set # # Both OpenTelemetry and OpenTracing provide no-op tracers by default: # - OpenTelemetry: Uses ProxyTracerProvider until SDK is configured # - OpenTracing: Uses default no-op global_tracer # # This allows spans to be created but not exported when tracing is not initialized, # letting the application run safely while producing no trace data. def self.tracer if defined?(OpenTelemetry) && OpenTelemetry.respond_to?(:tracer_provider) provider = OpenTelemetry.tracer_provider if provider && !provider.is_a?(OpenTelemetry::Internal::ProxyTracerProvider) otel_tracer = provider.tracer("gitlab-labkit") return Adapters::OpentelemetryTracer.new(otel_tracer) end end @tracer ||= if Tracing.otlp_connection? require "opentelemetry/sdk" otel_tracer = OpenTelemetry.tracer_provider.tracer("gitlab-labkit") Adapters::OpentelemetryTracer.new(otel_tracer) else Adapters::OpentracingTracer.new(OpenTracing.global_tracer) end end # Generate a span retrospectively def self.postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil) Loading
spec/labkit/tracing/tracing_utils_spec.rb +10 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,10 @@ require "opentelemetry/sdk" require "spec_helper" describe Labkit::Tracing::TracingUtils do def clear_tracer_memoization described_class.instance_variable_set(:@tracer, nil) end shared_examples "tracing implementation" do describe ".with_tracing" do let(:operation_name) { "test_operation" } Loading Loading @@ -116,6 +120,9 @@ describe Labkit::Tracing::TracingUtils do end before do clear_tracer_memoization stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "opentracing://jaeger")) allow(OpenTracing).to receive_messages(global_tracer: fake_tracer, start_active_span: fake_scope, active_span: fake_span) allow(fake_tracer).to receive_messages(start_active_span: fake_scope, start_span: fake_span, extract: nil) allow(fake_tracer).to receive(:inject) Loading Loading @@ -151,6 +158,9 @@ describe Labkit::Tracing::TracingUtils do end before do clear_tracer_memoization stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "otlp://localhost:4318")) allow(fake_tracer_provider).to receive(:tracer).and_return(fake_tracer) allow(fake_tracer).to receive(:in_span).and_yield(fake_span) allow(fake_tracer).to receive(:start_span).and_return(fake_span) Loading
spec/support/tracing/shared_examples.rb +5 −5 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ RSpec.shared_examples "a tracing instrumenter" do end before do stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "opentracing://jaeger")) allow(OpenTracing).to receive(:start_active_span).and_return(fake_scope) allow(fake_raw_span).to receive_messages(set_tag: nil, log_kv: nil) end Loading @@ -118,9 +119,7 @@ RSpec.shared_examples "a tracing instrumenter" do ) end let(:fake_tracer) { instance_double(Labkit::Tracing::Adapters::OpentelemetryTracer) } let(:tracer_method_receiver) { fake_tracer } let(:tracer_method_receiver) { instance_double(Labkit::Tracing::Adapters::OpentelemetryTracer) } def expect_exception_logged_on_span(span, exception) expect(span).to receive(:set_attribute).with("error", true) Loading @@ -136,8 +135,9 @@ RSpec.shared_examples "a tracing instrumenter" do end before do allow(Labkit::Tracing::TracingUtils).to receive(:tracer).and_return(fake_tracer) allow(fake_tracer).to receive(:start_active_span).and_return(fake_scope) stub_const("ENV", ENV.to_hash.merge("GITLAB_TRACING" => "otlp://localhost:4318")) allow(Labkit::Tracing::TracingUtils).to receive(:tracer).and_return(tracer_method_receiver) allow(tracer_method_receiver).to receive(:start_active_span).and_return(fake_scope) allow(fake_raw_span).to receive_messages(set_attribute: nil, add_event: nil, finish: nil) end Loading