Contexte : 120 alertes/jour non triées

La DSI d'un établissement de santé recevait en moyenne 120 alertes par jour dans son système de monitoring (Zabbix + logs applicatifs). Sans tri automatique, les équipes passaient 2h/jour à classifier manuellement les incidents — dont 70% étaient des faux positifs ou des alertes de faible priorité. AutomationSequence V8 + Ollama a réduit ce temps à 15 minutes de supervision.

Un LLM local qui classe des incidents IT n'est pas un gadget — c'est un premier niveau de triage qui libère les équipes pour les vrais problèmes. En environnement HDS, le LLM reste sur le réseau interne.

Architecture de la solution

# Pipeline d'automatisation des incidents
Zabbix/Logs
  → WebhookListen (AutomationSequence)
    → Séquence : incident_triage.asenc
      ├── Étape 1 : lire le log/alerte
      ├── Étape 2 : classification LLM (Ollama llama3:8b)
      ├── Étape 3 : si critique → ticket JIRA automatique
      ├── Étape 4 : si P1 → escalade Teams + SMS astreinte
      └── Étape 5 : toutes les 18h → rapport PDF quotidien

Étape 1 : détection des logs critiques

[
  {
    "type": "file_read",
    "path": "/var/log/app/{{date_today}}.log",
    "encoding": "utf-8",
    "output_var": "raw_log"
  },
  {
    "type": "text_filter",
    "data": "{{raw_log}}",
    "patterns": ["ERROR", "CRITICAL", "FATAL", "ORA-", "Connection refused"],
    "context_lines": 3,
    "output_var": "error_lines"
  },
  {
    "type": "condition",
    "if": "len({{error_lines}}) == 0",
    "then_actions": [{"type":"stop", "reason":"Aucune erreur détectée"}]
  }
]

Étape 2 : classification LLM

{
  "type": "llm_classify",
  "model": "llama3:8b",
  "text": "{{error_lines|join:\n}}",
  "categories": [
    "P1_critique",     // service down, perte de données
    "P2_majeur",       // dégradation significative
    "P3_mineur",       // impact limité
    "P4_faux_positif"  // alerte non significative
  ],
  "prompt_prefix": "Tu es expert en support IT hospitalier. Classe cet extrait de log par priorité d'incident. Réponds uniquement par le nom de la catégorie.",
  "temperature": 0.1,
  "output_var": "priority",
  "confidence_var": "priority_confidence"
}

Étape 3 : création ticket JIRA

{
  "type": "condition",
  "if": "{{priority}} in ['P1_critique', 'P2_majeur'] and {{priority_confidence}} > 0.7",
  "then_actions": [
    {
      "type": "llm_extract_json",
      "model": "llama3:8b",
      "prompt": "Extrais du log suivant : titre de l'incident (max 80 chars), composant affecté, impact estimé, actions recommandées. Réponds en JSON. Log: {{error_lines|join:\n|sample:20}}",
      "output_var": "incident_details"
    },
    {
      "type": "http_post",
      "url": "https://jira.intranet/rest/api/2/issue",
      "auth_vault": "JIRA_AUTH",
      "body": {
        "fields": {
          "project":     {"key": "IT"},
          "summary":     "[{{priority}}] {{incident_details.titre}}",
          "description": "Composant: {{incident_details.composant}}\nImpact: {{incident_details.impact}}\nActions: {{incident_details.actions}}",
          "priority":   {"name": "{{priority}}"},
          "issuetype":  {"name": "Incident"}
        }
      },
      "output_var": "jira_ticket"
    }
  ]
}

Étape 4 : escalade conditionnelle

{
  "type": "condition",
  "if": "{{priority}} == 'P1_critique'",
  "then_actions": [
    {
      "type": "teams_send",
      "webhook_vault_key": "TEAMS_WEBHOOK_ASTREINTE",
      "card": {
        "title": "🔴 INCIDENT P1 — Action immédiate requise",
        "facts": [
          {"label":"Ticket JIRA", "value":"{{jira_ticket.key}}"},
          {"label":"Composant",  "value":"{{incident_details.composant}}"},
          {"label":"Confiance IA","value":"{{priority_confidence|round:2}}"}
        ],
        "color": "attention"
      }
    }
  ]
}

Étape 5 : rapport PDF quotidien

# Séquence séparée déclenchée par CRON à 18h
# CRON: "0 18 * * 1-5"
[
  {
    "type": "oracle_query",
    "query": "SELECT * FROM incidents_log WHERE date_trunc='day' AND trunc_date=TRUNC(SYSDATE)",
    "output_var": "incidents_du_jour"
  },
  {
    "type": "llm_generate",
    "model": "llama3:8b",
    "template": "Rédige un résumé exécutif des incidents IT du jour pour la direction. Données: {{incidents_du_jour|sample:50}}. Format: résumé (3 phrases), incidents critiques, tendances, recommandations.",
    "output_var": "rapport_texte"
  },
  {
    "type": "pdf_create",
    "template": "templates/rapport_incidents.html.j2",
    "vars": {"contenu": "{{rapport_texte}}", "stats": "{{incidents_du_jour|stats}}"},
    "output": "rapports/incidents_{{date_today}}.pdf",
    "output_var": "pdf_path"
  },
  {
    "type": "smtp_send",
    "to": ["dsi@chu-exemple.fr", "direction@chu-exemple.fr"],
    "subject": "Rapport incidents IT — {{date_today}}",
    "attachments": ["{{pdf_path}}"]
  }
]

Chiffres après 3 mois

  • Temps de triage : 2h/jour → 15 minutes de supervision humaine.
  • Précision LLM : 91% de classification correcte (vs 100% humain, 94% sur les P1/P2 critiques).
  • Faux positifs non traités : 70% des alertes classées P4 ignorées automatiquement, 0 incident réel manqué.
  • Tickets JIRA créés automatiquement : 847 en 3 mois, dont 12% nécessitaient une correction manuelle du titre.
  • Rapport PDF : 63 rapports générés, 100% livrés avant 18h05.
  • Alertes Cortex XDR : 0 (Ollama tourne en local, aucune requête réseau suspecte).

Conclusion

L'automatisation du triage d'incidents avec AutomationSequence V8 + Ollama démontre que l'IA locale peut prendre en charge des décisions de classification répétitives avec une fiabilité suffisante pour le premier niveau de support. La clé du succès : un score de confiance minimum (0.7) avant de créer un ticket, et un rapport quotidien qui permet aux équipes de valider la pertinence des décisions automatiques. En environnement HDS, l'aspect "100% local" du LLM Ollama a été le critère décisif pour l'acceptation du projet.

⚙️
PRODUIT LIÉ
AutomationSequence V8.0
← Article précédent Retour au blog →