<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rachit</title>
    <description>The latest articles on DEV Community by Rachit (@rachitkohli).</description>
    <link>https://dev.to/rachitkohli</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4218148%2F5520f308-295f-4458-8918-7873c4925383.jpg</url>
      <title>DEV Community: Rachit</title>
      <link>https://dev.to/rachitkohli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rachitkohli"/>
    <language>en</language>
    <item>
      <title>Your Dashboard Is Lying to You: When Every Component Is Healthy, but the System Is Already Falling Behind</title>
      <dc:creator>Rachit</dc:creator>
      <pubDate>Sat, 31 Oct 2026 02:33:00 +0000</pubDate>
      <link>https://dev.to/rachitkohli/your-dashboard-is-lying-to-you-when-every-component-is-healthy-but-the-system-is-already-falling-1g78</link>
      <guid>https://dev.to/rachitkohli/your-dashboard-is-lying-to-you-when-every-component-is-healthy-but-the-system-is-already-falling-1g78</guid>
      <description>&lt;p&gt;Imagine you're monitoring a real-time operational dashboard.&lt;/p&gt;

&lt;p&gt;All your services are running.&lt;/p&gt;

&lt;p&gt;Your WebSocket connection is active. Your backend health checks are green. No exceptions are being reported. CPU and memory utilization look perfectly reasonable.&lt;/p&gt;

&lt;p&gt;Everything appears healthy.&lt;/p&gt;

&lt;p&gt;But there is one problem.&lt;/p&gt;

&lt;p&gt;The information on your screen is eight seconds old.&lt;/p&gt;

&lt;p&gt;A device has already changed its state. An operation has completed. An alert has been generated. Yet your dashboard is still showing what happened several seconds ago.&lt;/p&gt;

&lt;p&gt;Would you call this a healthy system?&lt;/p&gt;

&lt;p&gt;I wouldn't.&lt;/p&gt;

&lt;p&gt;And I think this is an interesting problem worth exploring in real-time application engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The difference between system health and information freshness
&lt;/h2&gt;

&lt;p&gt;Most applications have mechanisms to establish whether their components are functioning.&lt;/p&gt;

&lt;p&gt;We monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service availability&lt;/li&gt;
&lt;li&gt;CPU and memory utilization&lt;/li&gt;
&lt;li&gt;Network connectivity&lt;/li&gt;
&lt;li&gt;Message processing failures&lt;/li&gt;
&lt;li&gt;API response times&lt;/li&gt;
&lt;li&gt;Database availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are important measurements. But they don't necessarily tell us whether the information presented to the end user is current.&lt;/p&gt;

&lt;p&gt;Consider a fictional dashboard monitoring 1,000 devices.&lt;/p&gt;

&lt;p&gt;The backend receives status updates and forwards them through a WebSocket connection to the frontend.&lt;/p&gt;

&lt;p&gt;The connection remains active. Messages continue flowing. The frontend processes messages without errors.&lt;/p&gt;

&lt;p&gt;However, the rendering workload gradually increases. Updates begin accumulating in the application.&lt;/p&gt;

&lt;p&gt;Nothing is technically broken.&lt;/p&gt;

&lt;p&gt;But the operator is increasingly looking at the past instead of the present.&lt;/p&gt;

&lt;p&gt;This is where I think we need to distinguish component health from information freshness.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Follow one event through the system
&lt;/h2&gt;

&lt;p&gt;Let's simplify the architecture.&lt;/p&gt;

&lt;p&gt;A device generates an event. The event travels through a backend service, gets delivered over a WebSocket connection, and eventually updates the UI.&lt;/p&gt;

&lt;p&gt;The journey looks something like this:&lt;/p&gt;

&lt;p&gt;Device → Event Producer → Message Broker → Backend Consumer → WebSocket → Frontend → UI&lt;/p&gt;

&lt;p&gt;Every stage can introduce delay.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The producer may generate events faster than they can be consumed.&lt;/li&gt;
&lt;li&gt;The broker may accumulate messages.&lt;/li&gt;
&lt;li&gt;The consumer may be busy processing previous events.&lt;/li&gt;
&lt;li&gt;The network may introduce variable latency.&lt;/li&gt;
&lt;li&gt;The frontend may receive events faster than it can process them.&lt;/li&gt;
&lt;li&gt;The UI thread may be busy rendering other components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, each component might appear healthy.&lt;/p&gt;

&lt;p&gt;Collectively, however, they can create an increasingly stale view of the system.&lt;/p&gt;

&lt;p&gt;The important question isn't simply whether an event was delivered.&lt;/p&gt;

&lt;p&gt;It's how long it took for that event to become visible to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What if we measured information age?
&lt;/h2&gt;

&lt;p&gt;Here's a simple idea.&lt;/p&gt;

&lt;p&gt;For every event, capture its generation timestamp.&lt;/p&gt;

&lt;p&gt;When the information is displayed, compare that timestamp with the current time.&lt;/p&gt;

&lt;p&gt;Information Age = Display Time - Event Generation Time&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Display time&lt;/th&gt;
&lt;th&gt;Information age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device A&lt;/td&gt;
&lt;td&gt;10:00:00&lt;/td&gt;
&lt;td&gt;0 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device B&lt;/td&gt;
&lt;td&gt;10:00:03&lt;/td&gt;
&lt;td&gt;3 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device C&lt;/td&gt;
&lt;td&gt;10:00:08&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are illustrative values.&lt;/p&gt;

&lt;p&gt;A dashboard could use this measurement to identify information that is falling behind, even when its underlying connections remain active.&lt;/p&gt;

&lt;p&gt;We could also explore a concept I call &lt;strong&gt;Freshness Debt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Freshness Debt represents the accumulated age of information that has not yet been brought up to date.&lt;/p&gt;

&lt;p&gt;For a simplified experiment, we could calculate:&lt;/p&gt;

&lt;p&gt;Freshness Debt = Sum of the information age of all monitored devices.&lt;/p&gt;

&lt;p&gt;For 1,000 devices, this provides a way to examine whether the overall dashboard is becoming less current.&lt;/p&gt;

&lt;p&gt;This is a proposed engineering measurement, not a standardized metric. It would need to be evaluated against other measurements such as maximum information age, percentile latency, and the proportion of stale devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Should we process every incoming event?
&lt;/h2&gt;

&lt;p&gt;Now comes the interesting engineering trade-off.&lt;/p&gt;

&lt;p&gt;Suppose a device sends 50 status updates within a second.&lt;/p&gt;

&lt;p&gt;Does the dashboard need to render all 50 updates?&lt;/p&gt;

&lt;p&gt;The answer depends on what those events represent.&lt;/p&gt;

&lt;p&gt;If the events represent financial transactions, commands, or safety-critical transitions, dropping intermediate events may be unacceptable.&lt;/p&gt;

&lt;p&gt;But if they represent frequent updates to a device's current position or temperature, displaying every intermediate value may not provide much additional value.&lt;/p&gt;

&lt;p&gt;There are several approaches worth comparing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approach A: Process every event&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every event is delivered and processed individually.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preserves intermediate updates.&lt;/li&gt;
&lt;li&gt;Useful when every event matters.&lt;/li&gt;
&lt;li&gt;Straightforward event semantics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can create excessive UI work.&lt;/li&gt;
&lt;li&gt;Can increase rendering pressure.&lt;/li&gt;
&lt;li&gt;May cause pending work to accumulate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Approach B: Coalesce updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of processing every pending update for a device, retain its latest state.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Device A: 10 → 12 → 15 → 18&lt;/p&gt;

&lt;p&gt;If the UI only needs the latest device state, it may be sufficient to display 18.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces redundant UI work.&lt;/li&gt;
&lt;li&gt;Helps keep the display current.&lt;/li&gt;
&lt;li&gt;Useful for rapidly changing state information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intermediate transitions are lost from the displayed state.&lt;/li&gt;
&lt;li&gt;Not appropriate when every event has business significance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Approach C: Use bounded queues&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Limit how much pending work the application can accumulate.&lt;/p&gt;

&lt;p&gt;When the queue reaches capacity, define an explicit overload policy.&lt;/p&gt;

&lt;p&gt;Depending on the application, that could mean applying backpressure, rejecting new work, dropping selected updates, or replacing older pending state updates.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provides a memory and workload boundary.&lt;/li&gt;
&lt;li&gt;Makes overload behavior explicit.&lt;/li&gt;
&lt;li&gt;Helps prevent unbounded accumulation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires careful queue sizing and overload handling.&lt;/li&gt;
&lt;li&gt;Poor policies can cause data loss or delayed processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these approaches is universally correct.&lt;/p&gt;

&lt;p&gt;The important part is understanding whether the application needs every event, every state transition, or simply the latest known state.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How would I test this?
&lt;/h2&gt;

&lt;p&gt;I'd build a small simulation rather than immediately changing a production application.&lt;/p&gt;

&lt;p&gt;The experiment could contain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A synthetic event generator producing updates for 1,000 fictional devices.&lt;/li&gt;
&lt;li&gt;A backend consumer receiving and processing those events.&lt;/li&gt;
&lt;li&gt;A WebSocket connection delivering updates to a browser.&lt;/li&gt;
&lt;li&gt;A frontend dashboard displaying device status and information age.&lt;/li&gt;
&lt;li&gt;A configurable processing delay to simulate a busy UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then I'd compare three configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct event processing.&lt;/li&gt;
&lt;li&gt;Batched or coalesced updates.&lt;/li&gt;
&lt;li&gt;Bounded queues with an explicit overload policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event generation rate.&lt;/li&gt;
&lt;li&gt;Event processing rate.&lt;/li&gt;
&lt;li&gt;Queue depth.&lt;/li&gt;
&lt;li&gt;End-to-end information age.&lt;/li&gt;
&lt;li&gt;Median and 95th-percentile information age.&lt;/li&gt;
&lt;li&gt;Maximum information age.&lt;/li&gt;
&lt;li&gt;Percentage of devices displaying stale information.&lt;/li&gt;
&lt;li&gt;CPU and memory consumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd deliberately increase the incoming event rate until the application struggles.&lt;/p&gt;

&lt;p&gt;The objective wouldn't simply be to find the fastest implementation.&lt;/p&gt;

&lt;p&gt;It would be to understand which approach keeps the displayed information useful under increasing load.&lt;/p&gt;

&lt;p&gt;These are proposed experiments, not measured results. The interesting findings should come from running them.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A different way to think about real-time application health
&lt;/h2&gt;

&lt;p&gt;Perhaps we should stop asking only:&lt;/p&gt;

&lt;p&gt;"Is the system running?"&lt;/p&gt;

&lt;p&gt;And start asking:&lt;/p&gt;

&lt;p&gt;"Is the system showing the user what is actually happening?"&lt;/p&gt;

&lt;p&gt;A green health check is useful, but it doesn't guarantee that the information being presented is current.&lt;/p&gt;

&lt;p&gt;A connected dashboard can still be stale.&lt;/p&gt;

&lt;p&gt;A successfully processed message can still arrive too late to be useful.&lt;/p&gt;

&lt;p&gt;And a responsive application can still be displaying yesterday's reality.&lt;/p&gt;

&lt;p&gt;For systems where decisions depend on real-time information, freshness deserves to be treated as an important engineering concern.&lt;/p&gt;

&lt;p&gt;I'd like to explore this further through a small, reproducible experiment comparing event-processing strategies and their impact on information freshness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because in a real-time system, being connected is not the same as being current.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>monitoring</category>
      <category>performance</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
