@@ -45,32 +45,33 @@ struct State {
4545 rpc_apis : Arc < rpc_apis:: FullDependencies > ,
4646}
4747
48- fn handle_request ( req : Request < Body > , state : & Arc < Mutex < State > > ) -> Response < Body > {
48+ async fn handle_request ( req : Request < Body > , state : Arc < Mutex < State > > ) -> Response < Body > {
4949 let ( parts, _body) = req. into_parts ( ) ;
5050 match ( parts. method , parts. uri . path ( ) ) {
5151 ( Method :: GET , "/metrics" ) => {
52- let start = Instant :: now ( ) ;
53- let mut reg = prometheus:: Registry :: new ( ) ;
5452
55- let state = state. lock ( ) ;
53+ tokio:: task:: spawn_blocking ( move || {
54+ let start = Instant :: now ( ) ;
55+
56+ let mut reg = prometheus:: Registry :: new ( ) ;
57+ let state = state. lock ( ) ;
58+ state. rpc_apis . client . prometheus_metrics ( & mut reg) ;
59+ state. rpc_apis . sync . prometheus_metrics ( & mut reg) ;
60+ let elapsed = start. elapsed ( ) ;
61+ let ms = ( elapsed. as_secs ( ) as i64 ) * 1000 + ( elapsed. subsec_millis ( ) as i64 ) ;
62+ prometheus_gauge ( & mut reg, "metrics_time" , "Time to perform rpc metrics" , ms) ;
63+
64+ let mut buffer = vec ! [ ] ;
65+ let encoder = prometheus:: TextEncoder :: new ( ) ;
66+ let metric_families = reg. gather ( ) ;
67+
68+ encoder. encode ( & metric_families, & mut buffer) . expect ( "all source of metrics are static; qed" ) ;
69+ let text = String :: from_utf8 ( buffer) . expect ( "metrics encoding is ASCII; qed" ) ;
70+
71+ Response :: new ( Body :: from ( text) )
72+
73+ } ) . await . expect ( "The prometheus collection has panicked" )
5674
57- state. rpc_apis . client . prometheus_metrics ( & mut reg) ;
58- state. rpc_apis . sync . prometheus_metrics ( & mut reg) ;
59-
60- drop ( state) ;
61-
62- let elapsed = start. elapsed ( ) ;
63- let ms = ( elapsed. as_secs ( ) as i64 ) * 1000 + ( elapsed. subsec_millis ( ) as i64 ) ;
64- prometheus_gauge ( & mut reg, "metrics_time" , "Time to perform rpc metrics" , ms) ;
65-
66- let mut buffer = vec ! [ ] ;
67- let encoder = prometheus:: TextEncoder :: new ( ) ;
68- let metric_families = reg. gather ( ) ;
69-
70- encoder. encode ( & metric_families, & mut buffer) . expect ( "all source of metrics are static; qed" ) ;
71- let text = String :: from_utf8 ( buffer) . expect ( "metrics encoding is ASCII; qed" ) ;
72-
73- Response :: new ( Body :: from ( text) )
7475 } ,
7576 ( _, _) => {
7677 let mut res = Response :: new ( Body :: from ( "not found" ) ) ;
@@ -98,12 +99,12 @@ pub fn start_prometheus_metrics(conf: &MetricsConfiguration, deps: &rpc::Depende
9899 let state = Arc :: new ( Mutex :: new ( state) ) ;
99100
100101 deps. executor . spawn_std ( async move {
101- let make_service = make_service_fn ( move |_| {
102- let state = state. clone ( ) ;
103- async move {
104- Ok :: < _ , hyper:: Error > ( service_fn ( move |req| {
105- let response = handle_request ( req, & state) ;
106- async move { Ok :: < _ , hyper:: Error > ( response) }
102+ let make_service = make_service_fn ( move |_| {
103+ let state = state. clone ( ) ;
104+ async move {
105+ Ok :: < _ , hyper:: Error > ( service_fn ( move |req| {
106+ let response = handle_request ( req, state. clone ( ) ) ;
107+ async move { Ok :: < _ , hyper:: Error > ( response. await ) }
107108 } ) )
108109 }
109110 } ) ;
0 commit comments