Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
- Support floating tags for product images via the new `spec.image.stackableVersionPolicy` field
([#790]).
- Add `/ready` endpoint to the operator Deployment, which reports the CRD installation status ([#795]).
- The logs of the `containerdebug` process are now collected by the Vector agent and forwarded to
the Vector aggregator ([#812]).
- Nodes now have a default affinity to the OPA Pods when the role mapping from OPA is configured ([#796]).

### Changed
Expand Down Expand Up @@ -54,6 +56,10 @@
See [our internal issue](https://github.com/stackabletech/hdfs-operator/issues/626) and [the fix](https://github.com/kube-rs/kube/pull/2042) for details ([#773]).
- The operator now watches all resources that it creates and early-exits the reconcile action when the
cluster is marked for deletion ([#781]).
- The `containerdebug` process writes its log file again. The operator set
`CONTAINERDEBUG_LOG_DIRECTORY`, which containerdebug stopped reading in its version 0.2.0 when it
moved to `stackable-telemetry`; the directory is now set via `FILE_LOG_DIRECTORY`. The file is
rotated hourly and at most two files are kept, because rotation is opt-in ([#812]).

[#756]: https://github.com/stackabletech/superset-operator/pull/756
[#761]: https://github.com/stackabletech/superset-operator/pull/761
Expand All @@ -75,6 +81,7 @@
[#805]: https://github.com/stackabletech/superset-operator/pull/805
[#807]: https://github.com/stackabletech/superset-operator/pull/807
[#809]: https://github.com/stackabletech/superset-operator/pull/809
[#812]: https://github.com/stackabletech/superset-operator/pull/812

## [26.7.0] - 2026-07-21

Expand Down
6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 9 additions & 4 deletions Cargo.nix

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions docs/modules/superset/pages/usage-guide/logging.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,12 @@ spec:
enableVectorAgent: true
----

NOTE: The logs of the xref:concepts:observability/containerdebug.adoc[`containerdebug` process] are collected as well.
They are labelled `container: containerdebug`, although no such Kubernetes container exists.
The process runs in the background of the `superset` container.
The label comes from `/stackable/log/containerdebug`, the directory which the operator sets with the `FILE_LOG_DIRECTORY` environment variable and from which the Vector agent derives the container name.
Overriding `FILE_LOG_DIRECTORY` with `envOverrides` therefore changes how these logs are aggregated.
The agent only collects files one level below `/stackable/log`, so a sibling directory such as `/stackable/log/superset` relabels the events instead of dropping them, while any deeper or shallower path stops the aggregation.
A path outside `/stackable/log` also leaves the size-capped log volume.

Further information on how to configure logging, can be found in xref:concepts:logging.adoc[].
1 change: 1 addition & 0 deletions rust/operator-binary/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ tracing.workspace = true
[dev-dependencies]
indoc.workspace = true
rstest.workspace = true
stackable-operator = { workspace = true, features = ["test-support"] }
tokio.workspace = true
yaml_serde.workspace = true

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,285 @@ tests:
"timestamp": t'2025-10-02T09:27:28.582Z'
}

assert_eq!(expected_log_event, .)
- name: Test tracing-rs log
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"message":"found disk","disk.name":"overlay"},"target":"containerdebug::system_information::disk"}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "containerdebug::system_information::disk",
"message": "found disk\n\ndisk.name=overlay",
"timestamp": t'2026-11-02T14:49:28.028922Z',
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)
- name: Test unparsable tracing-rs log
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{ unparsable'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"errors": [
.errors[0]
],
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "",
"message": "{ unparsable",
"timestamp": .timestamp,
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)

# The remainder of the message contains character offsets into
# the VRL source, so only the stable prefix is asserted.
assert!(starts_with!(.errors[0], "JSON not parsable: "))
- name: Test tracing-rs log which is not a JSON object
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: 'false'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"errors": [
"Parsed event is not a JSON object."
],
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "",
"message": "false",
"timestamp": .timestamp,
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)
- name: Test tracing-rs log with invalid fields
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"timestamp":"unparsable","level":"INVALID","fields":"none","target":null}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"errors": [
.errors[0],
"Logger/target not found.",
"Level \"INVALID\" unknown, using \"INFO\" instead.",
"Fields are not an object."
],
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "",
"message": "{\"timestamp\":\"unparsable\",\"level\":\"INVALID\",\"fields\":\"none\",\"target\":null}",
"timestamp": .timestamp,
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)

# The remainder of the message contains character offsets into
# the VRL source, so only the stable prefix is asserted.
assert!(starts_with!(.errors[0], "Timestamp not parsable, using current time instead: "))
- name: Test tracing-rs log without a timestamp
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"level":"INFO","fields":{"message":"found disk"},"target":"containerdebug::system_information::disk"}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"errors": [
"Timestamp not found, using current time instead."
],
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "containerdebug::system_information::disk",
"message": "found disk",
"timestamp": .timestamp,
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)

# The current time is used and not the timestamp which the file
# source attached to the event. The latter reaches the transform
# as a string, whereas now() yields a timestamp.
assert!(is_timestamp(.timestamp))
- name: Test tracing-rs log without a message but with other fields
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"disk.name":"overlay"},"target":"containerdebug::system_information::disk"}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "containerdebug::system_information::disk",
"message": "disk.name=overlay",
"timestamp": t'2026-11-02T14:49:28.028922Z',
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)
- name: Test tracing-rs log with a message which is not a string
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"message":42,"disk.name":"overlay"},"target":"containerdebug::system_information::disk"}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "containerdebug::system_information::disk",
"message": "disk.name=overlay\nmessage=42",
"timestamp": t'2026-11-02T14:49:28.028922Z',
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)
- name: Test tracing-rs log without any fields
inputs:
- type: log
insert_at: processed_files_tracing_rs
log_fields:
file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json
message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{},"target":"containerdebug::system_information::disk"}'
pod: superset-node-default-0
source_type: file
timestamp: 2026-11-02T14:49:29.473487331Z
outputs:
- extract_from: extended_logs
expected_event_count: 1
conditions:
- type: vrl
source: |
expected_log_event = {
"cluster": "superset",
"container": "containerdebug",
"errors": [
"Message not found."
],
"file": "containerdebug.2026-11-02-14.tracing-rs.json",
"level": "INFO",
"logger": "containerdebug::system_information::disk",
"message": "",
"timestamp": t'2026-11-02T14:49:28.028922Z',
"namespace": "default",
"pod": "superset-node-default-0",
"role": "node",
"roleGroup": "default"
}

assert_eq!(expected_log_event, .)
- name: Test Vector internal logs
inputs:
Expand Down
Loading
Loading