Skip to content
Metric VaultHelp Center
Open app

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_DB bound. 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.

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:

ScopeWritten whenCarries
allEvery premium AI tool run, success or failureruns, errors, duration
tool:<toolId>The same runs, per toolruns, errors, duration, cache hit or miss
provider:<vendor>Every upstream call to DataForSEO, OpenAI or Anthropiccalls, 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#

FieldPopulated byNotes
runsTool scopes and provider scopesOne per run or per upstream call
errorsBothA non-OK response
dur_sumBothTotal milliseconds. Mean latency is this divided by runs
cache_hit / cache_misstool: scopes onlyA hit is a run served from the shared result cache
cost_microsprovider: scopes onlyUSD multiplied by one million
tokens_in / tokens_outAI provider scopes onlyReal token counts returned by the vendor
timeoutsprovider:dataforseo onlyRecorded when the provider call throws
quota_hitsNothingThe column exists and is never incremented
Warning

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#

  1. Select System Health in the Operations group.
  2. Choose a range: Last 24 hours or Last 7 days. The request is clamped to 168 hours and 2,000 rows regardless of what is asked for.
  3. Read the four tiles across the top.
TileValueSub-label
Total runsRuns on the all scope in the windowlast 24 hours or last 7 days
Error rateErrors as a percentage of runs, one decimal. Turns red at 10% or above<n> of <n> failed
Mean latencyTotal duration divided by runs, shown in ms below one second and seconds aboveper run
Provider costSum of every provider: scope, four decimal places<n> provider calls (est)
  1. Below the tiles, one card per provider shows spend, calls, errors and latency, plus tokens in / out when the provider reports tokens. Cards are ordered by spend.
  2. Seven charts follow: Runs & errors / hour, Provider cost / hour and Runs by tool (top eight), then Cache hit rate / hour, Average run time / hour, Quota blocks & timeouts / hour and AI 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.
  3. The Tool health table lists every tool with activity in the window: Tool | Runs | Errors | Error % | Avg latency | Cache hit % | Timeouts.
BadgeRule
idleNo runs in the window
downError rate at or above 50%
degradedError rate at or above 10%, or any recorded timeout
healthyEverything else
  1. Below that sit Grouped issues and Recent admin actions, documented in Error log and resolution and Audit log.
Screenshot
The System Health screen showing the four metric tiles, the per-provider cards and the Runs and errors chart.

Read the Usage & Credits screen#

  1. Select Usage & Activity in the Account group. The screen title is Usage & Credits.
  2. 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 not starter.
  3. Filter with Search by email... and the plan select (All plans, Free, Starter, Pro, Agency, Enterprise, Unlimited).
  4. The Credits & Runs by User table shows User 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.
  5. Top tools by credits — this month charts the twelve highest-credit tools across all customers.
  6. Export CSV writes the filtered rows to metricvault-usage-<date>.csv with the header Email,Plan,AI runs,Tool runs,Total runs,Month,Last run.
Note

Note: Refresh on this screen re-fetches from the server. The filters and the plan select only re-render what is already loaded.

Screenshot
The Usage and Credits screen showing the four stat cards, the plan filter and the Credits and Runs by User table.

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.

TileValueSub-label
Runs (24h)Runs on the all scopeacross all tools
Error rate (24h)Percentage, red at 10% or above<n> failed
Provider cost (24h)Two decimal placesAI + data (est)
Open issuesIssues whose status is not resolved, so unresolved plus regressedneed attention, or all clear at zero
Paying customersFrom 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 all and tool: scopes. Traffic that does not pass through it is invisible here. Total runs is 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#

SymptomLikely causeFix
Metrics unavailable with an error messageThe metrics endpoint returned an error or the request threwRead 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 rangeWiden the range to Last 7 days, or confirm activity in the Run Log
Provider cost is zero but there is clear trafficOnly vendors with a matching price entry produce an estimate, and DataForSEO reports zero cost on cached or free endpointsCheck the per-provider cards for calls and tokens, which are recorded regardless
A tool shows down but customers report no problemA small number of runs, all failing, produces a 100% error rateRead the Runs count next to the badge before escalating
Usage table seems to be missing customersThe table renders at most 200 rowsNarrow with the email search or the plan filter, or use the CSV export
Command Center never updatesThe tab is in the background. The interval only fires when the document is visibleBring 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?