@@ -8,14 +8,38 @@ use aws_sdk_eventbridge::operation::put_events::PutEventsInput;
88use aws_smithy_runtime_api:: box_error:: BoxError ;
99use aws_smithy_runtime_api:: client:: interceptors:: context:: Input ;
1010
11- use crate :: attribute_keys:: { DATADOG_ATTRIBUTE_KEY , RESOURCE_NAME_KEY , START_TIME_KEY } ;
11+ use crate :: attribute_keys:: { DATADOG_ATTRIBUTE_KEY , DATADOG_RESOURCE_NAME_KEY , START_TIME_KEY } ;
1212
13- use super :: { AwsServiceHandler , ONE_MB } ;
13+ use super :: { base_request_metadata , AwsServiceHandler , RequestMetadata , ONE_MB } ;
1414
1515#[ derive( Debug , Clone , Copy , Default ) ]
1616pub ( crate ) struct EventBridgeService ;
1717
18+ #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
19+ enum EventBridgeOperation {
20+ PutEvents ,
21+ }
22+
23+ impl EventBridgeOperation {
24+ fn from_name ( operation : & str ) -> Option < Self > {
25+ match operation {
26+ "PutEvents" => Some ( Self :: PutEvents ) ,
27+ _ => None ,
28+ }
29+ }
30+
31+ fn name ( self ) -> & ' static str {
32+ match self {
33+ Self :: PutEvents => "PutEvents" ,
34+ }
35+ }
36+ }
37+
1838impl AwsServiceHandler for EventBridgeService {
39+ fn service_id ( & self ) -> & ' static str {
40+ "EventBridge"
41+ }
42+
1943 fn inject (
2044 & self ,
2145 operation : & str ,
@@ -24,14 +48,34 @@ impl AwsServiceHandler for EventBridgeService {
2448 ) -> Result < ( ) , BoxError > {
2549 inject ( operation, trace_headers, input)
2650 }
51+
52+ fn extract_request_metadata (
53+ & self ,
54+ operation : & str ,
55+ input : & Input ,
56+ region : & str ,
57+ partition : & str ,
58+ ) -> Option < RequestMetadata > {
59+ let operation = EventBridgeOperation :: from_name ( operation) ?;
60+ if input. downcast_ref :: < PutEventsInput > ( ) . is_none ( ) {
61+ return None ;
62+ }
63+
64+ Some ( base_request_metadata (
65+ self . service_id ( ) ,
66+ operation. name ( ) ,
67+ region,
68+ partition,
69+ ) )
70+ }
2771}
2872
2973pub ( super ) fn inject (
3074 operation : & str ,
3175 trace_headers : HashMap < String , String > ,
3276 input : & mut Input ,
3377) -> Result < ( ) , BoxError > {
34- if operation == "PutEvents" {
78+ if let Some ( EventBridgeOperation :: PutEvents ) = EventBridgeOperation :: from_name ( operation ) {
3579 if let Some ( put_input) = input. downcast_mut :: < PutEventsInput > ( ) {
3680 inject_into_put_events ( put_input, trace_headers) ?;
3781 }
@@ -62,13 +106,13 @@ fn inject_into_put_events(
62106 for entry in entries. iter_mut ( ) {
63107 if let Some ( name) = entry. event_bus_name . as_deref ( ) {
64108 ctx. insert (
65- RESOURCE_NAME_KEY . into ( ) ,
109+ DATADOG_RESOURCE_NAME_KEY . into ( ) ,
66110 serde_json:: Value :: String ( name. into ( ) ) ,
67111 ) ;
68112 }
69113
70114 let trace_ctx = serde_json:: Value :: Object ( ctx. clone ( ) ) ;
71- ctx. remove ( RESOURCE_NAME_KEY ) ;
115+ ctx. remove ( DATADOG_RESOURCE_NAME_KEY ) ;
72116
73117 let detail = entry. detail . as_deref ( ) . unwrap_or ( "{}" ) ;
74118 let mut detail_map: serde_json:: Map < String , serde_json:: Value > =
@@ -101,6 +145,7 @@ mod tests {
101145 DATADOG_TRACE_ID_KEY ,
102146 } ;
103147 use aws_sdk_eventbridge:: types:: PutEventsRequestEntry ;
148+ use aws_smithy_runtime_api:: client:: interceptors:: context:: Input ;
104149
105150 fn parse_detail_datadog ( detail : & str ) -> HashMap < String , String > {
106151 let parsed: serde_json:: Value = serde_json:: from_str ( detail) . unwrap ( ) ;
@@ -153,7 +198,7 @@ mod tests {
153198 let detail = entries[ 0 ] . detail . as_ref ( ) . unwrap ( ) ;
154199 let dd = parse_detail_datadog ( detail) ;
155200 assert_eq ! ( dd[ DATADOG_TRACE_ID_KEY ] , "123456789" ) ;
156- assert ! ( !dd. contains_key( RESOURCE_NAME_KEY ) ) ;
201+ assert ! ( !dd. contains_key( DATADOG_RESOURCE_NAME_KEY ) ) ;
157202 }
158203
159204 #[ test]
@@ -172,7 +217,7 @@ mod tests {
172217 let entries = input. entries . as_ref ( ) . unwrap ( ) ;
173218 let detail = entries[ 0 ] . detail . as_ref ( ) . unwrap ( ) ;
174219 let dd = parse_detail_datadog ( detail) ;
175- assert_eq ! ( dd[ RESOURCE_NAME_KEY ] , "my-bus" ) ;
220+ assert_eq ! ( dd[ DATADOG_RESOURCE_NAME_KEY ] , "my-bus" ) ;
176221 }
177222
178223 #[ test]
@@ -205,9 +250,9 @@ mod tests {
205250 assert ! ( dd. contains_key( START_TIME_KEY ) ) ;
206251 }
207252 let dd0 = parse_detail_datadog ( entries[ 0 ] . detail . as_ref ( ) . unwrap ( ) ) ;
208- assert_eq ! ( dd0[ RESOURCE_NAME_KEY ] , "bus-1" ) ;
253+ assert_eq ! ( dd0[ DATADOG_RESOURCE_NAME_KEY ] , "bus-1" ) ;
209254 let dd1 = parse_detail_datadog ( entries[ 1 ] . detail . as_ref ( ) . unwrap ( ) ) ;
210- assert ! ( !dd1. contains_key( RESOURCE_NAME_KEY ) ) ;
255+ assert ! ( !dd1. contains_key( DATADOG_RESOURCE_NAME_KEY ) ) ;
211256 }
212257
213258 #[ test]
@@ -285,4 +330,22 @@ mod tests {
285330 . unwrap ( ) ;
286331 assert ! ( !detail. contains( DATADOG_ATTRIBUTE_KEY ) ) ;
287332 }
333+
334+ #[ test]
335+ fn extracts_put_events_request_metadata ( ) {
336+ let input = Input :: erase ( PutEventsInput :: builder ( ) . build ( ) . unwrap ( ) ) ;
337+
338+ let metadata = EventBridgeService
339+ . extract_request_metadata ( "PutEvents" , & input, "eu-west-1" , "aws" )
340+ . unwrap ( ) ;
341+
342+ assert_eq ! ( metadata. service_name, "aws.EventBridge" ) ;
343+ assert_eq ! ( metadata. resource_name, "EventBridge.PutEvents" ) ;
344+ assert_eq ! ( metadata. tags[ "aws.service" ] , "EventBridge" ) ;
345+ assert_eq ! ( metadata. tags[ "aws.operation" ] , "PutEvents" ) ;
346+ assert_eq ! ( metadata. tags[ "region" ] , "eu-west-1" ) ;
347+ assert_eq ! ( metadata. tags[ "aws.partition" ] , "aws" ) ;
348+ assert_eq ! ( metadata. tags[ "service.name" ] , "aws.EventBridge" ) ;
349+ assert_eq ! ( metadata. tags[ "resource.name" ] , "EventBridge.PutEvents" ) ;
350+ }
288351}
0 commit comments