add logger
This commit is contained in:
parent
0ce539f956
commit
5c59a5126b
79
Cargo.lock
generated
79
Cargo.lock
generated
@ -17,6 +17,15 @@ version = "2.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "1.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "android-tzdata"
|
name = "android-tzdata"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -194,7 +203,10 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bollard",
|
"bollard",
|
||||||
|
"flexi_logger",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
"log",
|
||||||
|
"log-panics",
|
||||||
"serde",
|
"serde",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-macros",
|
"tokio-macros",
|
||||||
@ -206,6 +218,20 @@ version = "1.0.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "flexi_logger"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a250587a211932896a131f214a4f64c047b826ce072d2018764e5ff5141df8fa"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"glob",
|
||||||
|
"log",
|
||||||
|
"nu-ansi-term",
|
||||||
|
"regex",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fnv"
|
name = "fnv"
|
||||||
version = "1.0.7"
|
version = "1.0.7"
|
||||||
@ -290,6 +316,12 @@ version = "0.31.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
|
checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.12.3"
|
version = "0.12.3"
|
||||||
@ -548,6 +580,15 @@ version = "0.4.22"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log-panics"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "68f9dd8546191c1850ecf67d22f5ff00a935b890d0e84713159a55495cc2ac5f"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.7.4"
|
version = "2.7.4"
|
||||||
@ -575,6 +616,15 @@ dependencies = [
|
|||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nu-ansi-term"
|
||||||
|
version = "0.50.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-conv"
|
name = "num-conv"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -705,6 +755,35 @@ dependencies = [
|
|||||||
"bitflags",
|
"bitflags",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.10.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.4.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.8.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.17.8"
|
version = "0.17.8"
|
||||||
|
@ -6,7 +6,10 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.88"
|
anyhow = "1.0.88"
|
||||||
bollard = { version = "0.17.1", features = ["ssl", "json_data_content", "tokio-stream"] }
|
bollard = { version = "0.17.1", features = ["ssl", "json_data_content", "tokio-stream"] }
|
||||||
|
flexi_logger = "0.29.0"
|
||||||
futures-util = "0.3.30"
|
futures-util = "0.3.30"
|
||||||
|
log = "0.4.22"
|
||||||
|
log-panics = "2.1.0"
|
||||||
serde = "1.0.210"
|
serde = "1.0.210"
|
||||||
tokio = {version = "1.40.0", features = ["full"]}
|
tokio = {version = "1.40.0", features = ["full"]}
|
||||||
tokio-macros = "2.4.0"
|
tokio-macros = "2.4.0"
|
||||||
|
46
src/main.rs
46
src/main.rs
@ -1,3 +1,4 @@
|
|||||||
|
use anyhow::Context;
|
||||||
use bollard::container::ListContainersOptions;
|
use bollard::container::ListContainersOptions;
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
|
|
||||||
@ -9,6 +10,8 @@ use std::default::Default;
|
|||||||
|
|
||||||
use tokio::time::{timeout, Instant};
|
use tokio::time::{timeout, Instant};
|
||||||
|
|
||||||
|
use flexi_logger::{AdaptiveFormat, Logger, LoggerHandle};
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@ -24,6 +27,18 @@ fn get_query_options() -> ListContainersOptions<&'static str> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_logger() -> anyhow::Result<LoggerHandle> {
|
||||||
|
let logger = Logger::try_with_str("info")
|
||||||
|
.context("default logging level invalid")?
|
||||||
|
.format(flexi_logger::detailed_format)
|
||||||
|
.adaptive_format_for_stdout(AdaptiveFormat::Detailed)
|
||||||
|
.log_to_stdout()
|
||||||
|
.start()
|
||||||
|
.context("can't start logger");
|
||||||
|
log_panics::init();
|
||||||
|
logger
|
||||||
|
}
|
||||||
|
|
||||||
async fn query_containers<T>(
|
async fn query_containers<T>(
|
||||||
connection: &Docker,
|
connection: &Docker,
|
||||||
query_options: ListContainersOptions<T>,
|
query_options: ListContainersOptions<T>,
|
||||||
@ -55,7 +70,7 @@ async fn query_task(
|
|||||||
) {
|
) {
|
||||||
let query_options = get_query_options();
|
let query_options = get_query_options();
|
||||||
let mut query_time = Duration::new(0, 0);
|
let mut query_time = Duration::new(0, 0);
|
||||||
println!("start recv");
|
log::debug!("query_task -> start recv");
|
||||||
while (timeout(interval - query_time, shutdown_rx.recv()).await).is_err() {
|
while (timeout(interval - query_time, shutdown_rx.recv()).await).is_err() {
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
|
|
||||||
@ -82,7 +97,7 @@ async fn filter_task(
|
|||||||
while let Some(containers) = in_rx.recv().await {
|
while let Some(containers) = in_rx.recv().await {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
|
|
||||||
println!("filter -> found unhealthy: {}", containers.len());
|
log::info!("filter -> found unhealthy: {}", containers.len());
|
||||||
|
|
||||||
let prev_times = unhealthy_time.take().unwrap();
|
let prev_times = unhealthy_time.take().unwrap();
|
||||||
let mut new_times: HashMap<String, Instant> = prev_times
|
let mut new_times: HashMap<String, Instant> = prev_times
|
||||||
@ -102,7 +117,7 @@ async fn filter_task(
|
|||||||
|
|
||||||
let _ = unhealthy_time.replace(new_times);
|
let _ = unhealthy_time.replace(new_times);
|
||||||
|
|
||||||
println!("filter -> filtered unhealthy: {}", containers.len());
|
log::info!("filter -> filtered unhealthy: {}", containers.len());
|
||||||
|
|
||||||
if containers.is_empty() {
|
if containers.is_empty() {
|
||||||
continue;
|
continue;
|
||||||
@ -116,15 +131,15 @@ async fn filter_task(
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn restart_task(connection: Arc<Docker>, mut rx: mpsc::Receiver<Containers>) {
|
async fn restart_task(connection: Arc<Docker>, mut rx: mpsc::Receiver<Containers>) {
|
||||||
println!("restart task start");
|
log::debug!("restart task start");
|
||||||
while let Some(containers) = rx.recv().await {
|
while let Some(containers) = rx.recv().await {
|
||||||
println!("restart -> found: {}", containers.len());
|
log::info!("restart -> found: {}", containers.len());
|
||||||
for container_id in containers {
|
for container_id in containers {
|
||||||
print!("restart -> container: {}...", &container_id);
|
log::warn!("restart -> container: {}...", &container_id);
|
||||||
let res = restart_container(&connection, container_id.as_str()).await;
|
let res = restart_container(&connection, container_id.as_str()).await;
|
||||||
match res {
|
match res {
|
||||||
Ok(_) => println!("ok\n"),
|
Ok(_) => log::info!("ok\n"),
|
||||||
Err(e) => println!("error: \n{e:?}\n"),
|
Err(e) => log::error!("error: \n{e:?}\n"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,7 +147,15 @@ async fn restart_task(connection: Arc<Docker>, mut rx: mpsc::Receiver<Containers
|
|||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
|
let logger = create_logger()?;
|
||||||
|
|
||||||
let connection = Arc::new(Docker::connect_with_defaults()?);
|
let connection = Arc::new(Docker::connect_with_defaults()?);
|
||||||
|
let _ = connection
|
||||||
|
.as_ref()
|
||||||
|
.ping()
|
||||||
|
.await
|
||||||
|
.context("ping on docker connection")?;
|
||||||
|
|
||||||
let query_connection = connection.clone();
|
let query_connection = connection.clone();
|
||||||
let restart_connection = connection.clone();
|
let restart_connection = connection.clone();
|
||||||
|
|
||||||
@ -154,15 +177,14 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
tokio::spawn(filter_task(unhealthy_timeout, filter_rx, filter_tx)),
|
tokio::spawn(filter_task(unhealthy_timeout, filter_rx, filter_tx)),
|
||||||
tokio::spawn(restart_task(restart_connection, restart_rx)),
|
tokio::spawn(restart_task(restart_connection, restart_rx)),
|
||||||
tokio::spawn(async {
|
tokio::spawn(async {
|
||||||
println!("shutdown -> sleep");
|
log::debug!("shutdown -> sleep");
|
||||||
tokio::time::sleep(Duration::from_secs(80)).await;
|
tokio::time::sleep(Duration::from_secs(80)).await;
|
||||||
println!("shutdown -> drop");
|
log::warn!("shutdown -> drop");
|
||||||
drop(shutdown_tx);
|
drop(shutdown_tx);
|
||||||
})
|
})
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
//let restart = restart_container(&connection, container_id.as_str()).await;
|
drop(logger);
|
||||||
//println!("restart: {}", restart.is_ok());
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user