Dashboard

What goes in an IT operations dashboard in Metabase?

An IT operations dashboard is the daily command view for the team that keeps systems running: incidents opened and resolved, MTTR against its goal, change success rate, scheduled maintenance, and who is carrying the on-call load. Metabase builds it from the incident and change records you already keep in Jira, PagerDuty, or incident.io — synced to a warehouse where they can finally be joined.

For: IT operations managers, NOC leads, and on-call engineers. Grain: one row per incident, change, or page. Refresh: hourly for review; 60-second auto-refresh on a NOC display.

What does an IT operations dashboard look like?

Here’s the layout this guide builds. Today’s position sits at the top — open incidents, MTTR, and paging volume — so the morning stand-up starts from one row of numbers. Incident flow and response speed come next, because that’s the work of the day; change outcomes, the maintenance calendar, and on-call load close the page for the weekly review.

IT operations dashboard in Metabase showing open incidents, MTTR, change success rate, maintenance schedule, and on-call load.
An example IT operations dashboard in Metabase, built from incident, change, and paging records. Figures are illustrative.

Which cards belong on an IT operations dashboard?

The eight below cover the three questions an ops lead asks every morning: what’s broken, how fast are we fixing it, and what are we about to change?

  • Incidents opened vs. resolved per day, past two weeks (line)
  • Open incidents by priority, P1 through P4 (row)
  • MTTR by week against its goal (line)
  • Change success rate, past 30 days (gauge)
  • Changes by outcome per week — implemented, rolled back, failed (stacked bar)
  • On-call pages per engineer, past 7 days (row)
  • After-hours pages per week (bar)
  • Upcoming scheduled maintenance, with window and risk (table)

What data does the dashboard need?

  • An incidents table: incident_id, service, priority, opened_at, acknowledged_at, resolved_at, status.
  • A changes table: change_id, service, change_type, window_start, risk, and an outcome of implemented, rolled back, or failed.
  • A pages table from your paging tool: page_id, engineer, triggered_at, and whether it fell inside business hours.
  • A maintenance_windows table (or the subset of changes flagged as scheduled maintenance) with start, end, and affected service.
  • A small services dimension so incidents, changes, and pages roll up to the same service names.

How do you build it?

  1. Sync incidents, pages, and on-call schedules from PagerDuty, incident.io, or Jira into your warehouse on a schedule — the joins below need them as tables, not API calls.
  2. Define MTTR once in a Metabase model: resolved_at − opened_at in hours, excluding suppressed and duplicate incidents, so every card computes response time identically.
  3. Build the change-outcome cards from the changes table, counting a change as failed if it was rolled back or caused an incident within 24 hours of its window.
  4. Join pages to the on-call schedule to attribute each page to the engineer who received it, then split by business hours for the after-hours trend.
  5. Add dashboard filters for service, priority, and date range, and set a 60-second auto-refresh on the copy that runs on the NOC display.

Example card SQL

Incidents opened vs. resolved per day, with daily MTTR PostgreSQL
WITH opened AS (
SELECT
  i.opened_at::date            AS day,
  COUNT(*)                     AS incidents_opened
FROM incidents i
GROUP BY 1
),
resolved AS (
SELECT
  i.resolved_at::date          AS day,
  COUNT(*)                     AS incidents_resolved,
  AVG(
    EXTRACT(EPOCH FROM i.resolved_at - i.opened_at) / 3600
  )                            AS mttr_hours
FROM incidents i
WHERE i.resolved_at IS NOT NULL
  AND i.status <> 'suppressed'
GROUP BY 1
)
SELECT
COALESCE(o.day, r.day)                 AS day,
COALESCE(o.incidents_opened, 0)        AS incidents_opened,
COALESCE(r.incidents_resolved, 0)      AS incidents_resolved,
ROUND(r.mttr_hours::numeric, 1)        AS mttr_hours
FROM opened o
FULL JOIN resolved r ON r.day = o.day
WHERE COALESCE(o.day, r.day) >= CURRENT_DATE - 30
ORDER BY 1;

Metrics

Integrations

Dashboards

FAQ

How is an IT operations dashboard different from an ITSM dashboard?
Altitude. This dashboard is the daily command view — what broke today, how fast it was fixed, which changes went out, who got paged. An ITSM dashboard steps back to the process layer: SLA attainment per catalog service, problem records, CSAT, change governance over weeks. If your ops team huddles around one screen each morning, build this one; if your service owners review performance monthly, build the ITSM view. Most teams end up with both, sharing the same incident and change tables underneath.
How should I calculate MTTR so the number is trustworthy?
Fix three definitions before you chart anything. First, the clock: MTTR usually runs from opened_at to resolved_at, not to closed_at — tickets often sit "resolved, awaiting confirmation" for days. Second, the filter: exclude suppressed and duplicate incidents, or a noisy monitor that auto-resolves in seconds will flatter the average. Third, the aggregate: put the definition in one shared Metabase model so every card computes it the same way. Pair it with MTTA to separate slow acknowledgment from slow repair.
Should MTTR be a mean or a median?
Chart both, alert on the median. Incident duration is heavily right-skewed: one twelve-hour outage in a quiet week can double the mean while the typical incident was fixed in forty minutes. The median tells the on-call engineer what a normal incident costs; the mean (or p90) tells leadership what the bad ones cost. In Metabase, build the card from a model that exposes duration per incident, then add median and average as two summarize columns — switching between them is one click, and the gap between the two lines is itself a useful signal of tail risk.
How do I measure change success rate when not every change has a ticket?
Count what you can observe, not what people file. If deploys go through CI, every pipeline run is a change record — join deploys to the incidents or rollbacks that followed within a window (24–48 hours is common) and compute change failure rate from that. Reserve the formal change table for infrastructure and vendor work that CI never sees. The dashboard can show both populations honestly on one stacked bar; what it should never do is show a 100% success rate that really means "nobody records failures."
How do I get incident and paging data into Metabase?
Land it in a warehouse first. PagerDuty and incident.io both expose incidents, escalations, and on-call schedules through APIs that ETL tools sync on a schedule; Jira covers teams that run incidents as tickets. Once the tables land, Metabase queries them like any other source. Resist the urge to screenshot vendor dashboards into a slide instead — the point of this build is joining pages to incidents to changes across tools, which no single vendor view can do.
What does unhealthy on-call load look like in the numbers?
Three patterns are worth an explicit card. Concentration: one engineer taking a third or more of all pages week after week — visible on the pages-per-engineer row chart. After-hours creep: the share of pages landing outside business hours trending up, which predicts burnout better than raw volume. And ack-time drift: when a rested rotation starts acknowledging in ten minutes instead of two, people are tuning out. None of these need new tooling — paging timestamps and the schedule table are enough — but they only become visible when someone charts them.
Should this dashboard auto-refresh on a wall display?
Yes, with two caveats. Metabase dashboards can auto-refresh on an interval, and a NOC screen showing open incidents by priority is a legitimate use — set the refresh to something the source database can afford, usually 60 seconds or more, not 10. The caveat is that a wall display is not an alerting system: paging should come from PagerDuty or your monitor, never from someone noticing a red number on a TV. Use the display for shared situational awareness during business hours and let the on-call pipeline own the 3 a.m. problem.