What does a security incident response trends dashboard show in Metabase?
A security incident response trends dashboard shows how the SOC is performing over time: detections per week by severity and tactic, median time to detect and contain, and how much of the queue closes as benign. It's built from detection and incident records synced from tools such as CrowdStrike, SentinelOne, and Okta.
What does an incident response trends dashboard look like?
Here's the layout this guide builds, at the grain of a single detection: the queue's size and shape at the top, then volume by severity and tactic alongside detect and contain times, then the rules and hosts generating the most work. Read it monthly, when deciding which detections to tune.

Which cards belong on an incident response trends dashboard?
- Detections per week by severity (stacked bar)
- Detections by MITRE ATT&CK tactic (bar)
- Median time to detect (MTTD), trailing 90 days (line)
- Median time to triage and contain by severity (bar)
- False-positive / benign closure rate by detection rule (table)
- Repeat-offender hosts — most detections in 90 days (table)
What data does the dashboard need?
detections— one row per detection withdetected_at,occurred_at,triaged_at,contained_at, verdict, severity, tactic, andhost_id.security_incidents— confirmed incidents with severity and resolution timestamps, linked to their originating detections.
How do you build it?
- Sync the detection grain from the EDR and identity providers — verdicts, timestamps, and tactics, not the raw telemetry firehose.
- Normalize severity and verdict values across sources so "benign," "false_positive," and "expected" roll up consistently.
- Compute response medians from timestamp deltas, excluding rows where the relevant timestamp is missing rather than treating them as zero.
- Build the weekly volume and triage-time cards first; add tactic breakdowns and repeat-offender views once verdicts are trustworthy.
Example card SQL
SELECT
DATE_TRUNC('week', detected_at) AS week,
severity,
COUNT(*) AS detections,
ROUND(
PERCENTILE_CONT(0.5) WITHIN GROUP (
ORDER BY EXTRACT(EPOCH FROM (triaged_at - detected_at)) / 3600.0
)::numeric, 1
) AS median_triage_hours
FROM detections
WHERE detected_at >= CURRENT_DATE - INTERVAL '12 weeks'
AND triaged_at IS NOT NULL
GROUP BY week, severity
ORDER BY week, severity;Related
Metrics
Integrations
Dashboards
FAQ
What is a security incident response trends dashboard?
How is this different from the incident response dashboard?
How do you measure MTTD honestly?
detected_at − occurred_at, but occurred_at is often unknowable — you rarely learn exactly when the attacker first acted. Use the earliest observed activity timestamp the EDR attaches to the detection as the proxy, label the card accordingly, and treat detections with no activity timestamp as excluded rather than zero. An honest median with a stated caveat beats a precise-looking number computed from a field that's really "when the sensor noticed."