diff options
| author | Hazel Atkinson <yellowsink@riseup.net> | 2025-04-07 13:43:12 +0100 |
|---|---|---|
| committer | Hazel Atkinson <yellowsink@riseup.net> | 2025-04-07 13:43:12 +0100 |
| commit | cd5fbac13f68d2e054632570bb3520f9a3ff8e42 (patch) | |
| tree | 18d177cb4affe5baaa8e1c119ecdfc5b5f995647 | |
| parent | fbbefe8d4341df7796aefae772ad335359c3b232 (diff) | |
| download | containerspy-cd5fbac13f68d2e054632570bb3520f9a3ff8e42.tar.gz containerspy-cd5fbac13f68d2e054632570bb3520f9a3ff8e42.tar.bz2 containerspy-cd5fbac13f68d2e054632570bb3520f9a3ff8e42.zip | |
cleanups, make workers close neatly on container exit
| -rw-r--r-- | src/config.rs | 2 | ||||
| -rw-r--r-- | src/main.rs | 7 | ||||
| -rw-r--r-- | src/stats_task.rs | 15 |
3 files changed, 19 insertions, 5 deletions
diff --git a/src/config.rs b/src/config.rs index 52cb69c..212ca64 100644 --- a/src/config.rs +++ b/src/config.rs @@ -35,7 +35,7 @@ pub static CONFIG: LazyLock<CspyConfig> = LazyLock::new(|| { struct ProtoDeserVisitor; /// deserialization boilerplate -impl<'de> confique::serde::de::Visitor<'de> for ProtoDeserVisitor { +impl confique::serde::de::Visitor<'_> for ProtoDeserVisitor { type Value = Protocol; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { diff --git a/src/main.rs b/src/main.rs index dd8f6a2..c703fc2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,9 @@ use anyhow::Result; use bollard::Docker; use config::CONFIG; use opentelemetry_otlp::{MetricExporter, Protocol, WithExportConfig}; -use opentelemetry_sdk::metrics::{PeriodicReader, PeriodicReaderBuilder, SdkMeterProvider}; +use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider}; use tokio::task::JoinHandle; -use tokio::time::interval; +use tokio::time::MissedTickBehavior; use tokio_util::sync::CancellationToken; mod config; @@ -80,7 +80,8 @@ async fn main() -> Result<()> { st2.cancel(); }); - let mut container_search_interval = tokio::time::interval(Duration::from_secs(1)); + let mut container_search_interval = tokio::time::interval(Duration::from_millis(CONFIG.otlp_export_interval.unwrap_or(6000)) / 2); + container_search_interval.set_missed_tick_behavior(MissedTickBehavior::Skip); let mut tasks: BTreeMap<String, JoinHandle<()>> = BTreeMap::new(); diff --git a/src/stats_task.rs b/src/stats_task.rs index 4240a63..8b82373 100644 --- a/src/stats_task.rs +++ b/src/stats_task.rs @@ -1,5 +1,5 @@ use std::mem::MaybeUninit; -use bollard::container::{BlkioStats, BlkioStatsEntry, StatsOptions}; +use bollard::container::{BlkioStatsEntry, StatsOptions}; use bollard::models::ContainerSummary; use bollard::Docker; use opentelemetry::metrics::MeterProvider; @@ -136,6 +136,19 @@ pub fn launch_stats_task( while let Some(val) = stats_stream.next().await { if let Ok(stats) = val { + + // when a container exits, instead of a None we get sent Ok()s with zeroes in it forever, horror + if stats.cpu_stats.cpu_usage.total_usage == 0 { + if stats.precpu_stats.cpu_usage.total_usage != 0 { break; } + else { + // last time was ALSO a zero, so this MIGHT actually be (SOMEHOW?) legit, + // so just loop around again, and wait for the main task to abort() this worker task instead! + // which it will if this container died, or if we are gonna get real stats later, it won't... + // man i dont know i should probably just break lol + continue; + } + }; + meter_container_cpu_usage_seconds_total.add( cpu_delta_from_docker( stats.cpu_stats.cpu_usage.total_usage, |
