Lorsqu’une alerte se déclenche, déclenchez Autopilot pour exécuter une analyse des causes profondes, et publier les résultats directement dans un canal Slack. Si Autopilot ne renvoie aucune réponse utilisable, le workflow envoie plutôt un avis d’erreur, afin que l’équipe sache qu’elle doit enquêter manuellement.
Avant d'utiliser ce workflow, assurez-vous d'avoir :
- Un ID de problème d'alerte New Relic au format UUID
- Destination Slack configurée dans New Relic — voir Créer des destinations
- L’UUID de la destination et le nom du canal Slack cible
Conseil
Lorsque vous déclenchez ce workflow depuis Alert Workflows, utilisez {{ issueId }} comme valeur pour l'entrée issueId. Cette variable transmet automatiquement l’ID de problème de l’alerte de déclenchement au workflow.
Ce workflow effectue les étapes suivantes :
- Envoie un message Slack initial pour accuser réception de l'alerte et informer l'équipe que la RCA est en cours
- Exécute Autopilot avec un prompt d'analyse des causes profondes limité à l'ID du problème de l'alerte
- Vérifie si Autopilot a renvoyé une réponse utilisable
- Si Autopilot réussit, reformate la réponse sous forme de blocs Slack Block Kit et publie les résultats sur Slack
- Si Autopilot échoue, publie un message d’erreur avec l’ID du problème
Ce workflow utilise newrelic.autopilot.run et newrelic.notification.sendSlack.
Important
Les valeurs du sélecteur expression doivent être écrites sur une seule ligne. Les scalaires de bloc YAML multilignes (|, ou |-) ne sont pas évalués pour les expressions de sélecteur, et ne produisent silencieusement aucune sortie.
Conseil
Le champ finalAnswer d’Autopilot peut renvoyer soit une chaîne simple, soit un objet encodé en JSON selon le contexte du prompt. Le sélecteur analysisText de ce workflow gère automatiquement les deux formats.
name: autopilotSlackRCAdescription: Automatically analyze New Relic alerts with Autopilot and send cleanly formatted findings to SlackworkflowInputs: issueId: type: String required: true validations: - errorMessage: Must be a valid New Relic issue ID in UUID format pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' type: regex slackDestinationId: type: String required: true validations: - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ errorMessage: "Invalid format. Please provide a valid UUID." type: regex channel: type: String required: truesteps: - name: notifyAlertReceived type: action action: newrelic.notification.sendSlack version: 1 inputs: destinationId: ${{ .workflowInputs.slackDestinationId }} channel: ${{ .workflowInputs.channel }} text: |- 🔔 *Alert Received — Starting Root Cause Analysis*
⏳ Running Autopilot for RCA, please wait...
- name: runAutopilot type: action action: newrelic.autopilot.run version: 1 inputs: prompt: >- Perform a root cause analysis for the following New Relic alert: Issue ID: ${{ .workflowInputs.issueId }} Provide your comprehensive analysis including Summary, Root Cause, and Remediation Actions. selectors: - name: analysisRaw expression: .response.finalAnswer - name: analysisText expression: '(.response.finalAnswer | if type=="string" then fromjson else . end).card.body | map(.value) | join("\n\n")' ignoreErrors: true
- name: checkAgentResponse type: switch switch: - condition: ${{ (.steps.runAutopilot.outputs.analysisRaw // "") != "" }} next: buildSlackBlocks next: sendAutopilotError
- name: buildSlackBlocks type: assign inputs: blocks: '${{ (.steps.runAutopilot.outputs.analysisText // "") | gsub("\\*\\*"; "*") | gsub("### "; "*") | gsub("## "; "*") as $text | ([ $text / "\n" ]) as $lines | [ { "type": "header", "text": { "type": "plain_text", "text": "✅ Autopilot RCA Complete" } }, { "type": "divider" } ] + [ $lines[][] | select(. != "") | { "type": "section", "text": { "type": "mrkdwn", "text": . } } ] }}' next: sendRcaFindings
- name: sendRcaFindings type: action action: newrelic.notification.sendSlack version: 1 inputs: destinationId: ${{ .workflowInputs.slackDestinationId }} channel: ${{ .workflowInputs.channel }} blocks: ${{ .steps.buildSlackBlocks.outputs.blocks }} next: end
- name: sendAutopilotError type: action action: newrelic.notification.sendSlack version: 1 inputs: destinationId: ${{ .workflowInputs.slackDestinationId }} channel: ${{ .workflowInputs.channel }} text: |- 🟥 *Autopilot RCA Failed*
Could not extract findings from Autopilot response for issue: ${{ .workflowInputs.issueId }} Please investigate manually. next: endComment ça marche
L’étape runAutopilot utilise deux sélecteurs pour gérer la variabilité de forme de finalAnswer au niveau de la couche d’extraction de données :
analysisRawcapture la valeur brute definalAnswer. L’étapecheckAgentResponseutilise cela pour déterminer si Autopilot a renvoyé quelque chose.analysisTextnormalise la valeur — sifinalAnswerest une chaîne encodée en JSON, il l’analyse d’abord, puis extrait le contenu textuel de.card.body. L’étapebuildSlackBlocksutiliseanalysisTextdirectement, ce qui permet de conserver une logique de formatage simple.
buildSlackBlocks convertit les marqueurs d’en-tête **bold**, et ###/## au format mrkdwn de Slack, divise le résultat au niveau des sauts de ligne, et enveloppe chaque ligne non vide dans un bloc Block Kit section.
Sujets connexes
Vue d’ensemble d’Autopilot
Découvrez comment Autopilot enquête sur les alertes et les incidents
Logique conditionnelle
Utilisez des instructions switch pour bifurquer en cas de succès ou d'échec
Envoyer des notifications Slack
Référence complète pour l’action sendSlack
Créer des destinations
Configurez la destination Slack requise par ce workflow
Dépannage de l'automatisation des workflows
Solutions pour les problèmes courants d’intégration d’Autopilot, et de Slack