Error Reporting in Google Cloud
A friendly, step-by-step guide to the service that watches your applications for crashes and exceptions, gathers the repeats into tidy groups, and tells you what broke, how often and since when. Learn how errors get in, how they are grouped, how to be alerted, and how to turn a pile of failures into a calm, repeatable fix routine.
Imagine you run an online bakery and your website quietly fails for one customer in fifty. The customer does not phone you. They simply leave. Somewhere inside your software an unexpected problem happened, a short message was written in a log file among millions of other lines, and nobody saw it. Days later your sales dip, and you cannot tell why.
Error Reporting is Google Cloud’s answer to this silent failure. It looks at the problems your applications run into, collects the ones that look like crashes and exceptions, groups the repeats together, counts them, and shows them in a clean list with the details a developer needs. In this guide we begin from zero. We explain what an error and a stack trace are, how Error Reporting finds them, how it decides which belong together, how you get alerted, and how a team can build a calm routine around it. Every new word is explained when it first appears, with everyday comparisons along the way.
WWhat Is Error Reporting in Google Cloud?
A first, simple picture before we open the details.
Error Reporting is a Google Cloud service that counts, analyses and aggregates the crashes and exceptions in your running cloud services. In plain words, it is a tidy inbox for application errors. Instead of reading raw log lines, you open a page that lists each distinct problem once, with how many times it happened, how many users it touched, when it first appeared, when it last appeared, and where in the code it came from.
It belongs to Google Cloud’s observability family, the set of tools that help you see what is happening inside your systems. Its neighbours are Cloud Logging for storing log messages, Cloud Monitoring for numbers and alerts, and Cloud Trace for following a request through many services. Error Reporting sits on top of logs: it reads the entries that look like errors and turns them into a structured, human-friendly view.
Think of a hospital emergency room. Hundreds of people arrive with problems. A triage nurse does not read every patient’s full life story. The nurse groups cases (“another broken wrist”), notes how many there are, flags new kinds of problem and tells doctors which need attention first. Error Reporting is the triage nurse for your software.
What it does for you
- Detects errors from logs and from direct reports, with no heavy setup in many environments.
- Groups similar errors so one bug appears as one line, not ten thousand.
- Counts occurrences over time and shows trends in a small chart.
- Shows details such as the stack trace, the service, the version and a sample log entry.
- Notifies you when a new error appears or when a resolved one comes back.
- Tracks status so a team can mark errors as acknowledged, resolved or muted.
- Links each error group to a ticket in your issue tracker so everyone can follow progress.
Error Reporting does not fix errors and it does not stop them from happening. It makes them visible, sorted and shareable so the right person can fix them quickly.
TThe Problem: Errors Hidden in an Ocean of Logs
Why reading raw logs is a poor way to find bugs.
Too much noise
A busy application can write millions of log lines a day. Most are routine messages such as “request received” or “order saved.” A real error is a needle in a haystack. Searching for the word “error” helps a little, but it also finds harmless warnings, expected failures and old problems everyone already knows about.
One bug, a thousand lines
When a bug affects many users, it writes the same failure again and again. Reading ten thousand copies of the same message does not teach you anything the first copy did not. What you really want to know is: how many different problems exist, and which is biggest?
Users do not report most errors
Many people never complain. They close the page, uninstall the app or go to a competitor. Without automatic detection, a team learns about problems only through angry emails or falling revenue, which is slow and costly.
Imagine a city where every broken streetlight sends the council a letter, and the letters pile up unread in a warehouse. A single dark street could generate a thousand identical letters. Error Reporting is the clerk who sorts the letters into piles by street, counts them, and puts the busiest piles on the mayor’s desk.
Slow, scattered investigation
Without a central view, developers hunt for the right log, the right time window, the right server and the right version. Valuable minutes disappear while customers wait. Having one place that says “this problem began after yesterday’s release and affects the checkout service” shortens the whole investigation.
Visibility
See errors even if no user ever reports them.
Grouping
Turn many events into a few meaningful problems.
Priority
Know which problem hurts the most users right now.
Context
Get the stack trace, version, service and example request in one place.
Notification
Be told quickly when something new breaks.
Teamwork
Share status, link tickets and avoid duplicate work.
Error Reporting shows what your code reports as failures. It cannot see problems that are silent, such as a page that loads but shows wrong numbers. Use it together with monitoring of business results.
EErrors, Exceptions and Stack Traces for Complete Beginners
The few programming ideas you need before the service makes sense.
What is an error?
When a program is running and meets a situation it cannot handle, such as dividing by zero, reading a missing file or calling a service that does not answer, it raises a signal that something went wrong. In many languages this signal is called an exception. If nothing catches and handles the exception, the program may stop or return a failure to the user. Programmers also use the word error loosely for any such failure.
A kitchen worker finds the sugar tin is empty in the middle of baking. They can shout for the manager (raise an exception). If a supervisor is ready to deal with it (“fetch more sugar”), the cake carries on. If nobody handles it, the baking stops and the order fails.
Handled and unhandled
A handled exception is one the code expects and deals with, for example showing “please try again.” An unhandled exception is a surprise that travels all the way up and crashes the request or the whole program. Error Reporting is most useful for unhandled and unexpected problems, though applications can deliberately report handled ones when they matter.
What is a stack trace?
Programs are made of functions that call other functions. At any moment the running code has a chain of calls, with the newest at the top, a bit like a stack of plates. When an exception occurs, the language can print this chain. That printout is called a stack trace. It lists the files, functions and line numbers that were active, so a developer can see exactly where the failure happened and how the code got there.
flowchart TD
A["User clicks Place Order"] --> B["checkout function"]
B --> C["calculate total function"]
C --> D["apply discount function"]
D --> E["Failure: discount value is missing"]
E -.-> F["Stack trace lists D, C, B, A with line numbers"]
Reading the diagram
The user’s click starts a chain: checkout calls a total calculation, which calls a discount step, which fails because a value is missing. The stack trace records that chain. A developer reading it sees the failing line first and the story of how the program arrived there behind it. Error Reporting uses this chain as the “fingerprint” of the problem, which is why a good stack trace is so important.
Other terms you will meet
- Log entry: one recorded message, with a time, a severity and a text or structured body.
- Severity: a label such as info, warning or error that says how serious a log entry is.
- Crash: the program stops completely because of an unhandled failure.
- Regression: a problem that was fixed and later returns, often after a new release.
- Release or version: a numbered snapshot of your code that you deploy.
When you read a stack trace, begin with the first lines. They name the type of failure and the place it happened. Lines far below are usually the framework code that started the request.
CCore Concepts: Events, Groups, Services and Versions
The small vocabulary of the Error Reporting console.
Error event
One single occurrence of a failure at one moment, with its stack trace and context.
Error group
A bundle of error events that Error Reporting decides are the same underlying problem.
Service
The name of the application or component that produced the error, such as checkout or search.
Version
The release label of the code that produced the error, such as a build number.
Occurrences
How many events a group has received in the chosen time window.
Affected users
The number of distinct users who met the error, when the application reports a user identifier.
First seen and last seen
Timestamps for when a group first appeared and when it most recently occurred.
Resolution status
A label showing whether the team is handling the group: open, acknowledged, resolved or muted.
Events versus groups
This pair is the most important idea. An event is a single happening. A group is a family of similar events. If one bug is triggered 5,000 times by 800 users, Error Reporting shows one group with 5,000 occurrences and 800 affected users. You work with groups; the events are the evidence inside them.
Each time a customer complains that the shop door sticks, that is an event. The note on the manager’s board that says “door sticks: 37 complaints this week” is the group. You fix the door once, not thirty-seven times.
Service and version context
Every error is stamped with the service name and version. This stamp is called the service context. It lets you ask useful questions: “Did this error exist before version 2.4?” or “Does it only affect the payments service?” Without it, errors from different applications blur together.
Time windows
The console lets you view errors over different time ranges, such as the last hour, day, week or custom periods, up to the limit of how long the service keeps data. A short window shows what is happening now. A long window shows slow trends and old, quiet problems.
| Question you ask | Where to look |
|---|---|
| What is breaking right now? | The list sorted by recent occurrences, short time window |
| What is new since the release? | Groups with a recent first-seen time and the new version label |
| What hurts the most people? | Sort by affected users |
| Is an old problem returning? | Groups marked resolved that show new occurrences |
| Which service is the noisiest? | Filter by service |
HHow Error Reporting Works: The Big Picture
From a failing line of code to a row in the console.
flowchart LR
APP["Your application: Cloud Run, Functions, App Engine, GKE, VMs"] --> LOG["Cloud Logging"]
APP -.-> API["Error Reporting API: direct report"]
LOG --> DET["Error detection: finds exception-like entries"]
API --> ING["Error Reporting ingestion"]
DET --> ING
ING --> GRP["Grouping engine"]
GRP --> CON["Console: list, details, trends"]
GRP --> NOT["Notifications"]
CON --> TEAM["Your team"]
NOT --> TEAM
Reading the diagram
Your application runs on a Google Cloud service. Most of these services send what the program prints, including stack traces, to Cloud Logging automatically. Error Reporting looks at those log entries, recognises the ones that contain an exception or stack trace, and ingests them. Alternatively, your code can call the Error Reporting API directly and hand over an error on purpose. After ingestion, a grouping engine decides which events belong together. The result appears in the console, and notifications can be sent.
The journey in steps
A failure happens
Code raises an exception while serving a request or running a job.
The failure is written down
The runtime or logging library writes the exception message and stack trace as a log entry, usually with error severity.
Cloud Logging stores it
The entry is collected and stored with details such as time, service and resource labels.
Error Reporting recognises it
The service scans entries for the shape of an exception and stack trace in supported languages and formats.
The event is grouped
The stack trace and context are compared with existing groups, and the event joins one or starts a new group.
You see and are told
The group’s counts update in the console, and a new-error notification may be sent.
It works like a newsroom. Reporters (your applications) write stories into the archive (Cloud Logging). An editor (Error Reporting) scans the archive for breaking-news stories, groups related ones, puts them on the front page and rings the duty manager if the story is new.
Because most errors arrive through Cloud Logging, anything that stops logs reaching Cloud Logging, such as exclusion rules or missing permissions, can also hide errors from Error Reporting. We return to this in the troubleshooting chapter.
WWhere Errors Come From: Automatic Capture and Direct Reports
The two roads into Error Reporting.
Road one: automatic capture from logs
Many Google Cloud runtimes forward your program’s output to Cloud Logging without extra work. When a printed message contains a recognisable exception and stack trace, Error Reporting can pick it up. This is the easiest path: for several managed services you may need only to make sure the application logs its exceptions, and that the API is enabled in the project.
Road two: reporting directly
Your code can also send errors on purpose, in one of three ways:
- Client libraries: Google provides libraries for several programming languages that wrap the reporting call, so one line sends an exception along with context.
- The Error Reporting API: any program that can make a secure web request can report an event, including languages without a ready-made library.
- Structured log entries: your logging code can write an entry in a documented shape that includes the message, the service context and the stack trace, and Error Reporting treats it as an error event.
| Path | Effort | Control | Best for |
|---|---|---|---|
| Automatic from logs | Lowest | Limited: depends on log format | Getting started quickly on managed services |
| Structured log entry | Low | High: you choose fields | Teams already using structured logging |
| Client library | Low to medium | High | Handled exceptions you still want to track |
| Direct API call | Medium | Complete | Unusual languages, devices or batch jobs |
Automatic capture is a security camera that records everything and lets the guard notice trouble afterwards. Direct reporting is a staff member pressing the alarm button on purpose. Both are useful, and some events are only caught by one of them.
Reporting handled errors on purpose
Sometimes your code catches an exception so a user sees a friendly message, yet the situation is still a bug worth fixing. If nothing reports it, the failure disappears. A good practice is to catch, tell the user kindly, and also report the error so it appears in your list.
Include the service name, the version, and where possible an anonymous user or request identifier. These small details are what make grouping, counting users and finding regressions possible.
SSupported Environments and Languages
Where Error Reporting works, and what it expects from your code.
Google Cloud environments
Cloud Run and Cloud Run functions
Container and function output flows to Cloud Logging automatically, so exceptions are often detected with little setup.
App Engine
Application logs are collected by the platform, and errors can appear without extra configuration for supported languages.
Google Kubernetes Engine
Container logs are collected by the cluster logging agent when logging is enabled.
Compute Engine
Needs an agent that sends application logs to Cloud Logging, or direct reporting from code.
Other clouds and on-premises
Applications elsewhere can use the client libraries or the API with proper credentials.
Client applications
Dedicated crash reporting products exist for mobile apps. Check what is recommended for front-end and mobile errors.
Languages
Error Reporting understands stack traces from several popular languages, commonly including Go, Java, Node.js, PHP, Python, Ruby and .NET. Each language prints stack traces in its own style, so the service has a recognition rule for each. If your language is not on the list, you can still send structured events with the stack trace as plain text through the API, though automatic recognition may be weaker. The list of supported languages and formats evolves, so confirm it in the official documentation.
Different languages write stack traces the way different countries write addresses. The postal clerk (Error Reporting) knows the common formats and can read them quickly. A very unusual format needs the sender to fill in a standard form (the API) so nothing is misread.
Make exceptions look like exceptions
- Log the full stack trace in a single log entry, not split across many lines that reach the logger separately.
- Use the standard exception logging methods of your language and logging library, which print traces in the format expected.
- Avoid trimming or reformatting the trace text before logging it.
- Set severity to error for entries that represent genuine failures.
- Use structured logging with a field for the trace and a field for the service context when possible.
Some logging setups write every line of a stack trace as a separate log entry. Then Error Reporting sees fragments, not a trace, and the error may not be detected or grouped well. Check how your logs look in Cloud Logging.
GGetting Started: Enabling the Service and Granting Access
The short setup checklist, in words.
Choose the project
Error Reporting works per Google Cloud project. Pick the project that holds the application you want to watch.
Enable the API
Switch on the Error Reporting API for that project. In some environments the console offers to do this when you first open the page.
Make sure logs flow
Confirm that your application’s output reaches Cloud Logging, and that no exclusion rule throws away error entries.
Check the runtime identity
The service account your application runs as needs permission to write logs, or to report errors if you call the API directly.
Cause a test error
Trigger a harmless, deliberate failure in a test environment and watch for it in the console.
Give your team access
Grant viewing and management roles to the people who will use the console.
Who can do what
Access is controlled by IAM, Google Cloud’s identity and access management system. Predefined roles exist for the main jobs. Names and exact permissions can change, so confirm the current ones, but the idea is stable:
| Role idea | Typical ability | Give it to |
|---|---|---|
| Viewer | See error groups, events and statistics | Developers, support, managers |
| User | Viewer abilities plus change status, such as resolve or mute, and set the issue link | The team that fixes errors |
| Writer | Report new error events through the API | Application service accounts |
| Administrator | Everything, including deleting groups and changing settings | A small number of owners |
It is like a library. Visitors may read books (viewer). Librarians may re-shelve and stamp them (user). Delivery people may drop new books at the back door (writer). The head librarian may remove books from the collection (administrator).
The service account your application uses needs only the ability to send errors, not to read or delete them. Giving applications the smallest role limits the damage if their credentials are ever stolen.
SService Context: Naming Your Service and Version
The two small labels that make errors much easier to understand.
The service context has two parts: a service name and a version. Managed platforms often fill these in for you from their own settings, such as the Cloud Run service name and revision. When you report errors yourself, you should provide them deliberately.
Why they matter
- Separation: errors from the website, the payment system and the nightly job are shown apart, so one noisy component does not hide the others.
- Release tracking: if the version label changes with each deploy, you can see which version first produced an error.
- Responsibility: a service name tells you which team to contact.
- Filtering: the console lets you narrow the list by service and version.
A complaint letter that says “the food was bad” is hard to act on. A letter that says “the lasagne at the Downtown branch on Friday night” can be handled at once. Service and version are the branch and the date for your errors.
Choosing good names
Stable service names
Use a short name that does not change between releases, such as “checkout-api.”
Meaningful versions
Use a release number, a short code revision or a build identifier that matches your deployment records.
Separate environments
Keep test, staging and production apart, ideally in different projects, so test noise never mixes with real problems.
Avoid unique values
Do not put random or per-request identifiers in the service or version, or every error looks new.
Using the full build timestamp or a container hash that changes every minute as the version creates a flood of “new” versions and makes release comparison meaningless. Choose a version label that changes only when you intentionally release.
TA Tour of the Console: List and Details
What you see when you open Error Reporting, and how to read it.
The error list
The first page shows a table of error groups for the selected time range. Each row is one group and typically shows:
- Resolution status: a label such as open, acknowledged, resolved or muted.
- Occurrences: how many events arrived in the time range, often with a small trend chart.
- Users: how many distinct users were affected, if user identifiers are available.
- Error: a short title, usually the exception type and message, plus the place in the code.
- Seen in: the services and versions where it appeared.
- First seen and last seen: when it began and when it last occurred.
- Response: a link to a ticket, if one has been attached.
Above the table you can filter by time, service, version and status, and sort by the columns that matter, such as most recent or most users.
The group details page
Clicking a row opens the group in detail. You will find a larger chart of occurrences, the list of affected services and versions, the status controls, the link field for a ticket, and a section of samples. Each sample is one real event with its full stack trace, and a link that opens the matching log entry in Cloud Logging, so you can see the surrounding messages around the same moment.
The list is the departure board at an airport: every flight in one table, delays highlighted. The details page is the gate information for one flight: who is on it, what went wrong, and what is being done.
How to triage the list in five minutes
Set a sensible window
Start with the last day, or the time since your latest release.
Filter to production
Pick the service and, if needed, the version you care about.
Sort by impact
Look at users affected first, then occurrences.
Spot the new ones
Groups with a very recent first-seen time are the most suspicious.
Open and decide
Read a sample, decide whether to fix now, schedule, mute or acknowledge, and record that decision.
The stack trace tells you where the failure happened. The linked log entries often tell you why, because the lines just before the error show which request, which input and which earlier step led to it.
HHow Errors Are Grouped Together
The clever part that turns noise into a short list.
Grouping is the service’s most valuable trick. When a new event arrives, Error Reporting compares it with existing groups. Two events are usually considered the same problem when they share the same type of failure and the same essential shape of stack trace, meaning the same functions in the same order, within the same service. Details that change on every occurrence, such as specific numbers in the message, are ignored for this comparison where possible.
flowchart TD
EV["New error event arrives"] --> N["Normalise: strip changing details"]
N --> FP["Build a fingerprint from exception type and stack frames"]
FP --> M{"Matches an existing group?"}
M -->|"Yes"| ADD["Add to group: update counts, last seen, users"]
M -->|"No"| NEW["Create new group: mark first seen, may notify"]
ADD --> UI["Console shows updated group"]
NEW --> UI
An illustration
Suppose the message says “Order 1001 not found” for one user and “Order 2093 not found” for another. A good grouping step recognises these as the same problem with different numbers, and puts them in one group. If two different functions each fail with a missing value, they have different stack traces and form two groups, even if the words look similar.
Think of sorting photographs by the building they show, not by the people standing in front of it. People change in every photo, but the building stays the same. The stack trace is the building; the message numbers are the passers-by.
When grouping goes wrong
- Over-splitting: one bug appears as many groups, often because the stack trace differs slightly, for example when it contains generated code names or random identifiers.
- Over-merging: different bugs share a group because they pass through the same shared helper function that appears at the top of both traces.
- Missing traces: events without a stack trace are grouped by the message alone, which can be crude.
How to improve grouping
| Problem | What helps |
|---|---|
| Messages contain unique identifiers | Keep identifiers out of the exception message; log them separately as fields |
| Wrapper exceptions hide the real cause | Preserve the original cause so the useful frames appear in the trace |
| Everything fails in one shared helper | Raise specific exception types for different failures |
| No stack trace at all | Log the exception object, not just a custom text message |
| Minified or compiled code makes traces unreadable | Use source maps or symbol files where your language supports it |
No automatic grouping is perfect. Treat the list as a very good first sort, and use judgement. If two groups are really one bug, link both to the same ticket.
LThe Life of an Error: Status and Workflow
A shared way for a team to say who is handling what.
Each error group has a resolution status that the team can change. These labels turn the list into a simple workflow board.
stateDiagram-v2
[*] --> Open: New error group appears
Open --> Acknowledged: Someone takes ownership
Acknowledged --> Resolved: Fix is released
Open --> Muted: Known and accepted
Acknowledged --> Muted: Decided not to fix
Resolved --> Open: Error returns after the fix
Muted --> Open: Team un-mutes it
Open
New or unhandled. Nobody has taken it yet. This is the default state.
Acknowledged
Someone has seen it and is working on it or has scheduled it. Notifications about it are reduced.
Resolved
The team believes it is fixed. If it occurs again, it returns to open and can trigger a notification, which reveals regressions.
Muted
Hidden from the default view and from notifications, for known or accepted noise. Use sparingly.
Think of a repair shop with tags on each job: “waiting,” “being worked on,” “finished” and “customer says ignore.” When a finished car comes back with the same noise, the tag flips back to “waiting” and the manager hears about it.
Good habits for the workflow
- Mark a group resolved only after the fix is deployed, not when the code is merged.
- Add a note or ticket link whenever you acknowledge, so colleagues know who is on it.
- Review muted groups on a schedule. A muted group can hide a growing problem.
- Keep the open list short. A list of hundreds of ignored open groups is no longer useful.
- Agree a team rule: how long may an open group wait before someone must look at it?
Muting is a way to quieten known noise, not to dispose of real bugs. Teams that mute everything to make the list look clean end up blind. Always record why a group was muted.
CCollaboration: Linking Errors to Your Issue Tracker
Turning a detected error into tracked, assigned work.
Each error group has a field where you can attach a link to a ticket in your issue tracker. This link appears in the list, so anyone can tell at a glance whether a problem has an owner. The tracker can be any system that has web addresses for issues, such as Jira, GitHub Issues, GitLab, Linear or an internal tool.
A typical flow
Notice
A notification or the daily review reveals a new group.
Create a ticket
The developer opens a ticket that includes the group address and a short summary, with the sample stack trace.
Link back
The ticket address is saved on the error group, and the status becomes acknowledged.
Fix and release
The code is repaired and deployed under a new version label.
Resolve and watch
The group is marked resolved, and the team watches for a return.
It is like attaching a repair-request number to a broken-streetlight report. Anyone who looks at the report sees that request number 4821 is already assigned, and nobody sends a second repair crew.
Sharing outside the console
- Each group has its own web address that you can paste into chat messages, tickets and incident notes.
- Colleagues need viewer access to open it, so combine sharing with appropriate roles.
- Teams often add the group address to deployment notes, so reviewers can check whether a release reduced the error.
Name a single person or team responsible for each acknowledged group. Shared responsibility often means no responsibility.
NNotifications: Being Told Without Staring at a Screen
How Error Reporting reaches out to people.
Nobody wants to refresh a web page all day. Error Reporting can send notifications when something worth attention happens. The usual triggers are a new error group appearing, or a resolved group reappearing, because both suggest a change in behaviour rather than ordinary background noise.
Typical channels
Project members can receive messages about new errors in the projects they care about.
Mobile app
The Google Cloud mobile app can show notifications and let you look at groups on the go.
Chat and paging tools
Through Cloud Monitoring notification channels, you can reach services such as Slack, PagerDuty or webhooks, depending on how you configure alerting.
Controlling the noise
- Send notifications for production projects only, not for every test project.
- Use the acknowledged and muted statuses to reduce repeats once a group is being handled.
- Let on-call people receive urgent alerts, and let others read a daily summary.
- Review who is subscribed whenever people join or leave the team.
A smoke alarm that beeps for burnt toast every morning is soon ignored, and a real fire is missed. Alerts must be rare enough, and meaningful enough, that people always take them seriously.
If every new error pages the on-call engineer at night, people will start muting or ignoring alerts. Reserve urgent notifications for what is truly urgent, such as high-volume or user-facing failures, and use quieter channels for the rest.
AAlerting with Cloud Monitoring and Log-Based Metrics
When you need rules more precise than “a new error appeared”.
Error Reporting’s own notifications are simple. For richer control, teams use Cloud Monitoring. A log-based metric counts log entries that match a filter, for example entries with error severity from the checkout service. Monitoring can chart that count over time and raise an alert when it crosses a threshold, such as more than fifty errors in five minutes.
flowchart LR
LOGS["Cloud Logging: error entries"] --> LBM["Log-based metric: count matching entries"]
LBM --> MON["Cloud Monitoring chart"]
MON --> POL["Alert policy: threshold and duration"]
POL --> CH["Notification channels: email, chat, pager"]
LOGS --> ER["Error Reporting groups and details"]
CH --> ONC["On-call engineer"]
ONC --> ER
When to use which
| Need | Best tool |
|---|---|
| Know that a brand-new kind of error appeared | Error Reporting new-error notification |
| Know that error volume has jumped | Alert on a log-based metric or error-rate metric in Cloud Monitoring |
| Alert only when a specific error text occurs | Log-based alert with a precise filter |
| See which bug is behind the volume | Error Reporting list and details |
| Alert on slow responses or failed health checks | Cloud Monitoring metrics and uptime checks |
Monitoring is the alarm that says “the building temperature is rising.” Error Reporting is the inspector who tells you “it is the kitchen oven in the east wing.” You want both: the alarm to wake you, and the inspector to point you.
Alert design tips
- Alert on user impact, such as an error rate, rather than on any single error.
- Use a duration, so a one-minute blip does not wake anyone.
- Include a link to the Error Reporting list in the alert’s documentation text.
- Test alerts by simulating a failure in a non-production project.
RRelationship to Cloud Logging, Monitoring and Trace
Four observability tools, each answering a different question.
flowchart TD
P["Production problem"] --> M["Monitoring: Is something wrong, and how big?"]
M --> E["Error Reporting: Which errors, where in the code?"]
E --> L["Logging: What happened around that moment?"]
L --> T["Trace: Which request path and which service was slow or failing?"]
T --> F["Fix, deploy, verify"]
| Tool | Main question | Data it holds |
|---|---|---|
| Cloud Monitoring | Is the system healthy right now? | Numbers over time: rates, latencies, usage |
| Error Reporting | What are the distinct failures and who is affected? | Grouped exception events with stack traces |
| Cloud Logging | What exactly happened? | Every log message, searchable |
| Cloud Trace | Where did a request spend time or fail across services? | Timed steps of a request path |
| Cloud Profiler | Which code uses the most CPU or memory? | Continuous performance profiles |
Imagine a car. Monitoring is the dashboard with the warning lights. Error Reporting is the mechanic’s list of faults found, grouped by part. Logging is the complete service history. Trace is the route map of one journey. You use the lights to know a problem exists, the fault list to know what it is, and the history to understand how it started.
Practical links between them
- From an Error Reporting sample, jump to the exact log entry in Cloud Logging.
- If your logs include a trace identifier, you can open the same request in Cloud Trace.
- Use log-based metrics to feed counts of matching errors into Monitoring charts and alerts.
- Put an Error Reporting widget or link on the same dashboard as your key service metrics.
Write one identifier per request into every log message and every reported error. When an error appears, you can pull up the whole story of that single request in seconds.
WWriting Code That Reports Errors Well
Habits for developers that make the console far more useful.
Log the exception object
Pass the real exception to the logger so the full stack trace is included, instead of building your own message string.
Keep messages stable
Put variable data in separate fields, not in the message text, so occurrences of one bug look alike.
Preserve the cause
When you wrap an exception, keep the original so the root cause stays in the trace.
Use specific exception types
Create meaningful types for meaningful problems, rather than one generic failure for everything.
Report user context safely
Include a pseudonymous user or session identifier, never raw personal data.
Set severity honestly
Use error severity for real failures and warning for recoverable oddities, so the signal stays strong.
Do not report everything
Not every exception is a bug. A user typing a wrong password is a normal event. A missing page requested by a web crawler is expected. If your code reports these as errors, the real problems drown in noise. Decide which situations deserve a place in the error list, and log the rest at a lower severity or count them as metrics instead.
A restaurant manager wants to be told when the freezer breaks, not every time a diner changes their mind about dessert. Teach your code the difference between “something is broken” and “someone made a choice.”
Global handlers as a safety net
Most frameworks let you register a single place that catches any exception nobody else handled. Connect that place to your error reporting, so even surprising failures are reported with the right service context. Then add specific reporting for important handled cases.
Batch jobs and background work
Scheduled tasks and queue workers have no user looking at a screen. If they fail quietly, nobody knows. Make sure their exceptions flow into the same error list, with a service name that makes clear which job failed, and consider an alert if an expected job does not run at all.
An empty handler that catches an exception and does nothing is the most common reason errors are invisible. At the very least, log it. If it matters, report it.
RReleases, Regressions and Safe Deployments
Using error data to judge whether a new version is healthy.
Every release is a small gamble. Error Reporting lets you check the result quickly. After deployment, compare the new version’s errors with the old one: Are there new groups whose first-seen time matches the deploy? Has an old group grown? Did a group you meant to fix disappear?
sequenceDiagram
participant D as Developer
participant P as Pipeline
participant S as Service v2
participant E as Error Reporting
D->>P: Merge change
P->>S: Deploy small share of traffic
S->>E: Report any new errors with version v2
D->>E: Check new groups and counts for v2
alt Healthy
D->>P: Increase traffic to v2
else Unhealthy
D->>P: Roll back to v1
end
D->>E: Mark fixed groups as resolved
Regression watch
A regression is a bug that returns. Because a resolved group reopens when it occurs again, the console becomes an automatic regression detector. Together with version labels, you can see exactly which release brought the problem back.
Releasing carefully is like trying a new recipe on a few guests before serving the whole party. If someone makes a face, you change the recipe. Error Reporting tells you which guests made a face and why.
A release checklist
Before the deploy
Note the current top error groups and their rates as a baseline.
During the rollout
Watch for groups first seen on the new version, especially with many users affected.
After the rollout
Compare rates against the baseline over several hours of normal traffic.
Close the loop
Resolve fixed groups and file tickets for new ones.
SSecurity and Privacy: Keeping Secrets Out of Errors
Error messages and stack traces can leak more than you expect.
What can leak
- Personal data in messages, such as names, emails or phone numbers from a failed form.
- Secrets in error text, such as connection strings, tokens or passwords that appear in a failed request.
- Internal details such as file paths, server names and library versions in stack traces.
- Business data embedded in a query or payload that is printed when it fails.
Because errors are stored and shown to many team members, anything printed into them becomes widely visible and long-lived. This matters under privacy laws and company rules.
A hospital incident report should say “patient in room 4 fell” and not include the patient’s full medical history. Error messages should describe what failed, not copy in the sensitive things the program was holding.
Protection measures
| Measure | What it does |
|---|---|
| Scrub before logging | Remove or mask sensitive fields in your own code before an exception message is written |
| Use identifiers, not values | Log an order number or hashed user key instead of the real details |
| Least-privilege access | Give console access only to people who need it; use viewer roles by default |
| Separate projects | Keep production errors in a restricted project, apart from development |
| Data loss prevention tools | Scan or redact logs for sensitive patterns where your policy requires it |
| Audit logging | Record who viewed or changed error data |
| Encryption and location | Data is encrypted in transit and at rest; confirm region and residency rules for your needs |
If you handle health, payment or children’s data, ask your compliance team what may appear in logs and error reports. Confirm Google’s current commitments for Error Reporting regarding data location and retention in the official documentation.
DData Retention, Scale and Limits
How long errors stay, and what happens when volumes grow.
Error Reporting does not keep data forever. Error events are retained for a limited period, commonly described as about thirty days, after which old events fall away from the view. Exact numbers can change, so confirm in the documentation. Error groups with recent activity remain visible, while very old, inactive ones eventually disappear.
Why this matters
- If you need to analyse trends over many months, export the underlying logs to storage or BigQuery, where you control the retention.
- For audits, keep your own record of significant incidents, not only the console view.
- When investigating an old incident, you may find the stack trace gone from Error Reporting but still present in Cloud Logging, depending on log retention settings.
Error Reporting is the whiteboard in the office: great for the current week, regularly wiped to stay readable. Logs exported to storage are the filing cabinet where you keep records for years.
Scaling and limits
Reporting rate
The API has request limits. Very chatty applications should sample or aggregate rather than report every single occurrence.
Message size
Very large messages or traces may be truncated. Keep error text focused.
Number of groups
Extremely many distinct groups, often caused by unique messages, can overwhelm the list and slow people down.
Delay
Events can take a short time to appear. Do not assume instant, to-the-second accuracy.
Quotas, retention periods and size limits change. Check the quotas page in the console and the current documentation before you design anything that depends on a specific value.
An error storm
A single failing dependency can make every request fail at once, creating millions of events in minutes. This is called an error storm. Grouping keeps the console readable, but your reporting code and quotas still feel the load. Guard against storms by rate limiting reports from one process, and by using circuit breakers that stop calling a broken dependency for a while.
CCost: What You Pay For and What Is Free
Understanding where the money may go.
Error Reporting itself has historically been offered without a separate charge, but nearby services may cost money. In particular, the log entries that carry your errors are stored in Cloud Logging, which has its own pricing for ingested and retained data above free allowances. Alerts and metrics in Cloud Monitoring can also have costs, and calling an API from outside can add network charges. Pricing changes, so always check the current pricing pages.
Habits that keep it economical
Fix noisy errors
A bug that writes thousands of identical stack traces costs money in logs and wastes everyone’s attention. Fixing it saves both.
Log at the right level
Do not log debug detail at error severity.
Exclude test traffic
Keep development and load-test errors out of production projects or filter them.
Set log retention wisely
Keep detailed logs as long as you need and no longer, exporting what must be archived to cheaper storage.
Watch the bill
Set budgets with alerts that warn when logging volume jumps.
The inspector’s report is free, but the paper it is printed on and the warehouse that stores every copy are not. A leaky pipe that sends a thousand identical reports a day costs more in paper and storage than a plumber would cost to fix it.
WWhy Is My Error Missing? A Troubleshooting Path
What to check when you expect an error and the console shows nothing.
flowchart TD
S["Expected error not shown"] --> A{"Is the API enabled in this project?"}
A -->|"No"| A1["Enable it"]
A -->|"Yes"| B{"Does the error appear in Cloud Logging?"}
B -->|"No"| B1["Fix logging: agent, permissions, exclusion filters, severity"]
B -->|"Yes"| C{"Is it one log entry with a full stack trace?"}
C -->|"No"| C1["Fix log format: single entry, standard exception logging"]
C -->|"Yes"| D{"Is the time range and filter in the console correct?"}
D -->|"No"| D1["Widen time range, clear service and status filters, include muted"]
D -->|"Yes"| E["Check reporting identity permission, API quotas and retention"]
| Symptom | Likely cause | What to try |
|---|---|---|
| Nothing appears at all | API not enabled, wrong project or logs not flowing | Check project, enable API, confirm entries in Cloud Logging |
| Errors in logs but not in the list | Trace split across entries or unsupported format | Make the trace one entry in the standard language format |
| Direct reports rejected | Missing permission or wrong credentials | Grant the writer role to the service account; check authentication |
| Error appears under the wrong service | Service context missing or incorrect | Set service and version explicitly |
| Hundreds of groups for one bug | Unique values in the message or trace | Move identifiers to separate fields; stabilise messages |
| Group seems to have disappeared | Muted, resolved or outside time range | Change status filter and time range |
| Notifications not arriving | Not subscribed, wrong channel or the group is acknowledged or muted | Check notification settings and channel configuration |
| Delay before errors show | Normal processing delay | Wait a few minutes and refresh |
When in doubt, open Cloud Logging. If the error is not in the logs, Error Reporting cannot show it. If it is in the logs, the problem is in format, permissions or filters.
TA Triage Playbook for Teams
A simple, repeatable routine for handling errors every day.
Tools help only when people use them consistently. A short playbook keeps everyone in step, especially for teams that rotate on-call duty.
Daily routine
- Open the list for production, last twenty-four hours, sorted by affected users.
- Check for new groups first. Each one needs a decision: fix now, schedule, or accept.
- Check for reopened groups, which mean a regression.
- For the top three by impact, make sure each has an owner and a ticket.
- Review muted groups weekly for any that have grown.
Severity guide
| Level | Signs | Response |
|---|---|---|
| Critical | Many users affected, core flow such as payment or login failing, rapid growth | Page on-call, consider rollback, open an incident |
| High | New error on a major feature, moderate user count | Fix in the current working day |
| Medium | Steady, low-volume error with limited impact | Schedule into the next sprint |
| Low | Rare, harmless, or caused by bad input | Reduce logging severity, handle gracefully, or mute with a note |
It is a restaurant kitchen’s end-of-shift routine. Someone always checks the fridge temperatures, the cleaning list and the notes for tomorrow. The routine is boring on purpose, because boring routines catch the problems that heroic effort misses.
Track simple team measures: time from first appearance to acknowledgement, number of open groups older than a week, and number of regressions per month. Improvement in these numbers shows the process is working.
AA Worked Example: The Missing Discount Bug
Following an imaginary online shop through one real-looking incident.
“Lotus Home” is an imaginary online kitchenware shop. On Tuesday at 10:05 the team releases version 3.8 of its checkout service on Cloud Run. By lunchtime, sales are a little lower than usual, but no customer has complained. Here is how Error Reporting helps.
sequenceDiagram
participant C as Customer
participant S as Checkout v3.8
participant L as Cloud Logging
participant E as Error Reporting
participant T as Team
C->>S: Place order with promo code
S->>S: Discount value missing, exception raised
S->>L: Log exception with stack trace
L->>E: Error entry detected
E->>E: New group created for version 3.8
E->>T: New error notification
T->>E: Open group, read stack trace and samples
T->>S: Deploy fix as v3.9
T->>E: Mark group resolved
The notification
At 10:20 an email arrives: a new error group in the checkout service. The title mentions a missing discount value.
Open the group
The details page shows that the group first appeared at 10:07, only in version 3.8, with 140 occurrences and 120 distinct users already.
Read the stack trace
The top lines point to the discount step inside the total calculation, in code changed by the latest release.
Look at the surrounding logs
Using the log link, the developer sees that every failing request carried a promo code, and requests without codes succeeded.
Decide
Because it affects a core flow and is growing, the team labels it critical, acknowledges the group and links a ticket.
Respond
They roll traffic back to version 3.7 within minutes, then fix the code and release 3.9 the next morning.
Verify and close
After 3.9, no new events arrive for the group. They mark it resolved and keep an eye on it for a week.
Learn
A new automated test for promo codes is added, and the release checklist now includes a look at Error Reporting during rollout.
Without Error Reporting, the shop would have discovered the problem from a monthly sales report, after hundreds of customers had given up. With it, the team learned of the problem within fifteen minutes, like a shop assistant who rushes over the moment a till stops working.
Seeing that the error existed only in version 3.8 told the team instantly which release to suspect and which release to return to. That one label saved hours.
AAdvantages, Disadvantages and Trade-offs
An honest balance sheet before you rely on it.
Advantages
- Turns floods of events into a short, prioritised list
- Very little setup on many managed Google Cloud services
- Stack traces, versions and users in one place
- Notifications for new and returning errors
- Status workflow and ticket links aid teamwork
- Connected to logging, monitoring and trace
- Reveals problems users never report
Disadvantages
- Only sees what code reports as exceptions or error entries
- Grouping is automatic and sometimes imperfect
- Limited retention for long-term analysis
- Depends on good log formats and service context
- Simple alerting compared with dedicated monitoring tools
- Not designed for every front-end or mobile crash scenario
- Can leak sensitive data if messages are careless
Key trade-offs
| Trade-off | One side | The other side |
|---|---|---|
| Automatic versus explicit reporting | Automatic capture is quick and needs no code | Explicit reporting gives context and covers handled errors |
| Completeness versus noise | Reporting everything misses nothing | Reporting selectively keeps the list useful |
| Immediate alerts versus calm | Fast notifications catch problems early | Too many alerts cause fatigue |
| Detail versus privacy | Rich messages help debugging | Minimal messages protect sensitive data |
| Convenience versus depth | Built-in service is simple and integrated | Specialist third-party tools may offer more features |
DDesign Patterns and Anti-patterns
Habits that help, and habits that hurt.
Helpful patterns
One project per environment
Keep production errors separate from test noise, with separate access.
Central exception handler
Catch unexpected failures in one place and report them with full context.
Release-aware monitoring
Check error groups during every rollout and use rollback when a new version misbehaves.
Error budget thinking
Agree acceptable error levels, and slow feature work when the budget is spent.
Daily triage ritual
A fixed five-minute review keeps the list healthy and nothing forgotten.
Ticket-linked groups
Every acknowledged group carries a ticket address and an owner.
Anti-patterns to avoid
Never opening the console
Setting up reporting and then ignoring the list gives a false sense of safety. Errors only help if someone reads them.
Muting to look tidy
Muting real bugs to produce a clean list hides growing problems. Mute only known noise, with a recorded reason.
Secrets and personal data in messages
Printing request bodies or credentials into exceptions spreads them to many readers and long-term storage.
Unique values in every message
Putting random identifiers into messages defeats grouping and floods the list with near-duplicates.
Reporting expected events as errors
Wrong passwords, missing pages from crawlers and normal validation failures are not bugs. Reporting them buries the real failures.
Swallowing exceptions silently
Empty handlers hide failures entirely. Always log, and report what matters.
BBest Practices and Common Mistakes
A checklist you can use from your first day.
Best practices
- Enable the API and confirm that logs reach Cloud Logging in every production project.
- Set clear service names and release-based version labels everywhere.
- Log full exceptions in a single, standard-format entry.
- Keep messages stable and move changing values into separate fields.
- Report handled errors that still represent bugs, and skip purely expected events.
- Give console access by role, and keep application identities write-only.
- Agree who triages, how often and what counts as critical.
- Use Cloud Monitoring alerts on error rates for urgent cases.
- Link every acknowledged group to a ticket with an owner.
- Scrub sensitive data before it is logged.
- Export logs if you need long-term history.
- Verify current features, limits and prices in official documentation.
Common mistakes
- Using a constantly changing value as the version label.
- Mixing test and production errors in one project.
- Splitting stack traces across many log entries.
- Treating the notification email as the whole process.
- Marking groups resolved before the fix is actually deployed.
- Letting open groups pile up until nobody trusts the list.
- Expecting Error Reporting to catch silent logic bugs that raise no exception.
- Forgetting background jobs and scheduled tasks.
Day one: enable the service and send a test error. Day two: set service and version labels. Day three: agree who triages. Day four: add a Monitoring alert on error rate. Day five: run your first triage and clean the open list.
RReal-World Patterns Across Teams
Illustrative ways teams typically use Error Reporting.
Small product teams
A handful of developers use email notifications and a five-minute morning check to catch regressions after each release, without needing a dedicated operations staff.
Platform and reliability teams
Pair Error Reporting with Monitoring alerts and service objectives. Error groups guide where reliability work is needed first and feed post-incident reviews.
Teams running many microservices
Use service names to separate dozens of components, then view a project-wide list sorted by impact to find which service is the weakest link on any day.
Serverless and event-driven applications
Functions and containers scale up and down invisibly. Error Reporting provides the one place to see failures across short-lived instances that leave no server to log into.
Data and batch pipelines
Nightly jobs report failures under clear job names, so the morning team sees which step failed without scanning raw logs.
Support and customer success
Support staff with viewer access check whether a customer complaint matches a known error group, and quote the group address in tickets to speed up engineering handover.
Security and compliance reviews
Reviewers inspect error samples for leaked secrets or personal data, then require scrubbing rules before code can ship.
These are typical patterns, not claims about specific companies. For named customer stories, see the case studies published by Google Cloud.
QQuick Decision Guide: Where Does Error Reporting Fit?
A short set of questions to decide how to use it in your own project.
flowchart TD
S["Your application runs on Google Cloud?"] -->|"Yes"| A{"Do exceptions with stack traces reach Cloud Logging?"}
S -->|"No, elsewhere"| X["Use client libraries or the API with credentials"]
A -->|"Yes"| B["Enable the API and watch the console"]
A -->|"No"| C["Fix logging format or report errors directly from code"]
B --> D{"Need alerts on error volume?"}
X --> D
C --> D
D -->|"Yes"| E["Add log-based metrics and Monitoring alert policies"]
D -->|"No"| F["Use new-error notifications and daily triage"]
E --> G["Agree owners, statuses and a triage routine"]
F --> G
Questions to ask your team
- Who will read the list? A tool nobody reads is only a cost. Name a person or a rota.
- What counts as an error here? Decide in advance which events deserve a place in the list, and which are normal.
- How will we tell versions apart? Agree a version label that changes with each release and stays stable between releases.
- What may be written in messages? Set a simple rule for sensitive data, and check it in code review.
- How fast must we respond? Link response times to severity levels, so urgent and non-urgent errors are treated differently.
- How long must we keep history? If longer than the service retains, plan a log export.
Buying a smoke detector is easy. Deciding who tests the battery, where it hangs and what the family does when it sounds is the real safety plan. Error Reporting is the detector; the answers to these questions are the plan.
Begin with one production service, one owner and one daily check. Once the routine feels natural and the list stays healthy, extend the same habits to your other services.
GGlossary of Terms
Quick definitions of the words used in this guide.
| Term | Plain meaning |
|---|---|
| Error Reporting | A service that gathers, groups and shows application errors |
| Exception | A signal raised by code when something unexpected goes wrong |
| Stack trace | The chain of function calls active when a failure occurred |
| Error event | One single occurrence of a failure |
| Error group | A bundle of events judged to be the same problem |
| Service context | The service name and version attached to an error |
| Fingerprint | The shape of an error used to decide which group it belongs to |
| Resolution status | Open, acknowledged, resolved or muted |
| Regression | A fixed problem that comes back |
| Log entry | One recorded message in Cloud Logging |
| Severity | A label saying how serious a log entry is |
| Log-based metric | A count made from log entries that match a filter |
| Alert policy | A rule that notifies people when a metric crosses a threshold |
| Observability | Being able to understand a system from its logs, metrics and traces |
| Canary release | Sending a small share of traffic to a new version first |
| Rollback | Returning to a previous version |
| Error storm | A sudden flood of errors, often from one failing dependency |
| IAM | The system that decides who may do what |
| Alert fatigue | Ignoring alerts because there are too many of them |
FFrequently Asked Questions
Often not. On many managed Google Cloud services, exceptions written to the logs with a stack trace are detected automatically. For more control, use client libraries, the API or structured log entries.
Yes, applications elsewhere can report through the API or client libraries with suitable credentials and a Google Cloud project to receive the errors.
Logging stores every message. Error Reporting extracts the failures, groups them, counts them and tracks their status. Think of logging as the archive and Error Reporting as the summarised front page.
Monitoring watches numbers and alerts on thresholds. Error Reporting explains which specific errors exist and where in the code they happen. Use them together.
Usually because messages contain changing values or stack traces differ slightly. Keep messages stable and put variable details in separate fields.
The group returns to open, and a notification can be sent, which helps you catch regressions.
For a limited time, commonly around thirty days of event data. Export logs if you need longer history, and confirm the current retention period in the documentation.
The service has typically been offered without a separate fee, but logging, monitoring and network usage around it can cost money. Check current pricing pages.
Error Reporting is mainly designed for server-side applications. For mobile apps and browsers, dedicated crash reporting tools are usually better; check current guidance for your platform.
Yes, through Cloud Monitoring notification channels connected to alert policies, and sometimes through other integrations. Configure them according to the current documentation.
Fix the code so the data is not logged, restrict access to the affected project, and ask your security team about deleting the exposed entries according to your policy.
SSummary and Key Takeaways
The whole guide in one short page.
Error Reporting turns the raw noise of application failures into a short, prioritised list of distinct problems. It collects exceptions from Cloud Logging or directly through its API, groups the repeats using the shape of the stack trace, counts occurrences and affected users, and labels each problem with the service and version where it appeared. Statuses, ticket links and notifications turn the list into a shared workflow, while Cloud Monitoring adds precise alerts. The service works best when your code logs full exceptions in standard formats, names its services and versions sensibly, keeps sensitive data out of messages, and when a team reviews the list on a regular routine.
Key takeaways
- Error Reporting groups many error events into a few meaningful problems, showing counts, users, first seen and last seen.
- Errors arrive automatically from Cloud Logging on many Google Cloud services, or through client libraries, the API and structured log entries.
- Always set a stable service name and a release-based version so you can separate components and spot regressions.
- Log full exceptions as single entries with stable messages, and never put secrets or personal data into error text.
- Use statuses and ticket links as a workflow, and keep the open list short with a regular triage routine.
- Combine new-error notifications with Cloud Monitoring alerts on error rates, and avoid alert fatigue.
- Remember limited retention, nearby logging costs and changing limits, and confirm current details in the official documentation.