BUGBYBUG BLOG

Search articles

Find engineering guides, product updates and debugging resources.

Error Monitoring/Field note

Every Production Failure Leaves a Data Trail

A production error rarely appears without warning. Learn how logs, breadcrumbs, traces, metrics, release details, and application state form a data trail that helps engineers reconstruct what happened and find the real cause.

A glowing blue digital circuit filled with binary signals, representing the data trail created as information moves through an application.
On this page

    A production failure rarely begins at the exact line where the application finally throws an exception.

    Before the visible error, something usually changed. A session expired. A request returned unexpected data. A feature flag opened a different path. A state update happened too early, or an outdated response replaced newer information.

    By the time the exception appears, the system may already be several steps away from the original cause.

    The stack trace shows where the application stopped.

    The data trail shows how it got there.

    The final error is only the last event

    Consider this error:

    Cannot read properties of undefined

    The stack trace points to a checkout total calculation.

    That tells the engineer where the application failed, but it does not explain that:

    The user’s session expired earlier

    A cart request returned 401

    Checkout continued without valid order data

    A later calculation attempted to access missing items

    Other users with older sessions followed the same path

    Focusing only on the throwing line may lead to a defensive check that hides the exception without fixing the broken session flow.

    The better question is:

    What sequence of events allowed the application to reach this invalid state?

    What makes up a data trail?

    A useful production data trail can include:

    Exception messages and stack traces

    User actions and navigation

    API requests and responses

    Application state changes

    Logs and distributed traces

    Release versions

    Feature flags

    Performance metrics

    Browser and device details

    Affected-user counts

    No single signal explains every failure.

    The value comes from connecting them.

    A timeout becomes more meaningful when it appears immediately before an exception. A release becomes more suspicious when an error begins shortly after deployment. A missing value becomes easier to explain when affected events share the same feature flag.

    Evidence becomes useful when it forms a connected story.

    Breadcrumbs preserve the path

    Breadcrumbs record important actions and system events before a failure.

    For example:

    User opened checkout

    Cart refresh started

    Cart refresh returned 401

    Session-cleared event fired

    Delivery method changed

    Total recalculation started

    Missing-items exception occurred

    The stack trace explains the final step.

    The breadcrumbs explain the path into it.

    Without that sequence, an engineer may incorrectly assume the calculation created the invalid data. With it, the team can investigate why checkout continued after authentication failed.

    Breadcrumbs should capture meaningful events—not every movement or interaction.

    Logs should describe what happened

    A log entry such as:

    Something failed

    provides almost no investigative value.

    A useful structured log might include:

    Service

    Operation

    Outcome

    Status code

    Duration

    Release

    Environment

    Trace or correlation identifier

    For example:

    Service: checkout-api

    Operation: refresh-cart

    Outcome: failed

    Status: 401

    Release: 2.6.0

    Duration: 186ms

    Structured logs make it easier to search, filter, compare failures, and connect events across services.

    The goal is not to generate more logs.

    It is to generate evidence that helps explain behaviour.

    Runtime state reveals what the code received

    Source code shows what a component expects.

    Runtime state shows what it actually received.

    Expected:

    order.items is an array.

    Actual:

    The order exists, but items is missing because the cart refresh failed.

    That difference can explain the failure more clearly than the exception message.

    Useful state context may include the current route, authentication status, active account, cached-data version, feature flags, request outcome, and relevant component state.

    Sensitive information should always be filtered, masked, or excluded.

    Releases and flags change the investigation

    Every production event should be connected to the version of the application that produced it.

    Release information helps teams determine whether:

    The issue is new

    It began after deployment

    A rollback stopped it

    Successful users are running another version

    Older sessions are interacting with newer code

    Feature flags add another layer.

    Two users may run the same release while experiencing different components, endpoints, validation rules, or integrations.

    Capturing relevant release and flag information helps explain why one group of users fails while another succeeds.

    Find the first abnormal event

    A timeline may contain many normal operations.

    The investigator needs to identify where the workflow first stopped behaving correctly.

    Consider this sequence:

    The user restored an old session

    The application loaded cached cart data

    The new release expected another cart structure

    Cart validation silently failed

    The user changed delivery method

    Total calculation accessed a missing field

    The exception appeared

    The visible error is step seven.

    The real problem begins around step three or four.

    That is where the stronger fix may belong.

    Compare successful and failed sessions

    A failed event becomes more useful when compared with a successful one.

    Successful flow:

    Session created after deployment

    Current cart structure

    Refresh request returns 200

    Checkout receives valid items

    Failed flow:

    Session created before deployment

    Older cart structure

    Refresh request returns 401

    Checkout continues without items

    The difference creates a testable hypothesis:

    Older sessions are not migrating or refreshing correctly after the release.

    This is much stronger than simply saying the total calculation sometimes fails.

    AI can help connect the evidence

    AI can organise stack traces, logs, requests, releases, state, breadcrumbs, and related events.

    It may identify that:

    Every failure began after one release

    Affected sessions are older

    The same request fails before each error

    One feature flag appears in all affected events

    A useful AI explanation should show the supporting evidence:

    These failures appear related because they affect the same checkout route, began after release 2.6.0, and all follow a 401 response from the cart-refresh endpoint.

    That is more trustworthy than simply claiming that the cart service caused the problem.

    AI should help build the hypothesis.

    Engineers still need to reproduce, test, and confirm it.

    The final lesson

    A production error is rarely one isolated event.

    It is usually the end of a path through requests, state changes, releases, services, and user actions.

    The stack trace shows where the application finally stopped.

    The data trail explains how it reached that point.

    Follow the requests.

    Follow the state.

    Follow the releases.

    Follow the connected events.

    Every production failure leaves a data trail.

    The clearer that trail is, the faster the team can understand what broke.

    Keep reading