> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Triage automatique des erreurs Sentry

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Triage automatique des erreurs Sentry" description="Connectez les webhooks Sentry à l'API Devin pour effectuer un triage automatique de chaque nouvelle erreur de production." prompt="Aidez-moi à configurer un pipeline de triage automatique entre Sentry et Devin. Suivez le guide à l'adresse https://docs.devin.ai/use-cases/gallery/api-sentry-auto-triage et accompagnez-moi étape par étape : activation du MCP Sentry, création de l'intégration interne et déploiement du gestionnaire de webhook." category="Réponse aux incidents" features="API, MCP" />

<div className="uc-detail-wrapper">
  <Tip>Pour un guide d'intégration Sentry plus détaillé, [cliquez ici](/fr/enterprise/integrations/sentry).</Tip>

  <Steps>
    <Step title="Activer le MCP Sentry">
      Devin a besoin d'accéder à votre compte Sentry afin de pouvoir récupérer les traces de pile, les breadcrumbs et les métadonnées d'événements lors du triage.

      1. Allez dans **Settings > Connections > MCP servers** et recherchez **Sentry**
      2. Cliquez sur **Enable** et terminez le processus OAuth avec le compte Sentry qui a accès à vos projets
      3. Testez la connexion — démarrez une session et demandez à Devin de lister les incidents récents dans l'un de vos projets

      Une fois connecté, Devin peut interroger n'importe quel projet Sentry auquel votre compte a accès : détails des incidents, traces de pile complètes, breadcrumbs d'événements, tags de version, et plus encore. Consultez la [documentation MCP Marketplace](/fr/work-with-devin/mcp) pour les détails de configuration.
    </Step>

    <Step title="Créer une intégration interne à Sentry">
      Sentry envoie des webhooks via les intégrations internes (**Internal Integrations**). Dans votre tableau de bord Sentry, allez dans **Settings > Developer Settings > Custom Integrations** et cliquez sur **Create New Integration > Internal Integration**.

      Configurez-la :

      * **Name :** `Devin Auto-Triage`
      * **Webhook URL :** Un service que vous déploierez à l’étape suivante (par exemple, `https://your-domain.com/sentry-webhook`)
      * **Alert Rule Action :** Activez (**on**) — cela rend l’intégration disponible en tant qu’action dans les règles d’alerte
      * **Permissions :** Accès en lecture à **Issue & Event** et **Project**

      Enregistrez l’intégration, puis créez une règle d’alerte. Allez dans **Alerts > Create Alert Rule > Issue Alert** pour votre projet :

      * **When :** A new issue is created
      * **If :** The issue has more than **50** events in **1 hour** (à adapter selon votre trafic)
      * **Then :** Send a notification via **Devin Auto-Triage**
    </Step>

    <Step title="Connectez le webhook à l’API Devin">
      Créez un petit handler qui reçoit le payload d'alerte de Sentry et démarre une session Devin. Créez un [service user](/fr/api-reference/v3/overview) dans **Settings > Service Users** avec la permission `ManageOrgSessions` et stockez son jeton sous le nom `DEVIN_API_KEY` dans l'environnement de votre handler. Affectez à `DEVIN_ORG_ID` l'identifiant de votre organisation — vous pouvez l'obtenir en appelant `GET https://api.devin.ai/v3/enterprise/organizations` avec votre jeton.

      ```javascript theme={null}
      const express = require('express');
      const app = express();
      app.use(express.json());

      app.post('/sentry-webhook', async (req, res) => {
        const event = req.body.data?.event;
        if (!event) return res.sendStatus(200);

        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: [
              `A Sentry alert fired for a new issue: "${event.title}"`,
              `Culprit: ${event.culprit}`,
              `Sentry URL: ${event.web_url}`,
              ``,
              `Use the Sentry MCP to pull the full stack trace and breadcrumbs.`,
              `Identify the root cause, fix the issue, and open a PR with a`,
              `regression test.`,
            ].join('\n'),
            tags: ['sentry-auto-triage', `project:${event.project}`],
          }),
        });

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

      app.listen(3000);
      ```

      Déployez ceci partout où il est possible de recevoir du trafic HTTPS — par exemple sur un Cloudflare Worker, une fonction AWS Lambda ou un petit VPS. Pointez l’URL de webhook de votre Sentry Internal Integration vers ce service.

      Le code ci-dessus marque chaque session avec `sentry-auto-triage` et le nom du projet Sentry. Cela vous permet de filtrer ces sessions dans le tableau de bord de Devin et de [les récupérer via l’API](/fr/api-reference/v3/sessions/get-organizations-sessions) à l’aide du paramètre de requête `tags` — pratique pour suivre le nombre d’erreurs que Devin trie par projet.

      Pour vérifier que le pipeline fonctionne, déclenchez une alerte de test dans Sentry (ou abaissez temporairement votre seuil), puis vérifiez sur [app.devin.ai](https://app.devin.ai/?utm_source=docs\&utm_medium=use-case-gallery) l’apparition d’une nouvelle session marquée `sentry-auto-triage`.
    </Step>

    <Step title="Comment Devin traite chaque alerte">
      Lorsqu’une nouvelle erreur dépasse votre seuil et que le webhook se déclenche, Devin démarre une session et traite le problème :

      1. **Interroge Sentry via MCP** — récupère la stack trace complète, les breadcrumbs (actions de l’utilisateur menant au crash), les tags de navigateur/OS/version affectés et la fréquence de l’événement
      2. **Identifie la cause racine** — lit le fichier source à la ligne exacte de la stack trace, suit le flux de données pour comprendre pourquoi la valeur est `undefined` ou `null`
      3. **Écrit une correction ciblée** — implémente une gestion des erreurs (optional chaining, valeurs par défaut, validation des entrées) conforme aux conventions existantes de votre base de code
      4. **Ajoute un test de non-régression** — crée un cas de test qui reproduit le scénario de crash initial et vérifie que la correction empêche qu’il se reproduise
      5. **Ouvre une PR** — ajoute l’URL du ticket Sentry dans la description de la PR pour que les relecteurs puissent recouper le contexte d’erreur initial et le volume d’événements

      Exemple de description de PR :

      ```
      Correctif : TypeError dans UserProfile quand user.profile est null

      Cause racine : Le endpoint /api/users/:id renvoie { profile: null }
      pour les utilisateurs n'ayant pas terminé la prise en main. UserProfile.tsx:47
      déstructure email depuis user.profile sans vérification de null.

      Correctif : Ajout du chaînage optionnel et d'un état de repli.
      Test : Ajout d'un test pour les utilisateurs avec un profil null — vérifie que
      le composant affiche « Complétez votre profil » au lieu de planter.

      Problème Sentry : FRONTEND-1892 (340 événements au cours de la dernière heure)
      ```
    </Step>

    <Step title="Affinez le triage avec des playbooks et Knowledge">
      Une fois le pipeline en cours d’exécution, rendez l’auto-triage plus intelligent :

      **Créez un playbook de triage.** Partez du playbook modèle [`!triage`](https://app.devin.ai/settings/playbooks/14fed18b89d44713a26e673cf258f548?utm_source=docs\&utm_medium=use-case-gallery) — dupliquez-le et personnalisez-le avec les conventions de gestion des erreurs de votre équipe (error boundaries, motifs de vérification de valeurs nulles, format de logs). Ensuite, transmettez l’ID du playbook dans votre gestionnaire de webhook en ajoutant `"playbook_id": "your-playbook-id"` au corps de la requête. Vous pouvez également demander à Devin de générer un playbook à partir d’une description de votre workflow de triage.

      **Ajoutez de la [Knowledge](/fr/product-guides/knowledge)** sur vos contrats d’API et les cas limites connus — par exemple : « Les réponses de `/api/users` peuvent renvoyer `{ profile: null }` pour les utilisateurs qui n’ont pas terminé l’onboarding. Protégez-vous toujours contre ce cas. » Demandez à Devin de vous aider à rédiger des entrées Knowledge à partir de votre documentation existante. Plus Devin dispose de contexte sur votre domaine, plus ses correctifs seront précis.

      **Définissez soigneusement le périmètre des alertes.** Utilisez les conditions de règles d’alerte de Sentry pour limiter les erreurs qui déclenchent Devin — filtrez par projet, environnement (`production` uniquement) ou volume d’erreurs. Un bon point de départ : ne déclenchez que pour les problèmes avec plus de 50 événements dans la première heure afin de vous concentrer sur les erreurs à fort impact.

      **Mettez en place un planning de revue hebdomadaire.** Créez un [schedule](https://app.devin.ai/settings/schedules/create?utm_source=docs\&utm_medium=use-case-gallery) qui s’exécute une fois par semaine pour revoir les résultats de vos sessions d’auto-triage et réinjecter les enseignements dans votre playbook et Knowledge :

      <PromptBlock type="schedule">
        ```txt Revue hebdomadaire de l’auto-triage Sentry theme={null}
        Passez en revue toutes les sessions Devin marquées avec le tag "sentry-auto-triage" de la semaine passée.
        Pour chaque session, vérifiez :

        1. Résultat de la PR (pull request) — a-t-elle été fusionnée, fermée sans fusion ou est-elle encore ouverte ?
        2. Statut de l’issue Sentry — a-t-elle été marquée comme résolue/corrigée, ignorée ou rejetée ?
        3. Tous les commentaires des reviewers ou les modifications demandées sur la PR

        En fonction de ces signaux :
        - Si les PR étaient systématiquement fermées ou recevaient les mêmes commentaires (par ex. "n’utilisez pas
          optional chaining ici, utilisez un contrôle explicite"), mettez à jour le !sentry-triage
          playbook avec cette convention
        - Si Devin a manqué de contexte et a produit un mauvais correctif, ajoutez une entrée Knowledge
          couvrant ce périmètre fonctionnel (par ex. contrats d’API, dépendances de services)
        - Résumez : combien de sessions ont été exécutées, combien de PR ont été fusionnées vs fermées, et
          les éventuels motifs récurrents dans les retours

        Publiez le récapitulatif sur #engineering-ops dans Slack.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
