@@ -3547,6 +3547,52 @@ async fn test_http_metrics() {
35473547 assert_eq ! ( failure_metric. get_label( ) [ 2 ] . value( ) , "422" ) ;
35483548}
35493549
3550+ #[ mz_ore:: test( tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ) ]
3551+ #[ cfg_attr( miri, ignore) ]
3552+ #[ allow( clippy:: disallowed_methods) ]
3553+ async fn test_time_to_first_row_metric ( ) {
3554+ let server = test_util:: TestHarness :: default ( ) . start ( ) . await ;
3555+
3556+ let client = server. connect ( ) . application_name ( "dbt" ) . await . unwrap ( ) ;
3557+ let _ = client. query_one ( "SELECT 1" , & [ ] ) . await . unwrap ( ) ;
3558+
3559+ let metrics = server. metrics_registry . gather ( ) ;
3560+ let metric = metrics
3561+ . into_iter ( )
3562+ . find ( |m| m. name ( ) == "mz_time_to_first_row_seconds" )
3563+ . expect ( "mz_time_to_first_row_seconds metric should exist" ) ;
3564+
3565+ // Find the series produced by our query.
3566+ let series = metric
3567+ . get_metric ( )
3568+ . iter ( )
3569+ . find ( |m| {
3570+ m. get_label ( )
3571+ . iter ( )
3572+ . any ( |l| l. name ( ) == "application_name" && l. value ( ) == "dbt" )
3573+ } )
3574+ . expect ( "a `mz_time_to_first_row_seconds` series for application_name=dbt should exist" ) ;
3575+
3576+ // Validate the labels are correct
3577+ let mut labels: Vec < ( & str , & str ) > = series
3578+ . get_label ( )
3579+ . iter ( )
3580+ . map ( |l| ( l. name ( ) , l. value ( ) ) )
3581+ . collect ( ) ;
3582+
3583+ labels. sort ( ) ;
3584+
3585+ assert_eq ! (
3586+ labels,
3587+ vec![
3588+ ( "application_name" , "dbt" ) ,
3589+ ( "instance_id" , "none" ) ,
3590+ ( "isolation_level" , "strict serializable" ) ,
3591+ ( "strategy" , "constant" ) ,
3592+ ] ,
3593+ ) ;
3594+ }
3595+
35503596#[ mz_ore:: test( tokio:: test( flavor = "multi_thread" , worker_threads = 2 ) ) ]
35513597#[ cfg_attr( miri, ignore) ] // too slow
35523598#[ allow( clippy:: disallowed_methods) ]
0 commit comments