Loading lib/labkit/tracing/jaeger_factory.rb +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 Loading @@ -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) Loading @@ -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" Loading @@ -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 Loading @@ -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 Loading spec/labkit/tracing/factory_spec.rb +12 −0 Original line number Diff line number Diff line Loading @@ -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 spec/labkit/tracing/jaeger_factory_spec.rb +12 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
lib/labkit/tracing/jaeger_factory.rb +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 Loading @@ -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) Loading @@ -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" Loading @@ -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 Loading @@ -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 Loading
spec/labkit/tracing/factory_spec.rb +12 −0 Original line number Diff line number Diff line Loading @@ -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
spec/labkit/tracing/jaeger_factory_spec.rb +12 −0 Original line number Diff line number Diff line Loading @@ -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