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

# Déboguer un rapport de bug de bout en bout

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="Déboguer un bug de bout en bout à partir d’un rapport" description="Confiez à Devin un rapport de bug avec des logs Datadog et un accès à la base de données, et obtenez une analyse de la cause racine et une PR de correctif." prompt="Utilisez le Datadog MCP pour trouver l'erreur la plus fréquente en production au cours des dernières 24 heures. Récupérez la stack trace complète et les logs associés, interrogez la réplique de base de données en lecture seule pour toute donnée pertinente, remontez jusqu'à la cause racine dans la base de code, et ouvrez une PR avec un correctif et un test de non-régression." category="Réponse aux incidents" features="MCP" />

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

  <Steps>
    <Step title="Connecter Datadog">
      Devin a besoin d'accéder à vos journaux Datadog pour rechercher des erreurs liées au bug. Si ce n'est pas déjà fait, activez le MCP Datadog :

      1. Allez dans **Settings > Connections > MCP servers** et recherchez **Datadog**
      2. Cliquez sur **Enable**, sélectionnez votre site/région Datadog et fournissez deux en-têtes :
         * `DD-API-KEY` — à partir de votre [page Datadog API keys](https://app.datadoghq.com/organization-settings/api-keys)
         * `DD-APPLICATION-KEY` — à partir de votre [page Datadog application keys](https://app.datadoghq.com/organization-settings/application-keys)

      Une fois connecté, Devin peut rechercher dans les journaux, récupérer des traces d'erreurs et corréler les problèmes avec les déploiements — le tout directement depuis la session. Consultez [MCP Marketplace](/fr/integrations/overview) pour tous les détails de configuration.
    </Step>

    <Step title="Donnez à Devin un accès en lecture seule à la base de données">
      Pour les bugs de données — mauvaises valeurs, champs manquants, requêtes défaillantes — Devin est beaucoup plus efficace lorsqu’il peut vérifier directement l’état des données. Fournissez une chaîne de connexion en lecture seule en tant que [Secret](/fr/product-guides/secrets) :

      1. Allez dans **Settings > Secrets** et ajoutez un nouveau secret :
         * **Name** : `DATABASE_READ_REPLICA_URL`
         * **Value** : `postgresql://readonly_user:password@read-replica.internal:5432/production`
      2. Ajoutez une note du type : *"Connexion en lecture seule à la réplique de lecture de production. À utiliser uniquement pour les requêtes SELECT."*

      Vous pouvez aussi connecter une base de données MCP (PostgreSQL, MySQL, etc.) dans **Settings > Connections > MCP servers** — Devin peut utiliser l’une ou l’autre approche pour interroger vos données.

      <Tip>Utilisez toujours une réplique de lecture ou un utilisateur avec des permissions en lecture seule (SELECT uniquement). Devin n’a jamais besoin d’un accès en écriture pour analyser un bug. Si vous êtes préoccupé par l’impact de requêtes coûteuses sur les performances, orientez Devin vers une réplique de lecture dédiée ou une réplique analytique existante, distincte de votre base de données de production.</Tip>
    </Step>

    <Step title="Envoyez le rapport de bogue à Devin">
      Collez directement le rapport de bug dans une session Devin. Incluez autant de contexte que la personne qui l’a signalé en a fourni — quand le problème a commencé, qui est concerné, ce qui ne va pas et où. Pour une analyse structurée, utilisez le [`!triage` template playbook](https://app.devin.ai/settings/playbooks/14fed18b89d44713a26e673cf258f548?utm_source=docs\&utm_medium=use-case-gallery) — dupliquez-le et personnalisez les étapes pour votre stack.

      <PromptBlock>
        ```txt Debug billing page bug theme={null}
        Bug report from support: Pro plan users are seeing "undefined" instead of
        their company name on the billing page. This started after last Friday's
        deploy (around 2026-02-13 18:00 UTC).

        Steps to investigate:
        1. Use Datadog to pull error logs for the billing service since Friday —
           look for null reference errors or API response changes
        2. Query the read replica to check whether Pro plan users actually have a
           company_name value: SELECT id, company_name, plan FROM users WHERE plan = 'pro' LIMIT 20
        3. Check git log for Friday's deploy — what changed in the billing page
           or user API response?
        4. Identify the root cause and fix it
        5. Add a regression test that would catch this if it happened again
        6. Run the app locally and verify the billing page renders correctly
           using your browser
        7. Open a PR with the fix
        ```
      </PromptBlock>

      Plus le rapport est précis, plus rapidement Devin trouve la réponse. « Since Friday’s deploy » permet à Devin de restreindre la plage temporelle dans Datadog. « Pro plan users » lui indique exactement quels enregistrements interroger.
    </Step>

    <Step title="Devin diagnostique et corrige">
      Avec Datadog et l’accès à la base de données connectés, Devin mène une enquête complète :

      **Récupère les logs Datadog** — Recherche des erreurs sur le service de facturation depuis vendredi, en filtrant par nom de service et statut d’erreur. Trouve un pic de `TypeError: Cannot read property 'name' of undefined` à partir de 18:12 UTC le jour du déploiement.

      **Interroge la base de données** — Exécute `SELECT id, company_name, plan FROM users WHERE plan = 'pro' LIMIT 20` sur la réplique de lecture. Confirme que les utilisateurs Pro ont *bien* des valeurs `company_name` — les données sont correctes, donc le bug vient du code.

      **Retrace la modification de code** — Vérifie `git log --since="2026-02-13"` et trouve le commit `a1b2c3d` qui a remanié la réponse de l’API utilisateur, en renommant `company` en `organization`. La page de facturation à `src/pages/billing/BillingHeader.tsx` fait encore référence à `user.company.name`.

      **Écrit la correction** — Met à jour `BillingHeader.tsx` pour utiliser `user.organization?.name ?? 'Your Company'` et ajoute un test de non-régression qui affiche le composant avec l’ancienne et la nouvelle structure de réponse de l’API.

      **Vérifie dans le navigateur** — Démarre le serveur de développement, ouvre la page de facturation dans le navigateur intégré de Devin, et confirme que le nom de l’entreprise s’affiche désormais correctement pour un utilisateur de test.

      **Ouvre une PR** avec la correction, le test et une description expliquant la cause première et l’impact (tous les utilisateurs Pro et Enterprise, \~350 comptes).
    </Step>

    <Step title="Suivi">
      Une fois la PR de correction fusionnée, vous pouvez demander à Devin de rechercher les problèmes associés ou d'ajouter de la surveillance :

      <PromptBlock>
        ```txt Trouver d'autres références à l'ancien champ theme={null}
        La cause profonde était que user.company a été renommé en user.organization dans
        la réponse de l'API. Recherchez dans l'ensemble du frontend d'autres références à
        "user.company" et mettez-les toutes à jour.
        ```
      </PromptBlock>

      Si vous voulez que Devin se souvienne de quelque chose tiré de cette investigation pour la prochaine fois, dites-le-lui simplement — par exemple : *"Souviens-toi que l'API utilisateur utilise `user.organization`, et non `user.company`."* Devin proposera une entrée [Knowledge](/fr/product-guides/knowledge) que vous pourrez examiner et enregistrer. Ainsi, les sessions futures commenceront avec le contexte que votre équipe a déjà acquis.
    </Step>
  </Steps>
</div>
