@@ -23,6 +23,7 @@ use crate::api::{jsonschema, schema, ErrCode, Error};
2323use crate :: encore:: parser:: meta:: v1:: rpc;
2424use crate :: encore:: parser:: meta:: v1:: { self as meta, selector} ;
2525use crate :: log:: LogFromRust ;
26+ use crate :: metrics:: Counter ;
2627use crate :: model:: StreamDirection ;
2728use crate :: names:: EndpointName ;
2829use crate :: trace;
@@ -406,6 +407,7 @@ pub(super) struct EndpointHandler {
406407 pub endpoint : Arc < Endpoint > ,
407408 pub handler : Arc < dyn BoxedHandler > ,
408409 pub shared : Arc < SharedEndpointData > ,
410+ pub requests_total : Counter ,
409411}
410412
411413#[ derive( Debug ) ]
@@ -427,6 +429,7 @@ impl Clone for EndpointHandler {
427429 endpoint : self . endpoint . clone ( ) ,
428430 handler : self . handler . clone ( ) ,
429431 shared : self . shared . clone ( ) ,
432+ requests_total : self . requests_total . clone ( ) ,
430433 }
431434 }
432435}
@@ -601,7 +604,6 @@ impl EndpointHandler {
601604 let duration = tokio:: time:: Instant :: now ( ) . duration_since ( request. start ) ;
602605
603606 // If we had a request failure, log that separately.
604-
605607 if let ResponseData :: Typed ( Err ( err) ) = & resp {
606608 logger. error ( Some ( & request) , "request failed" , Some ( err) , {
607609 let mut fields = crate :: log:: Fields :: new ( ) ;
@@ -629,6 +631,12 @@ impl EndpointHandler {
629631 } ) ;
630632 }
631633
634+ let code = match & resp {
635+ ResponseData :: Typed ( Ok ( _) ) => "ok" . to_string ( ) ,
636+ ResponseData :: Typed ( Err ( err) ) => err. code . to_string ( ) ,
637+ ResponseData :: Raw ( resp) => ErrCode :: from ( resp. status ( ) ) . to_string ( ) ,
638+ } ;
639+
632640 logger. info ( Some ( & request) , "request completed" , {
633641 let mut fields = crate :: log:: Fields :: new ( ) ;
634642 let dur_ms = ( duration. as_secs ( ) as f64 * 1000f64 )
@@ -644,13 +652,7 @@ impl EndpointHandler {
644652 ) ) ,
645653 ) ;
646654
647- let code = match & resp {
648- ResponseData :: Typed ( Ok ( _) ) => "ok" . to_string ( ) ,
649- ResponseData :: Typed ( Err ( err) ) => err. code . to_string ( ) ,
650- ResponseData :: Raw ( resp) => ErrCode :: from ( resp. status ( ) ) . to_string ( ) ,
651- } ;
652-
653- fields. insert ( "code" . into ( ) , serde_json:: Value :: String ( code) ) ;
655+ fields. insert ( "code" . into ( ) , serde_json:: Value :: String ( code. clone ( ) ) ) ;
654656 Some ( fields)
655657 } ) ;
656658
@@ -685,6 +687,7 @@ impl EndpointHandler {
685687 } ) ,
686688 } ;
687689 self . shared . tracer . request_span_end ( & model_resp, sensitive) ;
690+ self . requests_total . increment_with ( [ ( "code" , code) ] ) ;
688691 }
689692
690693 if let Ok ( val) = HeaderValue :: from_str ( request. span . 0 . serialize_encore ( ) . as_str ( ) ) {
0 commit comments