@@ -21,6 +21,8 @@ pub struct MSKRecord {
2121 pub topic : String ,
2222 pub partition : i32 ,
2323 pub timestamp : f64 ,
24+ #[ serde( default ) ]
25+ pub headers : Vec < HashMap < String , Vec < u8 > > > ,
2426}
2527
2628impl Trigger for MSKEvent {
@@ -105,7 +107,17 @@ impl Trigger for MSKEvent {
105107 }
106108
107109 fn get_carrier ( & self ) -> HashMap < String , String > {
108- HashMap :: new ( )
110+ let mut carrier = HashMap :: new ( ) ;
111+ if let Some ( record) = self . records . values ( ) . find_map ( |arr| arr. first ( ) ) {
112+ for header_map in & record. headers {
113+ for ( key, value_bytes) in header_map {
114+ if let Ok ( value_str) = String :: from_utf8 ( value_bytes. clone ( ) ) {
115+ carrier. insert ( key. to_lowercase ( ) , value_str) ;
116+ }
117+ }
118+ }
119+ }
120+ carrier
109121 }
110122
111123 fn is_async ( & self ) -> bool {
@@ -142,6 +154,7 @@ mod tests {
142154 topic : String :: from ( "topic1" ) ,
143155 partition : 0 ,
144156 timestamp : 1_745_846_213_022f64 ,
157+ headers : vec ! [ ] ,
145158 } ;
146159 let mut expected_records = HashMap :: new ( ) ;
147160 expected_records. insert ( String :: from ( "topic1" ) , vec ! [ record] ) ;
@@ -335,4 +348,36 @@ mod tests {
335348 "msk" // fallback value
336349 ) ;
337350 }
351+
352+ #[ test]
353+ fn test_new_with_headers ( ) {
354+ let json = read_json_file ( "msk_event_with_headers.json" ) ;
355+ let payload = serde_json:: from_str ( & json) . expect ( "Failed to deserialize into Value" ) ;
356+ let result = MSKEvent :: new ( payload) . expect ( "Failed to deserialize into MSKEvent" ) ;
357+
358+ let record = result. records . values ( ) . find_map ( |arr| arr. first ( ) ) . unwrap ( ) ;
359+ assert_eq ! ( record. topic, "topic1" ) ;
360+ assert_eq ! ( record. headers. len( ) , 3 ) ;
361+ }
362+
363+ #[ test]
364+ fn test_get_carrier_with_headers ( ) {
365+ let json = read_json_file ( "msk_event_with_headers.json" ) ;
366+ let payload = serde_json:: from_str ( & json) . expect ( "Failed to deserialize into Value" ) ;
367+ let event = MSKEvent :: new ( payload) . expect ( "Failed to deserialize MSKEvent" ) ;
368+ let carrier = event. get_carrier ( ) ;
369+
370+ assert_eq ! (
371+ carrier. get( "x-datadog-trace-id" ) . map( String :: as_str) ,
372+ Some ( "36979754430890456950" )
373+ ) ;
374+ assert_eq ! (
375+ carrier. get( "x-datadog-parent-id" ) . map( String :: as_str) ,
376+ Some ( "7431398482019833808" )
377+ ) ;
378+ assert_eq ! (
379+ carrier. get( "x-datadog-sampling-priority" ) . map( String :: as_str) ,
380+ Some ( "1" )
381+ ) ;
382+ }
338383}
0 commit comments