Dashboard

What goes in a server monitoring dashboard in Metabase?

A server monitoring dashboard watches the classic fleet signals — CPU, memory, and disk by server group, uptime, disk fill forecasts, service status, and the hosts eating the most resources. Metabase builds it from metric snapshots in your warehouse, whether they come from Prometheus, Datadog, or your own agents — cloud-specific fleets get their own AWS monitoring view, and database hosts a PostgreSQL monitoring one.

For: sysadmins, SREs, and platform teams. Grain: one row per server per hour (rollups), one-minute data for status cards. Refresh: every few minutes for status; hourly for trends.

What does a server monitoring dashboard look like?

Here’s the layout this guide builds. Fleet status leads — servers down and uptime are the glanceable verdict — then utilization by server group, where averages and p95 sit side by side so hot groups can’t hide, and finally capacity and services: disk forecasts, service status, and the top consumers to blame when a group runs hot.

Server monitoring dashboard in Metabase showing fleet uptime, CPU and memory by server group, disk fill forecasts, and service status.
An example server monitoring dashboard in Metabase, built from hourly metric rollups in the warehouse. Figures are illustrative.

Which cards belong on a server monitoring dashboard?

The eight below cover the three ways a fleet gets in trouble: a host dies, a group runs out of headroom, or a disk quietly fills.

  • Fleet uptime by month, with month-over-month comparison (trend)
  • CPU utilization by server group, average per hour (line)
  • p95 CPU by server group — the hot edge the average hides (line)
  • Memory utilization by server group, current average (row)
  • Disk I/O throughput, read and write, fleet-wide (area)
  • Service status mix — running, degraded, stopped, in maintenance (donut)
  • Top resource consumers — the ten busiest hosts by CPU (row)
  • Disk fill forecast — volumes by days to full at current growth (table)

What data does the dashboard need?

  • servers — inventory with server_id, server_group, environment, and an active flag.
  • server_metrics — per-server samples of cpu_pct, mem_pct, disk_free_gb, and I/O rates, rolled up hourly.
  • service_checks — service name, host, and running/degraded/stopped status per check.
  • volume_snapshots — per-volume capacity and used bytes, daily, for growth and fill forecasts.
  • Uptime pings or agent heartbeats — one row per server per check, for the uptime trend and the down-now count.

How do you build it?

  1. Export metrics from your collector into the warehouse: pull the Prometheus query API hourly (or use your agent’s export), keeping avg, p95, and max per server per hour.
  2. Tag every server with a server_group in the inventory table — web, app, database, batch, storage — because every comparison card on the page groups by it.
  3. Build the utilization cards from the hourly rollups (the SQL below), one shared model so average and p95 cards agree on the population.
  4. Compute the disk forecast from volume_snapshots: daily growth over 30 days, days-to-full, sorted ascending, top 10 into the table.
  5. Add filters for server group, environment, and date range, and let the status cards auto-refresh while trend cards stay on hourly cache.

Example card SQL

Hourly CPU, memory, and disk rollup by server group PostgreSQL
WITH hourly AS (
SELECT
  s.server_group,
  date_trunc('hour', m.sampled_at)      AS hour,
  AVG(m.cpu_pct)                        AS avg_cpu,
  PERCENTILE_CONT(0.95)
    WITHIN GROUP (ORDER BY m.cpu_pct)   AS p95_cpu,
  AVG(m.mem_pct)                        AS avg_mem,
  MIN(m.disk_free_gb)                   AS min_disk_free_gb
FROM server_metrics m
JOIN servers s ON s.server_id = m.server_id
WHERE m.sampled_at >= now() - interval '14 days'
GROUP BY s.server_group, date_trunc('hour', m.sampled_at)
)
SELECT
server_group,
hour,
ROUND(avg_cpu, 1)           AS avg_cpu_pct,
ROUND(p95_cpu, 1)           AS p95_cpu_pct,
ROUND(avg_mem, 1)           AS avg_mem_pct,
ROUND(min_disk_free_gb, 0)  AS min_disk_free_gb
FROM hourly
ORDER BY server_group, hour;

Metrics

Integrations

Dashboards

FAQ

What is a server monitoring dashboard?
A server monitoring dashboard tracks the health and capacity of a server fleet: CPU and memory utilization by server group, uptime, disk usage with fill forecasts, the status of the services those servers run, and which hosts consume the most resources. The point of building it in Metabase — from metric snapshots landed in a warehouse — is the shared, slower view: weekly capacity reviews, per-group comparisons, and joining server metrics to cost or ticket data, while your alerting stack keeps handling the real-time part.
How is this different from an IT monitoring dashboard?
Depth versus breadth. An IT monitoring dashboard covers the whole estate — network devices, endpoints, SaaS status — at shallow grain: up or down, alert counts, latency. A server monitoring dashboard takes one slice of that estate, the server fleet, and goes deep: per-group utilization trends, disk fill forecasts, service status, top consumers. Most teams keep both, with the estate page answering "is something wrong?" and this page answering "which server group, and is it capacity or a failure?"
What about cloud instances and database servers?
Give them their own views when the provider or workload changes what you monitor. For EC2 fleets, an AWS monitoring dashboard adds CloudWatch-specific signals — status checks, credit balances, ALB latency — that a generic server view has no columns for. Database hosts deserve the same treatment: a PostgreSQL monitoring dashboard watches cache hit rate, replication lag, and slow statements, none of which OS metrics reveal. Keep this fleet-level page as the umbrella, and link the specialized pages from it.
Why do fleet averages look fine while servers are on fire?
Because averaging across a fleet buries the tail: 40 idle servers and two pegged ones average to "comfortable". That is why this layout pairs every average with a p95 series and a top-consumers card — the p95 line shows the fleet's hot edge, and the top-10 table names the actual machines. When a group's average and p95 diverge sharply, that is a load-balancing problem, not a capacity problem; adding hardware won't fix it. As a rule, alert and plan on percentiles and maxima, and use averages only to spot long-term drift.
How do I forecast when a disk fills up?
Compute daily growth per volume over a trailing 30–60 days and divide free space by it. Linear extrapolation is crude but effective for the ordering decision — which volumes need attention this sprint — as long as you respect its failure modes: log rotation and cleanup jobs make growth lumpy, a one-off data load looks like a trend, and databases often preallocate space in steps. Chart used-space history for the top offenders next to the forecast table so a human can see whether the line is genuinely straight before acting on the number.
Should I monitor servers with Metabase or Grafana?
Different jobs. Grafana on Prometheus gives second-resolution graphs and alerting — keep it for on-call and incident debugging. Metabase works from rollups in your warehouse, which makes it worse at 3 a.m. and better at everything slower: capacity reviews with month-long baselines, utilization joined to asset and cost data, and dashboards shareable with managers who will never open Grafana. The practical split: raw metrics stay in Prometheus with short retention, hourly rollups land in the warehouse forever, and each tool reads its own layer.
What snapshot cadence should the warehouse tables use?
Hourly rollups for trends, one-minute data only for the current-status cards, and daily aggregates past 90 days. The trap is shipping raw scrape data into the warehouse: 15-second samples for 300 servers is roughly 170 million rows a month, and every dashboard card pays the query cost forever. Roll up at ingestion — avg, p95, and max per server per hour covers every card on this page — and keep MIN(disk_free_gb) rather than the average for disk, because the minimum is what pages you. Cheap queries are also what makes the auto-refresh wall display viable.