Measure, benchmark, instrument, and debug DORA metrics (Deployment Frequency, Lead Time for Changes, Change Failure Rate, MTTR) for production engineering teams. Covers GitHub Actions instrumentation, Prometheus recording rules, Grafana dashboards, incident source integration, SaaS tool selection, and anti-pattern detection. Use when asked to "instrument DORA metrics", "benchmark our deployment frequency", "why is my MTTR data missing", or "generate a DORA dashboard".
82%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Measure, benchmark, and instrument DORA metrics for production engineering teams.
Add DORA event emission to a GitHub Actions workflow.
Steps:
Identify which events to capture:
Detect: does a Prometheus Pushgateway exist in the stack? If not, it must be deployed before instrumentation can work:
kubectl get svc -A | grep pushgatewayIf absent, stop: Pushgateway is a prerequisite, and installing it into the user's cluster is their call, not this skill's. Give them a pinned install to run, then continue once the check above finds it:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade --install prometheus-pushgateway prometheus-community/prometheus-pushgateway \
--version 3.9.1 \
--namespace monitoring \
--create-namespaceGenerate GitHub Actions steps for each event type:
dora_deployment_timestamp and dora_lead_time_seconds to Pushgatewaydora_incident_start_timestampdora_incident_duration_seconds and dora_incident_caused_by_deployOutput: exact YAML to append to the existing workflow, using the Pushgateway job name convention job/dora/instance/<repo-owner_repo-name>. Sanitize owner/repo → owner_repo to avoid breaking Pushgateway path segments.
Example deploy event step:
- name: Push DORA deploy metrics
if: success()
env:
PUSHGATEWAY_URL: ${{ secrets.PUSHGATEWAY_URL }}
REPO: ${{ github.repository }}
run: |
DEPLOY_TS=$(date +%s)
# Lead time from first commit in this batch — requires fetch-depth: 0 in checkout.
FIRST_COMMIT_TS=$(git log --reverse --format="%ct" origin/main..HEAD | head -1)
FIRST_COMMIT_TS=${FIRST_COMMIT_TS:-$DEPLOY_TS}
LEAD_TIME=$((DEPLOY_TS - FIRST_COMMIT_TS))
INSTANCE="${REPO//\//_}"
curl --data-binary @- "${PUSHGATEWAY_URL}/metrics/job/dora/instance/${INSTANCE}" <<EOF
# TYPE dora_deployment_timestamp gauge
dora_deployment_timestamp{repo="${REPO}",env="production"} ${DEPLOY_TS}
# TYPE dora_lead_time_seconds gauge
dora_lead_time_seconds{repo="${REPO}",env="production"} ${LEAD_TIME}
EOFWarn: Change Failure Rate requires incident source integration — a rate of 0% without incident data is a configuration gap, not a real metric. Never report 0% CFR without confirmed incident source connectivity.
Validation:
# Confirm Pushgateway received the metric
curl -s http://pushgateway:9091/metrics | grep dora_deployment_timestamp
# Confirm Prometheus scraped it (allow up to 1 scrape interval, default 15s)
curl -s 'http://prometheus:9090/api/v1/query?query=dora_deployment_timestamp' \
| jq '.data.result[0].value[1] // "not yet scraped — wait 15s and retry"'Reference: references/dora.md → Open-source instrumentation pattern
Generate a Grafana dashboard for all four DORA metrics.
Steps:
Confirm the four recording rules are deployed before building the dashboard:
dora:deployment_frequency:rate30ddora:lead_time_seconds:p50dora:change_failure_rate:ratio30ddora:mttr_seconds:p50Verify with:
curl -s 'http://prometheus:9090/api/v1/query?query=dora:deployment_frequency:rate30d' | jq '.data.result[0].value[1] // "no data"'If any query returns no data, check the recording rule deployment — see references/dora.md for the full rule set.
Dashboard structure: four panels arranged in a 2×2 grid, one per DORA metric:
Each panel includes DORA performance band overlays as threshold regions (Elite/High/Medium/Low). A time range selector provides 30/60/90 day views.
Import the complete dashboard JSON from examples/dora/grafana-dashboard.json:
# Import via Grafana API
curl -s -X POST http://grafana:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-d @examples/dora/grafana-dashboard.jsonThreshold values for each performance tier are embedded directly in the panel JSON as threshold bands. Update them in the panel thresholds field if your organisation uses different band definitions.
Reference: references/dora.md → DORA performance bands
Classify current metric values against DORA performance bands.
Steps:
Accept current metric values — either provided directly or queried from Prometheus:
# Query current values
curl -s 'http://prometheus:9090/api/v1/query?query=dora:deployment_frequency:rate30d' | jq '.data.result[0].value[1] // "no data"'
curl -s 'http://prometheus:9090/api/v1/query?query=dora:lead_time_seconds:p50' | jq '.data.result[0].value[1] // "no data"'
curl -s 'http://prometheus:9090/api/v1/query?query=dora:change_failure_rate:ratio30d' | jq '.data.result[0].value[1] // "no data"'
curl -s 'http://prometheus:9090/api/v1/query?query=dora:mttr_seconds:p50' | jq '.data.result[0].value[1] // "no data"'Map each metric to Elite / High / Medium / Low using the 2023 DORA performance bands:
| Metric | Elite | High | Medium | Low |
|---|---|---|---|---|
| Deployment Frequency | Multiple/day | Weekly–monthly | Monthly–6 months | Less than 6 months |
| Lead Time for Changes | < 1 hour | 1 day – 1 week | 1 week – 1 month | > 1 month |
| Change Failure Rate | < 5% | 5–10% | 10–15% | > 15% |
| MTTR | < 1 hour | < 1 day | 1 day – 1 week | > 1 week |
Identify the weakest metric — the one furthest from Elite — as the highest-leverage improvement target.
Suggest the most impactful improvement for that specific metric:
Output: tier table + one-sentence recommendation per metric.
Reference: references/dora.md → DORA performance bands
Diagnose gaps in DORA metric data.
Steps:
Missing deployment events
on: push to main/release branch)?
grep -A5 '^on:' .github/workflows/*.yamlcurl http://pushgateway:9091/-/healthycurl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | select(.labels.job == "pushgateway")'Missing MTTR (or stuck at 0)
repository_dispatch events for incident lifecycle?
grep -r 'repository_dispatch' .github/workflows/Change failure rate is exactly 0%
Metrics stop at a specific date
kubectl describe pod -n monitoring -l app=prometheus-pushgateway | grep -i retention--persistence.file.Reference: references/dora.md → Anti-pattern detection
After completing this task, log errors and learnings via /platform-skills:self-improve log.
nitinjain999/platform-skills
c2e75b7
Also appears in
since Oct 19, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.