Integraciones

Proveedores de notificaciones

Hermes soporta el envío de notificaciones a 4 proveedores externos. Cada notificación tiene configurado en base de datos qué proveedores deben recibirla. La plataforma despacha de forma asíncrona e independiente a cada proveedor habilitado.

Proveedor

Tipo

Mecanismo

Email

Correo electrónico

JavaMailSender (SMTP)

Google Chat

Mensajería corporativa

Webhook HTTP

Slack

Mensajería de equipo

Webhook HTTP

Microsoft Teams

Mensajería corporativa

Power Automate Webhook


1. Configuración en application.yaml

1.1 Google Chat

YAML
anjana:
  messaging:
    google-chat:
      webhook-url: https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ

Cómo obtener la Webhook URL:

  1. Abrir el Space de Google Chat destino

  2. Hacer clic en el nombre del Space → Apps & integrations

  3. Add webhooks → Asignar nombre → Save

  4. Copiar la URL generada (incluye key y token como parámetros de query)

1.2 Slack

YAML
anjana:
  messaging:
    slack:
      webhook-url: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX

Cómo obtener la Webhook URL:

  1. Ir a api.slack.com/appsCreate New App

  2. Incoming Webhooks → Activar → Add New Webhook to Workspace

  3. Seleccionar el canal destino → Allow

  4. Copiar la Webhook URL generada

1.3 Microsoft Teams

YAML
anjana:
  messaging:
    teams:
      webhook-url: https://TENANT.webhook.office.com/webhookb2/XXXXXXXX@YYYYYYYY/IncomingWebhook/ZZZZZZZZ/WWWWWWWW

Nota importante: Teams ha deprecado los Office 365 Connectors. Es obligatorio usar Power Automate con el conector "Post to a channel when a webhook request is received".

Cómo configurar con Power Automate:

  1. En Teams, ir al canal destino → ...Workflows

  2. Buscar "Post to a channel when a webhook request is received"Add workflow

  3. Dar nombre al flujo → Next → copiar la URL del webhook generado

1.4 Email (SMTP)

YAML
spring:
  mail:
    host: smtp.example.com
    port: 587
    username: notifications@example.com
    password: ${MAIL_PASSWORD}
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true
    from: notifications@anjanadata.com

1.5 Timeouts HTTP (todos los proveedores webhook)

YAML
anjana:
  messaging:
    connectTimeoutSeconds: 10   # Tiempo máximo para establecer conexión
    readTimeoutSeconds: 30      # Tiempo máximo esperando respuesta
    writeTimeoutSeconds: 10     # Tiempo máximo enviando el request

1.6 Ejemplo de configuración completa

YAML
anjana:
  messaging:
    connectTimeoutSeconds: 10
    readTimeoutSeconds: 30
    writeTimeoutSeconds: 10
    google-chat:
      webhook-url: https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ
    slack:
      webhook-url: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX
    teams:
      webhook-url: https://TENANT.webhook.office.com/webhookb2/XXXXXXXX/IncomingWebhook/ZZZZZZZZ
  

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: notifications@anjanadata.com
    password: ${MAIL_PASSWORD}
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true
    mail:
    from: notifications@anjanadata.com

2. Configuración en Base de Datos

El campo external_sending de la tabla hermes.notification controla qué proveedores reciben cada tipo de notificación. Es una lista de valores separados por comas.

2.1 Valores posibles

Valor

Proveedor

EMAIL

Correo electrónico

SLACK

Slack

MICROSOFT_TEAMS

Microsoft Teams

GOOGLE_CHAT

Google Chat

2.2 Consultar configuración actual

SQL
SELECT
    notification_code,
    subject,
    severity,
    external_sending
FROM hermes.notification
ORDER BY notification_code;
image-20260730-071809.png



3. Formato de los mensajes enviados

Cada proveedor recibe el mensaje con un formato específico generado automáticamente por Hermes. El asunto y el cuerpo se resuelven mediante las claves de traducción (translation_key) configuradas en cada notificación, en todos los idiomas activos en la plataforma.

3.1 Google Chat

JSON
{
  "text": "Asunto de la notificación
Cuerpo completo de la notificación"
}

3.2 Slack

JSON
{
  "text": "**Asunto de la notificación**
Cuerpo completo de la notificación"
}

3.3 Microsoft Teams (Adaptive Card)

JSON
{
  "type": "message",
  "attachments": [{
    "contentType": "application/vnd.microsoft.card.adaptive",
    "content": {
      "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
      "type": "AdaptiveCard",
      "version": "1.2",
      "body": [
        { "type": "TextBlock", "text": "Asunto de la notificación", "weight": "Bolder" },
        { "type": "TextBlock", "text": "Cuerpo de la notificación", "wrap": true }
      ]
    }
  }]
}

3.4 Email

Correo HTML enviado a los destinatarios configurados en la notificación, con el cuerpo construido en todos los idiomas activos en la instalación.


4. Pools de ejecución asíncrona

Cada proveedor usa un pool de threads propio para no bloquear el hilo principal. Son configurables en application.yaml:

YAML
anjana:
  hermes:
    mail-pool:
      pool-size: 5
      core-pool-size: 2
      queue-capacity: 100
    slack-pool:
      pool-size: 3
      core-pool-size: 1
      queue-capacity: 50
    teams-pool:
      pool-size: 3
      core-pool-size: 1
      queue-capacity: 50
    google-chat-pool:
      pool-size: 3
      core-pool-size: 1
      queue-capacity: 50

Parámetro

Descripción

pool-size

Máximo de threads concurrentes para ese proveedor

core-pool-size

Threads siempre activos (aunque no haya mensajes)

queue-capacity

Mensajes en cola antes de comenzar a rechazar


5. Flujo de envío

Evento de workflow (task creada, asignada, completada...)
       ↓
NotificationService.dispatchToProviders()
       ↓
   Para cada proveedor configurado en external_sending:
       ├── EMAIL           → EmailService        (mailPoolTaskExecutor)
       ├── SLACK           → SlackService        (slackPoolTaskExecutor)
       ├── MICROSOFT_TEAMS → TeamsService        (teamsPoolTaskExecutor)
       └── GOOGLE_CHAT     → GoogleChatService   (googleChatPoolTaskExecutor)
                                  ↓
                        POST webhook / envío SMTP

Los proveedores se invocan en paralelo y de forma asíncrona, por lo que un fallo en un proveedor no bloquea ni afecta a los demás.


6. Verificación y troubleshooting

6.1 Verificar conectividad con curl

Bash
# Google Chat
curl -X POST \
  "https://chat.googleapis.com/v1/spaces/XXXXXXXXX/messages?key=YYYYYYY&token=ZZZZZZZ" \
  -H "Content-Type: application/json" \
  -d '{"text": "Test de conectividad desde Anjana Data"}'

# Slack
curl -X POST https://hooks.slack.com/services/T00000000/B00000000/XXXX \
  -H "Content-Type: application/json" \
  -d '{"text": "Test de conectividad desde Anjana Data"}'

6.2 Logs relevantes en Hermes

Los servicios registran errores a nivel ERROR cuando falla el envío:

ERROR c.a.h.googlechat.service.GoogleChatService - Error sending message to Google Chat
ERROR c.a.h.slack.service.SlackService          - Error sending message to Slack
ERROR c.a.h.teams.service.TeamsService          - Error sending message to Teams
ERROR c.a.h.email.service.EmailService          - Error sending email notification

6.3 Problemas frecuentes

Síntoma

Causa probable

Solución

No llegan mensajes a Google Chat

Webhook URL expirada o incorrecta

Regenerar el webhook en el Space de Google Chat

Error 401 en Slack

Token revocado

Recrear la app/webhook en Slack

Teams no recibe mensajes

Conector Office 365 Connectors deprecado

Migrar a Power Automate

Timeout en envío

readTimeoutSeconds demasiado bajo

Aumentar el valor (recomendado: 30s)

Campo external_sending en NULL

Notificación sin proveedores configurados

Actualiza en en Panel de administración con los proveedores deseados

Mensajes duplicados

Pool mal configurado con varios workers

Revisar core-pool-size y queue-capacity


Equipo de Producto · Anjana Data