Skip to content

Add Throwable safety net to CloudWatch Logs sink Uploader#6888

Merged
dlvenable merged 1 commit into
opensearch-project:mainfrom
bagmarnikhil:fix/cwl-sink-uploader-throwable-safety-net
Jun 3, 2026
Merged

Add Throwable safety net to CloudWatch Logs sink Uploader#6888
dlvenable merged 1 commit into
opensearch-project:mainfrom
bagmarnikhil:fix/cwl-sink-uploader-throwable-safety-net

Conversation

@bagmarnikhil

@bagmarnikhil bagmarnikhil commented May 28, 2026

Copy link
Copy Markdown
Contributor

When an unchecked Throwable escaped Uploader.upload(), the executor worker thread terminated silently. The batch's events were never acknowledged, never DLQ'd, and never reflected in any metric — a fatal classpath or runtime issue produced no operator-visible signal beyond a single stderr line from ThreadPoolExecutor. This change makes such failures observable and recoverable: the unhandled-error path now emits a dedicated metric and structured log, accounts the lost events in the existing failure counter, and releases event handles so the source can make forward progress instead of waiting indefinitely for an ack.

Closing the safety gap also required fixing a latent correctness bug that a naive catch-all would have compounded. Success and failure metrics were incremented before the post-loop cleanup ran, so a Throwable escaping after that point would have produced succeeded + failed > total — breaking any percentage-based dashboard or "no events failed" alarm. Without addressing this, the safety net would have traded silent loss for inconsistent metrics.

Description

[Describe what this change achieves]

Issues Resolved

Resolves #6887

Check List

  • [Y ] New functionality includes testing.
  • New functionality has a documentation issue. Please link to it in this PR.
  • New functionality has javadoc added
  • [ Y] Commits are signed with a real name per the DCO

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

When an unchecked Throwable escaped Uploader.upload(), the executor
worker thread terminated silently. The batch's events were never
acknowledged, never DLQ'd, and never reflected in any metric — a fatal
classpath or runtime issue produced no operator-visible signal beyond a
single stderr line from ThreadPoolExecutor. This change makes such
failures observable and recoverable: the unhandled-error path now emits
a dedicated metric and structured log, accounts the lost events in the
existing failure counter, and releases event handles so the source can
make forward progress instead of waiting indefinitely for an ack.

Closing the safety gap also required fixing a latent correctness bug
that a naive catch-all would have compounded. Success and failure
metrics were incremented before the post-loop cleanup ran, so a
Throwable escaping after that point would have produced
succeeded + failed > total — breaking any percentage-based dashboard or
"no events failed" alarm. Without addressing this, the safety net
would have traded silent loss for inconsistent metrics.

Signed-off-by: Nikhil Bagmar <nikhilbagmar73@gmail.com>
@bagmarnikhil bagmarnikhil requested a review from dlvenable May 29, 2026 16:28

@kiran536 kiran536 left a comment

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.

LGTM

@dlvenable dlvenable merged commit 0cebc1a into opensearch-project:main Jun 3, 2026
71 of 72 checks passed
@bagmarnikhil bagmarnikhil deleted the fix/cwl-sink-uploader-throwable-safety-net branch June 3, 2026 19:06
kkondaka pushed a commit to kkondaka/kk-data-prepper-f2 that referenced this pull request Jul 1, 2026
…-project#6888)

When an unchecked Throwable escaped Uploader.upload(), the executor
worker thread terminated silently. The batch's events were never
acknowledged, never DLQ'd, and never reflected in any metric — a fatal
classpath or runtime issue produced no operator-visible signal beyond a
single stderr line from ThreadPoolExecutor. This change makes such
failures observable and recoverable: the unhandled-error path now emits
a dedicated metric and structured log, accounts the lost events in the
existing failure counter, and releases event handles so the source can
make forward progress instead of waiting indefinitely for an ack.

Closing the safety gap also required fixing a latent correctness bug
that a naive catch-all would have compounded. Success and failure
metrics were incremented before the post-loop cleanup ran, so a
Throwable escaping after that point would have produced
succeeded + failed > total — breaking any percentage-based dashboard or
"no events failed" alarm. Without addressing this, the safety net
would have traded silent loss for inconsistent metrics.

Signed-off-by: Nikhil Bagmar <nikhilbagmar73@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] cloudwatch_logs sink: Uploader thread silently terminates on unchecked Throwable

4 participants