Execution Performance Dashboard ​

Overview ​
The Execution Performance Dashboard provides comprehensive visualization capabilities for monitoring duration and outcome statistics across various execution types in the continuous delivery pipeline. Each dashboard type includes:
Overview Section - High-level metrics at a glance:
- Total Duration - Aggregate time spent across all executions
- Average Runtime - Mean execution time
- Average Queue Time - Mean time waiting to start (when applicable)
- Failure Rate - Percentage of failed executions (fail, failure, error) with color-coded thresholds
Time Series Visualizations:
- Total Duration per Day - Daily aggregated execution time
- Total Number of Run per Day - Execution counts by outcome (success, fail, error, skip, cancelled)
Execution Table - Detailed per-entity analysis showing:
- Name - Pipeline/task/test identifier
- History - Sparkline visualization of recent execution outcomes
- Last Outcome - Most recent execution status
- Last Duration - Most recent execution time
- Last Queue - Most recent queue time
- P80 Duration - 80th percentile execution time
- Total Runs - Count of executions in selected time range
- Passed - Count of executions with outcome pass/success
- Failed - Count of executions with outcome fail/failure/error
- Skipped - Count of executions with outcome skip/skipped

Dashboard Types ​
The execution dashboard generator creates dashboards for multiple execution types:
- Pipeline executions - CI/CD pipeline runs
- Task executions - Individual task runs
- Test case runs - Individual test executions
- Test suite runs - Test suite executions
Implementation Details ​
Overview Stat Panels ​
The overview section uses aggregation queries to calculate key metrics. Example query for average runtime:
SELECT
COALESCE(AVG(extract('epoch' from (finished_at - started_at))), 0) AS avg_runtime
FROM cdviz.pipelinerun
WHERE
($__timeFilter(queued_at) OR $__timeFilter(finished_at))
AND last_payload -> 'subject' -> 'content' ->> 'pipelineName' = ANY(ARRAY[${selected_value:sqlstring}]::text[])
AND finished_at IS NOT NULLTime Series Queries ​
Daily aggregations use TimescaleDB's time_bucket function for efficient grouping:
SELECT
time_bucket('1 day', finished_at) AS time,
SUM(extract('epoch' from (finished_at - started_at))) AS total_duration
FROM cdviz.pipelinerun
WHERE
($__timeFilter(queued_at) OR $__timeFilter(finished_at))
AND last_payload -> 'subject' -> 'content' ->> 'pipelineName' = ANY(ARRAY[${selected_value:sqlstring}]::text[])
AND finished_at IS NOT NULL
GROUP BY time
ORDER BY timeExecution Table Query ​
The table panel uses the custom cdviz-executiontable-panel plugin with a complex query that:
- Aggregates execution history per entity name
- Creates arrays of historical data for sparkline visualization
- Calculates P80 duration and total run counts
- Aggregates outcome counts (passed, failed, skipped) across all runs
- Includes last execution details (outcome, duration, queue time)
WITH
execution_history AS (
SELECT
last_payload -> 'subject' -> 'content' ->> 'pipelineName' AS name,
subject_id,
outcome,
extract('epoch' from (finished_at - started_at)) AS run_duration,
extract('epoch' from (started_at - queued_at)) AS queue_duration,
last_payload -> 'subject' -> 'content' ->> 'url' AS url,
started_at,
finished_at,
queued_at,
row_number() OVER (PARTITION BY last_payload -> 'subject' -> 'content' ->> 'pipelineName' ORDER BY finished_at DESC) AS rn
FROM cdviz.pipelinerun
WHERE
($__timeFilter(queued_at) OR $__timeFilter(finished_at))
AND last_payload -> 'subject' -> 'content' ->> 'pipelineName' = ANY(ARRAY[${selected_value:sqlstring}]::text[])
AND finished_at IS NOT NULL
),
aggregated_stats AS (
SELECT
name,
COALESCE(PERCENTILE_CONT(0.80) WITHIN GROUP (ORDER BY run_duration), 0) AS p80_duration,
COUNT(*) AS total_runs
FROM execution_history
GROUP BY name
),
history_arrays AS (
SELECT
name,
COALESCE(array_agg(run_duration ORDER BY finished_at ASC) FILTER (WHERE rn <= 20), ARRAY[]::numeric[]) AS run_duration_history,
COALESCE(array_agg(queue_duration ORDER BY finished_at ASC) FILTER (WHERE rn <= 20), ARRAY[]::numeric[]) AS queue_duration_history,
COALESCE(array_agg(outcome ORDER BY finished_at ASC) FILTER (WHERE rn <= 20), ARRAY[]::text[]) AS outcome_history,
COALESCE(array_agg(subject_id ORDER BY finished_at ASC) FILTER (WHERE rn <= 20), ARRAY[]::text[]) AS subject_id_history,
COALESCE(array_agg(url ORDER BY finished_at ASC) FILTER (WHERE rn <= 20), ARRAY[]::text[]) AS url_history
FROM execution_history
WHERE rn <= 20
GROUP BY name
),
-- Aggregate outcome counts across all runs per name
outcome_summary AS (
SELECT
name,
COUNT(*) FILTER (WHERE outcome IN ('pass', 'success')) AS passed,
COUNT(*) FILTER (WHERE outcome IN ('fail', 'failure', 'error')) AS failed,
COUNT(*) FILTER (WHERE outcome IN ('skip', 'skipped')) AS skipped
FROM execution_history
GROUP BY name
)
SELECT
s.name AS "Name",
h.run_duration_history AS "Run History (s)",
h.outcome_history AS "Outcome History",
h.subject_id_history AS "Run IDs",
h.url_history AS "URLs",
h.queue_duration_history AS "Queue History (s)",
s.p80_duration AS "P80 Duration (s)",
s.total_runs AS "Total Runs",
COALESCE(o.passed, 0) AS "Passed",
COALESCE(o.failed, 0) AS "Failed",
COALESCE(o.skipped, 0) AS "Skipped"
FROM aggregated_stats s
LEFT JOIN history_arrays h ON s.name = h.name
LEFT JOIN outcome_summary o ON s.name = o.name
ORDER BY s.nameTechnical Considerations ​
Database Views ​
- The SQL queries utilize materialized views defined on the
cdevents_laketable (e.g.,cdviz.pipelinerun,cdviz.taskrun) - Each view provides denormalized access to execution data with fields like
started_at,finished_at,queued_at,outcome - For missing views, consider:
- Submitting a pull request to add the view to the database schema
- Creating custom views in your environment
- Using SQL
WITHstatements in your queries as a workaround
Queue Duration ​
- Some execution types do not include queued duration metrics (e.g., task runs)
- Dashboards conditionally display "Avg Queue Time" stat panels and queue history columns based on execution type
- Pipeline runs, test case runs, and test suite runs track queue time; task runs do not
Custom Execution Table Panel ​
The dashboard uses the cdviz-executiontable-panel custom Grafana plugin for displaying execution history:
- History Visualization - Sparkline charts showing execution outcome trends
- Interactive Tooltips - Hover over sparklines for detailed execution information including timestamps, durations, and outcomes
- Configurable Display - Adjustable history items (default: 20), bar height, and gap settings
- Array Data Processing - Handles PostgreSQL array columns for efficient history storage

Dashboard Variables ​
selected_value- Multi-select variable for filtering by pipeline/task/test namelimit- Hidden variable controlling the number of executions displayed in the table (default:20)- Time Range - Standard Grafana time picker integration with
$__timeFilter()function
Coming Soon ​
Future enhancements to the execution dashboards include:
- Tag-based Filtering - Filter and group executions by:
- Environment (dev, staging, production)
- Artifacts (application versions, container images)
- Teams (ownership and responsibility)
- Custom metadata tags
Source Code References ​
- Database schema: migrations
- Dashboard generator: execution_dashboards.ts