more reliable mdns setup

This commit is contained in:
Robin Appelman 2022-06-25 16:01:32 +02:00
commit 25fde3eeb6
3 changed files with 76 additions and 5 deletions

43
Cargo.lock generated
View file

@ -28,6 +28,15 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
@ -780,6 +789,8 @@ dependencies = [
"once_cell", "once_cell",
"regex", "regex",
"tokio", "tokio",
"tracing",
"tracing-subscriber",
"warp", "warp",
] ]
@ -1042,6 +1053,12 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
[[package]]
name = "smallvec"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
[[package]] [[package]]
name = "socket2" name = "socket2"
version = "0.4.4" version = "0.4.4"
@ -1223,9 +1240,21 @@ dependencies = [
"cfg-if", "cfg-if",
"log", "log",
"pin-project-lite", "pin-project-lite",
"tracing-attributes",
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-attributes"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.28" version = "0.1.28"
@ -1246,15 +1275,29 @@ dependencies = [
"tracing-subscriber", "tracing-subscriber",
] ]
[[package]]
name = "tracing-log"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
dependencies = [
"lazy_static",
"log",
"tracing-core",
]
[[package]] [[package]]
name = "tracing-subscriber" name = "tracing-subscriber"
version = "0.3.11" version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596"
dependencies = [ dependencies = [
"ansi_term",
"sharded-slab", "sharded-slab",
"smallvec",
"thread_local", "thread_local",
"tracing-core", "tracing-core",
"tracing-log",
] ]
[[package]] [[package]]

View file

@ -18,6 +18,8 @@ ahash = "0.7"
bollard = "0.13.0" bollard = "0.13.0"
futures-util = "0.3" futures-util = "0.3"
libmdns = "0.7" libmdns = "0.7"
tracing = "0.1.33"
tracing-subscriber = "0.3.11"
[dev-dependencies] [dev-dependencies]
iai = "0.1" iai = "0.1"

View file

@ -7,7 +7,11 @@ use palantir::docker::{get_docker, stat, Container};
use palantir::get_metrics; use palantir::get_metrics;
use palantir::power::power_usage; use palantir::power::power_usage;
use palantir::zfs::arcstats; use palantir::zfs::arcstats;
use std::time::Duration;
use tokio::runtime::Handle; use tokio::runtime::Handle;
use tokio::spawn;
use tokio::time::sleep;
use tracing::warn;
use warp::reject::Reject; use warp::reject::Reject;
use warp::{Filter, Rejection}; use warp::{Filter, Rejection};
@ -52,6 +56,8 @@ async fn serve_metrics(docker: Option<Docker>) -> Result<String, Rejection> {
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let host_port: u16 = dotenv::var("PORT") let host_port: u16 = dotenv::var("PORT")
.ok() .ok()
.map(|port| port.parse()) .map(|port| port.parse())
@ -66,16 +72,36 @@ async fn main() -> Result<()> {
let docker = get_docker().await; let docker = get_docker().await;
let docker = warp::any().map(move || docker.clone()); let docker = warp::any().map(move || docker.clone());
let mdns = Responder::spawn(&Handle::current())?; spawn(setup_mdns(
let _svc = mdns.register(
"_prometheus-http._tcp".into(),
hostname::get()?.into_string().unwrap(), hostname::get()?.into_string().unwrap(),
host_port, host_port,
&[&"/metrics"], ));
);
let metrics = warp::path!("metrics").and(docker).and_then(serve_metrics); let metrics = warp::path!("metrics").and(docker).and_then(serve_metrics);
warp::serve(metrics).run(([0, 0, 0, 0], host_port)).await; warp::serve(metrics).run(([0, 0, 0, 0], host_port)).await;
Ok(()) Ok(())
} }
async fn setup_mdns(hostname: String, port: u16) {
let mdns = loop {
match Responder::spawn(&Handle::current()) {
Ok(mdns) => break mdns,
Err(e) => {
warn!(error = display(e), "Failed to register mdns responder");
sleep(Duration::from_secs(5)).await;
}
}
};
let _svc = mdns.register(
"_prometheus-http._tcp".into(),
hostname,
port,
&[&"/metrics"],
);
loop {
sleep(Duration::from_secs(60 * 60)).await;
}
}