Dashboards
Time-bucketed charts of your events. Pick a predicate, group, time window, and chart type - we render it.
Dashboards
A dashboard is one saved query rendered as a chart over a time window. Pick a small predicate (severity:error, dataset:player-actions), optionally slice by dataset, event, or severity, choose the time window and chart type, and the dashboard renders a time-bucketed chart of event counts.
Use dashboards for the ops views you want at a glance: errors per minute, kicks per hour, transactions per day. Each dashboard is one chart. To build a multi-pane view, create several dashboards and visit the index page when you need them.
The index page
Logs ▸ Dashboards. Card grid, one card per saved dashboard. Filter chips on the left flip between:
- ALL - every active (non-archived) dashboard in the project
- MINE - just the ones you created
- ARCHIVED - everything you have archived (defer-cleanup view)
On the right of the strip, the DASHBOARDS · N / M chip shows your slot usage against your plan. Click + NEW DASHBOARD to open the create form.
| Plan | Dashboards |
|---|---|
| Hobby | 2 |
| Pro | 25 |
| Scale | Unlimited |
The predicate language
The predicate is what filters the chart. It's deliberately small: dashboards read from a rolled-up storage table that only carries dataset, event, and severity columns, so allowing arbitrary payload filters would silently match nothing.
Grammar:
predicate := clause (AND clause)*
clause := key ':' value (',' value)*
key := dataset | event | severity
value := lowercase identifier (a-z, 0-9, _, -)Examples:
severity:error
severity:warn,error,critical
dataset:player-actions AND severity:error
event:login,logout AND dataset:authThe empty string is a valid predicate (no filter, count everything).
If you want richer filters (payload fields, free-text matching, etc.), use the search page. Dashboards are intentionally fast and simple.
Group by
Optional. Slices the chart into multiple series:
- NONE - one series, total event count per bucket
- dataset - one series per dataset that appears in the window
- event - one series per distinct event name
- severity - one series per severity level (uses the canonical ordering: trace, debug, info, warn, error, fatal)
Only one group-by field at a time in v1.
Time windows and bucket sizes
Pick a window; we pick the bucket size:
| Window | Bucket | Buckets/chart |
|---|---|---|
| 1h | 1 minute | 60 |
| 24h | 15 minutes | 96 |
| 7d | 1 hour | 168 |
| 30d | 4 hours | 180 |
Tuned for ~60-180 data points per chart - enough density to read trends, sparse enough to read individual buckets.
Chart types
- BAR - vertical bars per bucket, stacked when grouped
- LINE - one line per series
- STACKED - filled area chart, series stacked
- TABLE - sum per series, sorted by total descending. Useful for "top N" views without rendering a chart.
Refresh
Dashboards do not auto-poll in v1. Click REFRESH at the top of the chart to re-run the query. Auto-refresh is on the roadmap; tell us if you need it sooner.
Save as dashboard from search
The search page has a ◰ SAVE AS DASHBOARD button next to the regular save button. Click it to open the new-dashboard form with the current query pre-populated. If your search query is full SOQL with payload predicates or OR / NOT clauses, the form will tell you which parts aren't supported as a dashboard predicate.
Archive is reversible
Archive hides a dashboard from the default list. To bring it back, open the ARCHIVED filter, click the row, and use the UNARCHIVE button on the Settings tab. Nothing is deleted; the row sits in storage with archived_at stamped.
This means dashboards behave the same way datasets do: archive is for cleanup, not destruction.
Common error responses
If you hit one of these on save:
| Code | Meaning |
|---|---|
nameRequired / nameTooLong | Name is empty or longer than 100 characters |
queryInvalid | Predicate failed the grammar check |
queryTooLong | Predicate is longer than 1024 characters |
groupByInvalid | Group by must be dataset, event, severity, or none |
timeWindowInvalid | Time window must be 1h, 24h, 7d, or 30d |
chartTypeInvalid | Chart type must be bar, line, stacked, or table |
dashboardCapExceeded | You are at your plan's dashboard cap; archive one or upgrade |
What this page does NOT do
- It does not let you compose multi-pane dashboards. One query, one chart. v2.
- It does not let you build dashboards on payload fields. They are not in the rollup; use search instead.
- It does not auto-refresh. Click REFRESH.
- It does not share dashboards publicly. Org members with LOGS READ can view; outside that, they cannot.
- It does not export the chart as PNG / CSV. On the roadmap.
Retention
How long ServerOps keeps your logs, what happens when you change plan or cancel, and how the recovery window protects you from losing your audit trail.
Alerts
Notify Discord (and eventually email, HTTP, Slack) when matching events cross a threshold. Three rule shapes: any match, count exceeds, no matches.