lib/opentelemetry/exporter/otlp/exporter.rb in opentelemetry-exporter-otlp-0.24.0 vs lib/opentelemetry/exporter/otlp/exporter.rb in opentelemetry-exporter-otlp-0.24.1
- old
+ new
@@ -33,21 +33,23 @@
private_constant(:KEEP_ALIVE_TIMEOUT, :RETRY_COUNT, :WRITE_TIMEOUT_SUPPORTED)
ERROR_MESSAGE_INVALID_HEADERS = 'headers must be a String with comma-separated URL Encoded UTF-8 k=v pairs or a Hash'
private_constant(:ERROR_MESSAGE_INVALID_HEADERS)
+ DEFAULT_USER_AGENT = "OTel-OTLP-Exporter-Ruby/#{OpenTelemetry::Exporter::OTLP::VERSION} Ruby/#{RUBY_VERSION} (#{RUBY_PLATFORM}; #{RUBY_ENGINE}/#{RUBY_ENGINE_VERSION})"
+
def self.ssl_verify_mode
if ENV.key?('OTEL_RUBY_EXPORTER_OTLP_SSL_VERIFY_PEER')
OpenSSL::SSL::VERIFY_PEER
elsif ENV.key?('OTEL_RUBY_EXPORTER_OTLP_SSL_VERIFY_NONE')
OpenSSL::SSL::VERIFY_NONE
else
OpenSSL::SSL::VERIFY_PEER
end
end
- def initialize(endpoint: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'http://localhost:4318/v1/traces'), # rubocop:disable Metrics/CyclomaticComplexity
+ def initialize(endpoint: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'http://localhost:4318/v1/traces'),
certificate_file: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
ssl_verify_mode: Exporter.ssl_verify_mode,
headers: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS', default: {}),
compression: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION', default: 'gzip'),
timeout: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10),
@@ -62,16 +64,11 @@
end
@http = http_connection(@uri, ssl_verify_mode, certificate_file)
@path = @uri.path
- @headers = case headers
- when String then parse_headers(headers)
- when Hash then headers
- else
- raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS
- end
+ @headers = prepare_headers(headers)
@timeout = timeout.to_f
@compression = compression
@metrics_reporter = metrics_reporter || OpenTelemetry::SDK::Trace::Export::MetricsReporter
@shutdown = false
end
@@ -387,18 +384,33 @@
result.array_value = Opentelemetry::Proto::Common::V1::ArrayValue.new(values: values)
end
result
end
+ def prepare_headers(config_headers)
+ headers = case config_headers
+ when String then parse_headers(config_headers)
+ when Hash then config_headers.dup
+ else
+ raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS
+ end
+
+ headers['User-Agent'] = "#{headers.fetch('User-Agent', '')} #{DEFAULT_USER_AGENT}".strip
+
+ headers
+ end
+
def parse_headers(raw)
entries = raw.split(',')
raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS if entries.empty?
entries.each_with_object({}) do |entry, headers|
k, v = entry.split('=', 2).map(&CGI.method(:unescape))
begin
k = k.to_s.strip
v = v.to_s.strip
+ rescue Encoding::CompatibilityError
+ raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS
rescue ArgumentError => e
raise e, ERROR_MESSAGE_INVALID_HEADERS
end
raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS if k.empty? || v.empty?