Quand l’alarme sort de la console d’hypervision pour arriver là où travaillent les équipes…

Dans la majorité des organisations, les outils de supervision sont avant tout consultés par des pilotes d’exploitation dont le rôle est précisément de surveiller la console d’hypervision. Mais une fois l’incident détecté, la résolution ne dépend pas uniquement d’eux. Très souvent, elle implique des équipes métier qui travaillent principalement sur des outils collaboratifs comme Microsoft Teams.

C’est précisément là que l’interconnexion avec Microsoft Teams + Canopsis prend tout son sens ! Elle fait sortir l’alarme de la solution d’hypervision pour l’amener au bon public et dans le bon contexte.

Pourquoi connecter Teams et Canopsis ?

Ici, l’objectif n’est pas de remplacer la console Canopsis, mais de compléter notre dispositif d’hypervision. Les pilotes continuent à superviser, corréler et analyser les alarmes, tandis que les équipes métier reçoivent une information adaptée à leur usage : une notification claire, contextualisée et compréhensible, directement dans leur canal Teams.

Chaque alarme peut ainsi être présentée avec un niveau de sévérité lisible, un composant métier identifiable, un message explicite et des éléments de contexte utiles à la prise de décision.

Une notification Teams pensée pour les équipes non techniques

Grâce aux cartes adaptatives Teams, l’alerte n’est plus un simple message brut ! Elle devient un support de communication avec :

Les équipes métier peuvent donc comprendre rapidement ce qui se passe, sans maîtriser les subtilités de Canopsis.

Une intégration simple et maîtrisée… des deux côtés !

Côté Teams, l’intégration repose sur les Workflows Power Automate, capables de recevoir et d’afficher des cartes interactives.

Côté Canopsis, un scénario déclenche l’envoi de la notification au bon moment, selon les règles définies par l’organisation.

Un exemple concret : notification d’un service métier « Logistique »

Dans cet exemple, on utilise un service Canopsis dédié à la logistique pour représenter un périmètre métier clair. Ce service agrège plusieurs sources techniques et est enrichi avec des informations compréhensibles par les équipes opérationnelles : description, type de service, statut, codes internes ou périmètres fonctionnels.

On configure ensuite un scénario Canopsis pour réagir au trigger “Activation de l’alarme” : le payload est disponible dans les annexes.

Lorsqu’une alarme s’active sur le service “Logistique”, le scénario s’exécute automatiquement et envoie une carte adaptative dans le canal Teams dédié : la méthode de configuration dans Teams est également disponible en annexe.

La notification reçue par les équipes métier se concentre sur l’essentiel :

Grâce à ce mécanisme, l’information n’est plus confinée à la console d’hypervision. Elle arrive directement dans le canal Teams où les équipes métier collaborent, prennent des décisions et coordonnent leurs actions. Les pilotes conservent la maîtrise opérationnelle dans Canopsis, tandis que les équipes métier gagnent en visibilité et en réactivité.

Pour terminer sur l’interconnexion entre Teams et Canopsis

En conclusion, l’intégration entre Microsoft Teams et Canopsis illustre parfaitement une hypervision moderne, tournée vers la collaboration et l’efficacité opérationnelle. En faisant sortir l’alarme de la console d’hypervision pour l’amener directement dans l’outil de travail quotidien des équipes métier, Canopsis réduit les silos et accélère la prise de décision.

Ainsi, les pilotes conservent une maîtrise complète dans Canopsis et les équipes métier reçoivent une information claire, contextualisée et immédiatement exploitable, sans dépendre d’une expertise technique spécifique. Chacun agit à son niveau, avec les bons outils.

Cette interconnexion transforme la notification Teams en un véritable levier de coordination. Elle rapproche les équipes, fluidifie les échanges et contribue directement à réduire les délais de résolution des incidents.

Pour aller plus loin, la documentation Canopsis détaille l’ensemble des mécanismes présentés, et nos équipes restent disponibles pour vous accompagner dans la mise en œuvre de cette intégration (et bien d’autres !) au sein de votre organisation.

Annexes

Le payload du scénario Canopsis

{
  "type": "message",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "version": "1.4",
        "type": "AdaptiveCard",
        "body": [
          {
            "type": "Container",
            "bleed": true,
            "spacing": "None",
            "style": "{{ if eq .Alarm.Value.State.Value 3 }}attention{{ else if eq .Alarm.Value.State.Value 2 }}warning{{ else if eq .Alarm.Value.State.Value 1 }}accent{{ else }}good{{ end }}",
            "selectAction": {
              "type": "Action.OpenUrl",
              "url": "{{ .Env.CanopsisURL }}/alarms/{{ .Alarm.ID }}"
            },
            "items": [
              {
                "type": "TextBlock",
                "size": "Large",
                "weight": "Bolder",
                "wrap": true,
                "text": "{{ if eq .Alarm.Value.State.Value 3 }}🟥 Alerte CRITIQUE{{ else if eq .Alarm.Value.State.Value 2 }}🟧 Alerte MAJEURE{{ else if eq .Alarm.Value.State.Value 1 }}🟨 Alerte MINEURE{{ else }}🟩 Fin d'alerte{{ end }} - {{ .Entity.Name }}"
              },
              {
                "type": "TextBlock",
                "wrap": true,
                "spacing": "Small",
                "text": "**{{ .Alarm.Value.DisplayName }}**"
              }
            ]
          },

          {
            "type": "FactSet",
            "facts": [
              { "title": "Composant", "value": "{{ .Entity.Name }}" },
              { "title": "Ressource", "value": "{{ if .Alarm.Value.Resource }}{{ .Alarm.Value.Resource }}{{ else }}N/A{{ end }}" },
              {
                "title": "Criticité",
                "value": "{{ if eq .Alarm.Value.State.Value 3 }}CRITIQUE (3){{ else if eq .Alarm.Value.State.Value 2 }}MAJEURE (2){{ else if eq .Alarm.Value.State.Value 1 }}MINEURE (1){{ else }}OK (0){{ end }}"
              },
              { "title": "Date", "value": "{{ .Alarm.Value.LastUpdateDate | localtime "02/01/2006 15:04:05" "Europe/Paris" }}" },
              { "title": "Trigger", "value": "{{ .AdditionalData.Trigger }}" }
            ]
          },

          { "type": "TextBlock", "text": "**Message:**", "wrap": true },
          { "type": "TextBlock", "text": "{{ .Alarm.Value.Output | replace "\n" "\n\n" }}", "wrap": true },

          { "type": "TextBlock", "id": "details_title", "text": "**Détails (infos service):**", "wrap": true, "isVisible": false, "spacing": "Medium" },

          {
            "type": "Container",
            "id": "details_block",
            "isVisible": false,
            "style": "emphasis",
            "items": [
              {
                "type": "ColumnSet",
                "spacing": "None",
                "columns": [
                  {
                    "type": "Column",
                    "width": "auto",
                    "items": [
                      { "type": "TextBlock", "text": "**Nom**", "wrap": true }
                    ]
                  },
                  {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                      { "type": "TextBlock", "text": "**Valeur**", "wrap": true }
                    ]
                  }
                ]
              }

              {{ if .Entity.Infos }}
              {{ range $k, $info := .Entity.Infos }}
              ,
              {
                "type": "ColumnSet",
                "separator": true,
                "spacing": "Small",
                "columns": [
                  {
                    "type": "Column",
                    "width": "auto",
                    "items": [
                      {
                        "type": "TextBlock",
                        "text": "{{ $k }}",
                        "wrap": true,
                        "isSubtle": true
                      }
                    ]
                  },
                  {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                      {
                        "type": "TextBlock",
                        "text": "{{ $info.Value }}",
                        "wrap": true
                      }
                    ]
                  }
                ]
              }
              {{ end }}
              {{ else }}
              ,
              {
                "type": "TextBlock",
                "text": "Aucune information enrichie disponible.",
                "wrap": true,
                "isSubtle": true
              }
              {{ end }}
            ]
          },

          {
            "type": "TextBlock",
            "text": "**Événements:** {{ .Alarm.Value.EventsCount }} | **Changements d'état:** {{ .Alarm.Value.TotalStateChanges }}",
            "wrap": true,
            "spacing": "Medium"
          }
        ],

        "actions": [
          {
            "type": "Action.OpenUrl",
            "title": "Voir dans Canopsis",
            "url": "{{ .Env.CanopsisURL }}/alarms/{{ .Alarm.ID }}"
          },
          {
            "type": "Action.ToggleVisibility",
            "title": "Détails",
            "targetElements": [ "details_title", "details_block" ]
          }
        ]
      }
    }
  ]
} 


La méthode de configuration dans Teams

1. Rendez-vous dans la section « Flux de travail » du canal dans lequel vous souhaitez publier les notifications.

2. Choisissez « Envoyer des alertes webhook à un canal »

3. Notez l’URL du webhook qui vient d’être créée. Elle sera à reporter dans le scénario Canopsis.