@@ -34,7 +34,7 @@ use crate::{
3434 common:: http:: ErrorMessage ,
3535 event:: Event ,
3636 http:: { KeepaliveConfig , MaxConnectionAgeLayer , build_http_trace_layer} ,
37- internal_events:: { EventsReceived , StreamClosedError } ,
37+ internal_events:: { EventsReceived , HttpBadRequest , StreamClosedError } ,
3838 shutdown:: ShutdownSignal ,
3939 sources:: {
4040 http_server:: HttpConfigParamKind ,
@@ -144,6 +144,26 @@ fn enrich_events(
144144 ) ;
145145}
146146
147+ fn emit_decode_error ( error : impl std:: fmt:: Display ) -> ErrorMessage {
148+ let message = format ! ( "Could not decode request: {error}" ) ;
149+ emit ! ( HttpBadRequest :: new(
150+ StatusCode :: BAD_REQUEST . as_u16( ) ,
151+ & message
152+ ) ) ;
153+ ErrorMessage :: new ( StatusCode :: BAD_REQUEST , message)
154+ }
155+
156+ fn parse_with_deserializer (
157+ deserializer : & OtlpDeserializer ,
158+ body : Bytes ,
159+ log_namespace : LogNamespace ,
160+ ) -> Result < Vec < Event > , ErrorMessage > {
161+ deserializer
162+ . parse ( body, log_namespace)
163+ . map ( |r| r. into_vec ( ) )
164+ . map_err ( emit_decode_error)
165+ }
166+
147167fn build_ingest_filter < Resp , F > (
148168 telemetry_type : & ' static str ,
149169 acknowledgements : bool ,
@@ -194,21 +214,29 @@ fn build_warp_log_filter(
194214 deserializer : Option < OtlpDeserializer > ,
195215) -> BoxedFilter < ( Response , ) > {
196216 let make_events = move |encoding_header : Option < String > , headers : HeaderMap , body : Bytes | {
197- if let Some ( d) = deserializer. as_ref ( ) {
198- d. parse ( body, log_namespace)
199- . map ( |r| r. into_vec ( ) )
200- . map_err ( |e| ErrorMessage :: new ( StatusCode :: BAD_REQUEST , e. to_string ( ) ) )
201- } else {
202- decode ( encoding_header. as_deref ( ) , body)
203- . and_then ( |body| {
204- bytes_received. emit ( ByteSize ( body. len ( ) ) ) ;
205- decode_log_body ( body, log_namespace, & events_received)
206- } )
207- . map ( |mut events| {
208- enrich_events ( & mut events, & headers_cfg, & headers, log_namespace) ;
209- events
210- } )
211- }
217+ decode ( encoding_header. as_deref ( ) , body)
218+ . inspect_err ( |err| {
219+ // Other status codes are already handled by `sources::util::decode` (tech debt).
220+ if err. status_code ( ) == StatusCode :: UNSUPPORTED_MEDIA_TYPE {
221+ emit ! ( HttpBadRequest :: new(
222+ err. status_code( ) . as_u16( ) ,
223+ err. message( )
224+ ) ) ;
225+ }
226+ } )
227+ . and_then ( |decoded_body| {
228+ bytes_received. emit ( ByteSize ( decoded_body. len ( ) ) ) ;
229+ if let Some ( d) = deserializer. as_ref ( ) {
230+ parse_with_deserializer ( d, decoded_body, log_namespace)
231+ } else {
232+ decode_log_body ( decoded_body, log_namespace, & events_received) . map (
233+ |mut events| {
234+ enrich_events ( & mut events, & headers_cfg, & headers, log_namespace) ;
235+ events
236+ } ,
237+ )
238+ }
239+ } )
212240 } ;
213241
214242 build_ingest_filter :: < ExportLogsServiceResponse , _ > (
@@ -226,16 +254,24 @@ fn build_warp_metrics_filter(
226254 deserializer : Option < OtlpDeserializer > ,
227255) -> BoxedFilter < ( Response , ) > {
228256 let make_events = move |encoding_header : Option < String > , _headers : HeaderMap , body : Bytes | {
229- if let Some ( d) = deserializer. as_ref ( ) {
230- d. parse ( body, LogNamespace :: default ( ) )
231- . map ( |r| r. into_vec ( ) )
232- . map_err ( |e| ErrorMessage :: new ( StatusCode :: BAD_REQUEST , e. to_string ( ) ) )
233- } else {
234- decode ( encoding_header. as_deref ( ) , body) . and_then ( |body| {
235- bytes_received. emit ( ByteSize ( body. len ( ) ) ) ;
236- decode_metrics_body ( body, & events_received)
257+ decode ( encoding_header. as_deref ( ) , body)
258+ . inspect_err ( |err| {
259+ // Other status codes are already handled by `sources::util::decode` (tech debt).
260+ if err. status_code ( ) == StatusCode :: UNSUPPORTED_MEDIA_TYPE {
261+ emit ! ( HttpBadRequest :: new(
262+ err. status_code( ) . as_u16( ) ,
263+ err. message( )
264+ ) ) ;
265+ }
266+ } )
267+ . and_then ( |decoded_body| {
268+ bytes_received. emit ( ByteSize ( decoded_body. len ( ) ) ) ;
269+ if let Some ( d) = deserializer. as_ref ( ) {
270+ parse_with_deserializer ( d, decoded_body, LogNamespace :: default ( ) )
271+ } else {
272+ decode_metrics_body ( decoded_body, & events_received)
273+ }
237274 } )
238- }
239275 } ;
240276
241277 build_ingest_filter :: < ExportMetricsServiceResponse , _ > (
@@ -254,16 +290,24 @@ fn build_warp_trace_filter(
254290 deserializer : Option < OtlpDeserializer > ,
255291) -> BoxedFilter < ( Response , ) > {
256292 let make_events = move |encoding_header : Option < String > , _headers : HeaderMap , body : Bytes | {
257- if let Some ( d) = deserializer. as_ref ( ) {
258- d. parse ( body, LogNamespace :: default ( ) )
259- . map ( |r| r. into_vec ( ) )
260- . map_err ( |e| ErrorMessage :: new ( StatusCode :: BAD_REQUEST , e. to_string ( ) ) )
261- } else {
262- decode ( encoding_header. as_deref ( ) , body) . and_then ( |body| {
263- bytes_received. emit ( ByteSize ( body. len ( ) ) ) ;
264- decode_trace_body ( body, & events_received)
293+ decode ( encoding_header. as_deref ( ) , body)
294+ . inspect_err ( |err| {
295+ // Other status codes are already handled by `sources::util::decode` (tech debt).
296+ if err. status_code ( ) == StatusCode :: UNSUPPORTED_MEDIA_TYPE {
297+ emit ! ( HttpBadRequest :: new(
298+ err. status_code( ) . as_u16( ) ,
299+ err. message( )
300+ ) ) ;
301+ }
302+ } )
303+ . and_then ( |decoded_body| {
304+ bytes_received. emit ( ByteSize ( decoded_body. len ( ) ) ) ;
305+ if let Some ( d) = deserializer. as_ref ( ) {
306+ parse_with_deserializer ( d, decoded_body, LogNamespace :: default ( ) )
307+ } else {
308+ decode_trace_body ( decoded_body, & events_received)
309+ }
265310 } )
266- }
267311 } ;
268312
269313 build_ingest_filter :: < ExportTraceServiceResponse , _ > (
@@ -278,12 +322,7 @@ fn decode_trace_body(
278322 body : Bytes ,
279323 events_received : & Registered < EventsReceived > ,
280324) -> Result < Vec < Event > , ErrorMessage > {
281- let request = ExportTraceServiceRequest :: decode ( body) . map_err ( |error| {
282- ErrorMessage :: new (
283- StatusCode :: BAD_REQUEST ,
284- format ! ( "Could not decode request: {error}" ) ,
285- )
286- } ) ?;
325+ let request = ExportTraceServiceRequest :: decode ( body) . map_err ( emit_decode_error) ?;
287326
288327 let events: Vec < Event > = request
289328 . resource_spans
@@ -304,12 +343,7 @@ fn decode_log_body(
304343 log_namespace : LogNamespace ,
305344 events_received : & Registered < EventsReceived > ,
306345) -> Result < Vec < Event > , ErrorMessage > {
307- let request = ExportLogsServiceRequest :: decode ( body) . map_err ( |error| {
308- ErrorMessage :: new (
309- StatusCode :: BAD_REQUEST ,
310- format ! ( "Could not decode request: {error}" ) ,
311- )
312- } ) ?;
346+ let request = ExportLogsServiceRequest :: decode ( body) . map_err ( emit_decode_error) ?;
313347
314348 let events: Vec < Event > = request
315349 . resource_logs
@@ -329,12 +363,7 @@ fn decode_metrics_body(
329363 body : Bytes ,
330364 events_received : & Registered < EventsReceived > ,
331365) -> Result < Vec < Event > , ErrorMessage > {
332- let request = ExportMetricsServiceRequest :: decode ( body) . map_err ( |error| {
333- ErrorMessage :: new (
334- StatusCode :: BAD_REQUEST ,
335- format ! ( "Could not decode request: {error}" ) ,
336- )
337- } ) ?;
366+ let request = ExportMetricsServiceRequest :: decode ( body) . map_err ( emit_decode_error) ?;
338367
339368 let events: Vec < Event > = request
340369 . resource_metrics
0 commit comments