diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c6cd879..33b7d1fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ - Add `/ready` endpoint to the operator Deployment, which reports the CRD installation status ([#868]). - Webservers now have a default affinity to the OPA Pods when OPA authorization is configured ([#872]). - The logs of the `containerdebug` process are now collected by the Vector agent and forwarded to - the Vector aggregator ([#888]). + the Vector aggregator ([#888], [#892]). ### Changed @@ -112,6 +112,7 @@ [#886]: https://github.com/stackabletech/airflow-operator/pull/886 [#887]: https://github.com/stackabletech/airflow-operator/pull/887 [#888]: https://github.com/stackabletech/airflow-operator/pull/888 +[#892]: https://github.com/stackabletech/airflow-operator/pull/892 ## [26.7.0] - 2026-07-21 diff --git a/rust/operator-binary/src/controller/build/properties/env_vars.rs b/rust/operator-binary/src/controller/build/properties/env_vars.rs index a74d6dd3..6bb930af 100644 --- a/rust/operator-binary/src/controller/build/properties/env_vars.rs +++ b/rust/operator-binary/src/controller/build/properties/env_vars.rs @@ -1,5 +1,6 @@ use std::{collections::BTreeSet, str::FromStr}; +use const_format::concatcp; use stackable_operator::{ constant, crd::{authentication::oidc, git_sync}, @@ -188,9 +189,11 @@ pub fn build_airflow_statefulset_envs( // other telemetry-based process in it would log into the same directory and the Vector // agent would label its events with `container: containerdebug`. env_vars = env_vars + // The directory must be exactly one level below the log directory, because the Vector + // agent derives the container name from that path segment. .with_value( &FILE_LOG_DIRECTORY, - format!("{STACKABLE_LOG_DIR}/containerdebug"), + concatcp!(STACKABLE_LOG_DIR, "/containerdebug"), ) .with_value(&FILE_LOG_ROTATION_PERIOD, "hourly") .with_value(&FILE_LOG_MAX_FILES, "2") diff --git a/rust/operator-binary/src/controller/build/volumes.rs b/rust/operator-binary/src/controller/build/volumes.rs index 30f9821b..06e6d787 100644 --- a/rust/operator-binary/src/controller/build/volumes.rs +++ b/rust/operator-binary/src/controller/build/volumes.rs @@ -32,11 +32,9 @@ pub fn create_volumes( name: LOG_VOLUME_NAME.to_string(), empty_dir: Some(EmptyDirVolumeSource { medium: None, - // Only the Airflow log files are budgeted here. The `containerdebug` files in this - // volume are rotated by time, which bounds their number but not their size, so they - // are an unbudgeted writer. They stay negligible at the default INFO level and a 30 - // minute loop, but raising `FILE_LOG_LEVEL` via `envOverrides` can exceed the limit, - // which makes the kubelet evict the Pod. + // Only the Airflow log files are budgeted. The `containerdebug` files in this + // volume are rotated by time, not by size, so they have no budget; raising + // `FILE_LOG_LEVEL` via `envOverrides` can therefore evict the Pod. size_limit: Some(product_logging::framework::calculate_log_volume_size_limit( &[MAX_LOG_FILES_SIZE], )), diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 89b8bce3..b7cf46a2 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -776,7 +776,13 @@ impl Deref for AirflowRole { } fn container_debug_command() -> String { - format!("containerdebug --output={STACKABLE_LOG_DIR}/containerdebug-state.json --loop &") + // The log directory is created here, because `FILE_LOG_MAX_FILES` makes the telemetry library + // prune old log files before it creates the first one, which complains about the directory not + // existing yet. + format!( + "mkdir --parents \"$FILE_LOG_DIRECTORY\"\n\ + containerdebug --output={STACKABLE_LOG_DIR}/containerdebug-state.json --loop &" + ) } #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]