{"id":12637,"date":"2020-05-26T14:21:03","date_gmt":"2020-05-26T14:21:03","guid":{"rendered":"https:\/\/www.dotcom-monitor.com\/blog\/?p=12637"},"modified":"2026-09-27T20:23:35","modified_gmt":"2026-09-27T20:23:35","slug":"stack-trace-monitoring-gaps-in-measuring-the-user-experience","status":"publish","type":"post","link":"https:\/\/www.dotcom-monitor.com\/blog\/stack-trace-monitoring-gaps-in-measuring-the-user-experience\/","title":{"rendered":"Stack Trace Monitoring: Gaps in User Experience"},"content":{"rendered":"
<\/p>\n
A shopper in Frankfurt clicks Pay and watches a spinner for ten seconds before giving up. Your APM dashboard stays green the whole time. No exception fired, no stack trace was captured, because nothing in your code failed. The payment provider’s script hung, the page never finished rendering, and the order walked. Your backend never even saw the final checkout request, so there is no failed transaction to inspect: from the application’s point of view, nothing happened. From the user’s point of view, the only step that mattered failed.<\/p>\n
That is the blind spot this article is about. Stack trace monitoring is genuinely good at what it does: when your code throws, it hands developers the file, the line, and the chain of calls that led there. The problem is what it structurally cannot see. A whole class of user-facing failures happens before a request reaches your code, after your response leaves it, or without any error firing at all.<\/p>\n
Here is what stack trace monitoring catches well, the five gaps it leaves in measuring the user experience, and how synthetic real-browser monitoring covers the territory it cannot.<\/p>\n
A stack trace is a snapshot of the call stack at the moment an error occurs: which functions were executing, in which files, at which line numbers, and in what order they were called. If you have ever seen a console error listing a cascade of methods and file paths, you have read one.<\/p>\n
Stack trace monitoring, as practiced by application performance monitoring (APM)<\/a> tools, captures these traces automatically, groups them, and tracks how often each exception recurs. When a NullPointerException starts firing in the checkout service, the APM platform tells developers exactly where to look and how widespread the problem is. Exceptions that would otherwise vanish into a log file become ranked, trended, assignable work.<\/p>\n Notice the trigger condition, because everything else in this article follows from it: a stack trace exists only when code executes and raises an error. Both halves of that condition matter. If your code never runs, or runs without throwing, there is no trace, no matter what the user just experienced.<\/p>\n A practical way to hold that in your head: code ran and threw, you get a trace. Code ran slowly without throwing, no trace. The browser failed before reaching your code, no trace. Something outside your code blocked the journey after your response left, no trace. One state in four produces evidence, and users live in all four.<\/p>\n None of what follows is an argument against APM. For failures that originate in your code, stack traces are the fastest route from symptom to fix:<\/p>\n Keep your APM tool. The question is not whether stack traces are useful. It is whether they describe what your users are experiencing. They do not, and the gaps fall into five distinct categories.<\/p>\n These five gaps are not random blind spots. They are boundary problems: borrowed code, pre-application infrastructure, browser execution, geography, and time. Stack traces are strong inside the application boundary and weak everywhere the user journey crosses out of it.<\/p>\n A typical page today pulls in payment widgets, tag managers, chat, analytics, and ad scripts from other companies’ servers. When one of those dependencies hangs or slows, the page stalls for the user, but the failing code is not yours, so your instrumentation raises nothing. There is often no explicit exception anywhere: the third-party endpoint responds, just slowly enough to block rendering. Third-party content<\/a> is the classic case where users suffer while every internal dashboard stays green.<\/p>\n Before a request ever reaches your application, it must resolve your domain, negotiate a TLS handshake, and often pass through a CDN edge. A misconfigured DNS record, an expired certificate, or a failing edge node stops users at the front door. Your code never executes for those visitors, which means the failure cannot generate a stack trace by definition. From inside your infrastructure, the most visible symptom is silence: traffic dips, and nothing explains why. The DNS, TCP, TLS, and HTTP layers<\/a> each fail in ways only an outside-in check can observe.<\/p>\n Server-side APM confirms your backend returned a valid response in good time. It says nothing about what the browser did with it. A JavaScript bundle that breaks in one browser version, a layout that collapses on mobile, a button whose click handler never binds: each leaves users staring at a broken page while the server logs a clean 200. Client-side exceptions can be collected separately, but slow rendering, layout shifts, and unresponsive controls mostly do not throw. They just quietly lose users. A hydration failure in a Next.js app is the modern classic: the server sends a perfect 200 with fully formed HTML, the client-side JavaScript fails, and users get a page that looks right and does nothing. The event worth monitoring is not whether JavaScript threw but whether the milestone completed: button clickable, form submitted, confirmation shown. Stack traces record exceptions; users experience missing milestones.<\/p>\n Your instrumentation lives inside your infrastructure and reports aggregates. If a carrier route degrades between one region and your servers, or a CDN point of presence starts failing in one geography, users there face timeouts while your averages barely move. A stack trace has no concept of where the user was; it only knows which code was executing. Regional failures are invisible by construction to a code-centric view.<\/p>\n The subtlest gap: performance decay never throws. A page that drifts from two seconds to eight seconds generates zero errors while steadily driving users away. It is usually marketing that notices first, in a sagging funnel metric, long before an engineer’s pager goes off, because from the code’s perspective nothing is broken. Stack trace monitoring is also reactive by design, since it reports after an error has already occurred, and its output reads only to people who know the codebase. A stack trace itself tracks no response times, no page load speeds, no user-facing performance metric at all. An application can be slow enough to be unusable and, from a stack trace perspective, perfectly healthy.<\/p>\nWhat Stack Trace Monitoring Catches Well<\/h2>\n
\n
The Gaps: What Stack Traces Miss About the User Experience<\/h2>\n

Third-Party Scripts and External APIs<\/h3>\n
DNS, TLS, and CDN Failures<\/h3>\n
Frontend Rendering and UI Failures<\/h3>\n
Regional Outages<\/h3>\n
Slow Is Not an Exception<\/h3>\n