Saltar al contenido
# 📊 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/)