fix(graphql): record reused non-JIT resolver errors - #10082
Conversation
Overall package sizeSelf size: 8.64 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.4.0 | 127.33 kB | 447.04 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | dc-polyfill | 0.1.11 | 25.74 kB | 25.74 kB |🤖 This report was automatically generated by heaviest-objects-in-the-universe |
|
✅ All CI checks and tests passed. Datadog automation helped this PR pass. 🎉 All green!🧪 All tests passed 🔄 Datadog retried 1 test - 1 passed on retry 🎯 Code Coverage (details) 🔗 Commit SHA: 754c778 | Docs | View more details | Give us feedback! |
BenchmarksBenchmark execution time: 2026-09-01 09:19:13 Comparing candidate commit 754c778 in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 2300 metrics, 10 unstable metrics.
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #10082 +/- ##
========================================
Coverage 98.62% 98.62%
========================================
Files 996 997 +1
Lines 152043 152260 +217
Branches 13193 12671 -522
========================================
+ Hits 149956 150174 +218
+ Misses 2087 2086 -1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Collapsed non-JIT fields reused the first span without observing later resolver completion, so a sibling rejection left the shared span and resolve hook successful.
Reused collapsed resolver calls share one span, but the prior error tracking entered a new async context and observed every call. GraphQL already normalizes resolver failures, so record errors at that boundary and leave successful reused calls unchanged. Only delayed non-JIT resolve hooks release their field before the execute hook. JIT and execute-only paths retain their existing hook order.
de27cf9 to
754c778
Compare
* fix(graphql): record reused resolver errors Collapsed non-JIT fields reused the first span without observing later resolver completion, so a sibling rejection left the shared span and resolve hook successful. * perf(graphql): move collapsed resolver error tracking off hot path Reused collapsed resolver calls share one span, but the prior error tracking entered a new async context and observed every call. GraphQL already normalizes resolver failures, so record errors at that boundary and leave successful reused calls unchanged. Only delayed non-JIT resolve hooks release their field before the execute hook. JIT and execute-only paths retain their existing hook order.
* fix(graphql): record reused resolver errors Collapsed non-JIT fields reused the first span without observing later resolver completion, so a sibling rejection left the shared span and resolve hook successful. * perf(graphql): move collapsed resolver error tracking off hot path Reused collapsed resolver calls share one span, but the prior error tracking entered a new async context and observed every call. GraphQL already normalizes resolver failures, so record errors at that boundary and leave successful reused calls unchanged. Only delayed non-JIT resolve hooks release their field before the execute hook. JIT and execute-only paths retain their existing hook order.
* fix(graphql): record reused resolver errors Collapsed non-JIT fields reused the first span without observing later resolver completion, so a sibling rejection left the shared span and resolve hook successful. * perf(graphql): move collapsed resolver error tracking off hot path Reused collapsed resolver calls share one span, but the prior error tracking entered a new async context and observed every call. GraphQL already normalizes resolver failures, so record errors at that boundary and leave successful reused calls unchanged. Only delayed non-JIT resolve hooks release their field before the execute hook. JIT and execute-only paths retain their existing hook order.
* fix(graphql): record reused resolver errors Collapsed non-JIT fields reused the first span without observing later resolver completion, so a sibling rejection left the shared span and resolve hook successful. * perf(graphql): move collapsed resolver error tracking off hot path Reused collapsed resolver calls share one span, but the prior error tracking entered a new async context and observed every call. GraphQL already normalizes resolver failures, so record errors at that boundary and leave successful reused calls unchanged. Only delayed non-JIT resolve hooks release their field before the execute hook. JIT and execute-only paths retain their existing hook order.
Collapsed non-JIT fields reuse one span, but a sibling rejection could leave that span and its resolve hook successful.
GraphQL normalizes resolver failures before execution completes. Recording the error at that boundary keeps successful reused calls on the existing collapsed fast path. The first error wins, and a falsy rejection receives a real Error. The resolve hook still runs once before the execute hook.