Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

Commit b9b6758

Browse files
author
adria0
committed
spawn_blocking metrics collection
1 parent 14598b3 commit b9b6758

File tree

4 files changed

+31
-27
lines changed

4 files changed

+31
-27
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ stats = { path = "util/stats" }
8181
term_size = "0.3"
8282
textwrap = "0.11.0"
8383
toml = "0.5.6"
84+
tokio = { version = "0.2", features = ["blocking"] }
8485
verification = { path = "ethcore/verification" }
8586
prometheus = "0.9.0"
8687

parity/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern crate openethereum;
2828
extern crate parking_lot;
2929
extern crate parity_daemonize;
3030
extern crate ansi_term;
31+
extern crate tokio;
3132

3233
#[cfg(windows)] extern crate winapi;
3334
extern crate ethcore_logger;

parity/metrics.rs

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)