@@ -23,6 +23,12 @@ use crate::cli::chat::tools::{
23
23
use crate :: cli:: chat:: util:: truncate_safe;
24
24
use crate :: os:: Os ;
25
25
26
+ /// The environment variable name where we set additional metadata for the AWS CLI user agent.
27
+ const USER_AGENT_ENV_VAR : & str = "AWS_EXECUTION_ENV" ;
28
+ const USER_AGENT_APP_NAME : & str = "AmazonQ-For-CLI" ;
29
+ const USER_AGENT_VERSION_KEY : & str = "Version" ;
30
+ const USER_AGENT_VERSION_VALUE : & str = env ! ( "CARGO_PKG_VERSION" ) ;
31
+
26
32
// Platform-specific modules
27
33
#[ cfg( windows) ]
28
34
mod windows;
@@ -247,6 +253,33 @@ pub fn format_output(output: &str, max_size: usize) -> String {
247
253
)
248
254
}
249
255
256
+ /// Helper function to set up environment variables with user agent metadata for CloudTrail tracking
257
+ pub fn setup_env_vars ( ) -> std:: collections:: HashMap < String , String > {
258
+ let mut env_vars: std:: collections:: HashMap < String , String > = std:: env:: vars ( ) . collect ( ) ;
259
+
260
+ // Set up additional metadata for the AWS CLI user agent
261
+ let user_agent_metadata_value = format ! (
262
+ "{} {}/{}" ,
263
+ USER_AGENT_APP_NAME , USER_AGENT_VERSION_KEY , USER_AGENT_VERSION_VALUE
264
+ ) ;
265
+
266
+ // If the user agent metadata env var already exists, append to it, otherwise set it
267
+ if let Some ( existing_value) = env_vars. get ( USER_AGENT_ENV_VAR ) {
268
+ if !existing_value. is_empty ( ) {
269
+ env_vars. insert (
270
+ USER_AGENT_ENV_VAR . to_string ( ) ,
271
+ format ! ( "{} {}" , existing_value, user_agent_metadata_value) ,
272
+ ) ;
273
+ } else {
274
+ env_vars. insert ( USER_AGENT_ENV_VAR . to_string ( ) , user_agent_metadata_value) ;
275
+ }
276
+ } else {
277
+ env_vars. insert ( USER_AGENT_ENV_VAR . to_string ( ) , user_agent_metadata_value) ;
278
+ }
279
+
280
+ env_vars
281
+ }
282
+
250
283
#[ cfg( test) ]
251
284
mod tests {
252
285
use super :: * ;
@@ -384,4 +417,47 @@ mod tests {
384
417
) ;
385
418
}
386
419
}
420
+
421
+ #[ test]
422
+ fn test_cloudtrail_tracking ( ) {
423
+ // Test that setup_env_vars sets the AWS_EXECUTION_ENV variable correctly
424
+ let env_vars = setup_env_vars ( ) ;
425
+
426
+ // Check that AWS_EXECUTION_ENV is set
427
+ assert ! ( env_vars. contains_key( USER_AGENT_ENV_VAR ) ) ;
428
+
429
+ let user_agent_value = env_vars. get ( USER_AGENT_ENV_VAR ) . unwrap ( ) ;
430
+
431
+ // Check that it contains our app name and version
432
+ assert ! ( user_agent_value. contains( USER_AGENT_APP_NAME ) ) ;
433
+ assert ! ( user_agent_value. contains( USER_AGENT_VERSION_KEY ) ) ;
434
+ assert ! ( user_agent_value. contains( USER_AGENT_VERSION_VALUE ) ) ;
435
+
436
+ // Check the format is correct
437
+ let expected_metadata = format ! (
438
+ "{} {}/{}" ,
439
+ USER_AGENT_APP_NAME , USER_AGENT_VERSION_KEY , USER_AGENT_VERSION_VALUE
440
+ ) ;
441
+ assert ! ( user_agent_value. contains( & expected_metadata) ) ;
442
+ }
443
+
444
+ #[ test]
445
+ fn test_cloudtrail_tracking_with_existing_env ( ) {
446
+ // Set an existing AWS_EXECUTION_ENV value
447
+ unsafe {
448
+ std:: env:: set_var ( USER_AGENT_ENV_VAR , "ExistingValue" ) ;
449
+ }
450
+
451
+ let env_vars = setup_env_vars ( ) ;
452
+ let user_agent_value = env_vars. get ( USER_AGENT_ENV_VAR ) . unwrap ( ) ;
453
+
454
+ // Should contain both the existing value and our metadata
455
+ assert ! ( user_agent_value. contains( "ExistingValue" ) ) ;
456
+ assert ! ( user_agent_value. contains( USER_AGENT_APP_NAME ) ) ;
457
+
458
+ // Clean up
459
+ unsafe {
460
+ std:: env:: remove_var ( USER_AGENT_ENV_VAR ) ;
461
+ }
462
+ }
387
463
}
0 commit comments