Skip to main content

Resumen

PagerDuty se integra con Devin como mecanismo de enrutamiento de alertas. Cuando se activan incidentes en PagerDuty, estos activan sesiones de Devin mediante la API de Devin a través de un puente ligero basado en webhook. Después, Devin investiga el incidente automáticamente: recopila telemetría, rastrea la causa raíz y, de forma opcional, abre PR con correcciones. Este patrón funciona especialmente bien cuando se combina con la integración de Datadog MCP, donde PagerDuty enruta la alerta a Devin y Devin usa Datadog para investigar registros y métricas.

Configuración

1

Despliega un servicio puente de webhook

Crea un pequeño controlador que reciba cargas de incidentes de PagerDuty y llame a la API de Devin para iniciar sesiones de investigación.Crea un usuario de servicio en Settings > Service Users con el permiso ManageOrgSessions. Guarda el token de la API como DEVIN_API_KEY, el ID de tu organización como DEVIN_ORG_ID y un secreto compartido como WEBHOOK_SECRET en tu servicio puente. Configurarás este mismo secreto en los Custom Headers del webhook de PagerDuty en el siguiente paso.
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());

function verifySignature(req) {
  const secret = Buffer.from(req.headers['x-webhook-secret'] || '');
  const expected = Buffer.from(process.env.WEBHOOK_SECRET || '');
  if (!expected.length) throw new Error('WEBHOOK_SECRET environment variable is not set');
  if (secret.length !== expected.length) return false;
  return crypto.timingSafeEqual(secret, expected);
}

app.post('/pagerduty-alert', async (req, res) => {
  if (!verifySignature(req)) return res.status(401).send('Bad signature');

  const event = req.body?.event;
  if (!event || event.event_type !== 'incident.triggered') {
    return res.sendStatus(200);
  }

  const incident = event.data;
  const title = incident.title || 'Unknown incident';
  const service = incident.service?.summary || 'unknown-service';
  const urgency = incident.urgency || 'high';
  const incidentUrl = incident.html_url || '';

  const orgId = process.env.DEVIN_ORG_ID;
  const response = await fetch(
    `https://api.devin.ai/v3/organizations/${orgId}/sessions`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.DEVIN_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      prompt: [
        `PagerDuty incident triggered: "${title}"`,
        `Service: ${service}`,
        `Urgency: ${urgency}`,
        `Incident URL: ${incidentUrl}`,
        ``,
        `Investigate this incident:`,
        `1. Check recent logs and metrics for ${service}`,
        `2. Identify the root cause of the issue`,
        `3. If the root cause is a code issue, open a hotfix PR`,
        `4. Post your findings to #incidents on Slack`,
      ].join('\n'),
      tags: ['pagerduty-triage', `service:${service}`],
    }),
  });

  const { session_id } = await response.json();
  console.log(`Started Devin session ${session_id} for: ${title}`);
  res.sendStatus(200);
});

app.listen(3000);
Despliega esto en cualquier lugar que pueda recibir tráfico HTTPS: un Cloudflare Worker, AWS Lambda o un contenedor pequeño.
2

Agrega una integración de webhook en PagerDuty

  1. En PagerDuty, ve a Services > [your service] > Integrations
  2. Haz clic en Add Integration y selecciona Generic Webhooks (v3)
  3. Configura la Webhook URL con el endpoint de tu servicio puente (por ejemplo, https://your-bridge.example.com/pagerduty-alert)
  4. En Custom Headers, agrega X-Webhook-Secret con el mismo valor que guardaste como WEBHOOK_SECRET en tu servicio puente
  5. En Event Subscription, filtra por el tipo de evento incident.triggered para que solo se active con incidentes nuevos
3

Verifica el flujo

Genera un incidente de prueba en PagerDuty (o usa un servicio de prueba) y confirma que:
  1. Tu servicio puente recibe la carga del webhook
  2. Se crea una nueva sesión de Devin en app.devin.ai
  3. Devin comienza a investigar el incidente

Mejores prácticas

  • Empieza con monitores de nivel de advertencia. Prueba el pipeline con incidentes no críticos antes de enrutar a Devin las alertas P1 de producción.
  • Filtra por servicio o gravedad. Usa las suscripciones a eventos de webhook de PagerDuty o agrega lógica en tu puente para omitir servicios de baja prioridad o ruidosos. Esto evita que Devin se sature con alertas de poco valor.
  • Usa distintos playbooks según la gravedad. Enruta las alertas P1 para una investigación inmediata y hotfix. Enruta las alertas P3 solo para el análisis de causa raíz. Pasa distintos valores de playbook_id en la solicitud a la API de Devin según la urgencia.
  • Etiqueta las sesiones para facilitar el seguimiento. El código de ejemplo etiqueta cada sesión con pagerduty-triage y el nombre del servicio, lo que facilita filtrarlas y revisarlas en el panel de Devin.

Combinación con Datadog

PagerDuty suele usarse junto con la integración de Datadog MCP. En este patrón:
  1. PagerDuty enruta la alerta a Devin (lo que activa la sesión de investigación)
  2. Devin usa Datadog MCP para consultar registros, métricas y trazas del servicio afectado
Esto le da a Devin tanto el contexto de la alerta de PagerDuty como datos de observabilidad detallados de Datadog, lo que permite realizar investigaciones más exhaustivas.
Agrega Knowledge sobre la arquitectura de tu servicio y los runbooks de guardia para que Devin pueda seguir automáticamente los procedimientos de investigación de tu equipo.