From 952a012f629ffa4b76d7a8a71c2cf2d1e7898bf0 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Wed, 24 Jun 2026 16:52:57 -0700 Subject: [PATCH 01/15] reorganize --- Cargo.lock | 4 +++ sk-cli/Cargo.toml | 1 + sk-tracer/src/export.rs | 31 +++++++++++++++++++ sk-tracer/src/lib.rs | 11 +++++++ sk-tracer/src/main.rs | 10 +----- sk-tracer/src/store.rs | 1 + ...est__dyn_obj_watcher_sanitize_pod_obj.snap | 11 +++++++ ...yn_obj_watcher_sanitize_pod_obj-2.snap.new | 12 +++++++ ..._dyn_obj_watcher_sanitize_pod_obj.snap.new | 12 +++++++ 9 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 sk-tracer/src/export.rs create mode 100644 sk-tracer/src/lib.rs create mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap create mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new create mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new diff --git a/Cargo.lock b/Cargo.lock index 96dec71a..dd425ec2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3794,7 +3794,10 @@ dependencies = [ "futures", "httpmock", "insta", +<<<<<<< HEAD "k8s-openapi", +======= +>>>>>>> aa51043 (reorganize) "kube", "mockall", "object_store", @@ -3846,6 +3849,7 @@ dependencies = [ "sk-core", "sk-skel", "sk-testutils", + "sk-tracer", "test-log", "tokio", ] diff --git a/sk-cli/Cargo.toml b/sk-cli/Cargo.toml index 3a64d8e6..3a790217 100644 --- a/sk-cli/Cargo.toml +++ b/sk-cli/Cargo.toml @@ -31,6 +31,7 @@ serde_json = { workspace = true } serde_yaml = { workspace = true } sk-api = { workspace = true } sk-core = { workspace = true } +sk-tracer = { workspace = true } sk-skel = { workspace = true } tokio = { workspace = true } blackbox-metrics = { workspace = true } diff --git a/sk-tracer/src/export.rs b/sk-tracer/src/export.rs new file mode 100644 index 00000000..08d74051 --- /dev/null +++ b/sk-tracer/src/export.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +use bytes::Bytes; +use object_store::ObjectStoreScheme; +use sk_api::v1::ExportRequest; +use sk_core::external_storage::ObjectStoreWrapper; +use tokio::sync::Mutex; + +use crate::store::TraceStore; + +pub async fn export_helper( + req: &ExportRequest, + store: Arc>, + object_store: &(dyn ObjectStoreWrapper + Sync), +) -> anyhow::Result> { + let trace_data = { store.lock().await.export(req.start_ts, req.end_ts, &req.filters).await? }; + + match object_store.scheme() { + // If we're writing to a cloud provider, we want to write from the location that the + // tracer's running from, ostensibly to minimize transport costs. + ObjectStoreScheme::AmazonS3 | ObjectStoreScheme::GoogleCloudStorage | ObjectStoreScheme::MicrosoftAzure => { + object_store.put(Bytes::from(trace_data)).await?; + Ok(vec![]) + }, + + // On the other hand, if we're trying to write to local storage (or something else), it's + // not going to do any good to write to local storage of the _tracer_, so we return all the + // data and let the client do something with it. + _ => Ok(trace_data), + } +} diff --git a/sk-tracer/src/lib.rs b/sk-tracer/src/lib.rs new file mode 100644 index 00000000..9e58ae1f --- /dev/null +++ b/sk-tracer/src/lib.rs @@ -0,0 +1,11 @@ +pub mod errors; +pub mod export; +pub mod manager; +pub mod store; +pub mod watchers; + +pub use export::export_helper; +pub use manager::TraceManager; + +#[cfg(test)] +mod tests; diff --git a/sk-tracer/src/main.rs b/sk-tracer/src/main.rs index be11fc82..83696f23 100644 --- a/sk-tracer/src/main.rs +++ b/sk-tracer/src/main.rs @@ -8,16 +8,11 @@ mod watchers; use std::ops::Deref; use std::sync::Arc; -use bytes::Bytes; use clap::Parser; use kube::Client; -use object_store::ObjectStoreScheme; use rocket::serde::json::Json; use sk_api::v1::ExportRequest; -use sk_core::external_storage::{ - ObjectStoreWrapper, - SkObjectStore, -}; +use sk_core::external_storage::SkObjectStore; use sk_core::logging; use sk_core::prelude::*; use tokio::sync::Mutex; @@ -106,6 +101,3 @@ async fn main() -> EmptyResult { logging::setup(&args.verbosity); run(args).await } - -#[cfg(test)] -mod tests; diff --git a/sk-tracer/src/store.rs b/sk-tracer/src/store.rs index 734a04a3..ce2349a9 100644 --- a/sk-tracer/src/store.rs +++ b/sk-tracer/src/store.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use kube::Resource; use sk_api::v1::ExportFilters; +use sk_core::index::TraceIndex; use sk_core::jsonutils; use sk_core::k8s::{ DynamicApiSet, diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap b/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap new file mode 100644 index 00000000..46b7189c --- /dev/null +++ b/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap @@ -0,0 +1,11 @@ +--- +source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs +expression: "serde_yaml::to_string(&received_message.obj).unwrap()" +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: {} + name: test-obj + namespace: test-namespace +spec: {} diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new new file mode 100644 index 00000000..4d802cb8 --- /dev/null +++ b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new @@ -0,0 +1,12 @@ +--- +source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs +assertion_line: 59 +expression: "serde_yaml::to_string(&received_message.obj).unwrap()" +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: {} + name: test-obj + namespace: test-namespace +spec: {} diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new new file mode 100644 index 00000000..4d802cb8 --- /dev/null +++ b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new @@ -0,0 +1,12 @@ +--- +source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs +assertion_line: 59 +expression: "serde_yaml::to_string(&received_message.obj).unwrap()" +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: {} + name: test-obj + namespace: test-namespace +spec: {} From fb317305257114618d2e7a2e1af0d38be75537a3 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Wed, 24 Jun 2026 17:11:16 -0700 Subject: [PATCH 02/15] make methods public in pod_owners_map, update snapshots --- sk-core/src/trace/pod_owners_map.rs | 32 +++++++++---------- ...est__dyn_obj_watcher_sanitize_pod_obj.snap | 11 ------- ...yn_obj_watcher_sanitize_pod_obj-2.snap.new | 12 ------- ..._dyn_obj_watcher_sanitize_pod_obj.snap.new | 12 ------- 4 files changed, 16 insertions(+), 51 deletions(-) delete mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap delete mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new delete mode 100644 sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new diff --git a/sk-core/src/trace/pod_owners_map.rs b/sk-core/src/trace/pod_owners_map.rs index 127909b2..3afbcad5 100644 --- a/sk-core/src/trace/pod_owners_map.rs +++ b/sk-core/src/trace/pod_owners_map.rs @@ -148,6 +148,22 @@ impl PodOwnersMap { }) .collect() } + + pub fn lifecycle_data_for<'a>( + &'a self, + owner_gvk: &GVK, + owner_ns_name: &str, + pod_hash: u64, + ) -> Option<&'a Vec> { + self.m.get(&(owner_gvk.clone(), owner_ns_name.into()))?.get(&pod_hash) + } + + pub fn new_from_parts( + m: HashMap<(GVK, String), PodLifecyclesMap>, + index: HashMap, + ) -> PodOwnersMap { + PodOwnersMap { m, index } + } } pub fn filter_lifecycles_map( @@ -190,22 +206,6 @@ pub fn filter_lifecycles_map( #[cfg(test)] #[cfg_attr(coverage, coverage(off))] impl PodOwnersMap { - pub fn lifecycle_data_for<'a>( - &'a self, - owner_gvk: &GVK, - owner_ns_name: &str, - pod_hash: u64, - ) -> Option<&'a Vec> { - self.m.get(&(owner_gvk.clone(), owner_ns_name.into()))?.get(&pod_hash) - } - - pub fn new_from_parts( - m: HashMap<(GVK, String), PodLifecyclesMap>, - index: HashMap, - ) -> PodOwnersMap { - PodOwnersMap { m, index } - } - pub fn pod_owner_meta(&self, pod_ns_name: &str) -> Option<&((GVK, String), u64, usize)> { self.index.get(pod_ns_name) } diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap b/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap deleted file mode 100644 index 46b7189c..00000000 --- a/sk-tracer/src/watchers/tests/snapshots/sk_store__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs -expression: "serde_yaml::to_string(&received_message.obj).unwrap()" ---- -apiVersion: v1 -kind: Pod -metadata: - annotations: {} - name: test-obj - namespace: test-namespace -spec: {} diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new deleted file mode 100644 index 4d802cb8..00000000 --- a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj-2.snap.new +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs -assertion_line: 59 -expression: "serde_yaml::to_string(&received_message.obj).unwrap()" ---- -apiVersion: v1 -kind: Pod -metadata: - annotations: {} - name: test-obj - namespace: test-namespace -spec: {} diff --git a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new b/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new deleted file mode 100644 index 4d802cb8..00000000 --- a/sk-tracer/src/watchers/tests/snapshots/sk_tracer__watchers__tests__dyn_obj_watcher_test__itest__dyn_obj_watcher_sanitize_pod_obj.snap.new +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: sk-tracer/src/watchers/tests/dyn_obj_watcher_test.rs -assertion_line: 59 -expression: "serde_yaml::to_string(&received_message.obj).unwrap()" ---- -apiVersion: v1 -kind: Pod -metadata: - annotations: {} - name: test-obj - namespace: test-namespace -spec: {} From bc5b072cc44a58a8fedc71de03cd977c60edfc3c Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Wed, 1 Jul 2026 13:31:20 -0700 Subject: [PATCH 03/15] remove sk-core helpers from sk-tracer tests --- sk-core/src/trace/pod_owners_map.rs | 32 +++++++++++------------ sk-tracer/src/watchers/dyn_obj_watcher.rs | 18 ------------- sk-tracer/src/watchers/mod.rs | 17 ------------ 3 files changed, 16 insertions(+), 51 deletions(-) diff --git a/sk-core/src/trace/pod_owners_map.rs b/sk-core/src/trace/pod_owners_map.rs index 3afbcad5..127909b2 100644 --- a/sk-core/src/trace/pod_owners_map.rs +++ b/sk-core/src/trace/pod_owners_map.rs @@ -148,22 +148,6 @@ impl PodOwnersMap { }) .collect() } - - pub fn lifecycle_data_for<'a>( - &'a self, - owner_gvk: &GVK, - owner_ns_name: &str, - pod_hash: u64, - ) -> Option<&'a Vec> { - self.m.get(&(owner_gvk.clone(), owner_ns_name.into()))?.get(&pod_hash) - } - - pub fn new_from_parts( - m: HashMap<(GVK, String), PodLifecyclesMap>, - index: HashMap, - ) -> PodOwnersMap { - PodOwnersMap { m, index } - } } pub fn filter_lifecycles_map( @@ -206,6 +190,22 @@ pub fn filter_lifecycles_map( #[cfg(test)] #[cfg_attr(coverage, coverage(off))] impl PodOwnersMap { + pub fn lifecycle_data_for<'a>( + &'a self, + owner_gvk: &GVK, + owner_ns_name: &str, + pod_hash: u64, + ) -> Option<&'a Vec> { + self.m.get(&(owner_gvk.clone(), owner_ns_name.into()))?.get(&pod_hash) + } + + pub fn new_from_parts( + m: HashMap<(GVK, String), PodLifecyclesMap>, + index: HashMap, + ) -> PodOwnersMap { + PodOwnersMap { m, index } + } + pub fn pod_owner_meta(&self, pod_ns_name: &str) -> Option<&((GVK, String), u64, usize)> { self.index.get(pod_ns_name) } diff --git a/sk-tracer/src/watchers/dyn_obj_watcher.rs b/sk-tracer/src/watchers/dyn_obj_watcher.rs index f18fab2b..174da4c3 100644 --- a/sk-tracer/src/watchers/dyn_obj_watcher.rs +++ b/sk-tracer/src/watchers/dyn_obj_watcher.rs @@ -96,21 +96,3 @@ impl EventHandler for DynObjHandler { Ok(()) } } - -#[cfg(test)] -use clockabilly::Clockable; - -#[cfg(test)] -use super::ObjStream; - -#[cfg(test)] -#[cfg_attr(coverage, coverage(off))] -pub(crate) fn new_from_parts( - gvk: GVK, - dyn_obj_tx: Sender, - stream: ObjStream, - clock: Box, - ready_tx: mpsc::Sender, -) -> ObjWatcher { - ObjWatcher::new_from_parts(Box::new(DynObjHandler { gvk, dyn_obj_tx }), stream, clock, ready_tx) -} diff --git a/sk-tracer/src/watchers/mod.rs b/sk-tracer/src/watchers/mod.rs index a9db0dd9..9a561872 100644 --- a/sk-tracer/src/watchers/mod.rs +++ b/sk-tracer/src/watchers/mod.rs @@ -143,23 +143,6 @@ mod tests; #[cfg(test)] #[cfg_attr(coverage, coverage(off))] impl ObjWatcher { - pub(crate) fn new_from_parts( - handler: Box + Send>, - stream: ObjStream, - clock: Box, - ready_tx: mpsc::Sender, - ) -> ObjWatcher { - ObjWatcher { - handler, - stream, - clock, - is_ready: true, - ready_tx, - init_buffer: vec![], - index: HashSet::new(), - } - } - pub(crate) async fn handle_next_event(&mut self) -> EmptyResult { let evt = self.stream.next().await.unwrap().unwrap(); self.handle_event(&evt, self.clock.now_ts()).await From ff8154a77b1d2332251820ec138c9ce8e1904f1d Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Wed, 1 Jul 2026 14:10:19 -0700 Subject: [PATCH 04/15] add coverage_attribute --- sk-tracer/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/sk-tracer/src/lib.rs b/sk-tracer/src/lib.rs index 9e58ae1f..bb894747 100644 --- a/sk-tracer/src/lib.rs +++ b/sk-tracer/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(coverage, feature(coverage_attribute))] pub mod errors; pub mod export; pub mod manager; From d54260c50e83037f8a380552d4fb8de5110bb014 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Wed, 1 Jul 2026 18:08:23 -0700 Subject: [PATCH 05/15] add transform export --- sk-tracer/src/export.rs | 8 +++++++- sk-tracer/src/lib.rs | 1 - sk-tracer/src/store.rs | 10 +++++++--- sk-tracer/src/tests/tracer_test.rs | 1 + 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/sk-tracer/src/export.rs b/sk-tracer/src/export.rs index 08d74051..f67fc0ea 100644 --- a/sk-tracer/src/export.rs +++ b/sk-tracer/src/export.rs @@ -13,7 +13,13 @@ pub async fn export_helper( store: Arc>, object_store: &(dyn ObjectStoreWrapper + Sync), ) -> anyhow::Result> { - let trace_data = { store.lock().await.export(req.start_ts, req.end_ts, &req.filters).await? }; + let trace_data = { + store + .lock() + .await + .export(req.start_ts, req.end_ts, &req.filters, req.transform.as_deref()) + .await? + }; match object_store.scheme() { // If we're writing to a cloud provider, we want to write from the location that the diff --git a/sk-tracer/src/lib.rs b/sk-tracer/src/lib.rs index bb894747..5a08eec4 100644 --- a/sk-tracer/src/lib.rs +++ b/sk-tracer/src/lib.rs @@ -5,7 +5,6 @@ pub mod manager; pub mod store; pub mod watchers; -pub use export::export_helper; pub use manager::TraceManager; #[cfg(test)] diff --git a/sk-tracer/src/store.rs b/sk-tracer/src/store.rs index ce2349a9..e8ea8502 100644 --- a/sk-tracer/src/store.rs +++ b/sk-tracer/src/store.rs @@ -1,8 +1,12 @@ use std::collections::HashMap; -use std::sync::Arc; +use std::sync::{ + Arc, + mpsc, +}; use kube::Resource; use sk_api::v1::ExportFilters; +use sk_core::event::append_event; use sk_core::index::TraceIndex; use sk_core::jsonutils; use sk_core::k8s::{ @@ -14,6 +18,7 @@ use sk_core::k8s::{ build_pod_self_owner_reference, format_gvk_name, }; +use sk_core::pod_owners_map::PodOwnersMap; use sk_core::prelude::*; use sk_core::trace::Trace; use sk_core::trace::event::append_event; @@ -78,8 +83,7 @@ impl TraceStore { index, pod_lifecycles, ..Default::default() - } - .to_bytes()?; + }; Ok(data) } diff --git a/sk-tracer/src/tests/tracer_test.rs b/sk-tracer/src/tests/tracer_test.rs index bc4c3b33..826ed979 100644 --- a/sk-tracer/src/tests/tracer_test.rs +++ b/sk-tracer/src/tests/tracer_test.rs @@ -11,6 +11,7 @@ use sk_core::prelude::*; use tokio::sync::Mutex; use super::*; +use crate::export::export_helper; use crate::store::TraceStore; #[fixture] From d3d07f47441b6cd088c3f2fd270e19def46e9341 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Thu, 2 Jul 2026 11:41:39 -0700 Subject: [PATCH 06/15] filter in collect events, clean up test files --- sk-tracer/src/store.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sk-tracer/src/store.rs b/sk-tracer/src/store.rs index e8ea8502..aeed1561 100644 --- a/sk-tracer/src/store.rs +++ b/sk-tracer/src/store.rs @@ -1,8 +1,5 @@ use std::collections::HashMap; -use std::sync::{ - Arc, - mpsc, -}; +use std::sync::Arc; use kube::Resource; use sk_api::v1::ExportFilters; @@ -73,6 +70,7 @@ impl TraceStore { // true so that in the second step, we keep pod data around even if the owning object was // deleted before the trace ends. let (events, index) = self.collect_events(start_ts, end_ts, filter, true, maybe_skel_file).await?; + // let num_events = events.len(); // Collect all pod lifecycle data that is a) between the start and end times, and b) is // owned by some object contained in the trace @@ -83,7 +81,8 @@ impl TraceStore { index, pod_lifecycles, ..Default::default() - }; + } + .to_bytes()?; Ok(data) } From 2d360a7d02e9511080f678bc25b0dd12641d90ec Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 10:36:53 -0700 Subject: [PATCH 07/15] fixing merge issues --- Cargo.lock | 4 --- sk-cli/Cargo.toml | 1 - sk-tracer/src/export.rs | 37 ---------------------- sk-tracer/src/lib.rs | 11 ------- sk-tracer/src/main.rs | 38 ++++++++++++++--------- sk-tracer/src/store.rs | 3 -- sk-tracer/src/tests/import_export_test.rs | 5 +++ sk-tracer/src/tests/tracer_test.rs | 1 - sk-tracer/src/watchers/dyn_obj_watcher.rs | 18 +++++++++++ sk-tracer/src/watchers/mod.rs | 17 ++++++++++ 10 files changed, 63 insertions(+), 72 deletions(-) delete mode 100644 sk-tracer/src/export.rs delete mode 100644 sk-tracer/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index dd425ec2..96dec71a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3794,10 +3794,7 @@ dependencies = [ "futures", "httpmock", "insta", -<<<<<<< HEAD "k8s-openapi", -======= ->>>>>>> aa51043 (reorganize) "kube", "mockall", "object_store", @@ -3849,7 +3846,6 @@ dependencies = [ "sk-core", "sk-skel", "sk-testutils", - "sk-tracer", "test-log", "tokio", ] diff --git a/sk-cli/Cargo.toml b/sk-cli/Cargo.toml index 3a790217..3a64d8e6 100644 --- a/sk-cli/Cargo.toml +++ b/sk-cli/Cargo.toml @@ -31,7 +31,6 @@ serde_json = { workspace = true } serde_yaml = { workspace = true } sk-api = { workspace = true } sk-core = { workspace = true } -sk-tracer = { workspace = true } sk-skel = { workspace = true } tokio = { workspace = true } blackbox-metrics = { workspace = true } diff --git a/sk-tracer/src/export.rs b/sk-tracer/src/export.rs deleted file mode 100644 index f67fc0ea..00000000 --- a/sk-tracer/src/export.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::sync::Arc; - -use bytes::Bytes; -use object_store::ObjectStoreScheme; -use sk_api::v1::ExportRequest; -use sk_core::external_storage::ObjectStoreWrapper; -use tokio::sync::Mutex; - -use crate::store::TraceStore; - -pub async fn export_helper( - req: &ExportRequest, - store: Arc>, - object_store: &(dyn ObjectStoreWrapper + Sync), -) -> anyhow::Result> { - let trace_data = { - store - .lock() - .await - .export(req.start_ts, req.end_ts, &req.filters, req.transform.as_deref()) - .await? - }; - - match object_store.scheme() { - // If we're writing to a cloud provider, we want to write from the location that the - // tracer's running from, ostensibly to minimize transport costs. - ObjectStoreScheme::AmazonS3 | ObjectStoreScheme::GoogleCloudStorage | ObjectStoreScheme::MicrosoftAzure => { - object_store.put(Bytes::from(trace_data)).await?; - Ok(vec![]) - }, - - // On the other hand, if we're trying to write to local storage (or something else), it's - // not going to do any good to write to local storage of the _tracer_, so we return all the - // data and let the client do something with it. - _ => Ok(trace_data), - } -} diff --git a/sk-tracer/src/lib.rs b/sk-tracer/src/lib.rs deleted file mode 100644 index 5a08eec4..00000000 --- a/sk-tracer/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![cfg_attr(coverage, feature(coverage_attribute))] -pub mod errors; -pub mod export; -pub mod manager; -pub mod store; -pub mod watchers; - -pub use manager::TraceManager; - -#[cfg(test)] -mod tests; diff --git a/sk-tracer/src/main.rs b/sk-tracer/src/main.rs index 83696f23..db6c8df5 100644 --- a/sk-tracer/src/main.rs +++ b/sk-tracer/src/main.rs @@ -8,11 +8,16 @@ mod watchers; use std::ops::Deref; use std::sync::Arc; +use bytes::Bytes; use clap::Parser; use kube::Client; +use object_store::ObjectStoreScheme; use rocket::serde::json::Json; use sk_api::v1::ExportRequest; -use sk_core::external_storage::SkObjectStore; +use sk_core::external_storage::{ + ObjectStoreWrapper, + SkObjectStore, +}; use sk_core::logging; use sk_core::prelude::*; use tokio::sync::Mutex; @@ -53,20 +58,6 @@ async fn export( res.map_err(|e| e.into()) } -#[instrument(ret, err)] -async fn run(args: Options) -> EmptyResult { - let config = TracerConfig::load(&args.config_file)?.normalize()?; - let client = Client::try_default().await.expect("failed to create kube client"); - let manager = TraceManager::start(client, config).await?; - let store = manager.get_store(); - - let rkt_config = rocket::Config { port: args.server_port, ..Default::default() }; - let server = rocket::custom(&rkt_config).mount("/", rocket::routes![export]).manage(store); - - server.launch().await?; - Ok(()) -} - async fn export_helper( req: &ExportRequest, store: Arc>, @@ -95,9 +86,26 @@ async fn export_helper( } } +#[instrument(ret, err)] +async fn run(args: Options) -> EmptyResult { + let config = TracerConfig::load(&args.config_file)?.normalize()?; + let client = Client::try_default().await.expect("failed to create kube client"); + let manager = TraceManager::start(client, config).await?; + let store = manager.get_store(); + + let rkt_config = rocket::Config { port: args.server_port, ..Default::default() }; + let server = rocket::custom(&rkt_config).mount("/", rocket::routes![export]).manage(store); + + server.launch().await?; + Ok(()) +} + #[tokio::main] async fn main() -> EmptyResult { let args = Options::parse(); logging::setup(&args.verbosity); run(args).await } + +#[cfg(test)] +mod tests; diff --git a/sk-tracer/src/store.rs b/sk-tracer/src/store.rs index aeed1561..d472e023 100644 --- a/sk-tracer/src/store.rs +++ b/sk-tracer/src/store.rs @@ -3,8 +3,6 @@ use std::sync::Arc; use kube::Resource; use sk_api::v1::ExportFilters; -use sk_core::event::append_event; -use sk_core::index::TraceIndex; use sk_core::jsonutils; use sk_core::k8s::{ DynamicApiSet, @@ -15,7 +13,6 @@ use sk_core::k8s::{ build_pod_self_owner_reference, format_gvk_name, }; -use sk_core::pod_owners_map::PodOwnersMap; use sk_core::prelude::*; use sk_core::trace::Trace; use sk_core::trace::event::append_event; diff --git a/sk-tracer/src/tests/import_export_test.rs b/sk-tracer/src/tests/import_export_test.rs index 7532e9e2..f9b34d51 100644 --- a/sk-tracer/src/tests/import_export_test.rs +++ b/sk-tracer/src/tests/import_export_test.rs @@ -8,16 +8,21 @@ use futures::stream; use futures::stream::StreamExt; use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; use kube::ResourceExt; +use kube::api::DynamicObject; use kube::discovery::ApiResource; use kube::runtime::watcher::Event; use serde_json::json; use sk_api::v1::ExportFilters; +use sk_core::constants::*; use sk_core::k8s::{ DynamicApiSet, GVK, + KubeResourceExt, format_gvk_name, }; use sk_core::macros::*; +use sk_core::trace::Trace; +use sk_core::trace::config::TracerConfig; use tokio::sync::{ Mutex, mpsc, diff --git a/sk-tracer/src/tests/tracer_test.rs b/sk-tracer/src/tests/tracer_test.rs index 826ed979..bc4c3b33 100644 --- a/sk-tracer/src/tests/tracer_test.rs +++ b/sk-tracer/src/tests/tracer_test.rs @@ -11,7 +11,6 @@ use sk_core::prelude::*; use tokio::sync::Mutex; use super::*; -use crate::export::export_helper; use crate::store::TraceStore; #[fixture] diff --git a/sk-tracer/src/watchers/dyn_obj_watcher.rs b/sk-tracer/src/watchers/dyn_obj_watcher.rs index 174da4c3..f18fab2b 100644 --- a/sk-tracer/src/watchers/dyn_obj_watcher.rs +++ b/sk-tracer/src/watchers/dyn_obj_watcher.rs @@ -96,3 +96,21 @@ impl EventHandler for DynObjHandler { Ok(()) } } + +#[cfg(test)] +use clockabilly::Clockable; + +#[cfg(test)] +use super::ObjStream; + +#[cfg(test)] +#[cfg_attr(coverage, coverage(off))] +pub(crate) fn new_from_parts( + gvk: GVK, + dyn_obj_tx: Sender, + stream: ObjStream, + clock: Box, + ready_tx: mpsc::Sender, +) -> ObjWatcher { + ObjWatcher::new_from_parts(Box::new(DynObjHandler { gvk, dyn_obj_tx }), stream, clock, ready_tx) +} diff --git a/sk-tracer/src/watchers/mod.rs b/sk-tracer/src/watchers/mod.rs index 9a561872..a9db0dd9 100644 --- a/sk-tracer/src/watchers/mod.rs +++ b/sk-tracer/src/watchers/mod.rs @@ -143,6 +143,23 @@ mod tests; #[cfg(test)] #[cfg_attr(coverage, coverage(off))] impl ObjWatcher { + pub(crate) fn new_from_parts( + handler: Box + Send>, + stream: ObjStream, + clock: Box, + ready_tx: mpsc::Sender, + ) -> ObjWatcher { + ObjWatcher { + handler, + stream, + clock, + is_ready: true, + ready_tx, + init_buffer: vec![], + index: HashSet::new(), + } + } + pub(crate) async fn handle_next_event(&mut self) -> EmptyResult { let evt = self.stream.next().await.unwrap().unwrap(); self.handle_event(&evt, self.clock.now_ts()).await From 8da14c074595f875c49ed12d93f31e0ef9871b41 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 14:35:39 -0700 Subject: [PATCH 08/15] fix order in sk-tracer main.rs --- sk-tracer/src/main.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/sk-tracer/src/main.rs b/sk-tracer/src/main.rs index db6c8df5..be11fc82 100644 --- a/sk-tracer/src/main.rs +++ b/sk-tracer/src/main.rs @@ -58,6 +58,20 @@ async fn export( res.map_err(|e| e.into()) } +#[instrument(ret, err)] +async fn run(args: Options) -> EmptyResult { + let config = TracerConfig::load(&args.config_file)?.normalize()?; + let client = Client::try_default().await.expect("failed to create kube client"); + let manager = TraceManager::start(client, config).await?; + let store = manager.get_store(); + + let rkt_config = rocket::Config { port: args.server_port, ..Default::default() }; + let server = rocket::custom(&rkt_config).mount("/", rocket::routes![export]).manage(store); + + server.launch().await?; + Ok(()) +} + async fn export_helper( req: &ExportRequest, store: Arc>, @@ -86,20 +100,6 @@ async fn export_helper( } } -#[instrument(ret, err)] -async fn run(args: Options) -> EmptyResult { - let config = TracerConfig::load(&args.config_file)?.normalize()?; - let client = Client::try_default().await.expect("failed to create kube client"); - let manager = TraceManager::start(client, config).await?; - let store = manager.get_store(); - - let rkt_config = rocket::Config { port: args.server_port, ..Default::default() }; - let server = rocket::custom(&rkt_config).mount("/", rocket::routes![export]).manage(store); - - server.launch().await?; - Ok(()) -} - #[tokio::main] async fn main() -> EmptyResult { let args = Options::parse(); From 285eec3787d64e3cf66ab929874298c785127d31 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 14:36:57 -0700 Subject: [PATCH 09/15] remove commented out code --- sk-tracer/src/store.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sk-tracer/src/store.rs b/sk-tracer/src/store.rs index d472e023..734a04a3 100644 --- a/sk-tracer/src/store.rs +++ b/sk-tracer/src/store.rs @@ -67,7 +67,6 @@ impl TraceStore { // true so that in the second step, we keep pod data around even if the owning object was // deleted before the trace ends. let (events, index) = self.collect_events(start_ts, end_ts, filter, true, maybe_skel_file).await?; - // let num_events = events.len(); // Collect all pod lifecycle data that is a) between the start and end times, and b) is // owned by some object contained in the trace From ba0967b8ad2027af9d3b743420c66cb3efe9756c Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 14:41:45 -0700 Subject: [PATCH 10/15] prefer important constants::* --- sk-core/src/trace/config.rs | 2 +- sk-core/src/trace/tests/pod_owners_map_test.rs | 2 +- sk-core/src/trace/tests/trace_test.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sk-core/src/trace/config.rs b/sk-core/src/trace/config.rs index 976999f4..80262bf5 100644 --- a/sk-core/src/trace/config.rs +++ b/sk-core/src/trace/config.rs @@ -9,7 +9,7 @@ use serde::{ use thiserror::Error; use tracing::*; -use crate::constants::KNOWN_GVKS_METADATA; +use crate::constants::*; use crate::k8s::GVK; #[derive(Debug, Error)] diff --git a/sk-core/src/trace/tests/pod_owners_map_test.rs b/sk-core/src/trace/tests/pod_owners_map_test.rs index 8f48c3db..ea277ba9 100644 --- a/sk-core/src/trace/tests/pod_owners_map_test.rs +++ b/sk-core/src/trace/tests/pod_owners_map_test.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use super::*; -use crate::constants::DEPLOYMENT_GVK; +use crate::constants::*; use crate::k8s::PodLifecycleData; use crate::trace::TraceIndex; use crate::trace::pod_owners_map::{ diff --git a/sk-core/src/trace/tests/trace_test.rs b/sk-core/src/trace/tests/trace_test.rs index 349ee396..175327e5 100644 --- a/sk-core/src/trace/tests/trace_test.rs +++ b/sk-core/src/trace/tests/trace_test.rs @@ -8,7 +8,7 @@ use sk_testutils::{ }; use super::*; -use crate::constants::DEPLOYMENT_GVK; +use crate::constants::*; use crate::k8s::PodLifecycleData; use crate::trace::Trace; use crate::trace::event::TraceEvent; From af6a62bb362776d599b9a1d20401e05fc6b68542 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 15:08:59 -0700 Subject: [PATCH 11/15] prefer to avoid importing prelude::* within the same crate --- sk-core/src/events.rs | 5 ++++- sk-core/src/hooks.rs | 8 ++++++-- sk-core/src/k8s/container_state.rs | 1 - sk-core/src/k8s/gvk.rs | 8 ++++++-- sk-core/src/k8s/lease.rs | 9 ++++++++- sk-core/src/k8s/mod.rs | 5 ++++- sk-core/src/k8s/owners.rs | 7 +++++-- sk-core/src/k8s/pod_ext.rs | 1 - sk-core/src/k8s/pod_lifecycle.rs | 1 - sk-core/src/k8s/sim.rs | 3 ++- sk-core/src/k8s/util.rs | 6 +++++- 11 files changed, 40 insertions(+), 14 deletions(-) diff --git a/sk-core/src/events.rs b/sk-core/src/events.rs index d7f21186..c519d98c 100644 --- a/sk-core/src/events.rs +++ b/sk-core/src/events.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use anyhow::bail; use async_trait::async_trait; use k8s_openapi::api::batch::v1 as batchv1; +use k8s_openapi::api::core::v1 as corev1; use kube::Resource; use kube::runtime::events; use kube::runtime::events::{ @@ -11,8 +12,10 @@ use kube::runtime::events::{ }; #[cfg(feature = "mock")] use mockall::automock; +use sk_api::v1::Simulation; -use crate::prelude::*; +use crate::errors::EmptyResult; +use crate::k8s::KubeResourceExt; #[cfg_attr(feature = "mock", automock)] #[async_trait] diff --git a/sk-core/src/hooks.rs b/sk-core/src/hooks.rs index dc28c974..bc185e1b 100644 --- a/sk-core/src/hooks.rs +++ b/sk-core/src/hooks.rs @@ -6,7 +6,10 @@ use anyhow::{ bail, }; use derive_more::Display; -use sk_api::v1::SimulationHooksConfig; +use sk_api::v1::{ + Simulation, + SimulationHooksConfig, +}; use tokio::io::{ AsyncWriteExt, BufWriter, @@ -14,7 +17,8 @@ use tokio::io::{ use tokio::process::Command; use tracing::*; -use crate::prelude::*; +use crate::errors::EmptyResult; +use crate::events::SkEventRecorder; #[derive(Debug, Display)] #[display("{_variant}")] diff --git a/sk-core/src/k8s/container_state.rs b/sk-core/src/k8s/container_state.rs index bae73d32..c0f31ab2 100644 --- a/sk-core/src/k8s/container_state.rs +++ b/sk-core/src/k8s/container_state.rs @@ -1,7 +1,6 @@ use tracing::*; use super::*; -use crate::prelude::*; // StartEndTimeable provides helper functions for computing the start and end times of a container // from its corresponding ContainerState object. Note that as per the Kubernetes spec, it is an diff --git a/sk-core/src/k8s/gvk.rs b/sk-core/src/k8s/gvk.rs index 5c9d0eb6..eed8475d 100644 --- a/sk-core/src/k8s/gvk.rs +++ b/sk-core/src/k8s/gvk.rs @@ -2,7 +2,12 @@ use std::borrow::Cow; use std::fmt; use std::ops::Deref; -use kube::api::GroupVersionKind; +use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; +use kube::api::{ + DynamicObject, + GroupVersionKind, + TypeMeta, +}; use serde::{ Deserialize, Deserializer, @@ -12,7 +17,6 @@ use serde::{ }; use crate::errors::*; -use crate::prelude::*; // GVK is a "newtype" wrapper around the metav1::GroupVersionKind object that lets me provide // custom serialization methods. We also add some handy helper/conversion functions. diff --git a/sk-core/src/k8s/lease.rs b/sk-core/src/k8s/lease.rs index d3a064f1..d7d5e0e2 100644 --- a/sk-core/src/k8s/lease.rs +++ b/sk-core/src/k8s/lease.rs @@ -4,15 +4,22 @@ use clockabilly::{ Utc, }; use k8s_openapi::api::coordination::v1 as coordinationv1; +use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; +use kube::ResourceExt; use kube::api::Patch; use serde_json::json; +use sk_api::v1::{ + Simulation, + SimulationRoot, +}; use tracing::*; +use crate::constants::*; +use crate::errors::EmptyResult; use crate::k8s::{ KubernetesError, build_object_meta, }; -use crate::prelude::*; #[derive(Debug, Eq, PartialEq)] pub enum LeaseState { diff --git a/sk-core/src/k8s/mod.rs b/sk-core/src/k8s/mod.rs index c32c5157..67f09fba 100644 --- a/sk-core/src/k8s/mod.rs +++ b/sk-core/src/k8s/mod.rs @@ -10,6 +10,9 @@ mod util; pub use apiset::*; pub use gvk::*; +use k8s_openapi::api::core::v1 as corev1; +use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; +use kube::api::TypeMeta; pub use lease::*; pub use owners::OwnersCache; use serde::{ @@ -21,7 +24,7 @@ pub use util::*; use crate::errors::*; use crate::macros::partial_ord_eq_ref; -use crate::prelude::*; + const LAST_APPLIED_CONFIG_LABEL_KEY: &str = "kubectl.kubernetes.io/last-applied-configuration"; const DEPL_REVISION_LABEL_KEY: &str = "deployment.kubernetes.io/revision"; diff --git a/sk-core/src/k8s/owners.rs b/sk-core/src/k8s/owners.rs index 92083fa3..619c276c 100644 --- a/sk-core/src/k8s/owners.rs +++ b/sk-core/src/k8s/owners.rs @@ -1,12 +1,15 @@ use std::collections::HashMap; use async_recursion::async_recursion; -use kube::Resource; use kube::api::ListParams; use kube::discovery::{ ApiCapabilities, Scope, }; +use kube::{ + Resource, + ResourceExt, +}; use tracing::*; use super::*; @@ -14,7 +17,7 @@ use crate::k8s::{ DynamicApiSet, format_gvk_name, }; -use crate::prelude::*; + // TODO I really want a way to mock out the OwnersCache, because // any tests that depend on it implicitly now have to depend on tokio diff --git a/sk-core/src/k8s/pod_ext.rs b/sk-core/src/k8s/pod_ext.rs index 7f042aa5..c90e6809 100644 --- a/sk-core/src/k8s/pod_ext.rs +++ b/sk-core/src/k8s/pod_ext.rs @@ -1,5 +1,4 @@ use super::*; -use crate::prelude::*; const KUBE_SVC_ACCOUNT_VOLUME_NAME_PREFIX: &str = "kube-api-access"; diff --git a/sk-core/src/k8s/pod_lifecycle.rs b/sk-core/src/k8s/pod_lifecycle.rs index ac5f5dc4..fdf93fd8 100644 --- a/sk-core/src/k8s/pod_lifecycle.rs +++ b/sk-core/src/k8s/pod_lifecycle.rs @@ -8,7 +8,6 @@ use std::cmp::{ use tracing::*; use super::*; -use crate::prelude::*; // A PodLifecycleData object is how we track the length of time a pod was running in a cluster. It // has three states, Empty, Running, and Finished. For each state, we track the timestamps that diff --git a/sk-core/src/k8s/sim.rs b/sk-core/src/k8s/sim.rs index f3ee996e..a82d945c 100644 --- a/sk-core/src/k8s/sim.rs +++ b/sk-core/src/k8s/sim.rs @@ -1,3 +1,4 @@ +use kube::ResourceExt; use sk_api::v1::{ Simulation, SimulationMetricsConfig, @@ -6,8 +7,8 @@ use sk_api::v1::{ SimulationState, }; +use crate::constants::*; use crate::k8s::build_global_object_meta; -use crate::prelude::*; pub fn metrics_ns(sim: &Simulation) -> String { match &sim.spec.metrics { diff --git a/sk-core/src/k8s/util.rs b/sk-core/src/k8s/util.rs index 52a81a3c..80e4a828 100644 --- a/sk-core/src/k8s/util.rs +++ b/sk-core/src/k8s/util.rs @@ -1,6 +1,10 @@ use std::collections::BTreeMap; -use kube::api::Resource; +use kube::ResourceExt; +use kube::api::{ + DynamicObject, + Resource, +}; use serde_json::{ Map, Value, From 8f49078a03a457470ace4dcd9c1dc6def2ed3381 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 15:17:36 -0700 Subject: [PATCH 12/15] fix test imports --- sk-core/src/k8s/tests/lease_test.rs | 4 ++++ sk-core/src/k8s/tests/mod.rs | 1 + sk-core/src/k8s/tests/util_test.rs | 1 + 3 files changed, 6 insertions(+) diff --git a/sk-core/src/k8s/tests/lease_test.rs b/sk-core/src/k8s/tests/lease_test.rs index a3c6dd96..f095f1a3 100644 --- a/sk-core/src/k8s/tests/lease_test.rs +++ b/sk-core/src/k8s/tests/lease_test.rs @@ -6,6 +6,10 @@ use httpmock::Method::*; use k8s_openapi::api::coordination::v1 as coordinationv1; use kube::error::ErrorResponse; use serde_json::json; +use sk_api::v1::{ + Simulation, + SimulationRoot, +}; use super::*; diff --git a/sk-core/src/k8s/tests/mod.rs b/sk-core/src/k8s/tests/mod.rs index fd1b9cba..b381f714 100644 --- a/sk-core/src/k8s/tests/mod.rs +++ b/sk-core/src/k8s/tests/mod.rs @@ -7,4 +7,5 @@ mod util_test; use sk_testutils::*; use super::*; +use crate::constants::*; use crate::macros::*; diff --git a/sk-core/src/k8s/tests/util_test.rs b/sk-core/src/k8s/tests/util_test.rs index 3f02c286..3bd7f34e 100644 --- a/sk-core/src/k8s/tests/util_test.rs +++ b/sk-core/src/k8s/tests/util_test.rs @@ -1,5 +1,6 @@ use assertables::*; use clockabilly::Utc; +use kube::api::DynamicObject; use serde_json::Value; use super::*; From 533a3d81ceba1fdd02e85663fd207915775ab690 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Fri, 10 Jul 2026 15:37:20 -0700 Subject: [PATCH 13/15] avoid super::* outside tests --- sk-core/src/k8s/container_state.rs | 6 +++++- sk-core/src/k8s/owners.rs | 4 +++- sk-core/src/k8s/pod_ext.rs | 8 +++++++- sk-core/src/k8s/pod_lifecycle.rs | 8 +++++++- sk-core/src/k8s/util.rs | 10 +++++++++- sk-driver/src/runner.rs | 2 +- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/sk-core/src/k8s/container_state.rs b/sk-core/src/k8s/container_state.rs index c0f31ab2..72dbf94b 100644 --- a/sk-core/src/k8s/container_state.rs +++ b/sk-core/src/k8s/container_state.rs @@ -1,6 +1,10 @@ +use k8s_openapi::api::core::v1 as corev1; use tracing::*; -use super::*; +use crate::k8s::{ + KubernetesError, + StartEndTimeable, +}; // StartEndTimeable provides helper functions for computing the start and end times of a container // from its corresponding ContainerState object. Note that as per the Kubernetes spec, it is an diff --git a/sk-core/src/k8s/owners.rs b/sk-core/src/k8s/owners.rs index 619c276c..3c0ec54f 100644 --- a/sk-core/src/k8s/owners.rs +++ b/sk-core/src/k8s/owners.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use async_recursion::async_recursion; +use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; use kube::api::ListParams; use kube::discovery::{ ApiCapabilities, @@ -12,9 +13,10 @@ use kube::{ }; use tracing::*; -use super::*; use crate::k8s::{ DynamicApiSet, + GVK, + KubeResourceExt, format_gvk_name, }; diff --git a/sk-core/src/k8s/pod_ext.rs b/sk-core/src/k8s/pod_ext.rs index c90e6809..85095f1f 100644 --- a/sk-core/src/k8s/pod_ext.rs +++ b/sk-core/src/k8s/pod_ext.rs @@ -1,4 +1,10 @@ -use super::*; +use anyhow::bail; +use k8s_openapi::api::core::v1 as corev1; + +use crate::k8s::{ + KubernetesError, + PodExt, +}; const KUBE_SVC_ACCOUNT_VOLUME_NAME_PREFIX: &str = "kube-api-access"; diff --git a/sk-core/src/k8s/pod_lifecycle.rs b/sk-core/src/k8s/pod_lifecycle.rs index fdf93fd8..0787dcff 100644 --- a/sk-core/src/k8s/pod_lifecycle.rs +++ b/sk-core/src/k8s/pod_lifecycle.rs @@ -5,9 +5,15 @@ use std::cmp::{ min, }; +use k8s_openapi::api::core::v1 as corev1; use tracing::*; -use super::*; +use crate::k8s::{ + KubeResourceExt, + PodExt, + PodLifecycleData, + StartEndTimeable, +}; // A PodLifecycleData object is how we track the length of time a pod was running in a cluster. It // has three states, Empty, Running, and Finished. For each state, we track the timestamps that diff --git a/sk-core/src/k8s/util.rs b/sk-core/src/k8s/util.rs index 80e4a828..78b8af90 100644 --- a/sk-core/src/k8s/util.rs +++ b/sk-core/src/k8s/util.rs @@ -1,5 +1,7 @@ use std::collections::BTreeMap; +use k8s_openapi::api::core::v1 as corev1; +use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; use kube::ResourceExt; use kube::api::{ DynamicObject, @@ -10,9 +12,15 @@ use serde_json::{ Value, }; -use super::*; use crate::constants::*; use crate::errors::*; +use crate::k8s::{ + DEPL_REVISION_LABEL_KEY, + GVK, + KubernetesError, + LAST_APPLIED_CONFIG_LABEL_KEY, +}; +use crate::prelude::KubeResourceExt; const MAX_LABEL_LENGTH: usize = 63; diff --git a/sk-driver/src/runner.rs b/sk-driver/src/runner.rs index e6811161..5341161e 100644 --- a/sk-driver/src/runner.rs +++ b/sk-driver/src/runner.rs @@ -30,7 +30,7 @@ use sk_core::prelude::*; use tokio::time::sleep; use tracing::*; -use super::*; +use crate::DriverContext; use crate::util::{ compute_step_size, wait_if_paused, From ee52d00cca47a0bd59483c5adc78e349e84f5725 Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Tue, 14 Jul 2026 09:53:25 -0700 Subject: [PATCH 14/15] remove redundant imports --- sk-tracer/src/tests/import_export_test.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sk-tracer/src/tests/import_export_test.rs b/sk-tracer/src/tests/import_export_test.rs index f9b34d51..7532e9e2 100644 --- a/sk-tracer/src/tests/import_export_test.rs +++ b/sk-tracer/src/tests/import_export_test.rs @@ -8,21 +8,16 @@ use futures::stream; use futures::stream::StreamExt; use k8s_openapi::apimachinery::pkg::apis::meta::v1 as metav1; use kube::ResourceExt; -use kube::api::DynamicObject; use kube::discovery::ApiResource; use kube::runtime::watcher::Event; use serde_json::json; use sk_api::v1::ExportFilters; -use sk_core::constants::*; use sk_core::k8s::{ DynamicApiSet, GVK, - KubeResourceExt, format_gvk_name, }; use sk_core::macros::*; -use sk_core::trace::Trace; -use sk_core::trace::config::TracerConfig; use tokio::sync::{ Mutex, mpsc, From d44634f01b52d2791fcb96b7ed9da2b556355aaa Mon Sep 17 00:00:00 2001 From: Ian O'Gorman Date: Tue, 14 Jul 2026 12:25:51 -0700 Subject: [PATCH 15/15] move constants, remove a missed crate::prelude --- sk-core/src/constants.rs | 2 ++ sk-core/src/k8s/mod.rs | 4 ---- sk-core/src/k8s/util.rs | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/sk-core/src/constants.rs b/sk-core/src/constants.rs index dacbe0ec..849b50a1 100644 --- a/sk-core/src/constants.rs +++ b/sk-core/src/constants.rs @@ -17,6 +17,8 @@ pub const CURRENT_TRACE_FORMAT_VERSION: u16 = 2; pub const KUBERNETES_IO_METADATA_NAME_KEY: &str = "kubernetes.io/metadata.name"; pub const APP_KUBERNETES_IO_NAME_KEY: &str = "app.kubernetes.io/name"; pub const APP_KUBERNETES_IO_COMPONENT_KEY: &str = "app.kubernetes.io/component"; +pub const LAST_APPLIED_CONFIG_LABEL_KEY: &str = "kubectl.kubernetes.io/last-applied-configuration"; +pub const DEPL_REVISION_LABEL_KEY: &str = "deployment.kubernetes.io/revision"; // Annotations that go on the Simulation CR itself // TODO (SK-277) maybe this just belongs in the CRD specification? diff --git a/sk-core/src/k8s/mod.rs b/sk-core/src/k8s/mod.rs index 67f09fba..a324a8c4 100644 --- a/sk-core/src/k8s/mod.rs +++ b/sk-core/src/k8s/mod.rs @@ -25,10 +25,6 @@ pub use util::*; use crate::errors::*; use crate::macros::partial_ord_eq_ref; - -const LAST_APPLIED_CONFIG_LABEL_KEY: &str = "kubectl.kubernetes.io/last-applied-configuration"; -const DEPL_REVISION_LABEL_KEY: &str = "deployment.kubernetes.io/revision"; - err_impl! {KubernetesError, #[error("field not found in struct: {0}")] FieldNotFound(String), diff --git a/sk-core/src/k8s/util.rs b/sk-core/src/k8s/util.rs index 78b8af90..d4f4d9f3 100644 --- a/sk-core/src/k8s/util.rs +++ b/sk-core/src/k8s/util.rs @@ -15,12 +15,10 @@ use serde_json::{ use crate::constants::*; use crate::errors::*; use crate::k8s::{ - DEPL_REVISION_LABEL_KEY, GVK, + KubeResourceExt, KubernetesError, - LAST_APPLIED_CONFIG_LABEL_KEY, }; -use crate::prelude::KubeResourceExt; const MAX_LABEL_LENGTH: usize = 63;