Merge branch 'block-processing-times' into bootstrap

This commit is contained in:
Paul Hauner
2019-08-14 12:32:16 +10:00
39 changed files with 854 additions and 764 deletions

View File

@@ -1,8 +1,10 @@
extern crate futures;
extern crate hyper;
#[macro_use]
extern crate lazy_static;
mod beacon;
mod config;
mod helpers;
mod metrics;
mod node;
mod spec;
mod url_query;
@@ -13,6 +15,8 @@ use hyper::rt::Future;
use hyper::service::service_fn_ok;
use hyper::{Body, Method, Response, Server, StatusCode};
use slog::{info, o, warn};
use std::ops::Deref;
use std::path::PathBuf;
use std::sync::Arc;
use tokio::runtime::TaskExecutor;
use url_query::UrlQuery;
@@ -68,6 +72,7 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
config: &ApiConfig,
executor: &TaskExecutor,
beacon_chain: Arc<BeaconChain<T>>,
db_path: PathBuf,
log: &slog::Logger,
) -> Result<exit_future::Signal, hyper::Error> {
let log = log.new(o!("Service" => "Api"));
@@ -81,6 +86,8 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
Ok(())
});
let db_path = DBPath(db_path);
// Get the address to bind to
let bind_addr = (config.listen_address, config.port).into();
@@ -91,12 +98,17 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
let service = move || {
let log = server_log.clone();
let beacon_chain = server_bc.clone();
let db_path = db_path.clone();
// Create a simple handler for the router, inject our stateful objects into the request.
service_fn_ok(move |mut req| {
metrics::inc_counter(&metrics::REQUEST_COUNT);
let timer = metrics::start_timer(&metrics::REQUEST_RESPONSE_TIME);
req.extensions_mut().insert::<slog::Logger>(log.clone());
req.extensions_mut()
.insert::<Arc<BeaconChain<T>>>(beacon_chain.clone());
req.extensions_mut().insert::<DBPath>(db_path.clone());
let path = req.uri().path().to_string();
@@ -109,6 +121,7 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
}
(&Method::GET, "/beacon/state") => beacon::get_state::<T>(req),
(&Method::GET, "/beacon/state_root") => beacon::get_state_root::<T>(req),
(&Method::GET, "/metrics") => metrics::get_prometheus::<T>(req),
(&Method::GET, "/node/version") => node::get_version(req),
(&Method::GET, "/node/genesis_time") => node::get_genesis_time::<T>(req),
(&Method::GET, "/spec") => spec::get_spec::<T>(req),
@@ -116,9 +129,10 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
_ => Err(ApiError::MethodNotAllowed(path.clone())),
};
match result {
let response = match result {
// Return the `hyper::Response`.
Ok(response) => {
metrics::inc_counter(&metrics::SUCCESS_COUNT);
slog::debug!(log, "Request successful: {:?}", path);
response
}
@@ -127,7 +141,11 @@ pub fn start_server<T: BeaconChainTypes + Clone + 'static>(
slog::debug!(log, "Request failure: {:?}", path);
e.into()
}
}
};
metrics::stop_timer(timer);
response
})
};
@@ -160,3 +178,14 @@ fn success_response(body: Body) -> Response<Body> {
.body(body)
.expect("We should always be able to make response from the success body.")
}
#[derive(Clone)]
pub struct DBPath(PathBuf);
impl Deref for DBPath {
type Target = PathBuf;
fn deref(&self) -> &Self::Target {
&self.0
}
}