The Operations dashboard provides visibility into your application's performance, errors, and resource usage through a collection of pre-built charts.
Overview
HTTP status codes
Tracks HTTP requests received by your environment over time, grouped by HTTP status code.
This includes requests made from your app's internal business logic to your app's API, including both Public API and Internal API requests.
Note that HTTP status code 101 is returned by your environment when processing WebSocket upgrade requests. WebSockets are used by the Gadget API to implement database transactions, as well as live queries.
Errors
Shows all errors occurring in your environment over time. This includes errors that may be logged at the warn level and errors that will be retried.
Breakdowns
Code: Groups errors by error type or code.
Message: Groups errors by the specific message emitted.
Source: Groups errors by the source of the request that encountered the error, such as the webhook topic, background action, or action.
Platform operations
Shows the billable platform operations your environment generates over time. These operations consume credits.
Breakdowns
Source type: Groups operations by category of platform operations.
Source: Shows the specific job, action, or workflow generating the operations.
Install: Shows the tenant responsible for the operation.
This chart takes up to a minute to update. The latest data may not be available immediately.
Active CPU time
Shows the amount of active serverless CPU time used by your application while code was actively running. Time spent waiting on IO (such as database queries, API calls, or LLM requests) is not included in this metric.
This chart displays two types of CPU usage:
CPU time: CPU time used within your plan's normal concurrency limits, billed at the standard rate.
Surge CPU time: CPU time used above your concurrency limit to run high-priority requests. Surge CPU time is billed at a higher rate and only applies while surge capacity is in use.
Request rate limit usage
Monitors how close your environment is to exceeding its request rate limit over time.
Breakdowns
Request type: Breaks usage down by the type of request consuming the limit.
External: Requests to your app's API that originate outside the Gadget runtime, such as browsers, external services, and third-party API clients.
Internal: Requests to your app's API that originate inside the Gadget runtime, such as action code and api.* calls.
Background: Background actions starting execution after an api.enqueue call.
Shows the total number of actions attempted over time. This includes every action invocation Gadget attempts to run, regardless of outcome.
Breakdowns
Action type: Broken down by action type, as model create, model update, model delete, model custom, or global.
Action: Breaks attempts down by the action's API identifier.
Install: Breaks attempts down by the install the action is associated with.
Scheduled actions attempted
Shows the total number of action attempts initiated by the scheduler trigger over time. This includes every scheduled action invocation Gadget attempts to run, regardless of outcome.
Breakdowns
Action: Breaks attempts down by the specific action being invoked.
Worker health
Gadget monitors runtime health metrics for each serverless worker powering your app. Learn more about worker lifecycle and management in the runtime environment guide.
Worker event loop utilization
Shows the maximum event loop utilization percentage for each serverless worker powering your environment.
Event-loop utilization is a Node.js-specific measure of how busy your workers are. A value of 100% means the event loop is fully utilized, and 0% means the event loop is idle. Ideally, event loop utilization should be below 75%, as higher utilization can lead to event loop blocks, which causes performance and responsiveness issues.
Read more about the Gadget runtime environment in the runtime environment guide.
Worker memory usage
Tracks the maximum memory usage for each worker instance.
This metric measures the system-level, non-evictable memory usage for each worker instance. This includes memory used by the Node.js process, like in-flight data, application code, and any memory allocated by native extensions. This also includes any memory consumed by subprocesses, like Playwright browsers or similar.
Read more about the Gadget runtime environment in the runtime environment guide.
Worker CPU usage
Shows the average CPU usage for each worker instance.
This metric measures the system-level CPU usage for each worker instance. This includes CPU used by the Node.js main thread, CPU used by Node.js worker threads, and CPU used by any subprocesses, like Playwright browsers or similar.
Read more about the Gadget runtime environment in the runtime environment guide.
Worker count
Displays the number of distinct worker instances running your application over time.
This metric tracks the number of distinct worker instances running your application over time. This includes both workers that are actively processing requests, and workers that are idle and waiting for requests. You may see the active worker count fluctuate as load on your application goes up and down, or as Gadget starts and stops workers for platform maintenance.
Read more about worker lifecycle and scaling in the runtime environment guide.
Database
Database queries
Tracks the total number of database queries over time. This includes both read and write queries.
Breakdowns
Model: Groups by the models queried.
Query type: Groups by read and write operations.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.
Database bytes read
Tracks the total bytes read within the database over time.
This metric shows how many bytes Postgres reads to fulfill your queries:
Simple read queries (such as findById or findOne) read very little data.
More complex read queries (such as findByFilterSort) read more data, as Postgres must scan multiple indexes and the table heap.
Computed fields and computed views may read significantly more data, since Postgres may need to scan large portions of multiple tables.
This metric is instrumented directly within Postgres and tracks the exact number of bytes read from any database storage subsystem to fulfill each query.
Breakdowns
Model: Groups by the models queried.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.
Database read queries
Tracks the total number of database read queries executed over time.
Breakdowns
Model: Groups by the models queried.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.
Database bytes written
Tracks the total bytes written within the database over time.
This metric shows how many bytes Postgres writes to fulfill write queries. This includes bytes written to:
The table heap
The WAL
The table's indexes
Common drivers of this metric include writing many rows, writing to models with many fields, or writing to models with many indexed fields.
This metric is instrumented directly within Postgres and tracks the exact number of bytes written to any database storage subsystem to fulfill a query.
Breakdowns
Model: Groups by the model being written to.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.
Database write queries
Tracks the total number of database write queries executed over time. Write queries include operations that create, update, or delete records.
Breakdowns
Model: Groups write queries by the model being written to.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.
Fields indexed for sort and filter
Shows the sort and filter index usage for each model field.
Tracks database rate limit usage over time for your environment.
The database rate limit caps the total amount of time spent running database queries within a 10 second window. Usage is measured in milliseconds, and each database query consumes rate limit capacity for the duration of time it runs.
Database storage
Shows database storage usage over time for your environment.
Breakdowns
Model: Breaks storage usage down by individual models.
Learn how database storage is billed and prorated in the billing guide.
This chart takes up to an hour to update. The latest data may not be available immediately.
File storage
Shows file storage usage over time for your environment.
Breakdowns
Model: Breaks storage usage down by individual models.
Learn how file storage is billed and prorated in the billing guide.
This chart takes up to an hour to update. The latest data may not be available immediately.
Search
Search requests
Tracks the volume of search queries executed over time.
Breakdowns
Model: Groups search requests by the model being queried.
This chart takes up to an hour to update. The latest data may not be available immediately.
Search read queries
Tracks the total number of search read queries executed over time.
Search read queries occur when your environment reads from the search index to retrieve matching records.
This chart takes up to a minute to update. The latest data may not be available immediately.
Search bytes written
Tracks the total number of bytes written to your environment's search indexes over time.
This metric reflects how much data is written to search indexes as records are created, updated, or reindexed.
This chart takes up to a minute to update. The latest data may not be available immediately.
Search write queries
Tracks the total number of search write queries executed over time against your application's search indexes.
Search write queries occur when records are added to, updated in, or removed from the search index.
This chart takes up to a minute to update. The latest data may not be available immediately.
Models indexed for search
Shows search index usage for each model in your application.
Shows the storage used by Elasticsearch search indexes backing your environment over time.
Breakdowns
Model: Breaks storage usage down by individual models.
This chart takes up to an hour to update. The latest data may not be available immediately.
Background actions
Background action attempts
Shows all background action attempts over time.
This chart counts every attempt to run a background action. A single background action may have multiple attempts due to retries, and each attempt is counted separately. Cancelled attempts are also included.
Breakdowns
Queue: Groups attempts by the queue the action ran in.
Action: Groups attempts by the specific background action.
Queued background actions
Displays the peak number of background actions waiting in queues over time.
This chart shows how many background actions were queued and waiting to run at each point in time. Actions that were actively running are not included in this count.
Breakdowns
Queue: Breaks queued actions down by queue.
Failed background action attempts
Shows the number of failed background action attempts over time.
This chart counts every failed attempt to run a background action. If an action is retried multiple times and fails repeatedly, each failed attempt is counted separately.
Breakdowns
Queue: Groups failed attempts by the queue they ran in.
Action: Groups failed attempts by the specific background action.
Retries: Groups failed attempts by retry attempt number.
Running background actions
Shows the peak number of background actions running at each point in time.
This chart reflects instantaneous concurrency, not total executions. It shows how many background actions were actively running at a given moment, not how many actions ran overall.
Breakdowns
Queue: Breaks running background actions down by queue.
Cancelled background actions
Tracks background action attempts that were cancelled over time.
These actions are explicitly cancelled and are no longer eligible to run. Each cancelled attempt is counted separately.
Breakdowns
Queue: Groups cancelled actions by the queue they were in.
Action: Groups cancelled actions by the specific background action.
Retries: Groups cancelled actions by retry attempt number.
Traffic
Route requests
Shows the number of requests made to your environment's HTTP routes over time.
This includes requests to both web routes and API routes handled by your environment.
Breakdowns
Route: Breaks requests down by individual route.
Route errors
Shows errors related to HTTP routes over time.
This chart includes requests to both web routes and API routes that resulted in error responses.
Breakdowns
Code: Groups errors by HTTP response status code.
Message: Groups errors by the error message returned by the route.
Outbound bandwidth
Tracks the total bandwidth served from your app's edge network over time. This is the amount of data your environment serves to clients.
This includes:
GraphQL responses served by your API
HTML responses served by routes
Raw file data served from File storage
This chart takes up to 12 hours to update, and aggregates data to the nearest hour. The latest data may not be available immediately.
Average page load time
Monitors the average and maximum page load times for your environment's routes.
This metric reflects how long web and api routes take to load for end users and helps identify slow or inconsistent performance.
This metric requires the web-performance.min.js script, which is included in Gadget applications by default. If this script has been removed, page load timing data will not be available.
Breakdowns
Route: Breaks page load times down by individual routes.
Shopify
Shopify API calls
Tracks all outbound API calls made from your environment to Shopify's API over time.
This includes GraphQL requests made to the Shopify admin API and when fetching non-webhooked fields.
Breakdowns
Status code: Groups API calls by HTTP response status code.
Install: Groups API calls by the Shopify shop (install) the calls are made for.
Shopify rate limit errors
This chart tracks API calls to Shopify that returned HTTP 429 (SHOPIFY_RATE_LIMIT_ERROR: too many requests) responses, indicating that Shopify rate limits were exceeded.
Breakdowns
Install: Groups rate limit errors by the Shopify shop (install) the calls were made for.
Webhooks
Shows the count of incoming Shopify webhook payloads received by your environment over time.
Breakdowns
Topic: Groups webhook payloads by the Shopify webhook topic.
Install: Groups webhook payloads by the Shopify shop (install) they were sent for.
Webhook triggered actions
Shows the count of actions triggered by Shopify webhooks over time.
This chart includes actions triggered directly by incoming Shopify webhooks, as well as actions triggered by Gadget’s internal missed-webhook reconciliation process.
Because webhook reconciliation runs periodically, it may trigger actions for multiple missed webhooks at once. This can result in periodic spikes in this chart, even when real-time webhook traffic is steady.
Breakdowns
Topic: Groups triggered actions by Shopify webhook topic.
Model: Groups triggered actions by the model affected.
Action: Groups triggered actions by the specific action that ran.
Install: Groups triggered actions by the Shopify shop (install).
Sync triggered actions
Shows the count of actions triggered by Shopify syncs over time.
These actions are generated when Gadget runs Shopify syncs to fetch or reconcile data from Shopify, rather than from real-time webhooks.
Breakdowns
Source: Groups triggered actions by the sync source that initiated them.
Install: Groups triggered actions by the Shopify shop (install).
Webhook reconciliation runs periodically to detect and recover missed Shopify webhooks. When missing events are found, Gadget triggers the appropriate actions to bring your data back into sync.
Because reconciliation runs in batches, this chart commonly shows periodic spikes when the reconciliation process executes.
Breakdowns
Source: Groups triggered actions by the reconciliation source that initiated them.
Install: Groups triggered actions by the Shopify shop (install).
Active installs
Tracks the number of active Shopify installs for your environment over time.
An active install represents a Shopify shop that currently has your Shopify app installed.
This chart takes up to 10 minutes to update. The latest data may not be available immediately.