From d31bf8d39ed56e65047318adccbeef84e65e8941 Mon Sep 17 00:00:00 2001 From: Keenan Tims Date: Wed, 4 Feb 2026 13:50:24 -0800 Subject: [PATCH] start unpicking influxdb --- Cargo.lock | 232 ++++++-------------------------------------- Cargo.toml | 2 +- Dockerfile | 5 +- src/main.rs | 1 - src/sources/uccm.rs | 143 +++++++++++---------------- 5 files changed, 86 insertions(+), 297 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2bc2ee9..e9de86e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,15 +20,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.6.21" @@ -264,7 +255,7 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", - "tracing-subscriber 0.3.22", + "tracing-subscriber", ] [[package]] @@ -296,7 +287,7 @@ dependencies = [ "num_enum", "rand", "siphasher", - "thiserror 2.0.18", + "thiserror", "tokio", ] @@ -449,16 +440,6 @@ dependencies = [ "syn 2.0.114", ] -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if", - "num_cpus", -] - [[package]] name = "deranged" version = "0.5.5" @@ -498,12 +479,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dyn-clone" version = "1.0.20" @@ -779,12 +754,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -1019,33 +988,26 @@ dependencies = [ [[package]] name = "influxdb2" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152a72a5d8d387580a1c6df5dc078891ba914d8462da51f7286321680f998b4" +checksum = "24cc9f9d9fee9ebda1a77b61769cde513e03ad09607b347602f4ea887657689e" dependencies = [ "base64 0.13.1", "bytes", "chrono", "csv", - "dotenv", "fallible-iterator", "futures", "go-parse-duration", "influxdb2-derive", "influxdb2-structmap", - "nom", - "opentelemetry", "ordered-float", "parking_lot", "reqwest", + "secrecy", "serde", "serde_json", - "serde_qs", - "smallvec", "snafu", - "tempfile", - "tracing", - "tracing-subscriber 0.2.25", "url", ] @@ -1206,22 +1168,13 @@ dependencies = [ "libc", ] -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matchers" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.4.13", + "regex-automata", ] [[package]] @@ -1236,12 +1189,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "mio" version = "1.1.1" @@ -1319,16 +1266,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -1353,16 +1290,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.5.11" @@ -1455,26 +1382,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91cea1dfd50064e52db033179952d18c770cbc5dfefc8eba45d619357ba3914" -dependencies = [ - "async-trait", - "dashmap", - "fnv", - "futures", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand", - "thiserror 1.0.69", - "tokio", - "tokio-stream", -] - [[package]] name = "ordered-float" version = "3.9.2" @@ -1515,26 +1422,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1678,17 +1565,8 @@ checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.13", - "regex-syntax 0.8.8", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1699,15 +1577,9 @@ checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.8", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.8" @@ -1829,6 +1701,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -1895,17 +1776,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_qs" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cac3f1e2ca2fe333923a1ae72caca910b98ed0630bb35ef6f8c8517d6e81afa" -dependencies = [ - "percent-encoding", - "serde", - "thiserror 1.0.69", -] - [[package]] name = "serde_repr" version = "0.1.20" @@ -2148,33 +2018,13 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "thiserror-impl", ] [[package]] @@ -2414,48 +2264,16 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers 0.0.1", - "parking_lot", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-serde", -] - [[package]] name = "tracing-subscriber" version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ - "matchers 0.2.0", + "matchers", "nu-ansi-term", "once_cell", - "regex-automata 0.4.13", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -2486,7 +2304,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e" dependencies = [ - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -3050,6 +2868,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index f40fd2b..17fd708 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ tracing-subscriber = { version = "0.3.22", features = ["fmt", "ansi", "time", "e serialport = "4.8.1" gethostname = "1.1.0" bitflags = "2.10.0" -influxdb2 = "0.3.9" +influxdb2 = { version = "0.5.2" } chrono = "0.4.43" serde_with = "3.16.1" ctrlc = "3.5.1" diff --git a/Dockerfile b/Dockerfile index 25db8df..e96d9c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM rust:slim as builder +FROM rust:slim AS builder -RUN apt-get update && apt-get install -y libssl-dev pkg-config +RUN apt-get update && apt-get install -y libudev-dev pkg-config # build deps only first for build cache WORKDIR /usr/src RUN USER=root cargo new chimemon @@ -11,6 +11,7 @@ COPY . . RUN cargo build --release FROM debian:bullseye-slim +RUN apt-get update && apt-get install -y libudev WORKDIR /app COPY --from=builder /usr/src/chimemon/target/release/chimemon chimemon CMD ["/app/chimemon"] diff --git a/src/main.rs b/src/main.rs index 0c46d06..a7da091 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,6 @@ use figment::{ providers::{Format, Toml}, }; use futures::future::join_all; -use std::path::Path; use tokio::{select, sync::broadcast, task::JoinHandle}; use tokio_util::sync::CancellationToken; use tracing::{Instrument, debug, error, info, info_span, warn}; diff --git a/src/sources/uccm.rs b/src/sources/uccm.rs index dd9f412..cb4f56a 100644 --- a/src/sources/uccm.rs +++ b/src/sources/uccm.rs @@ -8,21 +8,18 @@ use byteorder::{BigEndian, ReadBytesExt}; use bytes::{Buf, BytesMut}; use chrono::{DateTime, Duration, NaiveDateTime, Utc}; use figment::value::Map; -use futures::future::join; -use influxdb2::models::DataPoint; -use influxdb2::models::data_point::DataPointBuilder; use itertools::Itertools; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader, ReadHalf, WriteHalf}; +use tokio::select; use tokio::sync::Mutex; use tokio::time::sleep; -use tokio::{join, select}; use tokio_serial::{SerialPort, SerialStream}; use tokio_util::sync::CancellationToken; -use tracing::{debug, info, warn}; +use tracing::{debug, error, info, warn}; use crate::{ - ChimemonMessage, ChimemonSource, ChimemonSourceChannel, SourceMetric, SourceReportDetails, - TimeReport, UCCMConfig, + ChimemonMessage, ChimemonSource, ChimemonSourceChannel, SourceMetric, SourceReport, + SourceReportDetails, SourceStatus, TimeReport, UCCMConfig, }; pub const GPS_EPOCH: i64 = 315964800; // Doesn't seem possible to have a const DateTime object @@ -121,46 +118,22 @@ impl SourceReportDetails for UCCMTODReport { } } -impl UCCMTODReport { - pub fn as_builder(&self, measurement: &String, tags: &Map) -> DataPointBuilder { - let mut builder = - DataPoint::builder(measurement).timestamp(self.time.timestamp_nanos_opt().unwrap()); - builder = builder.field("leaps", self.leaps as i64); - builder = builder.field("osc_lock", self.flags.contains(UCCMFlags::OSC_LOCK)); - builder = builder.field("leap_flag", self.flags.contains(UCCMFlags::LEAP_FLAG)); - builder = builder.field("init_unlock", self.flags.contains(UCCMFlags::INIT_UNLOCK)); - builder = builder.field("init_no_sats", self.flags.contains(UCCMFlags::INIT_NO_SATS)); - builder = builder.field( - "have_gps_time", - self.flags.contains(UCCMFlags::HAVE_GPS_TIME), - ); - builder = builder.field("power_fail", self.flags.contains(UCCMFlags::POWER_FAIL)); - builder = builder.field("no_gps_sync", self.flags.contains(UCCMFlags::NO_GPS_SYNC)); - builder = builder.field("no_gps_sync2", self.flags.contains(UCCMFlags::NO_GPS_SYNC2)); - builder = builder.field("ant_fault", self.flags.contains(UCCMFlags::NO_ANT)); - builder = builder.field("gps_los", self.flags.contains(UCCMFlags::GPS_LOS)); - - builder = tags - .iter() - .fold(builder, |builder, (k, v)| builder.tag(k, v)); - - builder - } -} - #[derive(Debug)] pub struct UCCMLoopDiagReport { pub ocxo: f32, } -impl UCCMLoopDiagReport { - pub fn as_builder(&self, measurement: &String, tags: &Map) -> DataPointBuilder { - let mut builder = DataPoint::builder(measurement); - builder = builder.field("ocxo_offset", self.ocxo as f64); - builder = tags - .iter() - .fold(builder, |builder, (k, v)| builder.tag(k, v)); - builder +impl SourceReportDetails for UCCMLoopDiagReport { + fn is_healthy(&self) -> bool { + true + } + fn to_metrics(&self) -> Vec { + let tags = Arc::new(vec![]); + vec![SourceMetric::new_float( + "ocxo_offset", + self.ocxo as f64, + tags, + )] } } @@ -170,16 +143,13 @@ pub struct UCCMGpsSvTracking { pub cno: u8, } -impl UCCMGpsSvTracking { - fn as_builder(&self, measurement: &String, tags: &Map) -> DataPointBuilder { - let mut builder = DataPoint::builder(measurement) - .field("sv_cno", self.cno as i64) - .tag("sv_id", self.sv.to_string()); - builder = tags - .iter() - .fold(builder, |builder, (k, v)| builder.tag(k, v)); - - builder +impl From<&UCCMGpsSvTracking> for SourceMetric { + fn from(value: &UCCMGpsSvTracking) -> Self { + SourceMetric::new_int( + "sv_cno", + value.cno as i64, + Arc::new(vec![("sv_id", value.sv.to_string())]), + ) } } @@ -188,13 +158,12 @@ pub struct UCCMGPSSatsReport { pub tracked_svs: Vec, } -impl UCCMGPSSatsReport { - pub fn build(&self, measurement: &String, tags: &Map) -> Vec { - self.tracked_svs - .iter() - .map(|sv| sv.as_builder(measurement, tags)) - .map(|b| b.build().unwrap()) - .collect() +impl SourceReportDetails for UCCMGPSSatsReport { + fn is_healthy(&self) -> bool { + self.tracked_svs.len() >= 4 + } + fn to_metrics(&self) -> Vec { + self.tracked_svs.iter().map(|sv| sv.into()).collect() } } @@ -458,8 +427,8 @@ impl UCCMMonitor { state: Arc>, ) { let mut rdbuf = BytesMut::with_capacity(1024); - let mut last_loop_diag: Option = None; - let mut last_gps_sats: Option = None; + let mut last_loop_diag: Option> = None; + let mut last_gps_sats: Option> = None; let mut last_sent_report = Utc::now() - self.config.status_interval; @@ -507,31 +476,29 @@ impl UCCMMonitor { if sysnow - last_sent_report >= Duration::from_std(self.config.status_interval).unwrap() { - // let mut points = vec![ - // tod.as_builder(&self.config.measurement, &self.config.tags) - // .build() - // .unwrap(), - // ]; - // if let Some(loop_diag) = &last_loop_diag { - // points.push( - // loop_diag - // .as_builder( - // &self.config.measurement, - // &self.config.influxdb.tags, - // ) - // .build() - // .unwrap(), - // ) - // } - // if let Some(gps_sats) = &last_gps_sats { - // points.extend(gps_sats.build( - // &self.config.sources.uccm.measurement, - // &self.config.influxdb.tags, - // )); - // } + if let Some(loop_diag) = &last_loop_diag { + if let Err(e) = + chan.send(ChimemonMessage::SourceReport(SourceReport { + name: "uccm".to_owned(), + status: SourceStatus::Unknown, + details: loop_diag.clone(), + })) + { + error!(error = ?e, "Unable to send message to channel"); + } + } + if let Some(gps_sats) = &last_gps_sats { + if let Err(e) = + chan.send(ChimemonMessage::SourceReport(SourceReport { + name: "uccm".to_owned(), + status: SourceStatus::Unknown, + details: gps_sats.clone(), + })) + { + error!(error = ?e, "Unable to send message to channel"); + } + } - // chan.send(ChimemonMessage::DataPoints(points)) - // .expect("Unable to send to channel"); last_sent_report = sysnow; } } @@ -545,7 +512,7 @@ impl UCCMMonitor { let loop_report = UCCMLoopDiagReport::try_from(loop_diag_resp.as_str()); let gps_report = UCCMGPSSatsReport::try_from(gps_sats_resp.as_str()); if let Ok(loop_report) = loop_report { - last_loop_diag = Some(loop_report) + last_loop_diag = Some(Arc::new(loop_report)) } else { warn!( "Unable to parse loop diag report `{}`: {}", @@ -554,7 +521,7 @@ impl UCCMMonitor { ); } if let Ok(gps_report) = gps_report { - last_gps_sats = Some(gps_report) + last_gps_sats = Some(Arc::new(gps_report)) } else { warn!( "Unable to parse GPS sats report `{}`: {}", @@ -629,7 +596,5 @@ impl ChimemonSource for UCCMMonitor { _ = cancel.cancelled() => { return }, _ = rx_handle => { return } }; - - join!(rx_handle).0.unwrap(); } }