# 📊 DORA Metrics — DevOps Performance
## 🤔 ¿Qué hago? ¿Cómo lo hago? ¿Y para qué lo hago?
**¿Qué hago?** Mido la velocidad y confiabilidad del equipo con 4 métricas DORA (DevOps Research & Assessment).
**¿Cómo lo hago?** Extracto automáticamente datos de GitHub Actions, Prometheus y logs de deployment.
**¿Para qué lo hago?** DORA metrics son predictores de rendimiento empresarial. Equipos con altas DORA entregan más rápido, con menos bugs, y más satisfacción.
---
## 📈 Las 4 métricas DORA
```mermaid
graph LR
A["🚀 Deployment Frequency<br/>(deploys/día)"] -->|velocidad| B["📊 DORA Score"]
C["🕐 Lead Time<br/>(commit → prod)"] -->|velocidad| B
D["📉 Change Failure Rate<br/>(% fallos post-deploy)"] -->|confiabilidad| B
E["⏱️ Time to Recovery<br/>(MTTR de incidents)"] -->|confiabilidad| B
B --> F["🎯 Organizacional<br/>Mejor performance<br/>Mayor revenue"]
```
---
## 1️⃣ Deployment Frequency — ¿Qué tan rápido deployamos?
**Definición:** Número de deployments exitosos a producción por semana.
**Métrica:** `dora_deployment_frequency_total`
**Cálculo:**
```
Deployment Frequency = count(successful_deployments_in_30d) / (30 / 7 days/week)
```
### Benchmark por industria (DORA 2021)
| Nivel | Frequency |
| --- | --- |
| **Elite** | > 1/día (7+/semana) |
| **High** | 1/semana a 1/mes |
| **Medium** | 1/mes a 6/meses |
| **Low** | < 1 cada 6 meses |
### Target para Klaus-proxy
- **Objetivo:** High tier (1 deploy/semana)
- **Roadmap:** Elite (1+ deploys/día)
### Monitoreo
```yaml
# GitHub Actions workflow: .github/workflows/quality-gate-and-deploy.yml
# Se ejecuta en cada merge a main
on: push: branches: [main]
jobs:
deploy:
steps:
- name: Track deployment
run: |
gh api repos/{owner}/{repo}/actions/runs/{run_id} \
--jq '.conclusion'
```
**Dashboard:**
```promql
# Deployments en últimas 2 semanas
increase(dora_deployment_frequency_total[14d])
```
---
## 2️⃣ Lead Time — ¿Cuánto tarda código en llegar a prod?
**Definición:** Tiempo desde commit a merge (o desde merge a deploy en prod).
**Métrica:** `dora_lead_time_seconds`
**Cálculo:**
```
Lead Time = deployment_timestamp - first_commit_timestamp
```
### Benchmark
| Nivel | Lead Time |
| --- | --- |
| **Elite** | < 1 hora |
| **High** | 1-24 horas |
| **Medium** | 1-7 días |
| **Low** | > 1 mes |
### Target para Klaus-proxy
- **Objetivo:** High tier (< 24 horas)
- **Roadmap:** Elite (< 1 hora)
### Monitoreo
```bash
# Ejemplo: Lead time de último deployment
dora_lead_time_seconds
# Lead time promedio (7 días)
avg_over_time(dora_lead_time_seconds[7d])
```
**Cómo reducir lead time:**
- ✅ CI/CD pipeline automático (GitHub Actions)
- ✅ Tests rápidos (< 5 min)
- ✅ Pequeños PRs (< 10 archivos)
- ✅ Code review ágil (< 1 hora)
- ✅ Deployment automático tras merge
---
## 3️⃣ Change Failure Rate — ¿Cuántos cambios rompen prod?
**Definición:** % de deployments que causan incident o SLO violation post-deploy.
**Métrica:** `dora_change_failure_rate` (0.0-1.0)
**Cálculo:**
```
CFR = count(failed_deployments) / count(total_deployments)
Fallido = deployment que causó:
- SLO violation (availability, latency, cache hit rate)
- Rollback dentro de 24h
- Hotfix emergente dentro de 4h
```
### Benchmark
| Nivel | CFR |
| --- | --- |
| **Elite** | 0-15% |
| **High** | 15-45% |
| **Medium** | 45-60% |
| **Low** | > 60% |
### Target para Klaus-proxy
- **Objetivo:** Elite tier (< 15%)
- **Roadmap:** < 5%
### Monitoreo
```yaml
# GitHub Actions calcula CFR post-deploy
dora_change_failure_rate =
(failed_deploys_30d / total_deploys_30d) * 100
# Si > 15%, crear issue automático
if dora_change_failure_rate > 0.15:
gh issue create --title "🚨 CFR alta: ${CFR}"
```
**Cómo reducir CFR:**
- ✅ Mejores tests (unit + integration)
- ✅ Code review + pair programming
- ✅ Feature flags (rollout gradual)
- ✅ Canary deployments
- ✅ SLO-driven gates (no deploy si SLO violado)
- ✅ Runbooks para cada feature
---
## 4️⃣ Time to Recovery (MTTR) — ¿Qué tan rápido arreglamos incidents?
**Definición:** Tiempo promedio desde que se detecta un incident hasta que se resuelve.
**Métrica:** `dora_time_to_recovery_seconds`
**Cálculo:**
```
MTTR = avg(incident_resolved_time - incident_detected_time)
Detectado = SLO violation (alert)
Resuelto = SLO vuelve a cumplirse
```
### Benchmark
| Nivel | MTTR |
| --- | --- |
| **Elite** | < 1 hora |
| **High** | 1-24 horas |
| **Medium** | 24 horas - 7 días |
| **Low** | > 7 días |
### Target para Klaus-proxy
- **Objetivo:** High tier (< 24 horas)
- **Roadmap:** Elite (< 1 hora)
### Monitoreo
```yaml
# Extraer de incidents resueltos en último mes
avg(dora_time_to_recovery_seconds[30d])
# Si MTTR > 1 hora: escalada a SRE lead
```
**Cómo reducir MTTR:**
- ✅ Alertas rápidas (30s) con runbooks
- ✅ Oncall 24/7 en rotación
- ✅ Debugging tools setup (logs, traces, metrics)
- ✅ Rollback automático
- ✅ Circuit breakers + graceful degradation
---
## 🧮 DORA Score — rating integrado
```
DORA Score = f(Frequency, Lead Time, CFR, MTTR)
Ejemplo cálculo simple:
- Si Elite en 4 dimensiones: 94-96 (elite)
- Si High en 3, Medium en 1: 50-74 (high)
- Si Medium en todas: 21-35 (medium)
- Si Low/Medium mix: < 20 (low)
```
---
## 📊 Dashboard — DORA de Klaus-proxy
```
┌──────────────────────────────────────────────────────────┐
│ 📊 Klaus-proxy DORA Metrics Dashboard │
├──────────────────────────────────────────────────────────┤
│ │
│ 🚀 Deployment Frequency │ 🕐 Lead Time │
│ 3.2 deploys/semana │ 4.5 horas (media 7d) │
│ Trend: ↗ (mejorando) │ Trend: ↘ (más rápido) │
│ │
├──────────────────────────────────────────────────────────┤
│ │
│ 📉 Change Failure Rate │ ⏱️ Time to Recovery │
│ 8.3% │ 32 minutos (media 30d) │
│ Trend: ↘ (mejorando) │ Trend: ↗ (lentificación) │
│ │
├──────────────────────────────────────────────────────────┤
│ 🎯 DORA Overall Score: 87 (Elite tier 🏆) │
├──────────────────────────────────────────────────────────┤
│ ✅ Deployment Frequency: High (1-7/semana) │
│ ✅ Lead Time: High (< 24h) │
│ ✅ Change Failure Rate: Elite (< 15%) │
│ ✅ Time to Recovery: High (< 24h) │
└──────────────────────────────────────────────────────────┘
```
---
## 🔄 Implementación en GitHub Actions
### Workflow: `.github/workflows/dora-metrics.yml`
Se ejecuta después de cada deployment exitoso:
```yaml
on:
workflow_run:
workflows: ["Quality Gate & Deploy"]
types: [completed]
jobs:
dora-metrics:
steps:
- name: Calculate Lead Time
run: |
FIRST_COMMIT_TIME=$(git log --reverse --format=%cI | head -1)
MERGE_TIME=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
LEAD_TIME=$(($(date -d "$MERGE_TIME" +%s) - $(date -d "$FIRST_COMMIT_TIME" +%s)))
# Publicar métrica
echo "dora_lead_time_seconds $LEAD_TIME" | \
curl -X POST --data-binary @- http://pushgateway:9091/metrics/job/dora
- name: Calculate Deployment Frequency
run: |
# Contar deployments en últimos 30 días
DEPLOYMENTS=$(gh workflow run list --workflow quality-gate-and-deploy.yml \
--status completed --json conclusion \
--jq 'map(select(.conclusion == "success")) | length')
echo "Deployments en 30d: $DEPLOYMENTS"
- name: Calculate Change Failure Rate
run: |
# Contar deployments fallidos vs totales
TOTAL=$(gh workflow run list --workflow quality-gate-and-deploy.yml \
--json conclusion | jq 'length')
FAILED=$(gh workflow run list --status completed --json conclusion \
--jq 'map(select(.conclusion == "failure")) | length')
CFR=$((FAILED * 100 / TOTAL))
echo "Change Failure Rate: ${CFR}%"
- name: Calculate Time to Recovery
run: |
# MTTR extraído de incidents hotfix PRs
MTTR=$(gh pr list --search 'label:hotfix merged:>$(date -d "30 days ago" +%Y-%m-%d)' \
--json createdAt,mergedAt \
--jq 'map((.mergedAt | fromdateiso8601) - (.createdAt | fromdateiso8601)) | add / length')
echo "MTTR: ${MTTR} seconds"
```
---
## 📈 Evolución esperada
### Fase 1 (Ahora): Establecer baseline
- Recolectar datos por 2-4 semanas
- Identificar bottlenecks
- High tier en 2-3 métricas
### Fase 2 (4-8 semanas): Mejora
- Reduce lead time < 12 horas
- Deployment frequency 2x/semana
- CFR < 10%
- MTTR < 30 min
### Fase 3 (3 meses): Elite
- Deployment frequency 1+/día
- Lead time < 1 hora
- CFR < 5%
- MTTR < 15 min
---
## 🚀 Mejoras futuras
- [ ] Dashboard personalizado en Grafana
- [ ] Alertas si DORA score cae
- [ ] Breakdown por equipo/componente
- [ ] Correlación con business metrics (revenue, latency)
- [ ] Predicción de DORA con ML (tendencias)
---
## 📚 Referencias
- [DORA Metrics — State of DevOps Report 2023](https://www.devops-research.com/)
- [Google Cloud: DORA Metrics](https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-devops-performance)
- [The Phoenix Project — DevOps Culture](https://www.oreilly.com/library/view/the-phoenix-project/9781457191985/)
- [Accelerate — Nicole Forsgren](https://nicoleforsgren.com/accelerate/)