@@ -24,13 +24,18 @@ use cb_common::{
2424 constants:: COMMIT_BOOST_VERSION ,
2525 types:: { Jwt , ModuleId } ,
2626} ;
27+ use cb_metrics:: provider:: MetricsProvider ;
2728use eyre:: { Context , Result } ;
2829use headers:: { authorization:: Bearer , Authorization } ;
2930use tokio:: { net:: TcpListener , sync:: RwLock } ;
3031use tracing:: { debug, error, info, warn} ;
3132use uuid:: Uuid ;
3233
33- use crate :: { error:: SignerModuleError , manager:: SigningManager } ;
34+ use crate :: {
35+ error:: SignerModuleError ,
36+ manager:: SigningManager ,
37+ metrics:: { uri_to_tag, SIGNER_METRICS_REGISTRY , SIGNER_STATUS } ,
38+ } ;
3439
3540/// Implements the Signer API and provides a service for signing requests
3641pub struct SigningService ;
@@ -72,13 +77,15 @@ impl SigningService {
7277 info ! ( version = COMMIT_BOOST_VERSION , modules =? module_ids, port =? config. server_port, loaded_consensus, loaded_proxies, "Starting signing service" ) ;
7378
7479 let state = SigningState { manager : RwLock :: new ( manager) . into ( ) , jwts : config. jwts . into ( ) } ;
80+ SigningService :: init_metrics ( ) ?;
7581
7682 let app = axum:: Router :: new ( )
7783 . route ( REQUEST_SIGNATURE_PATH , post ( handle_request_signature) )
7884 . route ( GET_PUBKEYS_PATH , get ( handle_get_pubkeys) )
7985 . route ( GENERATE_PROXY_KEY_PATH , post ( handle_generate_proxy) )
8086 . with_state ( state. clone ( ) )
81- . route_layer ( middleware:: from_fn_with_state ( state. clone ( ) , jwt_auth) ) ;
87+ . route_layer ( middleware:: from_fn_with_state ( state. clone ( ) , jwt_auth) )
88+ . route_layer ( middleware:: from_fn ( log_request) ) ;
8289 let status_router = axum:: Router :: new ( ) . route ( STATUS_PATH , get ( handle_status) ) ;
8390
8491 let address = SocketAddr :: from ( ( [ 0 , 0 , 0 , 0 ] , config. server_port ) ) ;
@@ -88,6 +95,10 @@ impl SigningService {
8895 . await
8996 . wrap_err ( "signer server exited" )
9097 }
98+
99+ fn init_metrics ( ) -> Result < ( ) > {
100+ MetricsProvider :: load_and_run ( SIGNER_METRICS_REGISTRY . clone ( ) )
101+ }
91102}
92103
93104/// Authentication middleware layer
@@ -109,6 +120,14 @@ async fn jwt_auth(
109120 Ok ( next. run ( req) . await )
110121}
111122
123+ /// Requests logging middleware layer
124+ async fn log_request ( req : Request , next : Next ) -> Result < Response , SignerModuleError > {
125+ let url = & req. uri ( ) . clone ( ) ;
126+ let response = next. run ( req) . await ;
127+ SIGNER_STATUS . with_label_values ( & [ response. status ( ) . as_str ( ) , uri_to_tag ( url) ] ) . inc ( ) ;
128+ Ok ( response)
129+ }
130+
112131/// Status endpoint for the Signer API
113132async fn handle_status ( ) -> Result < impl IntoResponse , SignerModuleError > {
114133 Ok ( ( StatusCode :: OK , "OK" ) )
0 commit comments