Skip to content

feat: Tulip LTS May 2026 β€” upgrade to v0.150.0#35

Merged
perebaj merged 12 commits into
mainfrom
tulip-lts-may-2026
May 6, 2026
Merged

feat: Tulip LTS May 2026 β€” upgrade to v0.150.0#35
perebaj merged 12 commits into
mainfrom
tulip-lts-may-2026

Conversation

@perebaj

@perebaj perebaj commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Tulip LTS May 2026

This PR prepares the Tulip LTS (Long-Term Support) release by upgrading all components to v0.151.0 and making targeted component changes to ensure production stability.

What is an LTS?

The upstream OpenTelemetry Collector ships new releases every ~2 weeks. The Tulip LTS provides a curated, validated baseline with extended support β€” giving production environments a stable target without upgrade fatigue.

Changes

Version bump

All components upgraded from v0.145.0 β†’ v0.151.0, verified against the official otelcol-contrib manifest.

  • Core components: v0.151.0
  • Core providers: v1.57.0

Component changes

Removed: batchprocessor

  • Formally deprecated upstream (PR #15046)
  • Known data loss bug (#12443) β€” silently drops data when downstream exporters reject without queue/retry
  • Replaced with exporter-level sending_queue + batch configuration, which provides durable queuing, crash recovery, and retry with backoff

Removed: memorylimiterprocessor

  • Being replaced upstream by memorylimiterextension
  • Not suitable for an LTS release since the processor variant is on a deprecation path

Removed: healthcheckextension

  • The healthcheck extension v1 and v2 share code via a feature flag (#42256)
  • Including v1 would indirectly support v2, which is not the objective for an LTS release where component behavior must be fully predictable

Added: redactionprocessor

  • Redacts sensitive data from telemetry attributes before export
  • Essential for enterprise environments with data privacy requirements (PII, HIPAA, GDPR)

Added: filestorage extension

  • Persistent file-based storage for durable state across collector restarts (e.g., exporter sending queues, receiver checkpoints)

Added: hostmetricsreceiver

  • Collects host-level metrics (CPU, memory, disk, network, filesystem, processes)
  • Essential for infrastructure monitoring use cases

Added: filelogreceiver

  • Reads and parses log data from files on the host
  • Enables log collection pipelines for application, system, and container logs

Configuration updates

The default config.yaml now includes:

  • Exporter-level sending_queue for durable queuing
  • Exporter-level batch for efficient batching at the export stage
  • retry_on_failure with exponential backoff on all network exporters
  • Removed memory_limiter processor and health_check extension references

Bug fix

  • Fixed bash 3.2 compatibility in test/generate-trace.sh (&>> β†’ >> file 2>&1)

Final component manifest (28 components)

Category Count Components
Extensions 7 zpages, pprof, basicauth, bearertokenauth, oauth2clientauth, oidcauth, filestorage
Receivers 4 otlp, nop, hostmetrics, filelog
Exporters 5 debug, nop, otlp, otlphttp, file
Processors 7 attributes, resource, span, probabilisticsampler, filter, transform, redaction
Connectors 1 forward
Providers 3 env, file, yaml

Documentation

Full upgrade plan with migration guide available at docs/tulip-lts-may2026-upgrade-plan.md.

Validation

  • make generate-sources β€” PASS
  • make build β€” PASS (Tulip v0.151.0 compiles with all 28 components)
  • make test β€” PASS (collector starts, traces generated and verified)

Summary by CodeRabbit

  • New Features

    • Exporters gain buffered sending, exporter-level batching, and retry/backoff controls
    • Added filestorage extension, host metrics and file log receivers, and a redaction processor
  • Documentation

    • Added Tulip LTS May 2026 upgrade plan with migration guidance and final component manifest
  • Chores

    • Upgraded Tulip distribution and component pins to v0.151.0; removed pipeline-level batch processor
    • Replaced health-check extension with pprof as the enabled extension
  • Tests

    • Adjusted trace generation script log redirection form
  • Bug Fixes

    • Startup readiness now detects service readiness from startup logs rather than health endpoint

- Bump all components from v0.145.0 to v0.150.0
- Remove deprecated batchprocessor, replace with exporter-level batching
- Add memorylimiterprocessor for OOM protection
- Update default config with sending_queue, batch, and retry_on_failure
- Add LTS upgrade plan documentation
- Fix bash 3.2 compatibility in test script
@coderabbitai

coderabbitai Bot commented Apr 28, 2026

Copy link
Copy Markdown
πŸ“ Walkthrough

Walkthrough

Bumps Tulip to v0.151.0, removes the batchprocessor, replaces health_check with pprof, moves batching/retry/sending_queue into otlp and otlphttp exporters, adds an LTS upgrade plan and README updates, and tweaks test scripts/log readiness checks.

Changes

Tulip LTS / Distribution Upgrade

Layer / File(s) Summary
Manifest / Version pins
distributions/tulip/manifest.yaml
Bumps Tulip manifest to 0.151.0; updates component pins to v0.151.0; removes batchprocessor and adds migration guidance to use exporter-level sending_queue/batch/retry_on_failure.
Configuration: extensions & service
distributions/tulip/config.yaml, distributions/tulip/tulip-test.yaml, distributions/tulip/tulip-test-docker.yaml
Drops health_check extension and enables only pprof in service extensions; removes health_check endpoint block in docker config.
Configuration: exporters (sending_queue / batch / retry)
distributions/tulip/config.yaml
Adds exporter-level sending_queue (enabled, queue_size), batch (e.g., flush_timeout, min_size), and retry_on_failure (enabled, initial_interval, max_interval, max_elapsed_time) to both otlp and otlphttp exporters.
Pipelines
distributions/tulip/config.yaml
service.pipelines.traces keeps receivers: [ otlp ] and sets processors to an explicit empty list [] (no memory_limiter or batchprocessor).
Documentation / Migration guidance
docs/tulip-lts-may2026-upgrade-plan.md, README.md
Adds β€œTulip LTS May 2026 β€” Upgrade Plan” documenting v0.151.0 and component changes (removal of batchprocessor, removal of healthcheckextension, additions of filestorage, hostmetricsreceiver, filelogreceiver, redactionprocessor); updates README Included Components table accordingly.
Test scripts / tooling
test/generate-trace.sh, test/start-otelcol.sh
Changes trace generator log redirection from &>> logfile to >> logfile 2>&1; replaces health-check-based readiness probe with a log-based readiness check that looks for "Everything is ready".

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

πŸ‡ I hopped through manifests late at night,

swapped healthchecks for pprof's quiet light,
exporters learned to queue, batch, and retry,
docs and README watched the changes fly,
a tiny hop β€” Tulip's config feels just right.

πŸš₯ Pre-merge checks | βœ… 5
βœ… Passed checks (5 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed The PR title follows Conventional Commits format with 'feat:' prefix and clearly describes the main change: upgrading Tulip LTS to a new version.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
πŸ“ Generate docstrings
  • Create stacked PR
  • Commit on current branch
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tulip-lts-may-2026

Tip

πŸ’¬ Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire orgβ€”no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-inβ€”scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

πŸ‘‰ Get started


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

@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

🧹 Nitpick comments (2)
docs/tulip-lts-may2026-upgrade-plan.md (1)

87-93: Consider adding memory_limiter to the "After" example for consistency.

The "After" example shows processors: [], but the actual config.yaml implementation uses processors: [memory_limiter]. Since the documentation later states that "memory_limiter should be the first processor in every pipeline" (line 127), including it here would provide a more complete migration example.

πŸ“ Suggested update
 service:
   pipelines:
     traces:
       receivers: [otlp]
-      processors: []
+      processors: [memory_limiter]
       exporters: [otlp]
πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/tulip-lts-may2026-upgrade-plan.md` around lines 87 - 93, Update the
"After" example so the traces pipeline lists the memory_limiter processor
(change processors: [] to processors: [memory_limiter]) to match the actual
config and the guidance that "memory_limiter should be the first processor in
every pipeline"; locate the example under service -> pipelines -> traces in the
doc and ensure memory_limiter is included in that processors array.
test/generate-trace.sh (1)

15-15: Quote the variable to prevent word splitting and globbing.

The ${distribution} variable should be quoted. If the distribution name contains spaces or glob characters, this could cause unexpected behavior or file path issues.

πŸ›‘οΈ Proposed fix
-tracegen -otlp-endpoint localhost:4317 -otlp-insecure -service e2e-test >> ./test/logs/tracegen-${distribution}.log 2>&1
+tracegen -otlp-endpoint localhost:4317 -otlp-insecure -service e2e-test >> "./test/logs/tracegen-${distribution}.log" 2>&1
πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/generate-trace.sh` at line 15, The redirection filename uses an unquoted
shell variable which can cause word splitting/globbing for names with spaces or
wildcards; update the trace generation command (the tracegen invocation that
writes to ./test/logs/tracegen-${distribution}.log) to quote the ${distribution}
variable in the output filename so the shell treats it as a single word and
prevents glob expansion.
πŸ€– Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@distributions/tulip/config.yaml`:
- Around line 20-30: The config is missing the file_storage extension and the
sending_queue.storage references so queues remain in-memory; add an extensions
block defining file_storage (e.g., file_storage.directory:
/var/lib/otelcol/queue), add file_storage to service.extensions, and update both
exporter blocks (exporters.otlp.sending_queue and
exporters.otlphttp.sending_queue) to include storage: file_storage so durable
queuing is enabled; ensure existing sending_queue, batch, and retry_on_failure
settings are preserved.

---

Nitpick comments:
In `@docs/tulip-lts-may2026-upgrade-plan.md`:
- Around line 87-93: Update the "After" example so the traces pipeline lists the
memory_limiter processor (change processors: [] to processors: [memory_limiter])
to match the actual config and the guidance that "memory_limiter should be the
first processor in every pipeline"; locate the example under service ->
pipelines -> traces in the doc and ensure memory_limiter is included in that
processors array.

In `@test/generate-trace.sh`:
- Line 15: The redirection filename uses an unquoted shell variable which can
cause word splitting/globbing for names with spaces or wildcards; update the
trace generation command (the tracegen invocation that writes to
./test/logs/tracegen-${distribution}.log) to quote the ${distribution} variable
in the output filename so the shell treats it as a single word and prevents glob
expansion.
πŸͺ„ Autofix (Beta)

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: Repository: ollygarden/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 859ce0d5-2e2b-4643-b1a0-9907a2646e61

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 8955a8a and 5c606f0.

πŸ“’ Files selected for processing (4)
  • distributions/tulip/config.yaml
  • distributions/tulip/manifest.yaml
  • docs/tulip-lts-may2026-upgrade-plan.md
  • test/generate-trace.sh

Comment thread distributions/tulip/config.yaml
@perebaj perebaj self-assigned this Apr 28, 2026
@perebaj perebaj added the enhancement New feature or request label Apr 28, 2026

@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: 2

πŸ€– 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/tulip-lts-may2026-upgrade-plan.md`:
- Around line 87-93: Update the "After" pipeline example so
service.pipelines.traces.processors is not an empty array but includes
memory_limiter as the first processor to align with the document guidance;
specifically, ensure the pipelines.traces processors list begins with the
memory_limiter processor (refer to the memory_limiter processor name and the
service.pipelines.traces.processors array in the example) so the example matches
the stated production-safe default.
- Around line 40-45: Update the paragraph about exporter-level batching to
clarify that durable persistence and disk recovery are not automatic: explicitly
state that the sending_queue only persists to disk and recovers after a
Collector restart when the exporter's storage configuration is enabled and
pointed to persistent storage (i.e., the exporter-level "sending_queue" must be
configured with the appropriate "storage" settings); adjust the phrases "durably
enqueued in the persistent sending queue", "written to disk", and "recovered
after a Collector restart" to indicate they apply only when storage is
configured, and suggest operators verify exporter "sending_queue" + "storage"
settings when choosing this approach.
πŸͺ„ Autofix (Beta)

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: Repository: ollygarden/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 200de0f3-5435-400f-bf7a-ae5e1cb1ce78

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 5c606f0 and ec69282.

πŸ“’ Files selected for processing (1)
  • docs/tulip-lts-may2026-upgrade-plan.md

Comment thread docs/tulip-lts-may2026-upgrade-plan.md
Comment thread docs/tulip-lts-may2026-upgrade-plan.md
@perebaj

perebaj commented May 6, 2026

Copy link
Copy Markdown
Contributor Author

we do not have the intention to support processor/memory_limiter because it will be replaced by this component here

We will also remove the healthcheck extension v1 because v2 and v1 share code between them using a feature flag. Reference. In this case, we will indirectly support v2, which is not our objective for an LTS version of Tulip.

New components that we gonna support

  • processor/redaction
  • extension/filestorage
  • receivers/hostmetrics and receiver/filelog

perebaj added 4 commits May 6, 2026 10:36
Signed-off-by: perebaj <perebaj@gmail.com>
Signed-off-by: perebaj <perebaj@gmail.com>
Signed-off-by: perebaj <perebaj@gmail.com>

@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/tulip-lts-may2026-upgrade-plan.md`:
- Line 134: The heading "## Final LTS Component Manifest (28 components)" is
incorrect; update it to reflect the actual count of 27 components by changing
the text to "## Final LTS Component Manifest (27 components)"; verify the change
by cross-checking the tables that sum to 27 (7+4+5+7+1+3) and ensure no other
headings or references still say 28.
πŸͺ„ Autofix (Beta)

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: Repository: ollygarden/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 17daef7c-35b6-437f-8d2a-75789b98c3d5

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between ec69282 and a1ed998.

πŸ“’ Files selected for processing (4)
  • README.md
  • distributions/tulip/config.yaml
  • distributions/tulip/manifest.yaml
  • docs/tulip-lts-may2026-upgrade-plan.md

Comment thread docs/tulip-lts-may2026-upgrade-plan.md Outdated
Signed-off-by: perebaj <perebaj@gmail.com>

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/start-otelcol.sh (1)

39-44: ⚠️ Potential issue | 🟑 Minor | ⚑ Quick win

Update retry/failure log text to match the new readiness strategy.

Line 39 and Line 43 still refer to β€œServer unavailable/up,” but this loop now waits for a log readiness marker. This can mislead CI debugging.

Suggested wording tweak
-    echo "Server still unavailable" >> ./test/logs/test-${distribution}.log
+    echo "Collector not ready yet (waiting for startup log marker)" >> ./test/logs/test-${distribution}.log

...
-        echo "❌ FAIL. Server wasn't up after about 5s."
+        echo "❌ FAIL. Collector did not report readiness after about 5s."
πŸ€– 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 `@test/start-otelcol.sh` around lines 39 - 44, Update the retry/failure
messages to reflect the new readiness-by-log-marker strategy: replace the
"Server still unavailable" append into ./test/logs/test-${distribution}.log with
a message like "Readiness marker not found" (or similar), and change the failure
echo that currently says "❌ FAIL. Server wasn't up after about 5s." to "❌ FAIL.
Readiness marker not found after about 5s." so the output and log use the
readiness-marker terminology; modify the lines that perform the echo to ensure
they reference retries, max_retries and the distribution variable unchanged.
♻️ Duplicate comments (1)
docs/tulip-lts-may2026-upgrade-plan.md (1)

40-45: ⚠️ Potential issue | 🟠 Major | ⚑ Quick win

Clarify that sending_queue durability requires explicit storage wiring.

Line 42 and Line 44 describe durability/restart recovery as inherent, but the "After" example (Line 71 onward) does not configure exporter sending_queue.storage or service.extensions storage extension. As written, this can be read as crash-safe by default.

Suggested doc fix
-**Replacement:** Exporter-level batching via `sending_queue` + `batch` configuration on each exporter. This is the officially recommended path and provides stronger delivery guarantees because:
+**Replacement:** Exporter-level batching via `sending_queue` + `batch` configuration on each exporter. This is the officially recommended path and provides stronger delivery guarantees (with persistent queue storage configured) because:

-- Data is durably enqueued in the exporter's persistent sending queue before acknowledgment
+- Data is enqueued in the exporter's sending queue before send attempts
 - Batching and queueing are consolidated within the exporter
-- Data can be written to disk and recovered after a Collector restart
+- With `sending_queue.storage` configured to a persistent storage extension, data is written to disk and recovered after a Collector restart
 - No silent data loss β€” failed sends are retried with backoff
+extensions:
+  file_storage:
+    directory: /var/lib/otelcol/storage
+
 exporters:
   otlp:
     endpoint: otlp.example.com:4317
     sending_queue:
       enabled: true
+      storage: file_storage
       queue_size: 1000
@@
 service:
+  extensions: [file_storage]
   pipelines:
     traces:
       receivers: [otlp]
       processors: []
       exporters: [otlp]
For OpenTelemetry Collector v0.151.0, does exporter `sending_queue` persist across restarts by default, and what exact config is required to enable disk-backed persistence and restart recovery?

Also applies to: 71-93

πŸ€– 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/tulip-lts-may2026-upgrade-plan.md` around lines 40 - 45, The docs imply
exporter sending_queue is durable across restarts by default; update the text
and examples to state that disk-backed persistence is not automatic and must be
explicitly wired: add a storage extension entry under service.extensions (e.g.,
"storage") and set each exporter's sending_queue.storage to that extension id,
and update the "After" example (and lines 71–93) to include a concrete storage
extension config and sending_queue.storage reference so readers know how to
enable disk-backed restart recovery for sending_queue and batch.
πŸ€– 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.

Outside diff comments:
In `@test/start-otelcol.sh`:
- Around line 39-44: Update the retry/failure messages to reflect the new
readiness-by-log-marker strategy: replace the "Server still unavailable" append
into ./test/logs/test-${distribution}.log with a message like "Readiness marker
not found" (or similar), and change the failure echo that currently says "❌
FAIL. Server wasn't up after about 5s." to "❌ FAIL. Readiness marker not found
after about 5s." so the output and log use the readiness-marker terminology;
modify the lines that perform the echo to ensure they reference retries,
max_retries and the distribution variable unchanged.

---

Duplicate comments:
In `@docs/tulip-lts-may2026-upgrade-plan.md`:
- Around line 40-45: The docs imply exporter sending_queue is durable across
restarts by default; update the text and examples to state that disk-backed
persistence is not automatic and must be explicitly wired: add a storage
extension entry under service.extensions (e.g., "storage") and set each
exporter's sending_queue.storage to that extension id, and update the "After"
example (and lines 71–93) to include a concrete storage extension config and
sending_queue.storage reference so readers know how to enable disk-backed
restart recovery for sending_queue and batch.

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: Repository: ollygarden/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 821ee7b5-ca3e-40e6-971d-ea6d73878f9e

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between a1ed998 and 0b27cbd.

πŸ“’ Files selected for processing (4)
  • distributions/tulip/tulip-test-docker.yaml
  • distributions/tulip/tulip-test.yaml
  • docs/tulip-lts-may2026-upgrade-plan.md
  • test/start-otelcol.sh
βœ… Files skipped from review due to trivial changes (1)
  • distributions/tulip/tulip-test-docker.yaml

@perebaj perebaj merged commit 5e69634 into main May 6, 2026
2 checks passed
@perebaj perebaj deleted the tulip-lts-may-2026 branch May 6, 2026 22:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant