@@ -71,6 +71,7 @@ def initialize(endpoint: OpenTelemetry::Common::Utilities.config_opt('OTEL_EXPOR
7171 # @param [optional Numeric] timeout An optional timeout in seconds.
7272 # @return [Integer] the result of the export.
7373 def export ( span_data , timeout : nil )
74+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#export: Called with #{ span_data . size } spans, timeout=#{ timeout . inspect } " )
7475 return OpenTelemetry ::SDK ::Trace ::Export . failure ( message : 'exporter is shutdown' ) if @shutdown
7576
7677 send_bytes ( OpenTelemetry ::Exporter ::OTLP ::Common . as_encoded_etsr ( span_data ) , timeout : timeout )
@@ -131,26 +132,33 @@ def around_request
131132 end
132133
133134 def send_bytes ( bytes , timeout :) # rubocop:disable Metrics/MethodLength
135+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Entry with bytes.nil?=#{ bytes . nil? } , timeout=#{ timeout . inspect } " )
134136 if bytes . nil?
135137 OpenTelemetry . logger . error ( 'OTLP::HTTP::TraceExporter: send_bytes called with nil bytes' )
136138 return OpenTelemetry ::SDK ::Trace ::Export . failure ( message : 'send_bytes called with nil bytes' )
137139 end
138140
141+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Uncompressed size=#{ bytes . bytesize } bytes" )
139142 retry_count = 0
140143 timeout ||= @timeout
141144 start_time = OpenTelemetry ::Common ::Utilities . timeout_timestamp
145+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Starting request to #{ @uri } with timeout=#{ timeout } s" )
142146 around_request do # rubocop:disable Metrics/BlockLength
143147 request = Net ::HTTP ::Post . new ( @path )
144148 request . body = if @compression == 'gzip'
145149 request . add_field ( 'Content-Encoding' , 'gzip' )
146- Zlib . gzip ( bytes )
150+ compressed = Zlib . gzip ( bytes )
151+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Compressed size=#{ compressed . bytesize } bytes" )
152+ compressed
147153 else
154+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: No compression applied" )
148155 bytes
149156 end
150157 request . add_field ( 'Content-Type' , 'application/x-protobuf' )
151158 @headers . each { |key , value | request . add_field ( key , value ) }
152159
153160 remaining_timeout = OpenTelemetry ::Common ::Utilities . maybe_timeout ( timeout , start_time )
161+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Remaining timeout=#{ remaining_timeout } s, retry_count=#{ retry_count } " )
154162 if remaining_timeout . zero?
155163 OpenTelemetry . logger . error ( 'OTLP::HTTP::TraceExporter: timeout exceeded before sending request' )
156164 return OpenTelemetry ::SDK ::Trace ::Export . failure ( message : 'timeout exceeded before sending request' )
@@ -160,68 +168,92 @@ def send_bytes(bytes, timeout:) # rubocop:disable Metrics/MethodLength
160168 @http . read_timeout = remaining_timeout
161169 @http . write_timeout = remaining_timeout
162170 @http . start unless @http . started?
171+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Sending HTTP request" )
163172 response = measure_request_duration { @http . request ( request ) }
173+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Received response code=#{ response . code } , message=#{ response . message } " )
164174
165175 case response
166176 when Net ::HTTPOK
177+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: SUCCESS - HTTP 200 OK" )
167178 response . body # Read and discard body
168179 SUCCESS
169180 when Net ::HTTPServiceUnavailable , Net ::HTTPTooManyRequests
170181 body = response . body
182+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: ServiceUnavailable/TooManyRequests - retry_count=#{ retry_count + 1 } , retry_after=#{ response [ 'Retry-After' ] } " )
171183 redo if backoff? ( retry_after : response [ 'Retry-After' ] , retry_count : retry_count += 1 , reason : response . code )
184+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: FAILURE after max retries - HTTP #{ response . code } " )
172185 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed with #{ response . code } after #{ retry_count } retries" )
173186 OpenTelemetry ::SDK ::Trace ::Export . failure ( message : "export failed with HTTP #{ response . code } (#{ response . message } ) after #{ retry_count } retries: #{ body } " )
174187 when Net ::HTTPRequestTimeOut , Net ::HTTPGatewayTimeOut , Net ::HTTPBadGateway
175188 body = response . body
189+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Timeout/Gateway error - retry_count=#{ retry_count + 1 } , code=#{ response . code } " )
176190 redo if backoff? ( retry_count : retry_count += 1 , reason : response . code )
191+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: FAILURE after max retries - HTTP #{ response . code } " )
177192 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed with #{ response . code } after #{ retry_count } retries" )
178193 OpenTelemetry ::SDK ::Trace ::Export . failure ( message : "export failed with HTTP #{ response . code } (#{ response . message } ) after #{ retry_count } retries: #{ body } " )
179194 when Net ::HTTPBadRequest , Net ::HTTPClientError , Net ::HTTPServerError
180195 body = response . body
196+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Client/Server error - HTTP #{ response . code } " )
181197 log_status ( body )
182198 @metrics_reporter . add_to_counter ( 'otel.otlp_exporter.failure' , labels : { 'reason' => response . code } )
183199 OpenTelemetry ::SDK ::Trace ::Export . failure ( message : "export failed with HTTP #{ response . code } (#{ response . message } ): #{ body } " )
184200 when Net ::HTTPRedirection
201+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Redirect to location=#{ response [ 'location' ] } " )
185202 @http . finish
186203 handle_redirect ( response [ 'location' ] )
187204 redo if backoff? ( retry_after : 0 , retry_count : retry_count += 1 , reason : response . code )
188205 else
206+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Unexpected response - code=#{ response . code } , class=#{ response . class } " )
189207 @http . finish
190208 body = response . body
191209 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed with unexpected HTTP response #{ response . code } " )
192210 OpenTelemetry ::SDK ::Trace ::Export . failure ( message : "export failed with unexpected HTTP response #{ response . code } (#{ response . message } ): #{ body } " )
193211 end
194212 rescue Net ::OpenTimeout , Net ::ReadTimeout => e
213+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught #{ e . class } : #{ e . message } , retry_count=#{ retry_count + 1 } " )
195214 retry if backoff? ( retry_count : retry_count += 1 , reason : 'timeout' )
215+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for #{ e . class } " )
196216 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed due to #{ e . class } after #{ retry_count } retries" )
197217 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : "export failed due to #{ e . class } after #{ retry_count } retries" )
198218 rescue OpenSSL ::SSL ::SSLError => e
219+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught SSLError: #{ e . message } , retry_count=#{ retry_count + 1 } " )
199220 retry if backoff? ( retry_count : retry_count += 1 , reason : 'openssl_error' )
221+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for SSLError" )
200222 OpenTelemetry . handle_error ( exception : e , message : 'SSL error in OTLP::Exporter#send_bytes' )
201223 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : 'SSL error in OTLP::Exporter#send_bytes' )
202224 rescue SocketError => e
225+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught SocketError: #{ e . message } , retry_count=#{ retry_count + 1 } " )
203226 retry if backoff? ( retry_count : retry_count += 1 , reason : 'socket_error' )
227+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for SocketError" )
204228 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed due to SocketError after #{ retry_count } retries: #{ e . message } " )
205229 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : "export failed due to SocketError after #{ retry_count } retries: #{ e . message } " )
206230 rescue SystemCallError => e
231+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught #{ e . class } : #{ e . message } , retry_count=#{ retry_count + 1 } " )
207232 retry if backoff? ( retry_count : retry_count += 1 , reason : e . class . name )
233+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for #{ e . class } " )
208234 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed due to #{ e . class } after #{ retry_count } retries: #{ e . message } " )
209235 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : "export failed due to #{ e . class } after #{ retry_count } retries: #{ e . message } " )
210236 rescue EOFError => e
237+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught EOFError: #{ e . message } , retry_count=#{ retry_count + 1 } " )
211238 retry if backoff? ( retry_count : retry_count += 1 , reason : 'eof_error' )
239+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for EOFError" )
212240 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed due to EOFError after #{ retry_count } retries: #{ e . message } " )
213241 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : "export failed due to EOFError after #{ retry_count } retries: #{ e . message } " )
214242 rescue Zlib ::DataError => e
243+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught Zlib::DataError: #{ e . message } , retry_count=#{ retry_count + 1 } " )
215244 retry if backoff? ( retry_count : retry_count += 1 , reason : 'zlib_error' )
245+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Max retries exceeded for Zlib::DataError" )
216246 OpenTelemetry . logger . error ( "OTLP::HTTP::TraceExporter: export failed due to Zlib::DataError after #{ retry_count } retries: #{ e . message } " )
217247 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : "export failed due to Zlib::DataError after #{ retry_count } retries: #{ e . message } " )
218248 rescue StandardError => e
249+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Caught unexpected #{ e . class } : #{ e . message } " )
219250 OpenTelemetry . handle_error ( exception : e , message : 'unexpected error in OTLP::Exporter#send_bytes' )
220251 @metrics_reporter . add_to_counter ( 'otel.otlp_exporter.failure' , labels : { 'reason' => e . class . to_s } )
221252 return OpenTelemetry ::SDK ::Trace ::Export . failure ( error : e , message : 'unexpected error in OTLP::Exporter#send_bytes' )
222253 end
223254 ensure
224255 # Reset timeouts to defaults for the next call.
256+ OpenTelemetry . logger . debug ( "OTLP::HTTP::TraceExporter#send_bytes: Resetting timeouts to default #{ @timeout } s" )
225257 @http . open_timeout = @timeout
226258 @http . read_timeout = @timeout
227259 @http . write_timeout = @timeout
0 commit comments