Commit b644748b authored by Bob Van Landuyt's avatar Bob Van Landuyt 💬
Browse files

Merge branch 'abhatnagar/tracing-basicauth-support' into 'master'

feat(tracing): Add ability to use endpoints with basic auth credentials

See merge request !94
parents 17e642c7 b0a9e5c3
Loading
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
# frozen_string_literal: true

require "active_support"
require "active_support/core_ext"

require "jaeger/client"

module Labkit
@@ -22,10 +25,13 @@ module Labkit
        # The service_name parameter from GITLAB_TRACING takes precedence over the application one
        service_name = options[:service_name] if options[:service_name]

        # parse reporter headers as necessary
        headers = build_headers(options)

        kwargs = {
          service_name: service_name,
          sampler: get_sampler(options[:sampler], options[:sampler_param]),
          reporter: get_reporter(service_name, options[:http_endpoint], options[:udp_endpoint]),
          reporter: get_reporter(service_name, options[:http_endpoint], options[:udp_endpoint], headers),
        }.compact

        extra_params = options.except(:sampler, :sampler_param, :http_endpoint, :udp_endpoint, :strict_parsing, :debug)
@@ -40,6 +46,24 @@ module Labkit
        Jaeger::Client.build(**kwargs)
      end

      def self.build_headers(options)
        return unless options&.key?(:http_endpoint)

        http_endpoint = options[:http_endpoint]
        parsed = URI.parse(http_endpoint)

        headers = {}
        # add basic auth header only when both user and password are setup correctly
        user = parsed.user
        password = parsed.password
        if user.present? && password.present?
          headers["Authorization"] = "Basic " + Base64.strict_encode64("#{user}:#{password}")
        end

        return headers
      end
      private_class_method :build_headers

      def self.get_sampler(sampler_type, sampler_param)
        case sampler_type
        when "probabilistic"
@@ -52,11 +76,11 @@ module Labkit
      end
      private_class_method :get_sampler

      def self.get_reporter(service_name, http_endpoint, udp_endpoint)
      def self.get_reporter(service_name, http_endpoint, udp_endpoint, headers)
        encoder = Jaeger::Encoders::ThriftEncoder.new(service_name: service_name)

        if http_endpoint.present?
          sender = get_http_sender(encoder, http_endpoint)
          sender = get_http_sender(encoder, http_endpoint, headers)
        elsif udp_endpoint.present?
          sender = get_udp_sender(encoder, udp_endpoint)
        else
@@ -67,8 +91,8 @@ module Labkit
      end
      private_class_method :get_reporter

      def self.get_http_sender(encoder, address)
        Jaeger::HttpSender.new(url: address, encoder: encoder, logger: Logger.new(STDOUT))
      def self.get_http_sender(encoder, address, headers)
        Jaeger::HttpSender.new(url: address, headers: headers, encoder: encoder, logger: Logger.new(STDOUT))
      end
      private_class_method :get_http_sender

+12 −0
Original line number Diff line number Diff line
@@ -36,6 +36,18 @@ describe Labkit::Tracing::Factory do

        expect(described_class.create_tracer(service_name, "opentracing://jaeger?a=1&b=2&c=3")).to be(mock_tracer)
      end

      it "processes connections with basic auth credentials" do
        expect(Labkit::Tracing::JaegerFactory).to receive(:create_tracer).with(
          service_name,
          a: "1",
          b: "2",
          c: "3",
          http_endpoint: "https://foo:bar@observe.gitlab.com",
        ).and_return(mock_tracer)

        expect(described_class.create_tracer(service_name, "opentracing://jaeger?http_endpoint=https://foo:bar@observe.gitlab.com&a=1&b=2&c=3")).to be(mock_tracer)
      end
    end
  end
end
+12 −0
Original line number Diff line number Diff line
@@ -65,5 +65,17 @@ describe Labkit::Tracing::JaegerFactory do
    it "rejects invalid parameters when strict_parser is set" do
      expect { described_class.create_tracer(service_name, invalid: "true", strict_parsing: "1") }.to raise_error(StandardError)
    end

    context "when processing connection with basic auth credentials" do
      it_behaves_like "a jaeger tracer" do
        let(:tracer) do
          described_class.create_tracer(
            service_name,
            debug: "1",
            http_endpoint: "https://foo:bar@observe.gitlab.com",
          )
        end
      end
    end
  end
end