Metrics and usage analytics
What the System Health, Command Center and Usage screens measure, where each number comes from, and which fields are meaningful versus structurally always zero.
Last updated 2026-08-06
Summary#
Three screens report numbers. System Health reads an hourly telemetry rollup and reports runs, errors, latency, cache behavior and provider spend. Usage & Credits reads the billing counters and reports who is running what this month. The Command Center on the Dashboard merges both into a live pulse that refreshes on its own. This page explains exactly which write path feeds each number, so you can tell a real zero from a field that is never populated.
Purpose#
Operating the platform needs answers to two questions with different shapes. "Is the system healthy and what is it costing us right now?" is a time-series question that must stay cheap to compute however many customers exist. "Who is consuming credits and on what plan?" is a per-customer question. The telemetry rollup was designed for the first: one row per hour per scope, so its size grows with tools and hours rather than with users or events. The usage counters serve the second and are the same rows that bill the customer.
Requirements#
- An active admin session. See Getting admin access.
MONITOR_DBbound. Every number on all three screens comes from D1.- Nothing else. All three screens are read-only.
Permissions#
Both admin and owner see all three screens and every number on them. Nothing here is owner-gated, because nothing here mutates state.
Navigation Path#
Admin console → Operations → System Health
Admin console → Account → Usage & Activity
Admin console → Main → Dashboard (the System pulse block, below the fold)
The telemetry model#
Health data lives in one hourly rollup table. Every write is an upsert into a row keyed by the unix hour and a scope string. Three scope shapes exist:
| Scope | Written when | Carries |
|---|---|---|
all | Every premium AI tool run, success or failure | runs, errors, duration |
tool:<toolId> | The same runs, per tool | runs, errors, duration, cache hit or miss |
provider:<vendor> | Every upstream call to DataForSEO, OpenAI or Anthropic | calls, errors, duration, cost, tokens |
Writes are deferred off the request path and every failure is swallowed. Telemetry can never slow a run down or break one. It also means a burst of traffic during a worker restart can lose a few counts. Treat these numbers as accurate to within a rounding error, not as an accounting ledger.
Fields, and which are real#
| Field | Populated by | Notes |
|---|---|---|
runs | Tool scopes and provider scopes | One per run or per upstream call |
errors | Both | A non-OK response |
dur_sum | Both | Total milliseconds. Mean latency is this divided by runs |
cache_hit / cache_miss | tool: scopes only | A hit is a run served from the shared result cache |
cost_micros | provider: scopes only | USD multiplied by one million |
tokens_in / tokens_out | AI provider scopes only | Real token counts returned by the vendor |
timeouts | provider:dataforseo only | Recorded when the provider call throws |
quota_hits | Nothing | The column exists and is never incremented |
Warning: Because timeouts is only ever written against the DataForSEO provider scope, the Timeouts column in the Tool health table is structurally always 0, and the degraded badge can never be triggered by its timeout clause. Use the Timeouts only filter on Workflow Failures for per-step timeouts instead. See Error log and resolution.
How provider cost is calculated#
DataForSEO returns a real cost value in USD on each response, and that figure is recorded as-is. AI spend is estimated: token counts are real, and they are multiplied by a per-model price table held in the worker. A model missing from that table records its tokens with a zero-dollar estimate, so its usage is visible while its cost is not. Every label on screen says (est) for this reason.
Step-by-Step Guide#
Read the System Health screen#
- Select System Health in the Operations group.
- Choose a range:
Last 24 hoursorLast 7 days. The request is clamped to 168 hours and 2,000 rows regardless of what is asked for. - Read the four tiles across the top.
| Tile | Value | Sub-label |
|---|---|---|
Total runs | Runs on the all scope in the window | last 24 hours or last 7 days |
Error rate | Errors as a percentage of runs, one decimal. Turns red at 10% or above | <n> of <n> failed |
Mean latency | Total duration divided by runs, shown in ms below one second and seconds above | per run |
Provider cost | Sum of every provider: scope, four decimal places | <n> provider calls (est) |
- Below the tiles, one card per provider shows spend, calls, errors and latency, plus
tokens in / outwhen the provider reports tokens. Cards are ordered by spend. - Seven charts follow:
Runs & errors / hour,Provider cost / hourandRuns by tool(top eight), thenCache hit rate / hour,Average run time / hour,Quota blocks & timeouts / hourandAI tokens / hour. Every time chart carries a peak label, the last value per series next to its color chip, start and end times, and a crosshair tooltip on hover showing the hour's exact values. - The Tool health table lists every tool with activity in the window:
Tool | Runs | Errors | Error % | Avg latency | Cache hit % | Timeouts.
| Badge | Rule |
|---|---|
idle | No runs in the window |
down | Error rate at or above 50% |
degraded | Error rate at or above 10%, or any recorded timeout |
healthy | Everything else |
- Below that sit Grouped issues and Recent admin actions, documented in Error log and resolution and Audit log.
Read the Usage & Credits screen#
- Select Usage & Activity in the Account group. The screen title is
Usage & Credits. - Four stat cards summarize the current calendar month:
Active this month/Users with activity;AI runs (this month)/Premium AI tool runs;Tool runs (this month)/SEO tool runs;Paying customers/On a paid plan. A paying customer is anyone whose resolved plan is notstarter. - Filter with
Search by email...and the plan select (All plans,Free,Starter,Pro,Agency,Enterprise,Unlimited). - The
Credits & Runs by Usertable showsUser Email | Plan | AI runs | Tool runs | Total runs | Month | Last run, sorted by last run. At most 200 rows are rendered, so on a large account base the table is a recent-activity sample, not a complete list. The header count reflects what is drawn. Top tools by credits — this monthcharts the twelve highest-credit tools across all customers.- Export CSV writes the filtered rows to
metricvault-usage-<date>.csvwith the headerEmail,Plan,AI runs,Tool runs,Total runs,Month,Last run.
Note: Refresh on this screen re-fetches from the server. The filters and the plan select only re-render what is already loaded.
Read the Command Center#
The System pulse block sits below the fold on the Dashboard. It loads about 1.4 seconds after the console opens, again on every Dashboard nav click and on Refresh, and on a 45-second interval while the browser tab is visible. The updated <time> stamp tells you when it last ran.
| Tile | Value | Sub-label |
|---|---|---|
Runs (24h) | Runs on the all scope | across all tools |
Error rate (24h) | Percentage, red at 10% or above | <n> failed |
Provider cost (24h) | Two decimal places | AI + data (est) |
Open issues | Issues whose status is not resolved, so unresolved plus regressed | need attention, or all clear at zero |
Paying customers | From the subscriber aggregate | <n> active this month |
Three charts follow (Runs & errors / hour, Plan mix, New customers / day) and a Recent activity table that merges the audit log with the twenty newest error issues, sorted by time and capped at fourteen rows. New customers / day shows Not enough signup history yet. until there are at least two days of signups.
Interpreting the numbers#
- Mean latency includes cache hits. A run served from the shared cache is fast and still counts as a run, so a rising cache hit rate pulls the mean down without anything getting faster. Read latency and cache hit percentage together. See Tools and cache management.
- Runs are not credits. The health rollup counts executions. Credits are counted separately in the billing counters, and a free tool consumes none. Use Usage & Credits for anything cost-related to customers, and the provider cards for anything cost-related to us.
- Only the premium AI route feeds the
allandtool:scopes. Traffic that does not pass through it is invisible here.Total runsis a measure of that route, not of every request the worker serves. - A 24-hour window on a low-traffic hour looks alarming. Error rate over three runs is not a signal. Check the Runs value before reacting to a percentage.
Troubleshooting#
| Symptom | Likely cause | Fix |
|---|---|---|
Metrics unavailable with an error message | The metrics endpoint returned an error or the request threw | Read the message. Unauthorized means the session expired, so sign in again |
No tool activity in this window yet. | No premium AI runs in the selected range | Widen the range to Last 7 days, or confirm activity in the Run Log |
| Provider cost is zero but there is clear traffic | Only vendors with a matching price entry produce an estimate, and DataForSEO reports zero cost on cached or free endpoints | Check the per-provider cards for calls and tokens, which are recorded regardless |
A tool shows down but customers report no problem | A small number of runs, all failing, produces a 100% error rate | Read the Runs count next to the badge before escalating |
| Usage table seems to be missing customers | The table renders at most 200 rows | Narrow with the email search or the plan filter, or use the CSV export |
| Command Center never updates | The tab is in the background. The interval only fires when the document is visible | Bring the tab to the foreground, or press Refresh |
FAQs#
How far back does the health data go? The range control offers 24 hours and 7 days, and the endpoint refuses anything above 168 hours. Older rows remain in the table but the console has no way to ask for them.
Is any of this data pruned? No. There is no retention job for the rollup table. It grows with hours and scopes rather than with events, which is what keeps it small.
Do these screens cost anything to open? No. They are database reads. No provider call is made and no customer is billed for anything an admin views.
Why is quota_hits in the data model if it is never written? The column was defined with the rest of the rollup before the quota gate was wired to it. It is reserved, not broken, but nothing populates it today and no screen displays it.
Can I see an individual customer's usage rather than the aggregate? Yes, on the Customers screen, which reports plan, quota, used, remaining and the AI-versus-tool split for one email. See Customer lookup and billing.
Can I export the health data? Not from this screen. Only the audit log and the usage table have CSV exports.
See also
Was this article helpful?
Thanks — feedback noted for the docs team.