@@ -45,32 +45,33 @@ struct State {
45
45
rpc_apis : Arc < rpc_apis:: FullDependencies > ,
46
46
}
47
47
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 > {
49
49
let ( parts, _body) = req. into_parts ( ) ;
50
50
match ( parts. method , parts. uri . path ( ) ) {
51
51
( Method :: GET , "/metrics" ) => {
52
- let start = Instant :: now ( ) ;
53
- let mut reg = prometheus:: Registry :: new ( ) ;
54
52
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" )
56
74
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) )
74
75
} ,
75
76
( _, _) => {
76
77
let mut res = Response :: new ( Body :: from ( "not found" ) ) ;
@@ -98,12 +99,12 @@ pub fn start_prometheus_metrics(conf: &MetricsConfiguration, deps: &rpc::Depende
98
99
let state = Arc :: new ( Mutex :: new ( state) ) ;
99
100
100
101
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 ) }
107
108
} ) )
108
109
}
109
110
} ) ;
0 commit comments