Dashboards maakt van de tabellen in je sitedatabases en je warehouse grafieken, cijfers en tabellen die iedereen op je account kan openen — Grafana-achtig, met een tijdkiezer, automatisch verversen en variabelen, maar zonder iets te installeren. Je vindt het in de zijbalk, naast Databases.
Wat een dashboard is
Een dashboard is een raster van 24 kolommen met panelen. Elk paneel is één alleen-lezen SQL-query op één van je databases (de MariaDB- of PostgreSQL-database van een site, of een warehouse-database die een job of een import vult) en één manier om het resultaat te tonen:
- Tijdreeks — lijnen, vlakken of staven in de tijd; meerdere reeksen uit meerdere numerieke kolommen of uit een groepskolom;
- Staaf — categorieën naast elkaar, horizontaal of verticaal;
- Stat — één getal met een sparkline en drempelkleuren;
- Meter — een waarde op een boog tussen een minimum en een maximum;
- Tabel — sorteerbare rijen, met eenheden per kolom;
- Taart — aandelen van een geheel, als taart of donut.
Druk op e om te bewerken en panelen te verslepen, v om terug te gaan naar kijken, t voor de tijdkiezer, f voor een paneel op volledig scherm en Esc om de paneeleditor te sluiten. Elk dashboard bewaart zijn laatste 20 opgeslagen versies, kan een ster krijgen, gedupliceerd worden en geëxporteerd worden als JSON-bestand (veldhost.dashboard/v1) dat in elk account te importeren is.
Tijd en verversen
De tijdkiezer biedt de gebruikelijke keuzes (laatste 5 minuten tot laatste 90 dagen), een absoluut bereik en de now-…-notatie: now-24h, now-7d, now/d (sinds middernacht), now-1d/d (gisteren, hele dag), met eenheden s m h d w M y. Het bereik staat in de URL (?from=now-7d&to=now), dus een link opent precies wat jij zag. Automatisch verversen staat uit, of op 30 s, 1, 5 of 15 minuten, en pauzeert zolang het tabblad verborgen is. Dashboards zijn UTC: elke query draait met de sessietijdzone op UTC en de tijdmacro's zijn epoch-gebaseerd, dus dezelfde query geeft dezelfde buckets op MariaDB en PostgreSQL.
Macro's
Paneel-SQL mag deze macro's gebruiken. Ze worden op de server uitgewerkt, voor het huidige tijdbereik, vóórdat de alleen-lezen-controle de opdracht bekijkt — de database ziet dus altijd gewone SQL. F en T zijn begin en einde van het bereik als epoch-seconden; N is de automatische bucketbreedte in seconden (de kleinste stap van 1 s tot 30 d die een reeks onder het maximum aantal punten van het paneel houdt, nooit kleiner dan het minimuminterval).
| Macro | MariaDB | PostgreSQL |
|---|---|---|
$__timeFilter(col) | (col >= FROM_UNIXTIME(F) AND col < FROM_UNIXTIME(T)) | (col >= to_timestamp(F) AND col < to_timestamp(T)) |
$__timeFrom() / $__timeTo() | FROM_UNIXTIME(F) / FROM_UNIXTIME(T) | to_timestamp(F) / to_timestamp(T) |
$__unixEpochFilter(col) | (col >= F AND col < T) | |
$__unixEpochFrom() / $__unixEpochTo() | F / T | |
$__interval | INTERVAL N SECOND | INTERVAL 'N seconds' |
$__interval_s, $__range_s | de bucketbreedte / de lengte van het bereik, in seconden | |
$__timeGroup(col[, iv]) | FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(col) / N) * N) | to_timestamp(floor(extract(epoch from col) / N) * N) |
$__timeGroupAlias(col[, iv]) | … AS `time` | … AS "time" |
iv is $__interval (de standaard) of een letterlijke waarde als 5m, 1h, 1d; een bucket smaller dan het minimuminterval van het paneel wordt verbreed. De kolom moet een gewone of aangehaalde kolomnaam zijn — een expressie wordt geweigerd. Een tijdreekspaneel verwacht een eerste kolom met de naam time:
-- gebeurtenissen per bucket (MariaDB en PostgreSQL gelijk)
SELECT $__timeGroupAlias(created_at, $__interval), count(*) AS events
FROM analytics_events
WHERE $__timeFilter(created_at)
GROUP BY 1 ORDER BY 1
-- populairste pagina's in het bereik, voor een staafpaneel
SELECT path, count(*) AS hits
FROM analytics_events
WHERE $__timeFilter(created_at)
GROUP BY 1 ORDER BY 2 DESC LIMIT 10
Variabelen
Een variabele is een keuzelijst (of een tekstvak) onder de bovenbalk waarvan de waarde in elk paneel terechtkomt dat ernaar verwijst, en in de URL (?var-site=shop). Drie soorten:
- custom — een vaste lijst van waarde/label-paren;
- query — de eerste kolom van een query is de waarde, de tweede (indien aanwezig) het label; de query mag de macro's en andere variabelen gebruiken;
- textbox — vrije tekst; met validate: number wordt alleen een getal geaccepteerd.
Verwijs naar een variabele als ${site} of $site. De waarde wordt altijd ingevoegd als een complete tekstliteral, aangehaald voor de database — WHERE site = ${site}, nooit WHERE site = '${site}'. Een meervoudige keuze wordt een door komma's gescheiden lijst van literals (WHERE site IN (${site})), "Alles" wordt elke optie (tot 500), een lege keuze wordt NULL, en een getallenvak voegt kale cijfers in. Er is geen ruwe modus: een waarde kan nooit de vorm van de query veranderen. Wil je een deel van een tekst matchen, bouw dat dan in SQL: CONCAT('%', ${q}, '%') op MariaDB, '%' || ${q} || '%' op PostgreSQL.
Wie ziet wat
Iedereen op het account ziet elk dashboard — ook de rollen viewer en billing — omdat een paneel draait met het recht van degene die de SQL het laatst bewerkte, nooit dat van de kijker. Wie de database van het paneel zelf niet zou mogen bevragen, ziet de grafiek en de rijen, maar niet de SQL en niet de foutmelding van de database (alleen "de query van dit paneel is mislukt"). Eigenaren, beheerders en ontwikkelaars maken en bewerken dashboards; de auteur, of een eigenaar of beheerder, verwijdert er een. Verlaat de bewerker van een paneel het account, dan stopt dat paneel totdat iemand met toegang het opnieuw opslaat.
Cache en limieten
Elke paneelquery wordt beantwoord uit de meest recente identieke run zolang die vers is: vijf mensen die naar hetzelfde dashboard kijken, of twee tabbladen van jou, delen één query per paneel per verversing. De cache duurt zolang het verversinterval (minstens 30 s) of, zonder automatisch verversen, 5 minuten; handmatig verversen voert de query opnieuw uit. Relatieve bereiken worden afgerond op het verversinterval, zodat identieke verzoeken ook echt identiek zijn.
De gepubliceerde limieten zijn het standaardaanbod:
- 50 dashboards per account, 24 panelen en 10 variabelen per dashboard;
- 1.000 rijen per paneel, 500 punten per reeks (de automatische bucket houdt reeksen daaronder), 30 seconden per query;
- 8 dashboardquery's tegelijk en 30.000 per dag per account, apart geteld van de limieten van de editor — een druk dashboard blokkeert de SQL-editor nooit;
- automatisch verversen hoogstens elke 30 seconden; is het dagbudget voor 80 % gebruikt, dan zakt de pagina naar 5 minuten en zegt dat.
Meer nodig? Neem contact op — ruimere limieten zijn op aanvraag beschikbaar, tegen betaling.
Vanuit een script of je AI-assistent
Dashboards zitten in de API en de MCP-server, achter dezelfde opt-in-scope data als Databases:
GET /api/v1/dashboards,POST /api/v1/dashboards— lijst en aanmaken (met panelen en variabelen in één keer);GET/PUT/DELETE /api/v1/dashboards/{uid}— het volledige model (stuur deversionterug die je las; een verouderde is een409);POST /api/v1/dashboards/{uid}/panels,PUT/DELETE …/panels/{key}— één paneel tegelijk;POST /api/v1/dashboards/{uid}/panels/{key}/data— de rijen achter een paneel voor een tijdbereik, uit dezelfde cache.
Een assistent krijgt list_dashboards, get_dashboard, create_dashboard, add_panel en render_panel_data. Een token dat tot bepaalde sites beperkt is, ziet de SQL van een paneel alleen als de database van het paneel bij een van die sites hoort.