@@ -66,6 +66,7 @@ pub use crate::telemetry::core::{
6666 QProfileSwitchIntent ,
6767 TelemetryResult ,
6868} ;
69+ use crate :: util:: env_var:: Q_CLI_CLIENT_APPLICATION ;
6970use crate :: util:: system_info:: os_version;
7071
7172#[ derive( thiserror:: Error , Debug ) ]
@@ -226,10 +227,17 @@ impl TelemetryThread {
226227 Ok ( self . tx . send ( Event :: new ( EventType :: UserLoggedIn { } ) ) ?)
227228 }
228229
229- pub fn send_cli_subcommand_executed ( & self , subcommand : & RootSubcommand ) -> Result < ( ) , TelemetryError > {
230- Ok ( self . tx . send ( Event :: new ( EventType :: CliSubcommandExecuted {
230+ pub async fn send_cli_subcommand_executed (
231+ & self ,
232+ database : & Database ,
233+ subcommand : & RootSubcommand ,
234+ ) -> Result < ( ) , TelemetryError > {
235+ let mut telemetry_event = Event :: new ( EventType :: CliSubcommandExecuted {
231236 subcommand : subcommand. to_string ( ) ,
232- } ) ) ?)
237+ } ) ;
238+ set_event_metadata ( database, & mut telemetry_event) . await ;
239+
240+ Ok ( self . tx . send ( telemetry_event) ?)
233241 }
234242
235243 #[ allow( clippy:: too_many_arguments) ] // TODO: Should make a parameters struct.
@@ -246,7 +254,7 @@ impl TelemetryThread {
246254 status_code : Option < u16 > ,
247255 model : Option < String > ,
248256 ) -> Result < ( ) , TelemetryError > {
249- let mut event = Event :: new ( EventType :: ChatAddedMessage {
257+ let mut telemetry_event = Event :: new ( EventType :: ChatAddedMessage {
250258 conversation_id,
251259 message_id,
252260 request_id,
@@ -257,13 +265,17 @@ impl TelemetryThread {
257265 status_code,
258266 model,
259267 } ) ;
260- set_start_url_and_region ( database, & mut event ) . await ;
268+ set_event_metadata ( database, & mut telemetry_event ) . await ;
261269
262- Ok ( self . tx . send ( event ) ?)
270+ Ok ( self . tx . send ( telemetry_event ) ?)
263271 }
264272
265- pub fn send_tool_use_suggested ( & self , event : ToolUseEventBuilder ) -> Result < ( ) , TelemetryError > {
266- Ok ( self . tx . send ( Event :: new ( EventType :: ToolUseSuggested {
273+ pub async fn send_tool_use_suggested (
274+ & self ,
275+ database : & Database ,
276+ event : ToolUseEventBuilder ,
277+ ) -> Result < ( ) , TelemetryError > {
278+ let mut telemetry_event = Event :: new ( EventType :: ToolUseSuggested {
267279 conversation_id : event. conversation_id ,
268280 utterance_id : event. utterance_id ,
269281 user_input_id : event. user_input_id ,
@@ -277,20 +289,29 @@ impl TelemetryThread {
277289 output_token_size : event. output_token_size ,
278290 custom_tool_call_latency : event. custom_tool_call_latency ,
279291 model : event. model ,
280- } ) ) ?)
292+ aws_service_name : event. aws_service_name ,
293+ aws_operation_name : event. aws_operation_name ,
294+ } ) ;
295+ set_event_metadata ( database, & mut telemetry_event) . await ;
296+
297+ Ok ( self . tx . send ( telemetry_event) ?)
281298 }
282299
283- pub fn send_mcp_server_init (
300+ pub async fn send_mcp_server_init (
284301 & self ,
302+ database : & Database ,
285303 conversation_id : String ,
286304 init_failure_reason : Option < String > ,
287305 number_of_tools : usize ,
288306 ) -> Result < ( ) , TelemetryError > {
289- Ok ( self . tx . send ( Event :: new ( crate :: telemetry:: EventType :: McpServerInit {
307+ let mut telemetry_event = Event :: new ( crate :: telemetry:: EventType :: McpServerInit {
290308 conversation_id,
291309 init_failure_reason,
292310 number_of_tools,
293- } ) ) ?)
311+ } ) ;
312+ set_event_metadata ( database, & mut telemetry_event) . await ;
313+
314+ Ok ( self . tx . send ( telemetry_event) ?)
294315 }
295316
296317 pub fn send_did_select_profile (
@@ -336,28 +357,33 @@ impl TelemetryThread {
336357 reason_desc : Option < String > ,
337358 status_code : Option < u16 > ,
338359 ) -> Result < ( ) , TelemetryError > {
339- let mut event = Event :: new ( EventType :: MessageResponseError {
360+ let mut telemetry_event = Event :: new ( EventType :: MessageResponseError {
340361 result,
341362 reason,
342363 reason_desc,
343364 status_code,
344365 conversation_id,
345366 context_file_length,
346367 } ) ;
347- set_start_url_and_region ( database, & mut event ) . await ;
368+ set_event_metadata ( database, & mut telemetry_event ) . await ;
348369
349- Ok ( self . tx . send ( event ) ?)
370+ Ok ( self . tx . send ( telemetry_event ) ?)
350371 }
351372}
352373
353- async fn set_start_url_and_region ( database : & Database , event : & mut Event ) {
374+ async fn set_event_metadata ( database : & Database , event : & mut Event ) {
354375 let ( start_url, region) = get_start_url_and_region ( database) . await ;
355376 if let Some ( start_url) = start_url {
356377 event. set_start_url ( start_url) ;
357378 }
358379 if let Some ( region) = region {
359380 event. set_sso_region ( region) ;
360381 }
382+
383+ // Set the client application from environment variable
384+ if let Ok ( client_app) = std:: env:: var ( Q_CLI_CLIENT_APPLICATION ) {
385+ event. set_client_application ( client_app) ;
386+ }
361387}
362388
363389#[ derive( Debug ) ]
@@ -627,7 +653,8 @@ mod test {
627653
628654 thread. send_user_logged_in ( ) . ok ( ) ;
629655 thread
630- . send_cli_subcommand_executed ( & RootSubcommand :: Version { changelog : None } )
656+ . send_cli_subcommand_executed ( & database, & RootSubcommand :: Version { changelog : None } )
657+ . await
631658 . ok ( ) ;
632659 thread
633660 . send_chat_added_message (
0 commit comments