Skip to content

fix(spring): [Cache Tracing 14] Fix cache hit detection for typed get and fix jcache docs link#5203

Draft
adinauer wants to merge 2 commits intofeat/cache-tracing-instrument-conditional-opsfrom
fix/cache-tracing-typed-get-hit-detection
Draft

fix(spring): [Cache Tracing 14] Fix cache hit detection for typed get and fix jcache docs link#5203
adinauer wants to merge 2 commits intofeat/cache-tracing-instrument-conditional-opsfrom
fix/cache-tracing-typed-get-hit-detection

Conversation

@adinauer
Copy link
Member

@adinauer adinauer commented Mar 18, 2026

PR Stack (Cache Tracing)

  • #5172 — Add SentryCacheWrapper and SentryCacheManagerWrapper
  • #5173 — Add enableCacheTracing option
  • #5174 — Add BeanPostProcessor and auto-configuration
  • #5175 — Add cache tracing e2e sample
  • #5179 — Add SentryJCacheWrapper for JCache (JSR-107)
  • #5182 — Add JCache console sample
  • #5183 — Add cache tracing to all Spring Boot 4 samples
  • #5184 — Add retrieve() overrides for reactive/async cache support
  • #5190 — Port cache tracing to Spring Boot 3 Jakarta + samples
  • #5191 — Port cache tracing to Spring Boot 2 + samples
  • #5192 — Skip cache span data when child span is NoOp
  • #5201 — Add db.operation.name attribute to cache spans
  • #5202 — Instrument putIfAbsent, replace, and getAndReplace
  • #5203 — Fix cache hit detection for typed get and fix jcache docs link
  • #5204 — Use method-specific span operations for cache spans
  • #5205 — Merge startSpan helpers into shared core method
  • #5206 — Move operation attribute to centralized CACHE_OPERATION_KEY constant
  • #5207 — Add cache.write boolean span attribute
  • #5208 — Use comma-joined keys as span description for bulk JCache operations
  • #5209 — Remove _KEY suffix from cache SpanDataConvention constants
  • #5210 — Fix get(key, type) double-call in SentryCacheWrapper
  • #5212 — Fix cache evict system test to match actual span op

📜 Description

Bug fix: SentryCacheWrapper.get(Object key, Class<T> type) incorrectly used result != null to determine cache hit status. Since Spring's Cache.get(key, type) returns null both for cache misses and for cached null values, this caused cached nulls to be incorrectly reported as misses (cache.hit = false).

The fix uses delegate.get(key) (which returns a ValueWrapper) to determine hit/miss, then calls delegate.get(key, type) for the typed return value. Applied to all three Spring variants (spring, spring-jakarta, spring-7).

Docs fix: Updated the jcache README to link to the correct docs path (/platforms/java/integrations/jcache/).

💡 Motivation and Context

Applications that legitimately cache null values would get inaccurate cache hit metrics. The get(Object key) variant already handled this correctly via ValueWrapper — this aligns the typed overload.

💚 How did you test it?

  • Updated existing tests to mock both delegate.get(key) and delegate.get(key, type)
  • Added new test: get with type creates span with cache hit true when cached value is null
  • Added new test: get with type sets error status and throwable on exception
  • All tests pass across sentry-spring, sentry-spring-jakarta, and sentry-spring-7

📝 Checklist

  • I added GH Issue ID & Linear ID
  • I added tests to verify the changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • Review from the native team if needed.
  • No breaking change or entry added to the changelog.
  • No breaking change for hybrid SDKs or communicated to hybrid SDKs.

🔮 Next steps

⚠️ Merge this PR using a merge commit (not squash). Only the collection branch is squash-merged into main.

#skip-changelog

adinauer and others added 2 commits March 18, 2026 05:35
The get(key, type) method incorrectly used result != null to detect
cache hits, failing to distinguish a miss from a cached null value.
Now uses delegate.get(key) to check the ValueWrapper first.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@adinauer adinauer mentioned this pull request Mar 18, 2026
3 tasks
@github-actions
Copy link
Contributor

github-actions bot commented Mar 18, 2026

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


This PR will not appear in the changelog.


🤖 This preview updates automatically when you update the PR.

@sentry
Copy link

sentry bot commented Mar 18, 2026

Sentry Build Distribution

App Name App ID Version Configuration Install Page
SDK Size io.sentry.tests.size 8.34.1 (1) release Install Build

@adinauer
Copy link
Member Author

@sentry review

@adinauer
Copy link
Member Author

cursor review

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

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.

1 participant