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

fix: Cleaning OTel configure duplication

parent f22ac404
Loading
Loading
Loading
Loading
+17 −49
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ module Labkit
        # @yield [config] Optional configuration block for OpenTelemetry SDK customization
        # @yieldparam config [OpenTelemetry::SDK::Configurator] The SDK configurator
        # @return [Tracer, nil] The configured tracer or nil if initialization fails
        def create_tracer(service_name, connection_string, &config_block)
        def create_tracer(service_name, connection_string, &)
          return unless connection_string.present?

          options = parse_otlp_connection_string(connection_string)
@@ -42,13 +42,7 @@ module Labkit
            OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => service_name
          )

          # If user provided a config block, use SDK.configure for full configurability
          # Otherwise, use the manual configuration for backward compatibility
          if config_block
            configure_with_sdk(service_name, base_resource, sampler, exporter, &config_block)
          else
            configure_manually(service_name, base_resource, sampler, exporter)
          end
          configure(service_name, base_resource, sampler, exporter, &)

          extra_params = options.except(
            :sampler,
@@ -73,26 +67,16 @@ module Labkit

        private

        def configure_with_sdk(service_name, base_resource, sampler, exporter)
          # Use OpenTelemetry::SDK.configure for user customization
          # We'll create the provider manually first with sampler, then allow customization
        def configure(service_name, base_resource, sampler, exporter)
          if block_given?
            OpenTelemetry::SDK.configure do |c|
              c.service_name = service_name
              c.resource = base_resource

            # Add span processor with our exporter from GITLAB_TRACING
            if exporter
              processor = if exporter.is_a?(OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter)
                            OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(exporter)
                          else
                            OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
                          end

              c.add_span_processor(processor)
            end
              processor = create_span_processor(exporter)
              c.add_span_processor(processor) if processor

            # Yield to user configuration block (runs last, can override/extend)
            yield(c) if block_given?
              yield(c)
            end

            # SDK.configure doesn't expose sampler configuration directly
@@ -101,48 +85,32 @@ module Labkit
            current_provider = OpenTelemetry.tracer_provider
            return unless current_provider.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)

          # Create new provider with sampler, preserving resource
          new_provider = OpenTelemetry::SDK::Trace::TracerProvider.new(
            resource: current_provider.resource,
            sampler: sampler
          )

          # Re-add span processor with our exporter
          if exporter
            processor = if exporter.is_a?(OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter)
                          OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(exporter)
            # Create new provider with sampler, preserving resource from SDK.configure
            create_and_configure_provider(current_provider.resource, sampler, exporter)
          else
                          OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
            create_and_configure_provider(base_resource, sampler, exporter)
          end

            new_provider.add_span_processor(processor)
        end

          # Set globally
          OpenTelemetry.tracer_provider = new_provider
        end
        def create_span_processor(exporter)
          return nil unless exporter

        def configure_manually(_service_name, base_resource, sampler, exporter)
          # Manual configuration (backward compatible)
          span_processors = []
          if exporter
            processor = if exporter.is_a?(OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter)
          if exporter.is_a?(OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter)
            OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(exporter)
          else
            OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
          end

            span_processors << processor
        end

        def create_and_configure_provider(resource, sampler, exporter)
          tracer_provider = OpenTelemetry::SDK::Trace::TracerProvider.new(
            resource: base_resource,
            resource: resource,
            sampler: sampler
          )

          span_processors.each { |processor| tracer_provider.add_span_processor(processor) }
          processor = create_span_processor(exporter)
          tracer_provider.add_span_processor(processor) if processor

          # Register the tracer provider globally
          OpenTelemetry.tracer_provider = tracer_provider
        end