Skip to content

docs: add economizing log forwarding guide with measured savings data - #3395

Open
Clee2691 wants to merge 1 commit into
openshift:masterfrom
Clee2691:LOG-9673
Open

docs: add economizing log forwarding guide with measured savings data#3395
Clee2691 wants to merge 1 commit into
openshift:masterfrom
Clee2691:LOG-9673

Conversation

@Clee2691

@Clee2691 Clee2691 commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Description

This PR adds an economizing log forwarding guide with two recommended CLF configurations (balanced and minimal) for reducing log volume via field pruning, backed by measured data from a 6-node OCP cluster.

Accompanying plan/scripts: https://github.com/Clee2691/clo_investigations/tree/LOG-9673

/cc @vparfonov @r2d2rnd
/assign @jcantrill

Links

Summary by CodeRabbit

  • Documentation
    • Added guidance for reducing OpenShift log-forwarding volume and metadata overhead.
    • Documented measurement methods, field-level savings, pruning recommendations, and output-specific requirements.
    • Added instructions for safely customizing log fields across supported destinations.
  • Reference Samples
    • Added balanced and minimal ClusterLogForwarder examples for routing and pruning application, infrastructure, journal, and audit logs.
    • Included Loki-based configurations with recommended filters and TLS authentication.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3dcc6e1f-e621-4e2f-913a-805eaf17f5f3

📥 Commits

Reviewing files that changed from the base of the PR and between 331f2f5 and 8b052e0.

📒 Files selected for processing (3)
  • docs/administration/economizing-log-forwarding/economizing-log-forwarding.md
  • docs/administration/economizing-log-forwarding/methodology.md
  • docs/administration/economizing-log-forwarding/output-field-requirements.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • docs/administration/economizing-log-forwarding/methodology.md
  • docs/administration/economizing-log-forwarding/output-field-requirements.md
  • docs/administration/economizing-log-forwarding/economizing-log-forwarding.md

📝 Walkthrough

Walkthrough

Changes

Adds documentation for measuring log-forwarding costs, selecting fields for pruning, and applying balanced or minimal ClusterLogForwarder configurations with Loki output.

Changes

Economizing log forwarding

Layer / File(s) Summary
Guidance and measurement
docs/administration/economizing-log-forwarding/economizing-log-forwarding.md, docs/administration/economizing-log-forwarding/methodology.md
Documents metadata costs, field-level pruning, savings calculations, customization constraints, and measurement procedures.
Output field requirements
docs/administration/economizing-log-forwarding/output-field-requirements.md
Documents required, configurable, and safely prunable fields for supported outputs.
Balanced forwarding configuration
docs/reference/samples/observability.economize-balanced.yaml
Adds balanced pruning and audit filtering for application, infrastructure, journal, and audit logs routed to Loki.
Minimal forwarding configuration
docs/reference/samples/observability.economize-minimal.yaml
Adds minimal field allowlists, audit filtering, log-type separation, and dedicated pipelines routed to Loki.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers: vparfonov, r2d2rnd

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description check ✅ Passed The description explains the guide, configurations, measured data, investigation materials, reviewers, approver, and related JIRA issue.
Title check ✅ Passed The title clearly summarizes the primary documentation change and its focus on measured log-forwarding savings.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@qodo-for-rh-openshift

Copy link
Copy Markdown

PR Summary by Qodo

Add economizing log forwarding guide with tiered CLF pruning samples

📝 Documentation ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• Add a new guide quantifying log bloat and savings from CLF field pruning and audit filtering.
• Document per-output field requirements to avoid breaking routing/indexing when pruning.
• Provide balanced and minimal sample ClusterLogForwarder manifests for immediate adoption.
Diagram

graph TD
A["Cluster admin"] --> B["Economizing docs"] --> C["Tiered CLF samples"]
C --> D["Log collector"] --> E["prune (field removal)"] --> G[("Log store output")]
D --> F["kubeAPIAudit (event drop/level)"] --> G
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Single parametric sample (one manifest, two profiles)
  • ➕ Reduces duplication between balanced/minimal YAML
  • ➕ Easier to keep pipelines/outputs consistent across tiers
  • ➖ Harder for users to copy/paste a ready-to-apply manifest
  • ➖ Requires additional tooling or careful manual edits
2. Productized presets (operator-supported economize tiers)
  • ➕ Safer and more discoverable than docs; could include validation/guardrails
  • ➕ Easier upgrades when field requirements change
  • ➖ Requires product/CRD work beyond docs scope
  • ➖ Longer lead time and more compatibility surface
3. Focus on guidance only, omit measured numbers
  • ➕ Less risk of numbers being interpreted as universal guarantees
  • ➕ Smaller docs footprint
  • ➖ Lower credibility and harder for users to justify changes
  • ➖ Less actionable without concrete expected savings

Recommendation: For a docs-only PR, the current approach (actionable tiers + measured data + output constraints) is the best tradeoff: it enables immediate adoption while explicitly calling out backend field requirements. If this guidance gains traction, consider a follow-on to reduce YAML duplication or to introduce operator-level presets with validation-backed tier profiles.

Files changed (11) +1001 / -0 · 6 not counted

Documentation (9) +608 / -0
economizing-log-forwarding.mdAdd economizing guide with tier definitions and measured savings +261/-0

Add economizing guide with tier definitions and measured savings

• Introduces a new guide explaining log metadata bloat and how to reduce forwarded volume using 'prune' and 'kubeAPIAudit' filters. Includes per-log-group field cost tables, recommended balanced/minimal tiers, aggregate savings totals, and resource impact visuals, with links to sample CLF specs and methodology.

docs/administration/economizing-log-forwarding/economizing-log-forwarding.md

methodology.mdDocument measurement methodology for reported savings data +120/-0

Document measurement methodology for reported savings data

• Adds a dedicated methodology page describing the test environment, outputs, synthetic workload, sampling windows, and calculations used to derive byte savings and resource impact. Links to the external investigation repository for scripts/manifests.

docs/administration/economizing-log-forwarding/methodology.md

output-field-requirements.mdAdd per-output required fields to guide safe pruning +227/-0

Add per-output required fields to guide safe pruning

• Documents which log fields must be preserved for common outputs (LokiStack, GCL, Elasticsearch, Splunk, CloudWatch, Kafka, Syslog, HTTP, S3, OTLP, Azure Monitor), including code-based rationale and configuration gotchas. Establishes globally unprunable fields ('.log_type', '.log_source', '.message').

docs/administration/economizing-log-forwarding/output-field-requirements.md

field-cost-breakdown.pngAdd field cost breakdown chart image not counted

Add field cost breakdown chart image

• Adds a generated chart visualizing per-field byte cost distribution by log group to support the economizing guide.

docs/administration/economizing-log-forwarding/images/field-cost-breakdown.png

bytes-by-log-group.pngAdd average entry size by log group and tier chart image not counted

Add average entry size by log group and tier chart image

• Adds a chart comparing average log entry sizes across baseline/balanced/minimal tiers for container, journal, and audit logs.

docs/administration/economizing-log-forwarding/images/bytes-by-log-group.png

bloat-ratio.pngAdd bloat ratio by tier chart image not counted

Add bloat ratio by tier chart image

• Adds a chart showing how metadata-to-message bloat ratio changes across tiers.

docs/administration/economizing-log-forwarding/images/bloat-ratio.png

total-savings.pngAdd total bytes savings chart image not counted

Add total bytes savings chart image

• Adds a chart summarizing aggregate bytes forwarded and savings across tiers for the measured window.

docs/administration/economizing-log-forwarding/images/total-savings.png

cpu-timeseries.pngAdd collector CPU timeseries chart image not counted

Add collector CPU timeseries chart image

• Adds a chart visualizing collector CPU usage over time across tiers to illustrate overhead impact.

docs/administration/economizing-log-forwarding/images/cpu-timeseries.png

mem-timeseries.pngAdd collector memory timeseries chart image not counted

Add collector memory timeseries chart image

• Adds a chart visualizing collector memory usage over time across tiers to illustrate overhead impact.

docs/administration/economizing-log-forwarding/images/mem-timeseries.png

Other (2) +393 / -0
observability.economize-balanced.yamlAdd balanced-tier ClusterLogForwarder sample (blocklist prune + audit policy) +175/-0

Add balanced-tier ClusterLogForwarder sample (blocklist prune + audit policy)

• Provides an apply-ready CLF manifest that blocklists high-cost metadata fields for container/journal logs and applies moderate 'kubeAPIAudit' filtering plus audit field pruning. Uses separate pipelines for infra container vs journal pruning and routes to a LokiStack output by default.

docs/reference/samples/observability.economize-balanced.yaml

observability.economize-minimal.yamlAdd minimal-tier ClusterLogForwarder sample (allowlist prune + aggressive audit policy) +218/-0

Add minimal-tier ClusterLogForwarder sample (allowlist prune + aggressive audit policy)

• Provides an apply-ready CLF manifest that allowlists only essential fields for container/journal/audit logs and introduces more aggressive 'kubeAPIAudit' filtering (additional response codes and silencing read-only system users). Splits audit routing to handle API vs host/OVN audit differently.

docs/reference/samples/observability.economize-minimal.yaml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@docs/administration/economizing-log-forwarding/economizing-log-forwarding.md`:
- Around line 51-65: Update the documented prune-filter paths in the field
tables to use valid ClusterLogForwarder FieldPath syntax by quoting every
segment containing @, dots, or slashes, including nested examples such as
annotations and user.extra paths. Apply this consistently to all affected
entries in the table, while leaving simple alphanumeric segments unquoted.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 67c23629-978c-4d7b-aa12-141b6335134e

📥 Commits

Reviewing files that changed from the base of the PR and between 1cff204 and 331f2f5.

⛔ Files ignored due to path filters (6)
  • docs/administration/economizing-log-forwarding/images/bloat-ratio.png is excluded by !**/*.png
  • docs/administration/economizing-log-forwarding/images/bytes-by-log-group.png is excluded by !**/*.png
  • docs/administration/economizing-log-forwarding/images/cpu-timeseries.png is excluded by !**/*.png
  • docs/administration/economizing-log-forwarding/images/field-cost-breakdown.png is excluded by !**/*.png
  • docs/administration/economizing-log-forwarding/images/mem-timeseries.png is excluded by !**/*.png
  • docs/administration/economizing-log-forwarding/images/total-savings.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • docs/administration/economizing-log-forwarding/economizing-log-forwarding.md
  • docs/administration/economizing-log-forwarding/methodology.md
  • docs/administration/economizing-log-forwarding/output-field-requirements.md
  • docs/reference/samples/observability.economize-balanced.yaml
  • docs/reference/samples/observability.economize-minimal.yaml

Comment on lines +51 to +65
| `.kubernetes.annotations.k8s.ovn.org/pod-networks` | 387 | 19.2% | 38% |
| `.kubernetes.annotations.k8s.v1.cni.cncf.io/network-status` | 169 | 8.4% | 38% |
| `.message` | 162 | 8.1% | 100% |
| `.kubernetes.container_image` | 118 | 5.9% | 100% |
| `.kubernetes.container_id` | 72 | 3.6% | 100% |
| `.kubernetes.annotations.imageregistry.operator.openshift.io/dependencies-checksum` | 71 | 3.5% | 3% |
| `.kubernetes.annotations.network.operator.openshift.io/ovnkube-script-lib-hash` | 40 | 2.0% | 6% |
| `.kubernetes.pod_owner` | 37 | 1.9% | 100% |
| `.hostname` | 37 | 1.8% | 100% |
| `.kubernetes.namespace_id` | 36 | 1.8% | 100% |
| `.kubernetes.pod_id` | 36 | 1.8% | 100% |
| `.openshift.cluster_id` | 36 | 1.8% | 100% |
| `.kubernetes.pod_name` | 32 | 1.6% | 100% |
| `.@timestamp` | 30 | 1.5% | 100% |
| `.kubernetes.namespace_labels.kubernetes_io_metadata_name` | 24 | 1.2% | 100% |

@coderabbitai coderabbitai Bot Aug 10, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use valid ClusterLogForwarder FieldPath syntax.

These tables show paths that users can copy into prune filters. Quote every segment that contains @, dots, or slashes. Otherwise, CRD validation rejects the filter.

Proposed documentation update
-| `.kubernetes.annotations.k8s.ovn.org/pod-networks` | 387 | 19.2% | 38% |
-| `.@timestamp` | 30 | 1.5% | 100% |
+| `.kubernetes.annotations."k8s.ovn.org/pod-networks"` | 387 | 19.2% | 38% |
+| `."`@timestamp`"` | 30 | 1.5% | 100% |

Apply the same rule to paths such as .annotations."authorization.k8s.io/reason" and .user.extra."authentication.kubernetes.io/credential-id".

Also applies to: 86-105

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/administration/economizing-log-forwarding/economizing-log-forwarding.md`
around lines 51 - 65, Update the documented prune-filter paths in the field
tables to use valid ClusterLogForwarder FieldPath syntax by quoting every
segment containing @, dots, or slashes, including nested examples such as
annotations and user.extra paths. Apply this consistently to all affected
entries in the table, while leaving simple alphanumeric segments unquoted.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added a note about needing to quote certain field paths

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Clee2691, thank you. I noted the documentation guidance. Quote each ClusterLogForwarder FieldPath segment that contains @, dots, or slashes.


✏️ Learnings added
Learnt from: Clee2691
Repo: openshift/cluster-logging-operator PR: 3395
File: docs/administration/economizing-log-forwarding/economizing-log-forwarding.md:60-74
Timestamp: 2026-08-10T18:30:56.627Z
Learning: In `docs/administration/economizing-log-forwarding/` documentation for OpenShift `ClusterLogForwarder` prune filters, FieldPath segments that contain `@`, dots, or slashes must be quoted. Examples include `."`timestamp`"`, `.annotations."authorization.k8s.io/reason"`, and `.user.extra."authentication.kubernetes.io/credential-id"`.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

You are interacting with an AI system.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qodo-for-rh-openshift

qodo-for-rh-openshift Bot commented Aug 10, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (1) 📜 Skill insights (0)

Grey Divider


Action required

1. OTLP uses @timestamp ✓ Resolved 🐞 Bug ≡ Correctness
Description
The OTLP section claims .timestamp is used to set timeUnixNano, but the OTLP transform parses
.@timestamp (the @timestamp field); pruning @timestamp while keeping .timestamp will break
OTLP timestamps.
Code

docs/administration/economizing-log-forwarding/output-field-requirements.md[R188-189]

+| `.timestamp` | Used in `transform.go` `LogRecord` to set `timeUnixNano` (accessed as `@timestamp` internally) |
+| `.level` | Used in `transform.go` `LogRecordSeverity` to set `severityText` |
Relevance

●●● Strong

Mismatch between docs and OTLP implementation would break timestamps; likely accepted as correctness
fix.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The OTLP transform explicitly parses .@timestamp for timeUnixNano, while the normalization
pipeline sets both .timestamp and @timestamp; therefore, the doc’s .timestamp requirement does
not match what OTLP actually reads.

docs/administration/economizing-log-forwarding/output-field-requirements.md[181-189]
internal/generator/vector/output/otlp/transform.go[46-50]
internal/generator/vector/filter/openshift/viaq/v1/filter.go[34-40]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The OTLP required fields table says `.timestamp` is used for `timeUnixNano`, but the OTLP transform code parses `.@timestamp`.

## Issue Context
Users following this doc to build `prune.notIn` allowlists may omit `.@timestamp` and unintentionally remove the field required to compute OTLP log record timestamps.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/output-field-requirements.md[177-205]

## What to change
- Replace the OTLP required field entry `.timestamp` with `.@timestamp` (or `."@timestamp"` if you choose to show it quoted for clarity).
- Optionally add a note that the normalization step sets both `.timestamp` and `@timestamp`, but OTLP consumes `@timestamp`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Wrong metric name ✓ Resolved 🐞 Bug ≡ Correctness
Description
The new guide/methodology instructs querying component_sent_bytes_total, but the collector metric
name is vector_component_sent_bytes_total, so users following the docs will get no data and
compute incorrect savings.
Code

docs/administration/economizing-log-forwarding/methodology.md[R57-58]

+| `component_sent_bytes_total` | Collector `/metrics` endpoint | Total bytes forwarded per output component |
+| Raw JSON entries | HTTP receiver disk output | Per-entry size and per-field byte cost |
Relevance

●●● Strong

Wrong metric name would mislead users; straightforward doc correctness fix is typically accepted.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new docs reference a metric name that does not appear in the repository; the repo’s relabel
allowlist and functional tests explicitly reference vector_component_sent_bytes_total as the
metric emitted/validated.

docs/administration/economizing-log-forwarding/methodology.md[55-58]
docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[34-38]
internal/metrics/relabel.go[31-37]
test/functional/outputs/aws/s3/forward_to_s3_test.go[192-199]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The methodology and guide reference `component_sent_bytes_total`, but the actual metric name used by the collector/tests is `vector_component_sent_bytes_total`.

## Issue Context
This breaks the documented measurement procedure because Prometheus queries for the wrong series will return empty results.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/methodology.md[55-96]
- docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[34-38]

## What to change
- Replace all occurrences of `component_sent_bytes_total` with `vector_component_sent_bytes_total`.
- Ensure the surrounding text still reads correctly (it’s a Vector metric).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Splunk needs _internal fields 🐞 Bug ≡ Correctness
Description
The output requirements doc says Splunk requires .hostname and .timestamp, but the Splunk sink
is configured to read ._internal.hostname and ._internal.timestamp; pruning _internal will
break Splunk host/timestamp handling.
Code

docs/administration/economizing-log-forwarding/output-field-requirements.md[R78-79]

+| `.hostname` | Used in `splunk.go` as Splunk HEC `HostKey` (`._internal.hostname`) |
+| `.timestamp` | Used in `splunk.go` as Splunk HEC `TimestampKey` (`._internal.timestamp`), parsed via `fixTimestampFormat` |
Relevance

●●● Strong

Repo has precedent accepting Splunk docs updates to match implementation behavior.

PR-#3251

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The doc claims top-level fields are required, but the Splunk sink config explicitly uses
._internal.hostname and ._internal.timestamp as its HostKey/TimestampKey, and
_internal.hostname is populated during normalization.

docs/administration/economizing-log-forwarding/output-field-requirements.md[70-80]
internal/generator/vector/output/splunk/splunk.go[143-152]
internal/generator/vector/input/internal.go[30-36]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Splunk section lists `.hostname` and `.timestamp` as required, but the generated Splunk HEC sink reads `._internal.hostname` and `._internal.timestamp`.

## Issue Context
With `prune.notIn` (allowlist) configurations, users may keep `.hostname`/`.timestamp` while unknowingly pruning `_internal.*`, causing Splunk events to lose correct host/timestamp values.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/output-field-requirements.md[66-80]

## What to change
- Update the Splunk required field table to list `._internal.hostname` and `._internal.timestamp` (and optionally explain that `.hostname`/`.timestamp` are derived copies).
- If you keep `.hostname`/`.timestamp` in the doc for user ergonomics, add an explicit note that Splunk’s sink configuration uses `_internal` keys and those must be preserved when pruning.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Invalid field path examples ✗ Dismissed 🐞 Bug ≡ Correctness
Description
The per-field cost tables show annotation keys with dots/slashes as unquoted dotted paths; copying
these into prune filters would fail because field-path segments containing non-alphanumerics must
be quoted.
Code

docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[R51-52]

+| `.kubernetes.annotations.k8s.ovn.org/pod-networks` | 387 | 19.2% | 38% |
+| `.kubernetes.annotations.k8s.v1.cni.cncf.io/network-status` | 169 | 8.4% | 38% |
Relevance

●●● Strong

Doc example likely breaks prune filters; teams usually accept fixes to invalid field-path syntax.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The guide presents the field names in a syntax that looks like CLF FieldPath, but the API’s own
FieldPath documentation requires quoting segments with characters like - and /, and the guide’s
annotation keys contain such characters.

docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[49-57]
api/observability/v1/filter_types.go[108-112]
api/observability/v1/filter_types.go[139-152]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The guide’s cost tables list fields like `.kubernetes.annotations.k8s.ovn.org/pod-networks`, which are not valid FieldPath syntax for CLF filters because those key segments contain characters outside `[a-zA-Z0-9_]`.

## Issue Context
Users are likely to copy these expensive-field names into `prune.in`/`prune.notIn` and hit validation errors or target the wrong path.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[47-66]

## What to change
- Either:
 - Update the Field column values to valid CLF FieldPath syntax (e.g., `.kubernetes.annotations."k8s.ovn.org/pod-networks"`), or
 - Add a prominent note above the tables explaining that keys containing dots/slashes must be quoted when used in `prune`/`drop` filters, with one concrete example.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. prune-audit-minimal omits .level 📘 Rule violation ◔ Observability
Description
The new minimal-tier prune allowlists do not preserve .level or Kubernetes metadata fields for
audit logs, and the new field-requirements doc implies only .log_type, .log_source, and
.message are always required. This can produce forwarded log entries missing attributes required
by the compliance policy.
Code

docs/reference/samples/observability.economize-minimal.yaml[R129-132]

+      prune:
+        notIn:
+          - .log_type
+          - .log_source
Relevance

●● Moderate

Touches compliance/required-fields semantics vs “minimal” savings goal; may require product
decision, not just doc tweak.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Compliance ID 208 requires every processed/forwarded log entry to include log_type, log_source,
timestamp, message, level, and kubernetes_metadata. The new docs define the global
always-required fields as only .log_type, .log_source, .message and state other fields are
safe to prune for some outputs, and the new minimal-tier audit prune allowlist omits .level and
any Kubernetes metadata fields, allowing those required attributes to be removed from forwarded
logs.

Rule 208: Include required attributes in every processed log entry
docs/administration/economizing-log-forwarding/output-field-requirements.md[7-12]
docs/administration/economizing-log-forwarding/output-field-requirements.md[112-118]
docs/reference/samples/observability.economize-minimal.yaml[127-144]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
PR adds pruning guidance/config that can result in forwarded log entries missing required attributes (at minimum `level` and Kubernetes metadata), conflicting with the required-attributes compliance rule.

## Issue Context
- `output-field-requirements.md` states CLF always requires only `.log_type`, `.log_source`, `.message`, and multiple output sections say “Safe to prune: All other fields”, which encourages pruning fields required by policy.
- `observability.economize-minimal.yaml` uses `prune.notIn` allowlists for audit logs that omit `.level` and any Kubernetes metadata fields.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/output-field-requirements.md[7-12]
- docs/administration/economizing-log-forwarding/output-field-requirements.md[112-118]
- docs/reference/samples/observability.economize-minimal.yaml[125-155]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

6. Host/OVN pruning contradiction ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
The guide states neither tier targets host/OVN audit logs for pruning, but the minimal tier sample
explicitly routes host audit logs and applies prune-host-audit-minimal to keep only a small
allowlist.
Code

docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[R124-126]

+container entries) and are already compact at ~639 bytes per entry — the
+bulk of which is `.message` (34%) and `.hostname` (7%), both unprunable.
+Neither tier targets them for field-level pruning.
Relevance

●●● Strong

Clear doc/sample inconsistency; prior reviews commonly accept aligning docs with actual YAML
behavior.

PR-#3218

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The prose makes an absolute claim about both tiers, while the minimal tier sample both defines and
applies a host-audit prune filter in its host-audit pipeline.

docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[122-126]
docs/reference/samples/observability.economize-minimal.yaml[145-155]
docs/reference/samples/observability.economize-minimal.yaml[211-217]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The balanced-tier narrative says host/OVN audit logs are not targeted by either tier, but the minimal tier sample config does prune host/OVN audit logs.

## Issue Context
This creates confusion about what the minimal tier actually does and what users should expect to lose for host/OVN audit troubleshooting.

## Fix Focus Areas
- docs/administration/economizing-log-forwarding/economizing-log-forwarding.md[122-126]
- docs/reference/samples/observability.economize-minimal.yaml[145-155]
- docs/reference/samples/observability.economize-minimal.yaml[211-217]

## What to change
- Update the sentence to reflect reality (e.g., balanced doesn’t target them; minimal applies an allowlist), or remove the “neither tier” claim.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context used
⚠️ Tickets: not configured — ticket URL found in PR but could not be fetched — check ticket provider credentials
✅ Compliance rules (platform): 9 rules

Grey Divider

Tip of the day
💡 Did you know, you can reply 'qodo' on any finding to push back, ask questions, or dig deeper

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread docs/reference/samples/observability.economize-minimal.yaml
Comment thread docs/administration/economizing-log-forwarding/methodology.md Outdated
Comment thread docs/administration/economizing-log-forwarding/output-field-requirements.md Outdated
Comment thread docs/administration/economizing-log-forwarding/economizing-log-forwarding.md Outdated
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@openshift-ci

openshift-ci Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: Clee2691
Once this PR has been reviewed and has the lgtm label, please ask for approval from jcantrill. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci

openshift-ci Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

@Clee2691: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants