Skip to content

Add block-outcome telemetry to Grizzly, Jetty, Liberty, Spring-webmvc, Undertow and Akka-http - #12527

Draft
jandro996 wants to merge 6 commits into
block-telemetry-2bfrom
block-telemetry-3
Draft

jandro996 wants to merge 6 commits into
block-telemetry-2bfrom
block-telemetry-3

Conversation

@jandro996

@jandro996 jandro996 commented Sep 16, 2026

Copy link
Copy Markdown
Member

What Does This Do

Wires block-outcome telemetry (AppSecContext.reportBlockFailure()) into the six remaining
frameworks: Grizzly, Jetty, Liberty, Spring-webmvc, Undertow, and Akka-http. Follows the canonical
pattern already established for Netty (#12316) and Tomcat (#12493): resolve the
BlockResponseFunction, attempt the commit through tryCommitBlockingResponse(...), and on
false (or on exception) report the failure via AppSecContext - resolved through
RequestContext#getData(RequestContextSlot.APPSEC) + an instanceof check, never a direct cast to
AppSecRequestContext.

  • Wires the report check at every tryCommitBlockingResponse call site across:
    grizzly-2.0, grizzly-http-2.3.20, jetty-appsec-{7.0,8.1.3,9.2,9.3,9.4,11.0},
    jetty-server-{7.0,7.6,9.0,9.3,11.0}, liberty-{20.0,23.0}, spring-webmvc-{3.1,6.0},
    undertow-2.0 and akka-http-10.0
  • Adds UnmarshallerHelpersBlockFailureTest (JUnit 5) covering all branches of
    UnmarshallerHelpers.tryBlock: block committed, block failed, no BlockResponseFunction,
    foreign/null AppSec slot
  • Widens UnmarshallerHelpers.tryBlock visibility via @VisibleForTesting instead of a
    package-private comment, matching the existing repo convention

Known gap: several BlockResponseFunction implementations cannot signal a genuine commit failure

  • Undertow, Jetty, Grizzly, Liberty: each framework's BlockResponseFunction implementation
    always returns true after a genuine commit attempt, regardless of whether the commit actually
    succeeded. The only reachable false values are pre-attempt guards (missing reflection handle, no
    active span, wrong request/response type, process-wide init state), never a post-attempt outcome.
    Undertow's async exchange.dispatch(...) path is fire-and-forget, so there is no reachable
    false at all on that path (the real outcome is only logged via log.warn). Practically, the
    reportBlockFailure() branch wired by this PR will rarely or never fire for these four
    frameworks today.
  • Akka-http: AkkaBlockResponseFunction.tryCommitBlockingResponse returning true means the
    RequestBlockingAction was stashed for later use, not that the HTTP response was committed. The
    actual response substitution happens out-of-band via maybeCreateAlternativeResponse(). This
    return value is structurally incapable of signaling a genuine commit failure.

Fixing these underlying implementations is out of scope for this PR - it only wires telemetry on
top of the existing BlockResponseFunction contract and does not change any commit/blocking
behavior. It should be tracked as a separate tech-debt follow-up under APPSEC-62696.

Motivation

Part of APPSEC-62696: block-outcome telemetry, extending the pattern already shipped for Netty and
Tomcat to the remaining instrumented servers.

Additional Notes

  • The near-identical reportBlockFailure() wiring duplicated across the six frameworks is
    intentional: each module has its own BlockResponseFunction, classloader scope and bytecode
    discriminator, so no cross-module helper is introduced by design.
  • Advisory perf review found no merge-blocking findings: the added code is a single instanceof
    check plus a conditional method call on the existing commit-attempt path, not a new hot path.

Contributor Checklist

Jira ticket: APPSEC-62696

Note: Once your PR is ready to merge, add it to the merge queue by commenting /merge. /merge -c cancels the queue request. /merge -f --reason "reason" skips all merge queue checks; please use this judiciously, as some checks do not run at the PR-level. For more information, see this doc.

@jandro996 jandro996 added comp: asm waf Application Security Management (WAF) type: feature Enhancements and improvements tag: no release notes Changes to exclude from release notes labels Sep 16, 2026
@jandro996

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 16, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-17T14:06:48.028581Z 6f02c3d Manual request
🔒 Security Review Completed 2026-09-17T14:07:20.329181Z 6f02c3d Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: ff0f114442

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff0f114442

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@datadog-official

datadog-official Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

🎯 Code Coverage (details)
Patch Coverage: 100.00%
Overall Coverage: 59.08% (-0.01%)

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: fb575f5 | Docs | Give us feedback!

@dd-octo-sts

dd-octo-sts Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

🟢 Java Benchmark SLOs — All performance SLOs passed

Suite Status
Startup 🟢 pass

SLO thresholds are defined here based on automatically generated metrics. A warning is raised when results are within 5% of the threshold.

PR vs. master results
Scenario Candidate master Δ (95% CI of mean)
startup:insecure-bank:iast:Agent 14.00 s 14.04 s [-1.3%; +0.7%] (no difference)
startup:insecure-bank:tracing:Agent 12.93 s 13.01 s [-1.2%; +0.0%] (no difference)
startup:petclinic:appsec:Agent 17.55 s 17.32 s [+0.6%; +2.1%] (maybe worse)
startup:petclinic:iast:Agent 16.83 s 16.88 s [-6.4%; +5.8%] (unstable)
startup:petclinic:profiling:Agent 17.49 s 17.25 s [+0.2%; +2.5%] (maybe worse)
startup:petclinic:sca:Agent 17.59 s 17.39 s [+0.3%; +2.1%] (maybe worse)
startup:petclinic:tracing:Agent 16.58 s 16.71 s [-1.8%; +0.3%] (no difference)

Commit: fb575f54 · CI Pipeline · Benchmarking Platform UI


Load and DaCapo benchmarks can be triggered manually in the GitLab pipeline. Results will appear in the Benchmarking Platform UI after completion.

@jandro996
jandro996 changed the base branch from master to block-telemetry-2b September 17, 2026 09:04
- Wire reportBlockFailure() at every BlockResponseFunction.tryCommitBlockingResponse
  call site across akka-http, grizzly, jetty (appsec + server), liberty, spring-webmvc
  and undertow, resolving AppSecContext via RequestContextSlot.APPSEC instead of
  casting directly to AppSecRequestContext
- Add UnmarshallerHelpersBlockFailureTest covering all branches of
  UnmarshallerHelpers.tryBlock (block committed, block failed, no BRF, foreign/null
  AppSec slot)
- Widen UnmarshallerHelpers.tryBlock visibility via @VisibleForTesting instead of a
  package-private comment
Replace the repeated inline pattern (commit blocking response, then
manually check AppSecContext and call reportBlockFailure() on failure)
with the new BlockResponseFunction.tryCommitBlockingResponse(RequestContext,
Flow.Action.RequestBlockingAction) default overload added in
block-telemetry-2b (#12519). That overload already performs the
AppSecContext lookup and reportBlockFailure() call internally, so call
sites only need to pass the RequestContext instead of the TraceSegment.

Applies to the 37 call sites identified as mechanically substitutable:
akka-http-10.0, grizzly-http-2.3.20, jetty-appsec (7.0, 8.1.3, 9.2, 9.3,
9.4, 11.0), jetty-server (7.0, 7.6), liberty (20.0, 23.0), spring-webmvc
(3.1, 6.0), and undertow-2.0. Excludes GrizzlyBlockingHelper (grizzly-2.0,
manual reflection-based commit) and jetty-server-9.0's
JettyCommitResponseInstrumentation (compound res && _committed.get()
condition, not mechanically equivalent to the new overload's plain
boolean return).
…nd Undertow

- Move Grizzly's post-commit span/listener calls inside the try/catch so
  failures there also trigger reportBlockFailure()
- Add missing !success reportBlockFailure() branch to Jetty's before() in
  9.0.4/9.3/9.4.21/10.0
- Wrap Undertow's tryCommitBlockingResponse calls in FormDataContentHelper to
  catch exceptions swallowed by the advice's suppress=Throwable.class
@jandro996

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 2b99081893

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2b99081893

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…lure reporting to commit errors

- FormDataParserInstrumentation (Undertow): wrap the doParse blocking-commit call
  with FormDataContentHelper.tryCommitBlockingResponse so a synchronous exception
  is still reported as a block failure instead of being swallowed by the advice's
  suppress = Throwable.class.
- GrizzlyBlockingHelper: split post-commit finalization (effectivelyBlocked,
  SpanClosingListener.onAfterService) into its own try/catch so a failure there
  no longer reports block_failure for a response that was already committed
  successfully.
@jandro996

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: f2cbed27d7

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f2cbed27d7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

- Check the boolean return of FormDataContentHelper.tryCommitBlockingResponse
  in Undertow's FormDataParserInstrumentation before throwing BlockingException,
  matching the existing MultiPartUploadHandlerInstrumentation pattern
- Add LibertyBlockingHelper.tryCommitBlockingResponse wrapper in liberty-20.0
  and liberty-23.0 to report block_failure when the commit itself throws
  (mirrors Undertow's FormDataContentHelper contract)
- Route ParsePostDataInstrumentation, ParseParametersInstrumentation and
  GetPartsInstrumentation (both Liberty modules) through the new wrapper and
  check its return value before treating the request as blocked
@jandro996

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6f02c3d270

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 6f02c3d270

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

…aths

- Add SpringBlockingHelper (spring-webmvc-3.1 and spring-webmvc-6.0) wrapping
  BlockResponseFunction#tryCommitBlockingResponse to guarantee reportBlockFailure()
  is invoked even when the commit call throws.
- Route all 6 blocking call sites (HttpMessageConverter read/write,
  RequestMappingInfoHandlerMapping#handleMatch, UriTemplateVariablesHandlerInterceptor#preHandle,
  x2 modules) through the helper and only set/throw BlockingException when the
  commit actually succeeds.
- Fix HttpMessageConverterInstrumentationTest assertions that expected the old,
  unconditional-throw behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp: asm waf Application Security Management (WAF) tag: no release notes Changes to exclude from release notes type: feature Enhancements and improvements

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant