Los eventos de seguridad pueden contener rutas, identidades, IP y reglas. Trátalos como datos sensibles.
Redacción
{
"observability": {
"redaction": {
"enabled": true,
"ip": "mask",
"identity": "hash",
"userAgent": "full"
}
}
}Para IP e identidad están disponibles none, mask, hash y omit. El user agent puede ser full u omit.
Correlación, logs y eventos
{
"observability": {
"correlation": {
"headers": ["x-request-id", "x-correlation-id", "traceparent"]
},
"logs": { "enabled": true, "format": "json" },
"events": { "enabled": true }
}
}Los fallos de listeners de aplicación se aíslan de las decisiones y aparecen en el snapshot de ejecución.
OpenTelemetry
npm install @opentelemetry/api{
"observability": {
"otel": {
"enabled": true,
"serviceName": "orders-api",
"emitAllowedRequests": false
}
}
}Dhal utiliza el proveedor OpenTelemetry de la aplicación host.
Webhooks firmados
{
"observability": {
"webhooks": {
"enabled": true,
"urls": ["https://security.example.com/dhal/events"],
"timeoutMs": 750,
"emitAllowedRequests": false,
"signing": {
"enabled": true,
"secretEnv": "DHAL_WEBHOOK_SECRET",
"signatureHeader": "x-dhal-signature",
"timestampHeader": "x-dhal-timestamp",
"idHeader": "x-dhal-event-id"
}
}
}
}El receptor debe verificar timestamp, ID y firma HMAC, rechazar replays y responder 2xx solo tras aceptar el evento. Las colas son acotadas; las respuestas no 2xx cuentan como fallos.
Salud y apagado
const snapshot = protection.getRuntimeSnapshot();Monitoriza blocked, wouldBlock, internalErrors, overBudget, errores de listeners y entregas pendientes, fallidas o descartadas.
async function shutdown() {
await protection.close(5_000);
process.exit(0);
}flush() drena telemetría sin cerrar. close() impide nuevas inspecciones, drena telemetría y elimina listeners.