Verified Commit e1177894 authored by Hercules Merscher's avatar Hercules Merscher 🌴
Browse files

refactor: TracingUtils tracer conditional

parent 9da6d410
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -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)
+10 −0
Original line number Diff line number Diff line
@@ -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" }
@@ -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)
@@ -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)
+5 −5
Original line number Diff line number Diff line
@@ -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
@@ -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)
@@ -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