Measure pipeline reliability
Understanding how your CI/CD pipelines perform is essential for maintaining delivery velocity and software quality.
Without pipeline-level visibility, engineering leaders cannot identify flaky workflows, detect reliability regressions, or measure the impact of infrastructure changes on build stability.
This guide demonstrates how to build a comprehensive pipeline reliability dashboard in Port that answers critical questions at both the service level and team level:
- Failure rate: What percentage of pipeline runs are failing weekly and monthly?
- Failure trend: Is pipeline reliability improving or degrading over time?
- Failing pipelines: Which specific workflows or builds are failing most frequently?
- Team impact: Which teams and services are most affected by pipeline failures?
By the end of this guide, you will have a dashboard that provides full visibility into pipeline reliability health across services and teams, helping you identify problem areas and track improvement over time.
This guide supports GitHub, GitLab, and Azure DevOps.
Common use cases
- Track pipeline failure rate trends to detect reliability regressions early.
- Identify the most frequently failing workflows or builds to prioritize fixes.
- Monitor failure rates per team and service to understand organizational reliability health.
- Surface services with degrading pipeline reliability before they impact delivery.
- Compare reliability metrics across teams to identify best practices and improvement areas.
Prerequisites
This guide assumes the following:
- You have a Port account and have completed the onboarding process.
- GitHub
- GitLab
- Azure DevOps
- Port's GitHub integration is installed in your account.
- The
githubWorkflow,githubWorkflowRun, andgithubRepositoryblueprints already exist (these are created automatically when you install the GitHub integration). - A
serviceblueprint exists with ateamrelation to_team(see the PR delivery metrics guide for setup instructions).
- Port's GitLab integration is installed in your account.
- The
gitlabRepositoryblueprint already exists (created automatically when you install the GitLab integration). - A
serviceblueprint exists with ateamrelation to_team(see the PR delivery metrics guide for setup instructions).
- Port's Azure DevOps integration is installed in your account.
- The
azureDevopsRepositoryandazureDevopsProjectblueprints already exist (created automatically when you install the Azure DevOps integration). - A
serviceblueprint exists with ateamrelation to_team(see the PR delivery metrics guide for setup instructions).
Key metrics overview
This dashboard tracks pipeline reliability metrics across two levels - individual services and teams:
- GitHub
- GitLab
- Azure DevOps
| Metric | What it measures | Why it matters |
|---|---|---|
| Overall failure rate | Percentage of workflow runs that failed in the last month | Shows the organization-wide reliability baseline |
| Failing workflows | Count of workflows currently in a failure state | Highlights active reliability problems that need attention |
| Failure trend | Weekly count of failed workflow runs over time | Reveals whether pipeline reliability is improving or degrading |
| Run result distribution | Breakdown of workflow run conclusions (success, failure, cancelled, etc.) | Gives a complete picture of pipeline health beyond just failures |
| Top failing workflows | Workflows with the most failed runs | Identifies the specific workflows to prioritize for fixing |
| Team failure distribution | Failed workflow runs broken down by team | Shows which teams carry the most reliability burden |
| Weekly failure rate (%) | Percentage of workflow runs that failed in the last 7 days | Provides a short-term reliability signal |
| Monthly failure rate (%) | Percentage of workflow runs that failed in the last 30 days | Provides a longer-term reliability baseline |
| Failure rate trend | Whether weekly failure rate is better or worse than monthly average | Signals whether reliability is improving, stable, or degrading |
| Metric | What it measures | Why it matters |
|---|---|---|
| Overall failure rate | Percentage of pipeline jobs that failed in the last month | Shows the organization-wide reliability baseline |
| Failing pipelines | Count of pipelines currently in a failed state | Highlights active reliability problems that need attention |
| Failure trend | Weekly count of failed pipeline jobs over time | Reveals whether pipeline reliability is improving or degrading |
| Job result distribution | Breakdown of pipeline jobs by status (success, failed, canceled, etc.) | Gives a complete picture of pipeline health beyond just failures |
| Most failing stages | Pipeline stages with the most failed jobs | Identifies the specific stages to prioritize for fixing |
| Team failure distribution | Failed pipeline jobs broken down by team | Shows which teams carry the most reliability burden |
| Weekly failure rate (%) | Percentage of pipeline jobs that failed in the last 7 days | Provides a short-term reliability signal |
| Monthly failure rate (%) | Percentage of pipeline jobs that failed in the last 30 days | Provides a longer-term reliability baseline |
| Failure rate trend | Whether weekly failure rate is better or worse than monthly average | Signals whether reliability is improving, stable, or degrading |
| Metric | What it measures | Why it matters |
|---|---|---|
| Overall failure rate | Percentage of builds that failed in the last month | Shows the organization-wide reliability baseline |
| Failed builds | Count of builds that failed in the last month | Highlights active reliability problems that need attention |
| Failure trend | Weekly count of failed builds over time | Reveals whether pipeline reliability is improving or degrading |
| Build result distribution | Breakdown of builds by result (succeeded, failed, canceled, etc.) | Gives a complete picture of pipeline health beyond just failures |
| Top failing stages | Pipeline stages with the most failures | Identifies the specific stages to prioritize for fixing |
| Team failure distribution | Failed builds broken down by team | Shows which teams carry the most reliability burden |
| Weekly failure rate (%) | Percentage of builds that failed in the last 7 days | Provides a short-term reliability signal |
| Monthly failure rate (%) | Percentage of builds that failed in the last 30 days | Provides a longer-term reliability baseline |
| Failure rate trend | Whether weekly failure rate is better or worse than monthly average | Signals whether reliability is improving, stable, or degrading |
Set up data model
- GitHub
- GitLab
- Azure DevOps
The GitHub integration automatically creates the githubWorkflow and githubWorkflowRun blueprints with default properties. We need to ensure the workflow run blueprint has the right properties for reliability tracking, then add aggregation and calculation properties to the service and Team blueprints to surface failure metrics at those levels.
The integration mapping in this guide filters workflow runs to the default branch (main, master, or production) and the last 90 days. This ensures reliability metrics reflect production-relevant pipeline health rather than feature branch noise. Adjust the integration mapping selector if you need to include other branches.
Verify the GitHub workflow blueprint
The githubWorkflow blueprint should already have the following properties from the default integration. Verify they exist:Expected workflow properties (click to expand)
"path": {
"title": "Path",
"type": "string"
},
"status": {
"title": "Status",
"type": "string",
"enum": ["active", "deleted", "disabled_fork", "disabled_inactivity", "disabled_manually"],
"enumColors": {
"active": "green",
"deleted": "red"
}
},
"createdAt": {
"title": "Created At",
"type": "string",
"format": "date-time"
},
"updatedAt": {
"title": "Updated At",
"type": "string",
"format": "date-time"
},
"link": {
"title": "Link",
"type": "string",
"format": "url"
}
We need to add two additional properties that will be populated via the integration mapping to track the latest run result:
-
Go to the Builder page of your portal.
-
Find the GitHub Workflow blueprint and click on it.
-
Click on the
{...}button in the top right corner, and choose Edit JSON. -
Add the following properties to the
propertiessection:Additional workflow properties (click to expand)
"result": {
"title": "Result",
"description": "Latest run conclusion (merged from workflow-run data)",
"type": "string",
"enum": ["success", "failure", "cancelled", "skipped", "timed_out", "action_required", "neutral", "stale", "startup_failure"],
"enumColors": {
"success": "green",
"failure": "red",
"cancelled": "lightGray",
"skipped": "lightGray",
"timed_out": "orange",
"action_required": "yellow",
"neutral": "lightGray",
"stale": "darkGray",
"startup_failure": "red"
}
},
"last_triggered_at": {
"title": "Last Triggered At",
"type": "string",
"format": "date-time"
} -
Add the following mirror properties to the
mirrorPropertiessection (create it if it doesn't exist). These surface the owning team and service on each workflow:Workflow mirror properties (click to expand)
"team_name": {
"title": "Team",
"path": "repository.service.team.$title"
},
"service_name": {
"title": "Service",
"path": "repository.service.$title"
} -
Verify the
relationssection includes a relation togithubRepository:"repository": {
"title": "Repository",
"target": "githubRepository",
"required": false,
"many": false
} -
Click Save to update the blueprint.
Verify the GitHub workflow run blueprint
The githubWorkflowRun blueprint should already have the following properties. Verify they exist:Expected workflow run properties (click to expand)
"name": {
"title": "Name",
"type": "string"
},
"triggeringActor": {
"title": "Triggering Actor",
"type": "string"
},
"status": {
"title": "Status",
"type": "string",
"enum": ["queued", "in_progress", "completed", "waiting", "requested", "pending"],
"enumColors": {
"completed": "green",
"in_progress": "blue",
"queued": "lightGray",
"waiting": "yellow",
"requested": "orange",
"pending": "yellow"
}
},
"conclusion": {
"title": "Conclusion",
"type": "string",
"enum": ["success", "failure", "cancelled", "skipped", "timed_out", "action_required", "neutral", "stale", "startup_failure"],
"enumColors": {
"success": "green",
"failure": "red",
"cancelled": "lightGray",
"skipped": "lightGray",
"timed_out": "orange",
"action_required": "yellow",
"neutral": "lightGray",
"stale": "darkGray",
"startup_failure": "red"
}
},
"createdAt": {
"title": "Created At",
"type": "string",
"format": "date-time"
},
"runStartedAt": {
"title": "Run Started At",
"type": "string",
"format": "date-time"
},
"updatedAt": {
"title": "Updated At",
"type": "string",
"format": "date-time"
},
"runNumber": {
"title": "Run Number",
"type": "number"
},
"runAttempt": {
"title": "Run Attempt",
"type": "number"
},
"link": {
"title": "Link",
"type": "string",
"format": "url"
},
"headBranch": {
"title": "Head Branch",
"type": "string"
}
Add the following mirror properties to surface team, service, and workflow context on each run:
-
Go to the Builder page.
-
Find the GitHub Workflow Run blueprint and click on it.
-
Click on the
{...}button in the top right corner, and choose Edit JSON. -
Add or verify the following
mirrorProperties:Workflow run mirror properties (click to expand)
"team_name": {
"title": "Team",
"path": "repository.service.team.$title"
},
"service_name": {
"title": "Service",
"path": "repository.service.$title"
},
"workflow_name": {
"title": "Workflow Name",
"path": "workflow.path"
},
"workflow_current_result": {
"title": "Workflow Current Result",
"path": "workflow.result"
} -
Verify the
relationssection includes:"workflow": {
"title": "Workflow",
"target": "githubWorkflow",
"required": false,
"many": false
},
"repository": {
"title": "Repository",
"target": "githubRepository",
"required": false,
"many": false
} -
Click Save to update the blueprint.
We need to create two new blueprints - gitlabPipeline and gitlabJob - to model CI/CD pipeline data from GitLab, then add aggregation and calculation properties to the service and Team blueprints.
The integration mapping in this guide filters pipelines and jobs to the default branch (main, master, or production) and the last 90 days. This ensures reliability metrics reflect production-relevant pipeline health rather than feature branch noise. Adjust the integration mapping selector if you need to include other branches.
Create the GitLab pipeline blueprint
-
Go to the Builder page of your portal.
-
Click on the
+ Blueprintbutton. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Paste the following JSON and click Save:
GitLab pipeline blueprint JSON (click to expand)
{
"identifier": "gitlabPipeline",
"title": "GitLab Pipeline",
"icon": "GitLab",
"schema": {
"properties": {
"status": {
"title": "Status",
"type": "string",
"enum": ["created", "waiting_for_resource", "preparing", "pending", "running", "success", "failed", "canceled", "skipped", "manual", "scheduled"],
"enumColors": {
"success": "green",
"failed": "red",
"canceled": "lightGray",
"skipped": "lightGray",
"running": "blue",
"pending": "yellow",
"manual": "orange",
"created": "lightGray"
}
},
"createdAt": {
"title": "Created At",
"type": "string",
"format": "date-time"
},
"updatedAt": {
"title": "Updated At",
"type": "string",
"format": "date-time"
},
"link": {
"title": "Link",
"type": "string",
"format": "url"
},
"source": {
"title": "Source",
"description": "What triggered the pipeline (push, web, merge_request_event, etc.)",
"type": "string"
},
"ref": {
"title": "Ref",
"description": "Branch or tag that triggered the pipeline",
"type": "string"
}
}
},
"calculationProperties": {
"is_failing": {
"title": "Is Failing",
"icon": "Alert",
"description": "True when this pipeline's latest status is failed",
"calculation": "if .properties.status == \"failed\" then true else false end",
"type": "boolean",
"colorized": true,
"colors": {
"true": "red"
}
}
},
"mirrorProperties": {
"team_name": {
"title": "Team",
"path": "repository.service.team.$title"
},
"service_name": {
"title": "Service",
"path": "repository.service.$title"
}
},
"relations": {
"repository": {
"title": "Repository",
"target": "gitlabRepository",
"required": false,
"many": false
}
}
}
Create the GitLab job blueprint
-
In the Builder page, click on the
+ Blueprintbutton. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Paste the following JSON and click Save:
GitLab job blueprint JSON (click to expand)
{
"identifier": "gitlabJob",
"title": "GitLab Job",
"icon": "GitLab",
"schema": {
"properties": {
"status": {
"title": "Status",
"type": "string",
"enum": ["created", "waiting_for_resource", "preparing", "pending", "running", "success", "failed", "canceled", "skipped", "manual"],
"enumColors": {
"success": "green",
"failed": "red",
"canceled": "lightGray",
"skipped": "lightGray",
"running": "blue",
"pending": "yellow",
"manual": "orange",
"created": "lightGray"
}
},
"stage": {
"title": "Stage",
"description": "The pipeline stage this job belongs to",
"type": "string"
},
"startedAt": {
"title": "Started At",
"type": "string",
"format": "date-time"
},
"finishedAt": {
"title": "Finished At",
"type": "string",
"format": "date-time"
},
"link": {
"title": "Link",
"type": "string",
"format": "url"
},
"duration": {
"title": "Duration (seconds)",
"description": "How long the job ran in seconds",
"type": "number"
}
}
},
"mirrorProperties": {
"team_name": {
"title": "Team",
"path": "repository.service.team.$title"
},
"service_name": {
"title": "Service",
"path": "repository.service.$title"
},
"pipeline_status": {
"title": "Pipeline Status",
"path": "pipeline.status"
}
},
"relations": {
"pipeline": {
"title": "Pipeline",
"target": "gitlabPipeline",
"required": false,
"many": false
},
"repository": {
"title": "Repository",
"target": "gitlabRepository",
"required": false,
"many": false
}
}
}
We need to create two new blueprints — azureDevopsBuild and azureDevopsPipelineStage — to model CI/CD build data from Azure DevOps, then add aggregation and calculation properties to the service and Team blueprints.
Create the Azure DevOps build blueprint
-
Go to the Builder page of your portal.
-
Click on the
+ Blueprintbutton. -
Click on the
{...}button in the top right corner, and choose Edit JSON. -
Paste the following JSON and click Save:
Azure DevOps build blueprint JSON (click to expand)
{
"identifier": "azureDevopsBuild",
"title": "Azure DevOps Build",
"icon": "AzureDevops",
"schema": {
"properties": {
"status": {
"title": "Status",
"type": "string"
},
"result": {
"title": "Result",
"type": "string",
"enum": ["succeeded", "partiallySucceeded", "failed", "canceled", "none"],
"enumColors": {
"succeeded": "green",
"partiallySucceeded": "yellow",
"failed": "red",
"canceled": "lightGray",
"none": "lightGray"
}
},
"queueTime": {
"title": "Queue Time",
"type": "string",
"format": "date-time"
},
"startTime": {
"title": "Start Time",
"type": "string",
"format": "date-time"
},
"finishTime": {
"title": "Finish Time",
"type": "string",
"format": "date-time"
},
"definitionName": {
"title": "Definition Name",
"type": "string"
},
"requestedFor": {
"title": "Requested For",
"type": "string"
},
"link": {
"title": "Link",
"type": "string",
"format": "url"
}
}
},
"mirrorProperties": {
"team_name": {
"title": "Team",
"path": "repository.service.team.$title"
},
"service_name": {
"title": "Service",
"path": "repository.service.$title"
}
},
"relations": {
"project": {
"title": "Project",
"target": "azureDevopsProject",
"required": false,
"many": false
},
"repository": {
"title": "Repository",
"target": "azureDevopsRepository",
"required": false,
"many": false
}
}
}
Create the Azure DevOps pipeline stage blueprint
-
In the Builder page, click on the
+ Blueprintbutton. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Paste the following JSON and click Save:
Azure DevOps pipeline stage blueprint JSON (click to expand)
{
"identifier": "azureDevopsPipelineStage",
"title": "Azure DevOps Pipeline Stage",
"icon": "AzureDevops",
"schema": {
"properties": {
"state": {
"title": "State",
"type": "string"
},
"result": {
"title": "Result",
"type": "string"
},
"startTime": {
"title": "Start Time",
"type": "string",
"format": "date-time"
},
"finishTime": {
"title": "Finish Time",
"type": "string",
"format": "date-time"
},
"stageType": {
"title": "Stage Type",
"type": "string"
}
}
},
"relations": {
"project": {
"title": "Project",
"target": "azureDevopsProject",
"required": false,
"many": false
},
"build": {
"title": "Build",
"target": "azureDevopsBuild",
"required": false,
"many": false
}
}
}
Update the service blueprint
Add aggregation and calculation properties to the service blueprint to surface pipeline reliability metrics for each service.
- Go to your Builder page.
- Find the Service blueprint and click on it.
- Click on the
{...}button in the top right corner, and choose Edit JSON. - Add the following entries to the
aggregationPropertiessection of the blueprint:
- GitHub
- GitLab
- Azure DevOps
Service reliability aggregation properties (click to expand)
"workflow_runs_7d": {
"title": "Weekly Workflow Runs",
"description": "Total workflow runs in the last 7 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Workflow Runs",
"description": "Workflow runs that ended in failure in the last 7 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"workflow_runs_30d": {
"title": "Monthly Workflow Runs",
"description": "Total workflow runs in the last 30 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Workflow Runs",
"description": "Workflow runs that ended in failure in the last 30 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
}
Service reliability aggregation properties (click to expand)
Since the gitlabJob blueprint is two hops away from service (via gitlabRepository), these aggregations include a pathFilter to specify the exact relation path. This ensures Port can resolve the multi-hop chain correctly.
"workflow_runs_7d": {
"title": "Weekly Pipeline Jobs",
"description": "Total pipeline jobs in the last 7 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "gitlabJob"
}
]
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Pipeline Jobs",
"description": "Pipeline jobs that failed in the last 7 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "gitlabJob"
}
]
},
"workflow_runs_30d": {
"title": "Monthly Pipeline Jobs",
"description": "Total pipeline jobs in the last 30 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "gitlabJob"
}
]
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Pipeline Jobs",
"description": "Pipeline jobs that failed in the last 30 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "gitlabJob"
}
]
}
Service reliability aggregation properties (click to expand)
Since the azureDevopsBuild blueprint is two hops away from service (via azureDevopsRepository), these aggregations include a pathFilter to specify the exact relation path. This ensures Port can resolve the multi-hop chain correctly.
"workflow_runs_7d": {
"title": "Weekly Build Runs",
"description": "Total builds in the last 7 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "azureDevopsBuild"
}
]
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Builds",
"description": "Builds that failed in the last 7 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "azureDevopsBuild"
}
]
},
"workflow_runs_30d": {
"title": "Monthly Build Runs",
"description": "Total builds in the last 30 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "azureDevopsBuild"
}
]
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Builds",
"description": "Builds that failed in the last 30 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
},
"pathFilter": [
{
"path": ["repository", "service"],
"fromBlueprint": "azureDevopsBuild"
}
]
}
-
Add the following entries to the
calculationPropertiessection of the blueprint (these are the same regardless of your SCM provider, since the aggregation property names are identical):Service reliability calculation properties (click to expand)
"weekly_workflow_failure_rate": {
"title": "Weekly Failure Rate (%)",
"description": "Percentage of pipeline runs that failed in the last 7 days",
"type": "number",
"calculation": "if (.properties.workflow_runs_7d != null and .properties.workflow_runs_7d != 0) then ((.properties.failed_workflow_runs_7d // 0) / .properties.workflow_runs_7d) * 100 | floor else 0 end"
},
"monthly_workflow_failure_rate": {
"title": "Monthly Failure Rate (%)",
"description": "Percentage of pipeline runs that failed in the last 30 days",
"type": "number",
"calculation": "if (.properties.workflow_runs_30d != null and .properties.workflow_runs_30d != 0) then ((.properties.failed_workflow_runs_30d // 0) / .properties.workflow_runs_30d) * 100 | floor else 0 end"
},
"failure_rate_trend": {
"title": "Failure Rate Trend",
"description": "Weekly failure rate vs monthly average — Improving, Stable, or Degrading",
"type": "string",
"colorized": true,
"colors": {
"Improving": "green",
"Stable": "blue",
"Degrading": "red"
},
"calculation": "((if (.properties.workflow_runs_30d != null and .properties.workflow_runs_30d != 0) then ((.properties.failed_workflow_runs_30d // 0) / .properties.workflow_runs_30d) * 100 | floor else 0 end) - (if (.properties.workflow_runs_7d != null and .properties.workflow_runs_7d != 0) then ((.properties.failed_workflow_runs_7d // 0) / .properties.workflow_runs_7d) * 100 | floor else 0 end)) as $diff | if $diff > 0 then \"Improving\" elif $diff < 0 then \"Degrading\" else \"Stable\" end"
} -
Click Save to update the blueprint.
Update the team blueprint
Add aggregation and calculation properties to the Team blueprint to aggregate reliability metrics across all services owned by each team.
- Go to your Builder page.
- Find the Team blueprint and click on it.
- Click on the
{...}button in the top right corner, and choose Edit JSON. - Add the following entries to the
aggregationPropertiessection of the blueprint:
- GitHub
- GitLab
- Azure DevOps
Team reliability aggregation properties (click to expand)
"workflow_runs_7d": {
"title": "Weekly Workflow Runs",
"description": "Total workflow runs in the last 7 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Workflow Runs",
"description": "Workflow runs that ended in failure in the last 7 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"workflow_runs_30d": {
"title": "Monthly Workflow Runs",
"description": "Total workflow runs in the last 30 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Workflow Runs",
"description": "Workflow runs that ended in failure in the last 30 days",
"type": "number",
"target": "githubWorkflowRun",
"query": {
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
}
Team reliability aggregation properties (click to expand)
"workflow_runs_7d": {
"title": "Weekly Pipeline Jobs",
"description": "Total pipeline jobs in the last 7 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Pipeline Jobs",
"description": "Pipeline jobs that failed in the last 7 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"workflow_runs_30d": {
"title": "Monthly Pipeline Jobs",
"description": "Total pipeline jobs in the last 30 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Pipeline Jobs",
"description": "Pipeline jobs that failed in the last 30 days",
"type": "number",
"target": "gitlabJob",
"query": {
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
}
Team reliability aggregation properties (click to expand)
"workflow_runs_7d": {
"title": "Weekly Build Runs",
"description": "Total builds in the last 7 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastWeek"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_7d": {
"title": "Weekly Failed Builds",
"description": "Builds that failed in the last 7 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastWeek"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"workflow_runs_30d": {
"title": "Monthly Build Runs",
"description": "Total builds in the last 30 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
},
"failed_workflow_runs_30d": {
"title": "Monthly Failed Builds",
"description": "Builds that failed in the last 30 days",
"type": "number",
"target": "azureDevopsBuild",
"query": {
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
},
"calculationSpec": {
"func": "count",
"calculationBy": "entities"
}
}
-
Add the following entries to the
calculationPropertiessection of the blueprint (these are the same regardless of your SCM provider):Team reliability calculation properties (click to expand)
"weekly_workflow_failure_rate": {
"title": "Weekly Failure Rate (%)",
"description": "Percentage of pipeline runs that failed in the last 7 days",
"type": "number",
"calculation": "if (.properties.workflow_runs_7d != null and .properties.workflow_runs_7d != 0) then ((.properties.failed_workflow_runs_7d // 0) / .properties.workflow_runs_7d) * 100 | floor else 0 end"
},
"monthly_workflow_failure_rate": {
"title": "Monthly Failure Rate (%)",
"description": "Percentage of pipeline runs that failed in the last 30 days",
"type": "number",
"calculation": "if (.properties.workflow_runs_30d != null and .properties.workflow_runs_30d != 0) then ((.properties.failed_workflow_runs_30d // 0) / .properties.workflow_runs_30d) * 100 | floor else 0 end"
},
"failure_rate_trend": {
"title": "Failure Rate Trend",
"description": "Weekly failure rate vs monthly average — Improving, Stable, or Degrading",
"type": "string",
"colorized": true,
"colors": {
"Improving": "green",
"Stable": "blue",
"Degrading": "red"
},
"calculation": "((if (.properties.workflow_runs_30d != null and .properties.workflow_runs_30d != 0) then ((.properties.failed_workflow_runs_30d // 0) / .properties.workflow_runs_30d) * 100 | floor else 0 end) - (if (.properties.workflow_runs_7d != null and .properties.workflow_runs_7d != 0) then ((.properties.failed_workflow_runs_7d // 0) / .properties.workflow_runs_7d) * 100 | floor else 0 end)) as $diff | if $diff > 0 then \"Improving\" elif $diff < 0 then \"Degrading\" else \"Stable\" end"
} -
Click Save to update the blueprint.
Update integration mapping
- GitHub
- GitLab
- Azure DevOps
Now we'll update the GitHub integration mapping to populate the workflow and workflow run blueprints with the properties needed for reliability tracking. The default mapping may already handle basic workflow data, but we need to ensure the workflow run mapping filters to the default branch and includes the conclusion property.
-
Go to your Data Source page.
-
Select the GitHub integration.
-
Find or add the
workflowresource block in the mapping:Workflow mapping (click to expand)
- kind: workflow
selector:
query: 'true'
port:
entity:
mappings:
identifier: >-
(.url | capture("repos/(?<repo>[^/]+/[^/]+)/") | .repo) +
(.id|tostring)
title: .name
blueprint: '"githubWorkflow"'
properties:
path: .path
status: .state
createdAt: .created_at
updatedAt: .updated_at
link: .html_url
relations:
repository: >-
.url | capture("repos/[^/]+/(?<repo>[^/]+)/") | .repo -
Find or add the
workflow-runresource block. This mapping creates workflow run entities filtered to the default branch and last 90 days:Workflow run mapping (click to expand)
- kind: workflow-run
selector:
query: >-
(.head_branch | IN("main", "master", "production")) and
((.created_at | fromdateiso8601) > (now - 7776000))
port:
entity:
mappings:
identifier: .repository.full_name + (.id|tostring)
title: .display_title
blueprint: '"githubWorkflowRun"'
properties:
name: .name
triggeringActor: .triggering_actor.login
status: .status
conclusion: .conclusion
createdAt: .created_at
runStartedAt: .run_started_at
updatedAt: .updated_at
runNumber: .run_number
runAttempt: .run_attempt
link: .html_url
headBranch: .head_branch
relations:
workflow: .repository.full_name + (.workflow_id|tostring)
repository: .repository.name -
Add a second
workflow-runresource block that updates the workflow blueprint with the latest run result. This "merges" the most recent conclusion back onto the workflow entity:Workflow result update mapping (click to expand)
- kind: workflow-run
selector:
query: >-
(.head_branch | IN("main", "master", "production")) and
((.created_at | fromdateiso8601) > (now - 7776000))
port:
entity:
mappings:
identifier: .repository.full_name + (.workflow_id|tostring)
title: .repository.full_name + (.workflow_id|tostring)
blueprint: '"githubWorkflow"'
properties:
result: .conclusion
last_triggered_at: .run_started_at -
Click Save & Resync to apply the mapping.
The workflow run selector filters to main, master, and production branches only. This ensures reliability metrics reflect production-relevant pipeline health. If your repositories use different default branch names, update the IN(...) list accordingly.
Now we'll update the GitLab integration mapping to populate the pipeline and job blueprints. The mapping filters pipelines and jobs to the default branch and last 90 days.
-
Go to your Data Source page.
-
Select the GitLab integration.
-
Add the
pipelineresource block in the mapping:Pipeline mapping (click to expand)
- kind: pipeline
selector:
query: >-
(.ref | IN("main", "master", "production")) and
((.created_at | fromdateiso8601) > (now - 7776000))
port:
entity:
mappings:
identifier: .id | tostring
title: >-
(.__project.name // .__project.path_with_namespace) +
" #" + (.id | tostring)
blueprint: '"gitlabPipeline"'
properties:
status: .status
createdAt: .created_at
updatedAt: .updated_at
link: .web_url
source: .source
ref: .ref
relations:
repository: .__project.path_with_namespace -
Add the
jobresource block. This mapping creates job entities from pipeline jobs filtered to the default branch and last 90 days:Job mapping (click to expand)
- kind: job
selector:
query: >-
(.pipeline.ref | IN("main", "master", "production")) and
((.created_at | fromdateiso8601) > (now - 7776000))
port:
entity:
mappings:
identifier: .id | tostring
title: .name
blueprint: '"gitlabJob"'
properties:
status: .status
stage: .stage
startedAt: .started_at
finishedAt: .finished_at
link: .web_url
duration: .duration
relations:
pipeline: .pipeline.id | tostring
repository: >-
.web_url | split("/-/") | .[0] | split("://") |
.[1] | split("/") | .[1:] | join("/") -
Click Save & Resync to apply the mapping.
The pipeline and job selectors filter to main, master, and production branches only. This ensures reliability metrics reflect production-relevant pipeline health. If your repositories use different default branch names, update the IN(...) list accordingly.
Now we'll update the Azure DevOps integration mapping to populate the build and pipeline stage blueprints.
-
Go to your Data Source page.
-
Select the Azure DevOps integration.
-
Add the
buildresource block in the mapping:Build mapping (click to expand)
- kind: build
selector:
query: 'true'
port:
entity:
mappings:
identifier: >-
.__project.id + "/" + (.id | tostring) | gsub(" "; "")
title: .buildNumber
blueprint: '"azureDevopsBuild"'
properties:
status: .status
result: .result
queueTime: .queueTime
startTime: .startTime
finishTime: .finishTime
definitionName: .definition.name
requestedFor: .requestedFor.displayName
link: ._links.web.href
relations:
project: .__project.id | gsub(" "; "")
repository: .repository.id -
Add the
pipeline-stageresource block:Pipeline stage mapping (click to expand)
- kind: pipeline-stage
selector:
query: 'true'
port:
entity:
mappings:
identifier: >-
.__project.id + "/" + (.__build.id | tostring) + "/" +
(.id | tostring) | gsub(" "; "")
title: .name
blueprint: '"azureDevopsPipelineStage"'
properties:
state: .state
result: .result
startTime: .startTime
finishTime: .finishTime
stageType: .type
relations:
project: .__project.id | gsub(" "; "")
build: >-
(.__project.id + "/" + (.__build.id | tostring)) |
gsub(" "; "") -
Click Save & Resync to apply the mapping.
Visualize metrics
We will create a dedicated dashboard to monitor pipeline reliability metrics using Port's customizable widgets.
Create the dashboard
First, let's create an Engineering Intelligence folder (if it doesn't already exist) to organize your dashboards, then add the Pipeline Reliability dashboard inside it:
- Navigate to your software catalog.
- Click on the
+button in the left sidebar. - Select New folder.
- Name the folder Engineering Intelligence and click Create.
- Inside the Engineering Intelligence folder, click
+again. - Select New dashboard.
- Name the dashboard Pipeline Reliability and click Create.
Add widgets
You can populate the dashboard using either an API script or by manually creating each widget through the UI.
- API script
- Manual setup
The fastest way to set up the dashboard is by using Port's API to create all widgets at once.
Get your Port API token
-
In your Port portal, click on your profile picture in the top right corner.
-
Select Credentials.
-
Click Generate API token.
-
Copy the generated token and store it as an environment variable:
export PORT_ACCESS_TOKEN="YOUR_GENERATED_TOKEN"
If your portal is hosted in the EU region, replace api.getport.io with api.port-eu.io in the dashboard creation command below.
Create the dashboard with widgets
Save the following JSON to a file named reliability_dashboard.json:
- GitHub
- GitLab
- Azure DevOps
Dashboard JSON payload (click to expand)
{
"identifier": "pipeline_reliability",
"title": "Pipeline Reliability",
"icon": "Apps",
"type": "dashboard",
"description": "Based on default branch (main/master/production) workflow runs only. Adjust the integration mapping selector to include other branches if needed.",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "reliabilityDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 512,
"columns": [
{"id": "overallFailureRate", "size": 3},
{"id": "totalFailingWorkflows", "size": 3},
{"id": "failureTrend", "size": 3},
{"id": "workflowRunResults", "size": 3}
]
},
{
"height": 482,
"columns": [
{"id": "topFailingWorkflows", "size": 4},
{"id": "teamFailureBar", "size": 4},
{"id": "serviceFailureBar", "size": 4}
]
},
{
"height": 400,
"columns": [
{"id": "teamReliabilityTable", "size": 12}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReliabilityTable", "size": 12}
]
},
{
"height": 488,
"columns": [
{"id": "failedRunsTable", "size": 12}
]
}
],
"widgets": [
{
"id": "overallFailureRate",
"type": "entities-number-chart",
"title": "Overall Failure Rate % (Last Month)",
"icon": "Metric",
"description": "Percentage of workflow runs that failed across all services in the organisation",
"blueprint": "_team",
"chartType": "aggregateByProperty",
"calculationBy": "property",
"func": "average",
"property": "monthly_workflow_failure_rate",
"averageOf": "total",
"displayFormatting": "round",
"unit": "%",
"unitAlignment": "right",
"dataset": {"combinator": "and", "rules": []}
},
{
"id": "totalFailingWorkflows",
"type": "entities-number-chart",
"title": "Total Failing Workflows",
"icon": "Metric",
"description": "Workflows whose current result is in failure state",
"blueprint": "githubWorkflow",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{"property": "result", "operator": "=", "value": "failure"}
]
}
},
{
"id": "failureTrend",
"type": "line-chart",
"title": "Workflow Runs Failure Trend (Weekly)",
"icon": "LineChart",
"description": "Weekly trend of failed workflow runs over the past 6 months",
"blueprint": "githubWorkflowRun",
"chartType": "countEntities",
"func": "count",
"measureTimeBy": "runStartedAt",
"timeInterval": "isoWeek",
"timeRange": {"preset": "last6Months"},
"xAxisTitle": "",
"yAxisTitle": "# Failed Workflows",
"dataset": {
"combinator": "and",
"rules": [
{"property": "conclusion", "operator": "=", "value": "failure"}
]
}
},
{
"id": "workflowRunResults",
"type": "entities-pie-chart",
"title": "Workflow Run Results (Last Month)",
"icon": "Pie",
"description": "Breakdown of all workflow runs by conclusion status across the organisation",
"blueprint": "githubWorkflowRun",
"property": "property#conclusion",
"dataset": {
"combinator": "and",
"rules": [
{"property": "createdAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "topFailingWorkflows",
"type": "bar-chart",
"title": "Top Failing Workflows (Last 30 Days)",
"icon": "Bar",
"description": "Workflows with the most failed runs (last 30 days)",
"blueprint": "githubWorkflowRun",
"property": "mirror-property#workflow_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "runStartedAt", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "conclusion", "operator": "=", "value": "failure"}
]
}
},
{
"id": "teamFailureBar",
"type": "bar-chart",
"title": "Teams with Most Workflow Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed workflow runs by team",
"blueprint": "githubWorkflowRun",
"property": "mirror-property#team_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "runStartedAt", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "conclusion", "operator": "=", "value": "failure"}
]
}
},
{
"id": "serviceFailureBar",
"type": "bar-chart",
"title": "Services with Most Workflow Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed workflow runs by service",
"blueprint": "githubWorkflowRun",
"property": "mirror-property#service_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "conclusion", "operator": "=", "value": "failure"},
{"property": "runStartedAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "teamReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Team Reliability Overview",
"icon": "Table",
"description": "Workflow failure rates per team",
"blueprint": "_team",
"dataset": {"combinator": "and", "rules": [{"property": "type", "operator": "=", "value": "team"}]},
"excludedFields": [],
"blueprintConfig": {
"_team": {
"groupSettings": {"groupBy": []},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "serviceReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Reliability Overview",
"icon": "Table",
"description": "Workflow failure rates per service",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["parent_team_name", "team"]},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "failedRunsTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Failed Workflow Runs (Last Month)",
"icon": "Table",
"description": "All workflow runs that concluded with failure",
"blueprint": "githubWorkflowRun",
"dataset": {
"combinator": "and",
"rules": [
{"property": "workflow_current_result", "operator": "=", "value": "failure"},
{"property": "createdAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
},
"excludedFields": [],
"blueprintConfig": {
"githubWorkflowRun": {
"groupSettings": {"groupBy": ["team_name", "service_name", "repository"]},
"propertiesSettings": {
"order": ["repository", "service_name", "team_name", "workflow_name", "link", "$title", "conclusion", "runStartedAt"],
"shown": ["$title", "conclusion", "runStartedAt", "link", "workflow_name"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Dashboard JSON payload (click to expand)
{
"identifier": "pipeline_reliability",
"title": "Pipeline Reliability",
"icon": "Apps",
"type": "dashboard",
"description": "Based on default branch (main/master/production) pipeline runs only. Adjust the integration mapping selector to include other branches if needed.",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "reliabilityDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 512,
"columns": [
{"id": "overallFailureRate", "size": 3},
{"id": "totalFailingPipelines", "size": 3},
{"id": "failureTrend", "size": 3},
{"id": "jobResults", "size": 3}
]
},
{
"height": 482,
"columns": [
{"id": "failingStages", "size": 4},
{"id": "teamFailureBar", "size": 4},
{"id": "serviceFailureBar", "size": 4}
]
},
{
"height": 400,
"columns": [
{"id": "teamReliabilityTable", "size": 12}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReliabilityTable", "size": 12}
]
},
{
"height": 488,
"columns": [
{"id": "failedJobsTable", "size": 12}
]
}
],
"widgets": [
{
"id": "overallFailureRate",
"type": "entities-number-chart",
"title": "Overall Failure Rate % (Last Month)",
"icon": "Metric",
"description": "Percentage of pipeline jobs that failed across all services in the organisation",
"blueprint": "_team",
"chartType": "aggregateByProperty",
"calculationBy": "property",
"func": "average",
"property": "monthly_workflow_failure_rate",
"averageOf": "total",
"displayFormatting": "round",
"unit": "%",
"unitAlignment": "right",
"dataset": {"combinator": "and", "rules": []}
},
{
"id": "totalFailingPipelines",
"type": "entities-number-chart",
"title": "Total Failing Pipelines",
"icon": "Metric",
"description": "Pipelines whose current status is failed",
"blueprint": "gitlabPipeline",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{"property": "status", "operator": "=", "value": "failed"}
]
}
},
{
"id": "failureTrend",
"type": "line-chart",
"title": "Pipeline Job Failure Trend (Weekly)",
"icon": "LineChart",
"description": "Weekly trend of failed pipeline jobs over the past 6 months",
"blueprint": "gitlabJob",
"chartType": "countEntities",
"func": "count",
"measureTimeBy": "startedAt",
"timeInterval": "isoWeek",
"timeRange": {"preset": "last6Months"},
"xAxisTitle": "",
"yAxisTitle": "# Failed Jobs",
"dataset": {
"combinator": "and",
"rules": [
{"property": "status", "operator": "=", "value": "failed"}
]
}
},
{
"id": "jobResults",
"type": "entities-pie-chart",
"title": "Pipeline Job Results (Last Month)",
"icon": "Pie",
"description": "Breakdown of all pipeline jobs by status across the organisation",
"blueprint": "gitlabJob",
"property": "property#status",
"dataset": {
"combinator": "and",
"rules": [
{"property": "startedAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "failingStages",
"type": "bar-chart",
"title": "Most Failing Stages (Last 30 Days)",
"icon": "Bar",
"description": "Pipeline stages with the most failed jobs (last 30 days)",
"blueprint": "gitlabJob",
"property": "property#stage",
"dataset": {
"combinator": "and",
"rules": [
{"property": "startedAt", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "status", "operator": "=", "value": "failed"}
]
}
},
{
"id": "teamFailureBar",
"type": "bar-chart",
"title": "Teams with Most Pipeline Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed pipeline jobs by team",
"blueprint": "gitlabJob",
"property": "mirror-property#team_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "startedAt", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "status", "operator": "=", "value": "failed"}
]
}
},
{
"id": "serviceFailureBar",
"type": "bar-chart",
"title": "Services with Most Pipeline Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed pipeline jobs by service",
"blueprint": "gitlabJob",
"property": "mirror-property#service_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "status", "operator": "=", "value": "failed"},
{"property": "startedAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "teamReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Team Reliability Overview",
"icon": "Table",
"description": "Pipeline failure rates per team",
"blueprint": "_team",
"dataset": {"combinator": "and", "rules": [{"property": "type", "operator": "=", "value": "team"}]},
"excludedFields": [],
"blueprintConfig": {
"_team": {
"groupSettings": {"groupBy": []},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "serviceReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Reliability Overview",
"icon": "Table",
"description": "Pipeline failure rates per service",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["parent_team_name", "team"]},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "failedJobsTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Failed Pipeline Jobs (Last Month)",
"icon": "Table",
"description": "All pipeline jobs that concluded with failure",
"blueprint": "gitlabJob",
"dataset": {
"combinator": "and",
"rules": [
{"property": "status", "operator": "=", "value": "failed"},
{"property": "startedAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
},
"excludedFields": [],
"blueprintConfig": {
"gitlabJob": {
"groupSettings": {"groupBy": ["team_name", "service_name", "repository"]},
"propertiesSettings": {
"order": ["repository", "service_name", "team_name", "$title", "link", "pipeline", "stage"],
"shown": ["$title", "link", "stage", "pipeline"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Dashboard JSON payload (click to expand)
{
"identifier": "pipeline_reliability",
"title": "Pipeline Reliability",
"icon": "Apps",
"type": "dashboard",
"description": "Build and pipeline reliability metrics across services and teams.",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "reliabilityDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 512,
"columns": [
{"id": "overallFailureRate", "size": 3},
{"id": "totalFailedBuilds", "size": 3},
{"id": "failureTrend", "size": 3},
{"id": "buildResults", "size": 3}
]
},
{
"height": 482,
"columns": [
{"id": "topFailingStages", "size": 4},
{"id": "teamFailureBar", "size": 4},
{"id": "serviceFailureBar", "size": 4}
]
},
{
"height": 400,
"columns": [
{"id": "teamReliabilityTable", "size": 12}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReliabilityTable", "size": 12}
]
},
{
"height": 488,
"columns": [
{"id": "failedBuildsTable", "size": 12}
]
}
],
"widgets": [
{
"id": "overallFailureRate",
"type": "entities-number-chart",
"title": "Overall Failure Rate % (Last Month)",
"icon": "Metric",
"description": "Percentage of builds that failed across all services in the organisation",
"blueprint": "_team",
"chartType": "aggregateByProperty",
"calculationBy": "property",
"func": "average",
"property": "monthly_workflow_failure_rate",
"averageOf": "total",
"displayFormatting": "round",
"unit": "%",
"unitAlignment": "right",
"dataset": {"combinator": "and", "rules": []}
},
{
"id": "totalFailedBuilds",
"type": "entities-number-chart",
"title": "Total Failed Builds (Last Month)",
"icon": "Metric",
"description": "Number of builds that failed in the last 30 days",
"blueprint": "azureDevopsBuild",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{"property": "result", "operator": "=", "value": "failed"},
{"property": "$createdAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "failureTrend",
"type": "line-chart",
"title": "Build Failure Trend (Weekly)",
"icon": "LineChart",
"description": "Weekly trend of failed builds over the past 6 months",
"blueprint": "azureDevopsBuild",
"chartType": "countEntities",
"func": "count",
"measureTimeBy": "startTime",
"timeInterval": "isoWeek",
"timeRange": {"preset": "last6Months"},
"xAxisTitle": "",
"yAxisTitle": "# Failed Builds",
"dataset": {
"combinator": "and",
"rules": [
{"property": "result", "operator": "=", "value": "failed"}
]
}
},
{
"id": "buildResults",
"type": "entities-pie-chart",
"title": "Build Results (Last Month)",
"icon": "Pie",
"description": "Breakdown of all builds by result status across the organisation",
"blueprint": "azureDevopsBuild",
"property": "property#result",
"dataset": {
"combinator": "and",
"rules": [
{"property": "$createdAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "topFailingStages",
"type": "bar-chart",
"title": "Top Failing Pipeline Stages (Last 30 Days)",
"icon": "Bar",
"description": "Pipeline stages with the most failures (last 30 days)",
"blueprint": "azureDevopsPipelineStage",
"property": "$title",
"dataset": {
"combinator": "and",
"rules": [
{"property": "finishTime", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "result", "operator": "=", "value": "failed"}
]
}
},
{
"id": "teamFailureBar",
"type": "bar-chart",
"title": "Teams with Most Build Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed builds by team",
"blueprint": "azureDevopsBuild",
"property": "mirror-property#team_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "startTime", "operator": "between", "value": {"preset": "lastMonth"}},
{"property": "result", "operator": "=", "value": "failed"}
]
}
},
{
"id": "serviceFailureBar",
"type": "bar-chart",
"title": "Services with Most Build Failures (Last 30 Days)",
"icon": "Bar",
"description": "Distribution of failed builds by service",
"blueprint": "azureDevopsBuild",
"property": "mirror-property#service_name",
"dataset": {
"combinator": "and",
"rules": [
{"property": "result", "operator": "=", "value": "failed"},
{"property": "startTime", "operator": "between", "value": {"preset": "lastMonth"}}
]
}
},
{
"id": "teamReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Team Reliability Overview",
"icon": "Table",
"description": "Build failure rates per team",
"blueprint": "_team",
"dataset": {"combinator": "and", "rules": [{"property": "type", "operator": "=", "value": "team"}]},
"excludedFields": [],
"blueprintConfig": {
"_team": {
"groupSettings": {"groupBy": []},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "serviceReliabilityTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Reliability Overview",
"icon": "Table",
"description": "Build failure rates per service",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["parent_team_name", "team"]},
"propertiesSettings": {
"order": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend", "workflow_runs_7d", "failed_workflow_runs_7d"],
"shown": ["$title", "workflow_runs_30d", "failed_workflow_runs_30d", "monthly_workflow_failure_rate", "weekly_workflow_failure_rate", "failure_rate_trend"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
},
{
"id": "failedBuildsTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Failed Builds (Last Month)",
"icon": "Table",
"description": "All builds that resulted in failure",
"blueprint": "azureDevopsBuild",
"dataset": {
"combinator": "and",
"rules": [
{"property": "result", "operator": "=", "value": "failed"},
{"property": "$createdAt", "operator": "between", "value": {"preset": "lastMonth"}}
]
},
"excludedFields": [],
"blueprintConfig": {
"azureDevopsBuild": {
"groupSettings": {"groupBy": ["team_name", "service_name", "repository"]},
"propertiesSettings": {
"order": ["repository", "service_name", "team_name", "$title", "link", "definitionName", "requestedFor", "startTime"],
"shown": ["$title", "link", "definitionName", "requestedFor", "startTime"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Then run the following command to create the dashboard with all widgets:
curl -s -X POST "https://api.getport.io/v1/pages" \
-H "Authorization: Bearer $PORT_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d @reliability_dashboard.json | python3 -m json.tool
The script assumes an engineering_intelligence folder already exists in your catalog. If you haven't created it yet, follow step 1-4 in the create the dashboard section first else you will run into an error when you run the script.
High-level reliability metrics
Start with summary widgets that give an at-a-glance view of pipeline reliability health.Overall failure rate (%) (click to expand)
+ Widget and select Number Chart.Overall Failure Rate % (Last Month).Percentage of pipeline runs that failed across all services.Aggregate Property (All Entities) Chart type and choose Team as the Blueprint.Monthly Failure Rate (%) as the Property.average for the Function.total for Average of.custom as the Unit and input % as the unit and align the unit to the right.
- GitHub
- GitLab
- Azure DevOps
Total failing workflows (click to expand)
-
Click
+ Widgetand select Number Chart. -
Title:
Total Failing Workflows. -
Description:
Workflows whose current result is in failure state. -
Select
Count entitiesChart type and choose GitHub Workflow as the Blueprint. -
Select
countfor the Function. -
Add this JSON to the Dataset filter editor:
{
"combinator": "and",
"rules": [
{
"property": "result",
"operator": "=",
"value": "failure"
}
]
} -
Click Save.
Workflow runs failure trend (weekly) (click to expand)
-
Click
+ Widgetand select Line Chart. -
Title:
Workflow Runs Failure Trend (Weekly). -
Description:
Weekly trend of failed workflow runs over the past 6 months. -
Select
Count Entities (All Entities)Chart type and choose GitHub Workflow Run as the Blueprint. -
Input
# Failed Workflowsas the Y axis Title. -
Select
countfor the Function. -
Select
runStartedAtfor Measure time by. -
Set Time Interval to
Weekand Time Range toIn the past 180 days. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
} -
Click Save.
Workflow run results (last month) (click to expand)
-
Click
+ Widgetand select Pie chart. -
Title:
Workflow Run Results (Last Month). -
Description:
Breakdown of all workflow runs by conclusion status. -
Choose the GitHub Workflow Run blueprint.
-
Under Breakdown by property, select the
conclusionproperty. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Total failing pipelines (click to expand)
-
Click
+ Widgetand select Number Chart. -
Title:
Total Failing Pipelines. -
Description:
Pipelines whose current status is failed. -
Select
Count entitiesChart type and choose GitLab Pipeline as the Blueprint. -
Select
countfor the Function. -
Add this JSON to the Dataset filter editor:
{
"combinator": "and",
"rules": [
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Pipeline job failure trend (weekly) (click to expand)
-
Click
+ Widgetand select Line Chart. -
Title:
Pipeline Job Failure Trend (Weekly). -
Description:
Weekly trend of failed pipeline jobs over the past 6 months. -
Select
Count Entities (All Entities)Chart type and choose GitLab Job as the Blueprint. -
Input
# Failed Jobsas the Y axis Title. -
Select
countfor the Function. -
Select
startedAtfor Measure time by. -
Set Time Interval to
Weekand Time Range toIn the past 180 days. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Pipeline job results (last month) (click to expand)
-
Click
+ Widgetand select Pie chart. -
Title:
Pipeline Job Results (Last Month). -
Description:
Breakdown of all pipeline jobs by status. -
Choose the GitLab Job blueprint.
-
Under Breakdown by property, select the
statusproperty. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Total failed builds (click to expand)
-
Click
+ Widgetand select Number Chart. -
Title:
Total Failed Builds (Last Month). -
Description:
Number of builds that failed in the last 30 days. -
Select
Count entitiesChart type and choose Azure DevOps Build as the Blueprint. -
Select
countfor the Function. -
Add this JSON to the Dataset filter editor:
{
"combinator": "and",
"rules": [
{
"property": "result",
"operator": "=",
"value": "failed"
},
{
"property": "$createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Build failure trend (weekly) (click to expand)
-
Click
+ Widgetand select Line Chart. -
Title:
Build Failure Trend (Weekly). -
Description:
Weekly trend of failed builds over the past 6 months. -
Select
Count Entities (All Entities)Chart type and choose Azure DevOps Build as the Blueprint. -
Input
# Failed Buildsas the Y axis Title. -
Select
countfor the Function. -
Select
startTimefor Measure time by. -
Set Time Interval to
Weekand Time Range toIn the past 180 days. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Build results (last month) (click to expand)
-
Click
+ Widgetand select Pie chart. -
Title:
Build Results (Last Month). -
Description:
Breakdown of all builds by result status. -
Choose the Azure DevOps Build blueprint.
-
Under Breakdown by property, select the
resultproperty. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "$createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Failure distribution
Identify where failures are concentrated - by pipeline, team, and service.
- GitHub
- GitLab
- Azure DevOps
Top failing workflows (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Top Failing Workflows (Last 30 Days). -
Description:
Workflows with the most failed runs (last 30 days). -
Select GitHub Workflow Run as the Blueprint.
-
Select
Workflow Nameas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "runStartedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
} -
Click Save.
Teams with most workflow failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Teams with Most Workflow Failures (Last 30 Days). -
Description:
Distribution of failed workflow runs by team. -
Select GitHub Workflow Run as the Blueprint.
-
Select
Teamas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "runStartedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "conclusion",
"operator": "=",
"value": "failure"
}
]
} -
Click Save.
Services with most workflow failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Services with Most Workflow Failures (Last 30 Days). -
Description:
Distribution of failed workflow runs by service. -
Select GitHub Workflow Run as the Blueprint.
-
Select
Serviceas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "conclusion",
"operator": "=",
"value": "failure"
},
{
"property": "runStartedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Most failing stages (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Most Failing Stages (Last 30 Days). -
Description:
Pipeline stages with the most failed jobs (last 30 days). -
Select GitLab Job as the Blueprint.
-
Select
Stageas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Teams with most pipeline failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Teams with Most Pipeline Failures (Last 30 Days). -
Description:
Distribution of failed pipeline jobs by team. -
Select GitLab Job as the Blueprint.
-
Select
Teamas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "status",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Services with most pipeline failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Services with Most Pipeline Failures (Last 30 Days). -
Description:
Distribution of failed pipeline jobs by service. -
Select GitLab Job as the Blueprint.
-
Select
Serviceas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "status",
"operator": "=",
"value": "failed"
},
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Top failing pipeline stages (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Top Failing Pipeline Stages (Last 30 Days). -
Description:
Pipeline stages with the most failures (last 30 days). -
Select Azure DevOps Pipeline Stage as the Blueprint.
-
Select
Titleas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "finishTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Teams with most build failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Teams with Most Build Failures (Last 30 Days). -
Description:
Distribution of failed builds by team. -
Select Azure DevOps Build as the Blueprint.
-
Select
Teamas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
},
{
"property": "result",
"operator": "=",
"value": "failed"
}
]
} -
Click Save.
Services with most build failures (click to expand)
-
Click
+ Widgetand select Bar Chart. -
Title:
Services with Most Build Failures (Last 30 Days). -
Description:
Distribution of failed builds by service. -
Select Azure DevOps Build as the Blueprint.
-
Select
Serviceas the Breakdown by property. -
Add this JSON to the Additional filters editor:
{
"combinator": "and",
"rules": [
{
"property": "result",
"operator": "=",
"value": "failed"
},
{
"property": "startTime",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
Team reliability
Compare reliability metrics across teams.Team reliability overview (click to expand)
+ Widget and select Table.Team Reliability Overview.Pipeline failure rates per team.... button in the top right corner of the table and select Customize table.type = team.
workflow_runs_30d): Total runs in the last 30 days.failed_workflow_runs_30d): Failed runs in the last 30 days.monthly_workflow_failure_rate): Percentage of runs that failed.weekly_workflow_failure_rate): Percentage of runs that failed in the last 7 days.failure_rate_trend): Whether failure rate is improving, stable, or degrading.
Service reliability
Track reliability at the individual service level.Service reliability overview (click to expand)
+ Widget and select Table.Service Reliability Overview.Pipeline failure rates per service.... button in the top right corner of the table and select Customize table.
workflow_runs_30d): Total runs in the last 30 days.failed_workflow_runs_30d): Failed runs in the last 30 days.monthly_workflow_failure_rate): Percentage of runs that failed.weekly_workflow_failure_rate): Percentage of runs that failed in the last 7 days.failure_rate_trend): Whether failure rate is improving, stable, or degrading.parent_team_name and team as the Group by columns.
Failed pipeline runs
Drill into individual failed runs to investigate root causes.
- GitHub
- GitLab
- Azure DevOps
Failed workflow runs table (click to expand)
-
Click
+ Widgetand select Table. -
Title:
Failed Workflow Runs (Last Month). -
Description:
All workflow runs that concluded with failure. -
Choose the GitHub Workflow Run blueprint.
-
Add this JSON to the Initial filters editor:
{
"combinator": "and",
"rules": [
{
"property": "conclusion",
"operator": "=",
"value": "failure"
},
{
"property": "createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
-
Click on the
...button in the top right corner of the table and select Customize table. -
In the top right corner of the table, click on Manage Properties and add the following columns:
- Title: The run title.
- Conclusion: The run conclusion (success, failure, etc.).
- Run Started At: When the run started.
- Link: URL to the workflow run.
- Workflow Name: The workflow path (via mirror property).
-
Select
team_name,service_nameandrepositoryas the Group by columns. -
Click on the save icon in the top right corner of the widget to save the customized table.
Failed pipeline jobs table (click to expand)
-
Click
+ Widgetand select Table. -
Title:
Failed Pipeline Jobs (Last Month). -
Description:
All pipeline jobs that concluded with failure. -
Choose the GitLab Job blueprint.
-
Add this JSON to the Initial filters editor:
{
"combinator": "and",
"rules": [
{
"property": "status",
"operator": "=",
"value": "failed"
},
{
"property": "startedAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
-
Click on the
...button in the top right corner of the table and select Customize table. -
In the top right corner of the table, click on Manage Properties and add the following columns:
- Title: The job name.
- Link: URL to the job.
- Stage: The pipeline stage.
- Pipeline: The parent pipeline (via relation).
-
Select
team_name,service_nameandrepositoryas the Group by columns. -
Click on the save icon in the top right corner of the widget to save the customized table.
Failed builds table (click to expand)
-
Click
+ Widgetand select Table. -
Title:
Failed Builds (Last Month). -
Description:
All builds that resulted in failure. -
Choose the Azure DevOps Build blueprint.
-
Add this JSON to the Initial filters editor:
{
"combinator": "and",
"rules": [
{
"property": "result",
"operator": "=",
"value": "failed"
},
{
"property": "$createdAt",
"operator": "between",
"value": {
"preset": "lastMonth"
}
}
]
} -
Click Save.
-
Click on the
...button in the top right corner of the table and select Customize table. -
In the top right corner of the table, click on Manage Properties and add the following columns:
- Title: The build number.
- Link: URL to the build.
- Definition Name: The build pipeline definition.
- Requested For: Who triggered the build.
- Start Time: When the build started.
-
Select
team_name,service_nameandrepositoryas the Group by columns. -
Click on the save icon in the top right corner of the widget to save the customized table.
Next steps
Once your Pipeline Reliability dashboard is in place, consider these additional improvements:
- Create automations to send Slack notifications when a service's failure rate exceeds a threshold or when the failure rate trend changes to "Degrading".
- Add an AI agent to provide natural language insights into your reliability data, helping identify patterns in failures and recommending fixes.
- Combine with delivery metrics by adding reliability columns to your existing Delivery Performance dashboard for a unified engineering intelligence view.