src/main: Terminate on ctrl-c

This commit is contained in:
Max Inden 2020-04-10 11:50:11 +02:00
parent f7582c97c0
commit a9042bb1ed
No known key found for this signature in database
GPG Key ID: 5403C5464810BC26
3 changed files with 64 additions and 18 deletions

34
Cargo.lock generated
View File

@ -522,6 +522,16 @@ dependencies = [
"stream-cipher",
]
[[package]]
name = "ctrlc"
version = "3.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a4ba686dff9fa4c1c9636ce1010b0cf98ceb421361b0bb3d6faeec43bd217a7"
dependencies = [
"nix",
"winapi 0.3.8",
]
[[package]]
name = "cuckoofilter"
version = "0.3.2"
@ -624,6 +634,15 @@ dependencies = [
"version_check",
]
[[package]]
name = "exit-future"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5"
dependencies = [
"futures 0.3.4",
]
[[package]]
name = "fake-simd"
version = "0.1.2"
@ -1139,7 +1158,9 @@ name = "kademlia-exporter"
version = "0.1.0"
dependencies = [
"async-std",
"ctrlc",
"env_logger",
"exit-future",
"futures 0.3.4",
"libp2p",
"libp2p-kad",
@ -1767,6 +1788,19 @@ dependencies = [
"winapi 0.3.8",
]
[[package]]
name = "nix"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"void",
]
[[package]]
name = "nodrop"
version = "0.1.14"

View File

@ -15,4 +15,6 @@ libp2p-kad = "0.16.2"
prometheus = "0.7"
void = "1.0.2"
tide = "0.6"
exit-future = "0.2"
ctrlc = "3"

View File

@ -1,34 +1,44 @@
use async_std::task;
use prometheus::{Encoder, Registry, TextEncoder};
use std::error::Error;
use std::{error::Error, sync::{Arc, Mutex}};
mod behaviour;
mod exporter;
fn main() -> Result<(), Box<dyn Error>> {
let (signal, exit) = exit_future::signal();
let signal = Arc::new(Mutex::new(Some(signal)));
ctrlc::set_handler(move || {
println!("Got ctrlc");
match signal.lock().unwrap().take() {
Some(signal) => signal.fire().unwrap(),
None => {}
}
}).unwrap();
let registry = Registry::new();
let exporter = exporter::Exporter::new(&registry)?;
let _metrics_server = std::thread::spawn(move || {
task::block_on(async {
let mut app = tide::with_state(registry);
app.at("/metrics")
.get(|req: tide::Request<prometheus::Registry>| async move {
let mut buffer = vec![];
let encoder = TextEncoder::new();
let metric_families = req.state().gather();
encoder.encode(&metric_families, &mut buffer).unwrap();
let exit_clone = exit.clone();
let metrics_server = std::thread::spawn(move || {
let mut app = tide::with_state(registry);
app.at("/metrics")
.get(|req: tide::Request<prometheus::Registry>| async move {
let mut buffer = vec![];
let encoder = TextEncoder::new();
let metric_families = req.state().gather();
encoder.encode(&metric_families, &mut buffer).unwrap();
String::from_utf8(buffer).unwrap()
});
app.listen("0.0.0.0:8080").await.unwrap();
Result::<(), ()>::Ok(())
})
String::from_utf8(buffer).unwrap()
});
let endpoint = app.listen("0.0.0.0:8080");
futures::pin_mut!(endpoint);
task::block_on(exit_clone.until(endpoint))
});
// Kick it off.
let _listening = false;
task::block_on(exporter);
task::block_on(exit.until(exporter));
metrics_server.join().unwrap();
Ok(())
}