@@ -71,6 +71,7 @@ pub use crate::telemetry::core::{
7171 QProfileSwitchIntent ,
7272 TelemetryResult ,
7373} ;
74+ use crate :: util:: env_var:: Q_CLI_CLIENT_APPLICATION ;
7475use crate :: util:: system_info:: os_version;
7576
7677#[ derive( thiserror:: Error , Debug ) ]
@@ -231,10 +232,17 @@ impl TelemetryThread {
231232 Ok ( self . tx . send ( Event :: new ( EventType :: UserLoggedIn { } ) ) ?)
232233 }
233234
234- pub fn send_cli_subcommand_executed ( & self , subcommand : & RootSubcommand ) -> Result < ( ) , TelemetryError > {
235- Ok ( self . tx . send ( Event :: new ( EventType :: CliSubcommandExecuted {
235+ pub async fn send_cli_subcommand_executed (
236+ & self ,
237+ database : & Database ,
238+ subcommand : & RootSubcommand ,
239+ ) -> Result < ( ) , TelemetryError > {
240+ let mut telemetry_event = Event :: new ( EventType :: CliSubcommandExecuted {
236241 subcommand : subcommand. to_string ( ) ,
237- } ) ) ?)
242+ } ) ;
243+ set_event_metadata ( database, & mut telemetry_event) . await ;
244+
245+ Ok ( self . tx . send ( telemetry_event) ?)
238246 }
239247
240248 pub async fn send_chat_slash_command_executed (
@@ -246,15 +254,15 @@ impl TelemetryThread {
246254 result : TelemetryResult ,
247255 reason : Option < String > ,
248256 ) -> Result < ( ) , TelemetryError > {
249- let mut event = Event :: new ( EventType :: ChatSlashCommandExecuted {
257+ let mut telemetry_event = Event :: new ( EventType :: ChatSlashCommandExecuted {
250258 conversation_id,
251259 command,
252260 subcommand,
253261 result,
254262 reason,
255263 } ) ;
256- set_start_url_and_region ( database, & mut event ) . await ;
257- Ok ( self . tx . send ( event ) ?)
264+ set_event_metadata ( database, & mut telemetry_event ) . await ;
265+ Ok ( self . tx . send ( telemetry_event ) ?)
258266 }
259267
260268 #[ allow( clippy:: too_many_arguments) ] // TODO: Should make a parameters struct.
@@ -265,14 +273,14 @@ impl TelemetryThread {
265273 result : TelemetryResult ,
266274 data : ChatAddedMessageParams ,
267275 ) -> Result < ( ) , TelemetryError > {
268- let mut event = Event :: new ( EventType :: ChatAddedMessage {
276+ let mut telemetry_event = Event :: new ( EventType :: ChatAddedMessage {
269277 conversation_id,
270278 result,
271279 data,
272280 } ) ;
273- set_start_url_and_region ( database, & mut event ) . await ;
281+ set_event_metadata ( database, & mut telemetry_event ) . await ;
274282
275- Ok ( self . tx . send ( event ) ?)
283+ Ok ( self . tx . send ( telemetry_event ) ?)
276284 }
277285
278286 pub async fn send_record_user_turn_completion (
@@ -282,17 +290,21 @@ impl TelemetryThread {
282290 result : TelemetryResult ,
283291 args : RecordUserTurnCompletionArgs ,
284292 ) -> Result < ( ) , TelemetryError > {
285- let mut event = Event :: new ( EventType :: RecordUserTurnCompletion {
293+ let mut telemetry_event = Event :: new ( EventType :: RecordUserTurnCompletion {
286294 conversation_id,
287295 result,
288296 args,
289297 } ) ;
290- set_start_url_and_region ( database, & mut event ) . await ;
291- Ok ( self . tx . send ( event ) ?)
298+ set_event_metadata ( database, & mut telemetry_event ) . await ;
299+ Ok ( self . tx . send ( telemetry_event ) ?)
292300 }
293301
294- pub fn send_tool_use_suggested ( & self , event : ToolUseEventBuilder ) -> Result < ( ) , TelemetryError > {
295- Ok ( self . tx . send ( Event :: new ( EventType :: ToolUseSuggested {
302+ pub async fn send_tool_use_suggested (
303+ & self ,
304+ database : & Database ,
305+ event : ToolUseEventBuilder ,
306+ ) -> Result < ( ) , TelemetryError > {
307+ let mut telemetry_event = Event :: new ( EventType :: ToolUseSuggested {
296308 conversation_id : event. conversation_id ,
297309 utterance_id : event. utterance_id ,
298310 user_input_id : event. user_input_id ,
@@ -310,7 +322,12 @@ impl TelemetryThread {
310322 model : event. model ,
311323 execution_duration : event. execution_duration ,
312324 turn_duration : event. turn_duration ,
313- } ) ) ?)
325+ aws_service_name : event. aws_service_name ,
326+ aws_operation_name : event. aws_operation_name ,
327+ } ) ;
328+ set_event_metadata ( database, & mut telemetry_event) . await ;
329+
330+ Ok ( self . tx . send ( telemetry_event) ?)
314331 }
315332
316333 pub async fn send_mcp_server_init (
@@ -321,14 +338,15 @@ impl TelemetryThread {
321338 init_failure_reason : Option < String > ,
322339 number_of_tools : usize ,
323340 ) -> Result < ( ) , TelemetryError > {
324- let mut event = Event :: new ( crate :: telemetry:: EventType :: McpServerInit {
341+ let mut telemetry_event = Event :: new ( crate :: telemetry:: EventType :: McpServerInit {
325342 conversation_id,
326343 server_name,
327344 init_failure_reason,
328345 number_of_tools,
329346 } ) ;
330- set_start_url_and_region ( database, & mut event) . await ;
331- Ok ( self . tx . send ( event) ?)
347+ set_event_metadata ( database, & mut telemetry_event) . await ;
348+
349+ Ok ( self . tx . send ( telemetry_event) ?)
332350 }
333351
334352 pub async fn send_agent_config_init (
@@ -337,9 +355,9 @@ impl TelemetryThread {
337355 conversation_id : String ,
338356 args : AgentConfigInitArgs ,
339357 ) -> Result < ( ) , TelemetryError > {
340- let mut event = Event :: new ( crate :: telemetry:: EventType :: AgentConfigInit { conversation_id, args } ) ;
341- set_start_url_and_region ( database, & mut event ) . await ;
342- Ok ( self . tx . send ( event ) ?)
358+ let mut telemetry_event = Event :: new ( crate :: telemetry:: EventType :: AgentConfigInit { conversation_id, args } ) ;
359+ set_event_metadata ( database, & mut telemetry_event ) . await ;
360+ Ok ( self . tx . send ( telemetry_event ) ?)
343361 }
344362
345363 pub fn send_did_select_profile (
@@ -387,7 +405,7 @@ impl TelemetryThread {
387405 request_id : Option < String > ,
388406 message_id : Option < String > ,
389407 ) -> Result < ( ) , TelemetryError > {
390- let mut event = Event :: new ( EventType :: MessageResponseError {
408+ let mut telemetry_event = Event :: new ( EventType :: MessageResponseError {
391409 result,
392410 reason,
393411 reason_desc,
@@ -397,20 +415,25 @@ impl TelemetryThread {
397415 request_id,
398416 message_id,
399417 } ) ;
400- set_start_url_and_region ( database, & mut event ) . await ;
418+ set_event_metadata ( database, & mut telemetry_event ) . await ;
401419
402- Ok ( self . tx . send ( event ) ?)
420+ Ok ( self . tx . send ( telemetry_event ) ?)
403421 }
404422}
405423
406- async fn set_start_url_and_region ( database : & Database , event : & mut Event ) {
424+ async fn set_event_metadata ( database : & Database , event : & mut Event ) {
407425 let ( start_url, region) = get_start_url_and_region ( database) . await ;
408426 if let Some ( start_url) = start_url {
409427 event. set_start_url ( start_url) ;
410428 }
411429 if let Some ( region) = region {
412430 event. set_sso_region ( region) ;
413431 }
432+
433+ // Set the client application from environment variable
434+ if let Ok ( client_app) = std:: env:: var ( Q_CLI_CLIENT_APPLICATION ) {
435+ event. set_client_application ( client_app) ;
436+ }
414437}
415438
416439#[ derive( Debug ) ]
@@ -690,7 +713,8 @@ mod test {
690713
691714 thread. send_user_logged_in ( ) . ok ( ) ;
692715 thread
693- . send_cli_subcommand_executed ( & RootSubcommand :: Version { changelog : None } )
716+ . send_cli_subcommand_executed ( & database, & RootSubcommand :: Version { changelog : None } )
717+ . await
694718 . ok ( ) ;
695719 thread
696720 . send_chat_added_message (
0 commit comments