Last9

officiel

Intégrez de manière transparente le contexte de production en temps réel—logs, métriques et traces—dans votre environnement local pour corriger le code plus rapidement.

Que pouvez-vous faire avec Last9 MCP ?

  • Enquêter sur les incidents en production — Demandez à votre assistant de récupérer les journaux, les traces, les métriques, les exceptions et les alertes déclenchées d’un service afin qu’il puisse diagnostiquer l’origine du problème.
  • Corréler les changements avec leur impact — Vérifiez les déploiements et les changements de configuration, puis comparez un service et ses appelants avant et après pour déterminer si un changement a provoqué une régression.
  • Interroger les métriques Prometheus — Exécutez des requêtes PromQL de plage ou instantanées et répertoriez les valeurs des libellés pour explorer n’importe quelle métrique de votre source de données.
  • Inspecter les performances des bases de données — Découvrez les bases de données, repérez les exécutions de requêtes lentes et examinez les schémas de requêtes ainsi que les métriques côté serveur issues des spans OTel.
  • Analyser les traces et les profils — Récupérez le diagramme en cascade d’une trace à partir de son ID, classez les écarts d’attributs entre les cohortes, ou récupérez un flamegraph et les principales fonctions d’un service.
  • Gérer les alertes et les tableaux de bord — Examinez la couverture et la qualité des alertes, créez ou modifiez des règles d’alerte, et répertoriez, validez ou modifiez des tableaux de bord personnalisés.

Documentation

Serveur MCP Last9

last9 mcp demo

Votre agent IA ne sait pas ce qui ne fonctionne pas en production. Voici la solution.

Le serveur MCP Last9 connecte Claude, Cursor, Windsurf et tout autre assistant IA compatible avec MCP directement à vos données d’observabilité en production — journaux, métriques, traces, exceptions, requêtes de base de données, alertes et déploiements. L’agent cesse de deviner et commence à lire les signaux réels.


Démarrer en 30 secondes (hébergé)

Aucun binaire à installer. Aucun jeton à gérer. Une URL, une authentification OAuth dans votre navigateur, et c’est terminé.

Trouvez le slug de votre organisation dans votre URL Last9 : app.last9.io/<org_slug>/...

Claude Code

claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp

Saisissez /mcp, sélectionnez last9, puis authentifiez-vous. C’est tout.

Cursor

Settings > MCP > Add New MCP Server :

{
  "mcpServers": {
    "last9": {
      "type": "http",
      "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Cliquez sur Connect, puis terminez l’authentification OAuth.

VS Code

Nécessite la version 1.99+. Ouvrez la palette de commandes → MCP: Add Server, collez l’URL, puis authentifiez-vous.

Ou directement dans settings.json :

{
  "mcp": {
    "servers": {
      "last9": {
        "type": "http",
        "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
      }
    }
  }
}

Windsurf

Settings > Cascade > Open MCP Marketplace > icône d’engrenage (mcp_config.json) :

{
  "mcpServers": {
    "last9": {
      "serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Claude Web/Desktop

Settings > Connectors > Add custom connector. Nommez-le last9, collez l’URL, puis authentifiez-vous.

Nécessite un accès administrateur à votre organisation Claude.


Auto-hébergé (STDIO)

Utilisez cette méthode si votre client MCP ne prend pas en charge le transport HTTP ou si vous avez besoin d’exécuter le serveur localement.

Installation

Homebrew :

brew install last9/tap/last9-mcp

NPM :

Nécessite Node.js 22.23.4+, 24.22.1+ ou 26.12.1+ : les versions antérieures acceptent les certificats TLS des autorités intermédiaires eMudhra compromises lorsque le programme d’installation télécharge le binaire.

npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest

Binaires précompilés (Windows / installation manuelle) :

Téléchargez-les depuis GitHub Releases :

PlateformeArchive
Windows (x64)last9-mcp-server_Windows_x86_64.zip
Windows (ARM64)last9-mcp-server_Windows_arm64.zip
Linux (x64)last9-mcp-server_Linux_x86_64.tar.gz
Linux (ARM64)last9-mcp-server_Linux_arm64.tar.gz
macOS (x64)last9-mcp-server_Darwin_x86_64.tar.gz
macOS (ARM64)last9-mcp-server_Darwin_arm64.tar.gz

Obtenir un jeton d’actualisation

Seuls les administrateurs peuvent créer des jetons.

  1. Accédez à API Access
  2. Cliquez sur Generate Token avec les autorisations d’écriture
  3. Copiez-le

Configuration du client

Homebrew :

{
  "mcpServers": {
    "last9": {
      "command": "/opt/homebrew/bin/last9-mcp",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

NPM :

{
  "mcpServers": {
    "last9": {
      "command": "npx",
      "args": ["-y", "@last9/mcp-server@latest"],
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

Où coller ceci :

ClientEmplacement
Claude Web/DesktopSettings > Developer > Edit Config (claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > Cascade > MCP Marketplace > icône d’engrenage (mcp_config.json)
VS CodeEncapsulez dans { "mcp": { "servers": { ... } } } dans settings.json — détails
Configuration STDIO de VS Code
{
  "mcp": {
    "servers": {
      "last9": {
        "type": "stdio",
        "command": "/opt/homebrew/bin/last9-mcp",
        "env": {
          "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
        }
      }
    }
  }
}

Pour NPM : utilisez "command": "npx" et ajoutez "args": ["-y", "@last9/mcp-server@latest"].

Windows

Après le téléchargement depuis GitHub Releases, extrayez l’archive et indiquez le chemin complet :

{
  "mcpServers": {
    "last9": {
      "command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

La méthode NPM est plus simple sous Windows : aucune gestion de chemin n’est nécessaire.

Variables d’environnement

VariableValeur par défautDescription
LAST9_REFRESH_TOKEN(obligatoire)Jeton d’actualisation depuis API Access
LAST9_DATASOURCEorganisation par défautNom de la source de données/du cluster — utile si vous avez plusieurs clusters Levitate
LAST9_FAKE_NOW_ISO(non défini)Pour les évaluations/relectures uniquement ; ne jamais définir en production. Instant RFC3339 (par ex. 2026-01-02T15:04:05Z) qui remplace l’heure actuelle lors de la résolution de fenêtres relatives telles que lookback_minutes, afin de rendre les exécutions reproductibles. Une valeur non valide provoque une erreur au démarrage. Les délais d’expiration, les caches et l’expiration des jetons continuent d’utiliser l’heure réelle
LAST9_API_HOSTapp.last9.ioRemplace l’hôte de l’API
LAST9_TOOLSETStous les outilsEnsembles d’outils à exposer, séparés par des virgules (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias : LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalseDéfinissez true pour ne servir que des outils en lecture seule ; voir Mode lecture seule. Une valeur qui n’est pas booléenne provoque une erreur au démarrage. Alias : LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—Outils d’écriture servis malgré le mode lecture seule, séparés par des virgules. Alias : LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000Nombre maximal d’entrées pour les requêtes get_logs segmentées
LAST9_USE_LOG_SEARCH_APIfalseDéfinissez true pour répondre à get_logs et get_service_logs avec un seul appel de recherche côté serveur au lieu d’une segmentation côté client. Chaque appel dispose de 90 secondes, puis renvoie des conseils pour réduire la fenêtre ; une réponse 502 ou 503 est réessayée une fois dans ce délai
LAST9_DEBUG_CHUNKINGfalseDéfinissez true pour consigner les détails de planification des segments pour get_logs, get_service_logs, get_traces
LAST9_DISABLE_TELEMETRYtrueDéfinissez false pour activer le traçage OTel interne
OTEL_SDK_DISABLED—Variable d’environnement OTel standard. Remplace LAST9_DISABLE_TELEMETRY
OTEL_EXPORTER_OTLP_ENDPOINT—Point de terminaison du collecteur OTLP (uniquement lorsque la télémétrie est activée)
OTEL_EXPORTER_OTLP_HEADERS—En-têtes d’authentification OTLP (uniquement lorsque la télémétrie est activée)

Chronométrage des phases des outils

Lorsque la télémétrie interne est activée, les spans des outils contiennent last9.phase.<phase>.duration_ms (temps écoulé réel en millisecondes) et last9.phase.<phase>.failed (indique si cette phase a renvoyé une erreur). Les mêmes champs sont émis dans les journaux de débogage tool phase completed, avec tool et phase, lorsque le journal configuré accepte les enregistrements de débogage. Ces mesures de durée n’ajoutent ni entrées, ni texte de requête, ni identifiants, ni corps d’erreur.

OutilPhases
get_log_patternssample : récupérer et décoder l’échantillon ; mine : extraction des motifs ; deep_link : résoudre l’index facultatif et créer le lien
get_logsfetch : récupérer, décoder et fusionner les résultats, y compris les nouvelles tentatives et les vérifications facultatives de cohérence des décomptes ; count_sanity : vérification facultative imbriquée ; post_process : conseils, résumé et mise en forme JSON ; deep_link : résolution de l’index et création du lien
get_service_profilerequest : préparer et envoyer la requête via le client API partagé, puis lire la réponse complète avant la mise en forme succincte

Seules les phases exécutées sont enregistrées, y compris les échecs de récupération. Les assistants facultatifs qui suppriment les erreurs conservent ce comportement ; failed: false ne garantit pas qu’un lien facultatif ou une vérification de décompte était disponible. La durée imbriquée de count_sanity est déjà incluse dans fetch ; ne l’ajoutez pas une deuxième fois. Le temps de récupération inclut le travail du client : il ne mesure donc pas uniquement l’exécution côté serveur. Comparez ces phases sur des fenêtres et des chemins de recherche équivalents avant d’ajuster l’échantillonnage ou la mise en cache.

Pour analyser la latence, rejouez les mêmes service, source de données, index, fenêtre et limites sur les versions de référence et candidates. Consignez le SHA de la version, la durée totale de l’outil, les durées des phases, last9.logs.search_path, les attributs de nouvelle tentative lorsqu’ils sont présents et les indicateurs de couverture. Comparez aussi bien les appels lents que les appels habituels. Une récupération lente ou une requête de profil lente indique une phase réseau/API à examiner ; il faut des éléments corrélés distincts sur l’exécution côté serveur avant d’attribuer la latence de queue au serveur. Ces diagnostics ne suffisent pas à eux seuls à établir une amélioration de la latence.

Mode lecture seule

--read-only (ou LAST9_MCP_READ_ONLY=true) ne sert que les outils annotés readOnlyHint: true : aucun outil ne peut donc créer, modifier ou supprimer des règles d’alerte, des canaux de notification, des tableaux de bord ou des règles de suppression, accuser réception des alertes, les réattribuer ou mettre des groupes en sourdine. Un outil sans annotations est considéré comme un outil d’écriture et est masqué.

Pour conserver quelques outils d’écriture, répertoriez-les avec --allow-write-tools (ou LAST9_MCP_ALLOW_WRITE_TOOLS) :

last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
  • Le serveur refuse de démarrer si un nom autorisé ne correspond pas à un outil d’écriture (faute de frappe ou nom d’un outil de lecture) ; l’erreur répertorie les outils d’écriture valides.
  • --allow-write-tools sans --read-only provoque une erreur au démarrage, car tous les outils d’écriture sont déjà servis.
  • Le mode lecture seule se combine avec --toolsets : un outil n’est servi que s’il satisfait aux deux critères. --toolsets=alerts --read-only --allow-write-tools=mute_alert_group sert les outils de lecture des alertes ainsi que mute_alert_group ; un outil d’écriture autorisé qui ne fait pas partie des ensembles d’outils sélectionnés reste masqué.
  • Le mode --http et dump-tools respectent les mêmes indicateurs et variables d’environnement : go run . dump-tools --read-only affiche les outils disponibles en lecture seule, ainsi que les instructions du serveur qu’il sert dans instructions.
  • Les descriptions, schémas et résultats des outils de lecture, ainsi que les instructions du serveur, ne mentionnent jamais un outil d’écriture masqué. Un outil d’écriture autorisé peut toutefois mentionner ses outils associés masqués (create_alert crée une règle désactivée que patch_alert active) ; autorisez donc ces outils ensemble.

Fonctionnalités

Repères

  • get_workspace_overview — Premier appel recommandé lorsqu’une requête ne précise aucun service ni outil (si elle en précise un, elle est directement dirigée vers l’outil correspondant) : environnements, signaux observés au cours de la dernière heure (journaux, traces, métriques), nombres de services et de groupes d’alertes, alertes en cours et heure actuelle, le tout en un seul appel peu coûteux. Un signal non observé pendant cette heure peut tout de même avoir des données plus anciennes et reste donc interrogeable. Si un sous-appel échoue, son champ prend la valeur null et une entrée errors[] est ajoutée. Disponible dans tous les ensembles d’outils
  • get_current_time — Heure actuelle et limites absolues pour last 2h, yesterday ou since yesterday 9am IST, dans n’importe quel fuseau horaire IANA ou abréviation courante. Disponible dans tous les ensembles d’outils

État des services

  • get_service_summary — Lignes de flotte (service, env) classées : request_count sur l’intervalle, throughput_rpm, nombres d’erreurs HTTP 4xx/5xx et nombres d’erreurs gRPC
  • get_service_environments — Environnements disponibles pour vos services. Exécutez cet outil en premier : les autres outils APM ont besoin de env qu’il fournit
  • get_service_performance_details — Analyse complète : débit, taux d’erreur, p50/p90/p95/moyenne/max, apdex, disponibilité (résumé par défaut ; série complète avec include_series)
  • get_service_operations_summary — Opérations regroupées par points de terminaison HTTP, appels de base de données, messagerie et clients HTTP
  • get_service_dependency_graph — Carte des dépendances avec débit, latence et taux d’erreur pour les éléments en amont, en aval et l’infrastructure
  • get_apm_service_deviations — Compare une fenêtre actuelle à une période de référence de même durée : régressions/améliorations, rapprochement Apdex et résultat final (flotte ou service unique)
  • get_exceptions — Exceptions côté serveur avec filtres de service et de span

Observabilité des bases de données

Quatre outils qui analysent directement les performances de votre base de données, à partir des spans de trace OpenTelemetry et, en l’absence de traces, de métriques d’infrastructure telles que CloudWatch. Aucune instrumentation supplémentaire n’est nécessaire si vous utilisez déjà OTel.

  • get_databases — Découvrez toutes les bases de données de votre infrastructure : type de base de données, hôte, débit (requêtes/min), latence p95, taux d’erreur, nombre de services dépendants. Détecte également les bases de données à partir de métriques d’infrastructure telles que CloudWatch, sans instrumentation des traces — ces lignes affichent une valeur d’activité au lieu de métriques de traces
  • get_database_slow_queries — Les exécutions de requêtes réellement les plus lentes, triées par durée, avec des ID de trace pour consulter les traces complètes
  • get_database_queries — Modèles et agrégats de requêtes : fréquence d’exécution d’une requête, durée moyenne/p95, taux d’erreur
  • get_database_server_metrics — Métriques côté serveur provenant de l’hôte de la base de données lui-même (CPU, connexions, taux de succès du cache de tampons — selon votre système de base de données)

Prend en charge PostgreSQL, MySQL, MongoDB, Redis, Aerospike et tout autre système dont les traces OTel comportent un attribut db_system — ainsi que les bases de données détectées à partir de métriques d’infrastructure telles que CloudWatch, dont les lignes affichent une valeur d’activité au lieu de métriques de traces.

Prometheus / PromQL

  • prometheus_range_query — Requêtes de plage PromQL sur n’importe quelle métrique
  • prometheus_instant_query — Requêtes instantanées ; utilisez des fonctions de regroupement telles que avg_over_time, sum_over_time
  • prometheus_label_values — Valeurs des libellés pour une série donnée
  • prometheus_labels — Tous les libellés disponibles pour une série

Pour les diriger vers une autre source de données/cluster que celui par défaut, définissez LAST9_DATASOURCE, ou utilisez datasource pour un appel donné. Si datasource est omis, la source par défaut est utilisée ; une correspondance approximative unique considérée comme sûre par le moteur de correspondance (par exemple, une variante de casse) utilise la correspondance la plus proche. La résolution automatique n’est pas garantie en cas de lettre manquante, supplémentaire ou inversée : même un seul candidat peut nécessiter une confirmation si la modification risque d’affecter un code de région ou d’environnement. Les correspondances plus approximatives ou ambiguës renvoient des candidats et n’exécutent aucune requête (ce n’est pas une erreur) ; les noms inconnus renvoient une erreur. Un bloc de contenu supplémentaire indique la source de données utilisée si vous ne l’avez pas nommée exactement. get_metric_status, get_service_profile et get_apm_service_deviations résolvent datasource de la même manière.

Journaux

  • get_logs — Requêtes de journaux complètes dans un pipeline JSON (agrégations, filtres, extraction de champs)
  • get_service_logs — Lignes de journal d’un service, filtrables par gravité et contenu du corps ; résumées au-delà de 20 lignes, sauf si response_mode vaut raw
  • get_log_patterns — Lignes de journal d’un service dans une fenêtre, regroupées en modèles de messages, avec le nombre, les premières/dernières occurrences, la répartition des niveaux de gravité et un exemple
  • get_emerging_log_patterns — Modèles de journaux nouveaux, en hausse, en baisse ou disparus par rapport à une fenêtre de référence, avec les nombres des deux fenêtres
  • get_log_attributes — Catalogue global des attributs du schéma des journaux pour une fenêtre temporelle
  • get_log_attributes_for_pipeline — Champs de journal réellement présents dans un pipeline en cours (découverte limitée au périmètre), chacun avec son filter_field exact
  • get_drop_rules — Règles d’exclusion des journaux de Last9 Control Plane
  • add_drop_rule — Créer une règle d’exclusion pour réduire le volume de journaux à la source
  • get_remapping_rules — Règles de remappage (logs_extract, logs_map, traces_map) de Last9 Control Plane
  • add_remapping_rule — Créer une règle de remappage qui extrait ou associe des attributs de journaux et de traces lors de l’ingestion

Traces

  • get_traces — Requêtes de traces dans un pipeline JSON pour les recherches générales et les agrégations
  • get_service_traces — Traces par ID de trace exact ou nom de service. Utilisez cette option si vous avez un ID de trace : elle est plus rapide
  • get_trace_attributes — Catalogue global des attributs du schéma des traces
  • get_trace_attributes_for_pipeline — Attributs réellement présents dans un pipeline en cours (découverte limitée au périmètre), chacun avec son filter_field exact
  • get_trace_attribute_values — Valeurs distinctes d’un attribut de trace, avec possibilité de limiter la recherche à un pipeline
  • get_trace_attribute_deviations — Classe les valeurs d’attribut qui diffèrent entre deux cohortes de spans délimitées (lentes vs rapides, en erreur vs sans erreur, ou deux fenêtres temporelles). Corrélation, pas causalité
  • get_trace_waterfall — Une trace exacte sous forme de cascade parent/enfant, avec temps propre calculé par union d’intervalles, spans les plus lents et avertissements sur le graphe

Événements de changement et alertes

  • get_change_events — Déploiements, modifications de configuration, retours arrière. Corrélez les incidents avec les changements effectués
  • analyze_change_impact — Un changement a-t-il provoqué un problème ? Compare un service et ses appelants directs avant et après un changement : signaux clés, écarts APM et d’attributs de trace, nouvelles alertes déclenchées et verdict (regression likely / no significant change / insufficient data)
  • get_alert_groups — Groupes d’alertes Compass configurés avec libellés de métadonnées, équipe, niveau et nombre de règles — y compris les groupes sans règle et ceux qui ne déclenchent aucune alerte
  • get_alert_operations_summary — État de santé de l’astreinte sur une fenêtre : alertes déclenchées et acquittées, backlog, notifications et, avec include_rules, règles les plus bruyantes, instables et non acheminées. Chaque nombre est accompagné de son status (available / partial / unavailable)
  • get_alert_coverage — Ce sur quoi vous ne déclenchez pas d’alerte : signaux clés non couverts, groupes d’alertes entièrement désactivés ou non acheminés, et règles mises en sourdine trop longtemps, chacun accompagné d’un outil de correction suggéré. Lecture seule.
  • get_alert_config — Configurations des règles d’alerte — recherche par nom, gravité, type et balises
  • get_entity_kpis — Chaque KPI (id, nom, PromQL, unité) d’un groupe d’alertes, y compris les KPI encore utilisés par aucune règle — les identifiants dont create_alert et validate_alert_expression ont besoin
  • create_kpi — Créer un KPI (PromQL + unité) dans un groupe d’alertes lorsqu’aucun KPI existant ne convient. Créez-le une seule fois et conservez l’identifiant renvoyé
  • get_alerts — Alertes actuellement déclenchées dans une fenêtre temporelle
  • get_alert_rule_state — État historique de déclenchement (1/0) par règle d’alerte sur une plage temporelle, regroupé par rule_id. Filtrable par groupe d’alertes, nom de règle, filtres de libellés et état.
  • get_alert_hygiene — Règles d’alerte bruyantes, instables, obsolètes et non acheminées sur 7 ou 30 jours, classées par ordre de priorité, chacune avec les chiffres justifiant le verdict et une correction suggérée. Lecture seule.
  • get_notification_channels — Canaux de notification configurés (Slack, PagerDuty, e-mail, etc.). scope=channels répertorie les canaux eux-mêmes (identifiants à associer) ; par défaut, attached répertorie les associations par groupe d’alertes
  • recommend_alert_config — Conseils de conception en lecture seule (cycle de vie, étapes de validation, contexte pour les intervenants) avant la création d’une règle d’alerte
  • validate_alert_expression — Tester une expression d’alerte sur les KPI d’un groupe d’alertes sans rien enregistrer
  • describe_alert_chart — En lecture seule : signaux pouvant déclencher une alerte (clé, unité) sur un graphique Discover (discover-service, discover-exceptions)
  • create_alert — Créer une règle d’alerte (statique ou adaptative via adaptive_std_cmp) dans un groupe d’alertes existant ; elle est toujours créée désactivée, comme brouillon. Créez-la une seule fois ; affinez-la avec update_alert / patch_alert
  • create_alert_from_chart — Créer une règle d’alerte à seuil statique à partir d’un graphique Discover en un seul appel. Comme avec create_alert, la règle est créée désactivée, comme brouillon
  • update_alert — Remplacement complet de la configuration d’évaluation d’une règle (peut renvoyer un nouvel ID de règle)
  • patch_alert — Modification partielle d’une règle : activer/mettre en pause, mute_until, intervenant properties, recurring_mute_schedule hebdomadaire (ou clear_recurring_mute_schedule)
  • delete_alert — Supprimer définitivement une règle d’alerte
  • mute_alert_group — Mettre en sourdine (ou réactiver) toutes les règles d’un groupe d’alertes jusqu’à une échéance
  • acknowledge_alert — Prendre en charge une alerte déclenchée ou en libérer la responsabilité
  • reassign_alert — Transférer une alerte déjà acquittée à un autre utilisateur
  • create_notification_channel — Créer un canal Slack, PagerDuty, Opsgenie, e-mail ou webhook générique
  • attach_notification_channel — Acheminer un canal existant vers un groupe d’alertes pour breach, threat ou les deux
  • detach_notification_channel — Supprimer une association entre un canal et un groupe d’alertes
  • delete_notification_channel — Supprimer définitivement un canal sans association

Les outils d’écriture des alertes (create_kpi, create_alert, update_alert, patch_alert, delete_alert, create_alert_from_chart, mute_alert_group, acknowledge_alert, reassign_alert, create_notification_channel, attach_notification_channel, detach_notification_channel, delete_notification_channel) nécessitent un jeton avec un droit d’écriture ; delete_alert, detach_notification_channel et delete_notification_channel nécessitent plutôt un droit de suppression. Ils sont exposés uniquement dans l’ensemble d’outils alerts.

Les règles, canaux et associations créés par ces outils sont marqués created_via: last9-mcp, avec le nom et la version du client MCP (pour les règles, les annotations _l9_created_via_ et _l9_created_via_client_, que patch_alert et update_alert conservent et que les appelants ne peuvent pas définir). get_entity_alert_rules et get_notification_channels affichent le marqueur, et delete_alert, detach_notification_channel et delete_notification_channel indiquent aux agents de ne nettoyer que les ressources marquées, sauf si l’utilisateur en désigne une.

Tableaux de bord personnalisés

  • list_dashboards — Tableaux de bord personnalisés filtrés par nom et paginés sous 32 KB : identifiants, noms, dates de dernière mise à jour, auteurs et état de verrouillage
  • get_dashboard — Définition complète d’un tableau de bord par ID, y compris les panneaux et les requêtes
  • preview_dashboard — Aperçu en lecture seule d’un tableau de bord ou d’un correctif non enregistré : requêtes résolues, résultats limités par panneau et différence nette entre les panneaux ; n’enregistre jamais les modifications
  • validate_dashboard — Vérification statique, exécution et classification en lecture seule pour un ID de tableau de bord enregistré ou un dashboard_definition intégré, sur une fenêtre de ≤24 h. Ne crée ni ne met à jour de tableaux de bord
  • create_dashboard — Créer une seule fois un tableau de bord personnalisé entièrement nouveau (panneaux, requêtes, métadonnées). Une fois l’ID renvoyé, modifiez les panneaux avec patch_dashboard.
  • update_dashboard — Restructurer la majeure partie d’un tableau de bord existant par ID (remplacement complet ; les tableaux de bord système en lecture seule renvoient une erreur). Pour modifier des panneaux individuellement, utilisez patch_dashboard
  • patch_dashboard — Modifications ciblées d’un tableau de bord existant par ID (ajouter/modifier/supprimer/déplacer un panneau, définir le titre ou une variable) ; renvoie une différence compacte, pas le tableau de bord complet
  • delete_dashboard — Supprimer un tableau de bord personnalisé par ID
  • set_dashboard_lock — Verrouiller ou déverrouiller un tableau de bord personnalisé par ID (auteur ou administrateur de l’organisation uniquement) ; un tableau de bord verrouillé refuse les mises à jour, les correctifs et la suppression
  • list_dashboard_snapshots — Instantanés figés d’un tableau de bord à un moment donné (métadonnées uniquement)
  • get_dashboard_snapshot — Instantané figé complet, y compris les données des panneaux, pour l’analyse des causes racines (RCA) ou les vues partageables
  • delete_dashboard_snapshot — Supprimer un instantané figé par ID

La création de tableaux de bord est disponible via MCP avec prompts/list et prompts/get, sans installer de compétence. Les trois invites ne prennent aucun argument :

  • create_dashboard_guide — Découverte, mise en page et sélection des panneaux ; valider l’ensemble du tableau de bord candidat et exécuter la requête de chaque panneau avant approbation, créer une seule fois, appliquer les modifications ciblées, puis relire le résultat.
  • dashboard_examples — Exemple complet couvrant les signaux RED du service, la latence des points de terminaison, les classes d’état, l’état de santé des hôtes, le nombre de journaux et les panneaux de traces, avec des variables dépendantes.
  • query_guide — Sémantique des compteurs, jauges, histogrammes et métriques de traces dérivées, requêtes instantanées ou de plage, fenêtres de taux, limites de pourcentage et règles logjson/tracejson.

Le même contenu est consultable à last9://reference/create_dashboard_guide, last9://reference/dashboard_examples et last9://reference/query_guide. Les invites et les ressources restent accessibles dans chaque ensemble d’outils ; l’exécution du flux de travail nécessite les outils appropriés (pour la création de tableaux de bord à signaux mixtes, utilisez --toolsets=dashboards,investigate, qui sert également à list_datasources). Les sessions en lecture seule peuvent préparer et valider, mais pas enregistrer. Vérifiez la disponibilité des outils avant de suivre une étape.

Les vérifications des panneaux utilisent actuellement prometheus_range_query, prometheus_instant_query, get_logs et get_traces, ainsi que validate_dashboard. Les types de requêtes non pris en charge par le validateur et ses valeurs par défaut simplifiées ne garantissent pas une parité de rendu. L’étape distincte de vérification des requêtes passera à query_panel après la fusion de #475.

Profilage continu

Le profilage continu doit être activé pour l’organisation. Commencez par découvrir les services avec get_profile_services, puis récupérez un graphique en flammes ou les fonctions classées.

  • get_profile_services — Services disposant de données de profilage dans la fenêtre (index avant la requête)
  • get_flamegraph — Arbre de flamegraph imbriqué pour un service (cpu par défaut ; également alloc, wall)
  • get_top_functions — Classement des échantillons propres aux fonctions les plus sollicitées pour un service
  • get_profile_summary — Bref diagnostic en langage naturel du profil d’un service

Tableaux de bord Grafana

Outils en lecture seule sur l’instance Grafana de l’organisation (via le proxy Grafana de Last9). Les champs d’identifiants ne sont jamais renvoyés au modèle. Activez-les avec LAST9_TOOLSETS=grafana (ou laissez les toolsets non définis pour tous les outils).

  • grafana_search_dashboards — Rechercher des tableaux de bord par sous-chaîne de titre (avec pagination ; truncated: true lorsque la limite est atteinte)
  • grafana_get_dashboard — Résumé d’un tableau de bord par uid (panneaux, variables, cibles PromQL) ; full_json=true pour le JSON Grafana brut
  • grafana_list_folders — Arborescence des dossiers
  • grafana_list_folder_dashboards — Tableaux de bord d’un dossier (avec pagination)
  • grafana_list_datasources — Inventaire des sources de données sans identifiants

Résolution approximative des noms

  • did_you_mean — Lorsque l’agent n’est pas sûr du nom d’une entité, cet outil renvoie les correspondances les plus proches de votre catalogue (services, environnements, hôtes, bases de données, déploiements/espaces de noms K8s, tâches). Jusqu’à 3 suggestions avec des scores de similarité. Le serveur l’appelle automatiquement avant la plupart des outils lorsqu’une recherche de nom ne renvoie aucun résultat.

Profil du service

  • get_service_profile — À quoi ressemblent réellement les données de télémétrie d’un service, avant de les interroger : signaux disponibles, langage et environnement d’exécution, environnements de déploiement, structure de ses journaux et correctif d’ingestion recommandé, le cas échéant. Permet à l’agent d’ignorer les outils de traces lorsqu’un service n’a aucune trace, et d’extraire la gravité du corps du journal lorsque SeverityText est vide, plutôt que de filtrer sur ce champ et de ne rien trouver.

Fonctionnement

Liens profonds dans chaque réponse. Chaque outil renvoie un champ deep_link — une URL directe vers le tableau de bord Last9 correspondant exactement à cette requête et à cette plage temporelle. L’agent peut vous transmettre le lien ; vous cliquez dessus ; vous y êtes.

Toolsets. Par défaut, le serveur expose tous les outils. Les hôtes d’automatisation qui n’ont besoin que d’investigation (journaux/traces/métriques/profils) peuvent définir LAST9_TOOLSETS=investigate (ou transmettre --toolsets=investigate) afin que tools/list reste réduit, sans désactivation massive côté client. Packs nommés : logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Les noms inconnus provoquent un échec immédiat. get_current_time et get_workspace_overview sont disponibles dans tous les toolsets. En mode HTTP, une requête peut encore réduire cet ensemble avec l’en-tête X-Last9-Toolsets (voir Toolsets par requête). Le pack alerts fournit également les outils en lecture seule prometheus_range_query et get_dashboard, appelés par l’invite author-alert. Le pack metrics seul n’inclut pas list_datasources ni did_you_mean — utilisez investigate (ou combinez des toolsets) si vous avez besoin de ces outils de découverte.

Ressources de référence des outils. Les longs manuels logjson/tracejson/service-logs/metrics sont des ressources MCP (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting), et non du texte toujours présent dans la description des outils. Le manuel d’alerting couvre la grammaire des expressions d’alerte, les champs statiques et adaptatifs, les unités, les vérifications effectuées par validate_alert_expression et des modèles de règles de latence / taux d’erreur / saturation. Les règles de requête essentielles restent dans la description de l’outil afin que les agents qui n’appellent jamais resources/read disposent tout de même de consignes de construction correctes. Découvrez les champs propres à l’organisation avec get_log_attributes / get_log_attributes_for_pipeline (et leurs équivalents pour les traces) — ils ne sont pas injectés dans les descriptions.

Résultats volumineux segmentés. get_logs et get_traces gèrent les grands ensembles de résultats par segmentation plutôt que par troncature. La limite par défaut est de 5000 entrées pour les journaux ; elle est configurable via LAST9_MAX_GET_LOGS_ENTRIES.


Développement

Mode HTTP, tests avec curl, compilation depuis les sources

Exécution en mode HTTP

export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server

Le serveur démarre à http://localhost:8080/mcp.

Tester avec curl

Le gestionnaire Streamable HTTP fonctionne en mode sans état : chaque requête est donc traitée indépendamment. Une négociation initialize et un en-tête Mcp-Session-Id sont facultatifs — les clients qui les envoient fonctionnent également (l’en-tête est accepté et ignoré), et les clients peuvent aussi passer directement à tools/list / tools/call. Chaque outil correspond à une requête/réponse indépendante ; le serveur n’envoie aucune notification serveur→client, donc GET /mcp (le flux SSE) renvoie 405.

# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

# Call a tool
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/call",
      "params": {
        "name": "get_service_logs",
        "arguments": {
          "service_name": "your-service-name",
          "lookback_minutes": 30,
          "limit": 10
        }
      }
    }'

Toolsets par requête

En mode HTTP, une requête peut réduire l’ensemble des outils disponibles avec l’en-tête X-Last9-Toolsets, ou le paramètre de requête toolsets pour les clients qui ne peuvent pas définir d’en-têtes (/mcp?toolsets=logs,traces). Si les deux sont envoyés, un en-tête non vide est prioritaire. La valeur utilise les mêmes noms séparés par des virgules que --toolsets. La requête voit l’intersection avec le --toolsets défini au démarrage : elle peut réduire l’ensemble, jamais l’élargir, et all ou une valeur vide conserve l’ensemble défini au démarrage. Un nom inconnu renvoie 400 en le nommant. tools/list, tools/call et les instructions initialize suivent tous l’ensemble effectif ; get_current_time et get_workspace_overview restent présents dans tous les ensembles.

curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -H "X-Last9-Toolsets: logs,alerts" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

Chaque ensemble effectif distinct est servi par son propre serveur, créé à la première requête (quelques dizaines de millisecondes) et conservé jusqu’à l’arrêt ; une requête qui reprend l’ensemble défini au démarrage réutilise le serveur de démarrage. Il n’y a pas d’éviction : seuls les toolsets nommés sont acceptés, le cache contient donc au maximum un serveur par combinaison de ces toolsets (135 actuellement, environ 75 MB de tas actif au total ; un cache complet s’est stabilisé autour de 230 MB de mémoire résidente lors des tests).

Compiler depuis les sources

git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server

LAST9_HTTP=true est destiné au développement local. Pour une utilisation réelle, le point de terminaison HTTP hébergé est plus simple.


Référence des outils

Tous les paramètres, normes de saisie temporelle et détails

Saisie temporelle

  • Les heures absolues (start_time_iso/end_time_iso, ou time_iso) sont prioritaires sur lookback_minutes.
  • Pour les fenêtres relatives : utilisez lookback_minutes.
  • Pour les fenêtres absolues : utilisez RFC3339/ISO8601 — 2026-02-09T15:04:05Z.
  • L’ancien YYYY-MM-DD HH:MM:SS est accepté uniquement pour des raisons de compatibilité.
  • Convertissez les expressions telles que since yesterday 9am IST en bornes RFC3339 avec get_current_time.

get_workspace_overview

Aucun paramètre. Sonde les 60 dernières minutes en parallèle, chaque sous-appel ayant un délai d’expiration court, et renvoie current_time, lookback_minutes, environments, telemetry (booléens logs/traces/metrics), service_count (rangs des services distincts get_service_summary, tous les environnements), alert_group_count, firing_alert_count et errors ([{field, error}]). Un champ dont le sous-appel a échoué est null (inconnu), jamais 0 ni false. Les sondes ne sont pas limitées par --toolsets : les toolsets déterminent les outils disponibles, et le jeton d’API détermine ce que le serveur peut lire.

get_current_time

  • range (chaîne, facultatif) : last 2h, past 30 minutes, last 7d (s, m, h, d = 24h, w = 7d ; au maximum 366d) ; today ; yesterday ; since <point> ; <point> to <point>. Un instant peut être au format RFC3339, ou today / yesterday / un jour de la semaine (monday, mon : sa dernière occurrence, aujourd’hui inclus) / YYYY-MM-DD avec un 9am, 9:30pm ou 14:30 facultatif. Un fuseau horaire final remplace timezone pour les deux bornes ; un fuseau horaire placé ailleurs provoque une erreur. Omettez ce paramètre pour obtenir uniquement now.
  • timezone (chaîne, facultatif) : nom IANA ou abréviation (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). UTC par défaut. Les fuseaux inconnus provoquent une erreur, tout comme le fuseau ambigu CST (indiquez America/Chicago ou Asia/Shanghai).

Renvoie now (et start/end avec range) au format {iso, epoch_seconds, local} ; local n’apparaît que pour un fuseau autre que UTC.

get_exceptions

  • limit (entier, facultatif) : nombre maximal d’exceptions. Valeur par défaut : 20.
  • lookback_minutes (entier, facultatif) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (chaîne, facultatif) : plage temporelle absolue.
  • service_name (chaîne, facultatif) : filtrer par service.
  • span_name (chaîne, facultatif) : filtrer par nom de span.
  • env (chaîne, facultatif) : filtrer par environnement.

get_service_summary

  • start_time_iso / end_time_iso (chaîne, facultatif)
  • env (chaîne, facultatif) : expression régulière PromQL. Valeur par défaut : .*. Une correspondance exacte nécessite des ancres (par ex. ^prod$).
  • sort_by (chaîne, facultatif) : request_count (par défaut), throughput_rpm, http_4xx_count, http_5xx_count ou grpc_error_count.
  • limit (entier, facultatif) : nombre maximal de lignes classées. Omettre ou indiquer 0 signifie 10 ; les valeurs supérieures à 100 sont limitées à 100.

get_service_environments

  • start_time_iso / end_time_iso (chaîne, facultatif)

Tous les autres outils APM nécessitent une valeur env. Utilisez "" si ce champ est vide.

get_service_performance_details

Renvoie par défaut un résumé par série : points, missing_points (intervalles de disponibilité sans trafic, exclus des statistiques), min, p50, p90, p99 (rang le plus proche), max, mean, last, baseline_mean (moyenne de la première moitié des points valides, et non de la fenêtre), delta_pct (seconde moitié des points valides par rapport à la référence ; absent si la référence est égale à 0) et jusqu’à 3 change_points (timestamp, before_mean, after_mean), pour un maximum de 4 séries par métrique et chaque quantile de temps de réponse (moyenne la plus élevée en premier ; series_omitted indique le nombre de séries restantes). Une série avec points: 0 ne contient aucune statistique, et baseline_mean/delta_pct nécessitent au moins 6 points (3 par moitié). full_series indique que les points bruts sont disponibles via include_series.

  • service_name (chaîne, obligatoire)
  • lookback_minutes (entier, facultatif) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • env (chaîne, facultatif) : valeur par défaut : prod.
  • top_n (entier, facultatif) : nombre maximal d’entrées par liste des principales opérations/erreurs. Valeur par défaut : 5, ou 10 avec include_series=true. Maximum : 100.
  • include_series (booléen, facultatif) : renvoyer chaque point de chaque série au lieu du résumé. Valeur par défaut : false.

get_service_operations_summary

  • service_name (chaîne, obligatoire)
  • lookback_minutes (entier, facultatif) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • env (chaîne, facultatif) : valeur par défaut : prod.

get_service_dependency_graph

  • service_name (chaîne, facultatif)
  • lookback_minutes (entier, facultatif) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • env (chaîne, facultatif) : valeur par défaut : prod.

get_apm_service_deviations

  • service_name (string, optional) : omettre pour la portée de la flotte ; fournir pour un service et ses corrélations d’opérations.
  • lookback_minutes (integer, optional) : fenêtre actuelle. Valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional) : fenêtre actuelle explicite.
  • baseline_start_time_iso / baseline_end_time_iso (string, optional) : référence explicite. Par défaut, la fenêtre de même durée qui précède immédiatement.
  • datasource (string, optional) : omettre pour utiliser la valeur par défaut ; les noms approximatifs sont résolus comme pour les outils Prometheus. La réponse indique la valeur par défaut ou la correspondance la plus proche utilisée ; les noms ambigus renvoient des candidats sans lancer de requête.
  • env (string, optional) : valeur par défaut : prod.
  • max_services / max_operations (integer, optional) : valeur par défaut : 10, maximum : 10 chacun.

get_databases

  • env (string, optional) : filtrer par environnement. Accepte une expression régulière. Valeur par défaut : tous.
  • lookback_minutes (integer, optional) : valeur par défaut : 60. La fenêtre ne peut pas dépasser 7 jours.
  • start_time_iso / end_time_iso (string, optional)

get_database_slow_queries

  • db_system (string, optional) : par exemple postgresql, mysql, mongodb, redis.
  • host (string, optional) : hôte de la base de données (net_peer_name).
  • service_name (string, optional) : nom du service appelant.
  • env (string, optional)
  • min_duration_ms (float, optional) : durée minimale de la requête en ms.
  • lookback_minutes (integer, optional) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional) : valeur par défaut : 20.

get_database_queries

  • db_system (string, optional)
  • host (string, optional)
  • service_name (string, optional)
  • env (string, optional)
  • lookback_minutes (integer, optional) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional) : valeur par défaut : 20.

get_database_server_metrics

  • db_system (string, required) : par exemple postgresql, mysql, mongodb, redis, aerospike.
  • host (string, optional)
  • lookback_minutes (integer, optional) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional)

prometheus_range_query

  • query (string, required) : la requête PromQL.
  • start_time_iso / end_time_iso (string, optional) : par défaut, les 60 dernières minutes.
  • lookback_minutes (float, optional) : valeur par défaut : 60.

prometheus_instant_query

  • query (string, required)
  • time_iso (string, optional) : par défaut, maintenant.
  • lookback_minutes (float, optional)

prometheus_label_values

  • match_query (string, optional) : filtre PromQL.
  • label (string, required) : nom du label.
  • lookback_minutes (float, optional) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional)

Lorsqu’aucune fenêtre n’est indiquée et que match_query désigne une métrique (metric{...} ou {__name__="metric"}), un résultat vide sur 60 minutes est réessayé une fois sur 4 jours ; un second bloc de texte indique la fenêtre couverte par le résultat.

prometheus_labels

  • match_query (string, optional) : filtre PromQL.
  • lookback_minutes (float, optional) : valeur par défaut : 60.
  • start_time_iso / end_time_iso (string, optional)

Réessaie une recherche vide portant sur une seule métrique sur 4 jours, comme prometheus_label_values.

get_logs

  • logjson_query (array, required) : requête de pipeline JSON.
  • lookback_minutes (integer, optional) : valeur par défaut : 5.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional) : valeur par défaut du serveur : 5000.
  • index (string, optional) : physical_index:<name> ou rehydration_index:<block_name>.
  • response_mode (string, optional) : summary (par défaut ; également pour null) ou raw. Un résultat de lignes brutes de plus de 20 lignes est renvoyé sous la forme summary : lines_summarized, severity_counts (les six principaux labels, le reste dans other_severities), first_timestamp/last_timestamp, un histogram à 10 intervalles sur la fenêtre de requête (sur les lignes renvoyées, avec truncated: true lorsque la limite a tronqué le résultat), et les principaux patterns (template, count, jusqu’à deux samples), le reste étant totalisé dans other, avec un maximum de 4000 caractères ; les métadonnées de premier niveau qui ne tiennent toujours pas sont supprimées et indiquées dans dropped_fields. raw renvoie les lignes. Les résultats agrégés ne sont jamais résumés.

Pour l’inventaire des services basé sur les logs, interroger d’abord physical_index_service_count :

sum by (name, service_name, env) (physical_index_service_count{destination="logs"})

Utiliser service_name comme ServiceName, env comme environnement lorsqu’il est présent, et name comme nom d’index physique. Si name="default", omettre index ; pour un index physique autre que celui par défaut, sélectionné par l’utilisateur, transmettre index: "physical_index:<name>". Si le backend rejette le filtrage explicite par index physique, réessayer sans index et signaler que ce backend ne prend pas en charge le filtrage explicite par index physique.

get_service_logs

  • service_name (string, required)
  • lookback_minutes (integer, optional) : valeur par défaut : 60.
  • limit (integer, optional) : valeur par défaut : 100, ou 20 avec response_mode: "raw".
  • env (string, optional)
  • severity_filters (array, optional) : par exemple ["error", "warn"]. Logique OU.
  • body_filters (array, optional) : par exemple ["timeout", "failed"]. Logique OU.
  • start_time_iso / end_time_iso (string, optional)
  • index (string, optional)
  • response_mode (string, optional) : summary (par défaut ; également pour null) ou raw. Au-delà de 20 lignes, logs est remplacé par le même summary que get_logs, les autres champs étant conservés ; raw renvoie les entrées.

Les différents types de filtres sont combinés avec ET. Chaque tableau utilise une logique OU en interne. Utiliser get_logs d’abord pour obtenir des décomptes agrégés généraux ; utiliser get_service_logs uniquement après avoir restreint la recherche à un service, un environnement et un index, ainsi qu’à un petit échantillon.

get_log_patterns

  • service_name (string, required)
  • env (string, optional)
  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional) : valeur par défaut : 60.
  • severity_filters / body_filters (array, optional) : logique OU, comme dans get_service_logs. Définir severity_filters uniquement lorsque get_service_profile indique severity_set all ; avec none ou partial, les lignes dont le corps contient le niveau de gravité sont exclues.
  • index (string, optional)
  • sample_size (integer, optional) : lignes échantillonnées dans la fenêtre, de la plus récente à la plus ancienne. Valeur par défaut : 1000, maximum : 5000.
  • top_n (integer, optional) : modèles renvoyés par décompte. Valeur par défaut : 20, maximum : 100. Le reste est totalisé dans other.

Le regroupement est effectué par le serveur MCP sur les lignes échantillonnées ; les décomptes, first_seen et last_seen portent donc sur l’échantillon. window.sample_limit_reached indique quand l’échantillon risque de ne pas inclure certaines lignes correspondantes (il contient sample_size lignes et l’API ne renvoie pas de valeur exacte de total_matching_lines égale à ce nombre, ou la recherche a été logs_truncated), auquel cas il ne contient que les lignes les plus récentes de la fenêtre. Chaque template et sample est tronqué à 500 caractères et se termine par …, de sorte qu’un corps qui ne peut pas être regroupé (comme du JSON sans champ message) ne peut pas remplir la réponse. Une recherche comportant des segments en échec est une erreur d’outil ; une recherche tronquée ou plafonnée renvoie tout de même des modèles, signalés par sample_limit_reached. Une liste patterns vide signifie que rien ne correspond uniquement lorsque sample_limit_reached est faux ; lorsqu’il est vrai, la recherche s’est arrêtée prématurément et a pu manquer des lignes correspondantes.

get_emerging_log_patterns

Prend tous les paramètres de get_log_patterns (la plage temporelle correspond à la fenêtre actuelle), ainsi que :

  • baseline_start_time_iso / baseline_end_time_iso (string, optional) : définir les deux ou aucun. Par défaut : la fenêtre de même durée qui précède immédiatement la fenêtre actuelle.
  • min_count (integer, optional) : nombre de lignes qu’un modèle modifié doit avoir dans la fenêtre où il est le plus fréquent : fenêtre actuelle pour new/increased, référence pour decreased/disappeared. Valeur par défaut : 3 (ou sample_size si cette valeur est inférieure), maximum : sample_size.
  • change_factor (number, optional) : ratio de fréquence supérieur à 1 qu’un modèle présent dans les deux fenêtres doit atteindre (increased) ou auquel il doit descendre, à l’inverse de (decreased). Valeur par défaut : 2.

Les deux seuils doivent être respectés ; un modèle à fort volume dont la fréquence n’a pas changé de change_factor n’est donc jamais signalé. Renvoie uniquement les modèles modifiés (new, increased, decreased, disappeared), avec les décomptes current et baseline ; unchanged_patterns compte les modèles présents dans les deux fenêtres dont la variation est inférieure à change_factor, et below_min_count_patterns compte les changements écartés parce qu’ils comportaient moins de min_count lignes. Les fréquences sont comparées par minute lorsque les deux échantillons contiennent toutes les lignes correspondantes, par minute estimée à partir de la valeur exacte de total_matching_lines d’un échantillon plafonné, et sinon en tant que parts de l’échantillon, auquel cas increased/decreased décrivent la composition plutôt que le taux (comparison_basis). Une liste patterns vide signifie qu’aucun changement ne dépasse les deux seuils, et non que les logs sont inchangés : les changements plus rares sont comptabilisés dans below_min_count_patterns, et une fenêtre avec sample_limit_reached compare des échantillons, pas des fenêtres entières.

get_log_attributes

  • lookback_minutes (integer, optional) : valeur par défaut : 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)
  • index (string, optional)

get_log_attributes_for_pipeline

  • pipeline (array, required) : étapes de filtre précédentes pour limiter la découverte, par exemple [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (integer, optional) : valeur par défaut : 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)
  • index (string, optional)

get_drop_rules

Aucun paramètre. Liste les règles de suppression via GET /otel_settings/drop?region=....

add_drop_rule

  • name (string, required)
  • filters (array, required) : chaque filtre : key, value, operator (equals/not_equals), conjunction (and).
  • Les clés de filtre doivent utiliser attributes["key_name"] ou resource.attributes["key_name"] (exigence de l’API Last9).
  • Crée la règle via POST /otel_settings/drop?region=...&cluster_id=....

get_remapping_rules

  • rule_type (string, required) : logs_extract, logs_map ou traces_map.
  • region (string, optional) : valeur par défaut : la région de la source de données configurée.
  • Liste les règles via GET /otel_settings/remapping/{rule_type}?region=....

add_remapping_rule

Crée une règle par appel ; les règles de mappage nécessitent un appel par target_attribute.

  • rule_type (chaîne, obligatoire) : logs_extract, logs_map ou traces_map.
  • name (chaîne, obligatoire)
  • remap_keys (tableau, obligatoire) : champs source. logs_extract avec json : noms des champs du corps ; avec pattern : exactement une expression régulière avec un groupe de capture nommé. Règles de mappage : chemins d’attributs, la première valeur non vide l’emporte.
  • target_attribute (chaîne, obligatoire) : logs_extract : log_attributes ou resource_attributes. logs_map : service, severity ou resource_deployment.environment. traces_map : service.
  • extract_type (chaîne, obligatoire uniquement pour logs_extract) : json ou pattern.
  • action (chaîne, uniquement pour logs_extract) : upsert (par défaut) ou insert.
  • prefix (chaîne, uniquement pour logs_extract)
  • preconditions (tableau, uniquement pour logs_extract) : au plus un {key, value, operator} ; operator est equals (par défaut), not_equals ou like (expression régulière).
  • region (chaîne, facultatif) : par défaut, la région de la source de données configurée.
  • Crée la règle via POST /otel_settings/remapping/{rule_type}?region=.... Aucune nouvelle tentative ; après un délai d’expiration, vérifiez avec get_remapping_rules.

get_traces

À utiliser pour les recherches générales et les agrégations. Pour rechercher un ID de trace exact, utilisez get_service_traces.

  • tracejson_query (tableau, obligatoire)
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • lookback_minutes (entier, facultatif) : par défaut : 60.
  • limit (entier, facultatif) : par défaut : 5000.

get_service_traces

Un seul de trace_id ou service_name est requis.

  • trace_id (chaîne, facultatif) : période rétrospective par défaut : 72 heures.
  • service_name (chaîne, facultatif) : période rétrospective par défaut : 60 min.
  • lookback_minutes (entier, facultatif)
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • limit (entier, facultatif) : par défaut : 10.
  • env (chaîne, facultatif)

get_trace_attributes

  • lookback_minutes (entier, facultatif) : par défaut : 15.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • region (chaîne, facultatif)

get_trace_attributes_for_pipeline

  • pipeline (tableau, obligatoire) : étapes de filtrage précédentes pour limiter la découverte, par exemple [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (entier, facultatif) : par défaut : 15.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • region (chaîne, facultatif)

get_trace_attribute_values

  • tag_name (chaîne, obligatoire) : nom de l’attribut de get_trace_attributes (par exemple resource_department ou attributes['http.method']).
  • pipeline (tableau, facultatif) : étapes de filtrage précédentes pour limiter les valeurs ; omettez ce paramètre pour obtenir les valeurs globales.
  • lookback_minutes (entier, facultatif) : par défaut : 15.
  • start_time_iso / end_time_iso (chaîne, facultatif) : limites historiques RFC3339 ; prioritaires sur lookback_minutes.
  • region (chaîne, facultatif)

get_trace_attribute_deviations

  • comparison_mode (chaîne, obligatoire) : latency, errors ou time.
  • service_name (chaîne, obligatoire)
  • environment (chaîne, obligatoire) : valeur exacte de deployment.environment.
  • operation (chaîne, facultatif)
  • filters (tableau, facultatif) : conditions de filtrage JSON des traces.
  • candidate_attributes (tableau, facultatif) : maximum 8 ; omettez ce paramètre pour une découverte limitée.
  • latency_threshold_ms (nombre, facultatif) : requis pour le mode latency ; refusé pour les autres modes.
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • lookback_minutes (entier, facultatif) : par défaut : 15. Maximum : 15.
  • baseline_start_time_iso / baseline_end_time_iso (chaîne, facultatif) : requis pour le mode time ; les périodes ne doivent pas se chevaucher et doivent avoir la même durée que la fenêtre cible.
  • minimum_cohort_size (entier, facultatif) : par défaut : 100. Minimum : 20.
  • minimum_value_support (entier, facultatif) : par défaut : 20. Minimum : 10.
  • limit (entier, facultatif) : par défaut : 10. Maximum : 10.

Nécessite l’activation de la fonctionnalité backend complémentaire.

get_trace_waterfall

  • trace_id (chaîne, obligatoire)
  • environment (chaîne, facultatif)
  • start_time_iso / end_time_iso (chaîne, facultatif)
  • lookback_minutes (entier, facultatif) : par défaut : 4320 (72 heures).
  • selected_span_id (chaîne, facultatif) : renvoie uniquement les attributs, événements et liens de cette étendue.
  • max_spans (entier, facultatif) : par défaut : 500. Maximum : 1000 ; la politique de masquage de l’organisation peut imposer une limite inférieure.

Renvoie l’enveloppe investigation-evidence/v1 du service de traces sans modification ; la cascade se trouve sous data. Le service construit la cascade et masque les valeurs selon une politique propre à chaque organisation (identifiants, littéraux de requête, URL, adresses e-mail, adresses IP, identifiants utilisateur) avant qu’elles ne quittent le backend : sanitizer indique la politique appliquée et evidence.sanitization comptabilise les éléments masqués ou tronqués. Si une information nécessaire est masquée, demandez à un administrateur de l’organisation d’ajuster la politique plutôt que de chercher à la contourner. L’outil refuse une réponse sans bloc sanitizer, avec un sanitizer.version différent de trace-evidence-sanitizer/v1, dont le corps répète une clé JSON ou dont le corps dépasse 512 KiB (limite inférieure max_spans). Nécessite l’activation de la fonctionnalité backend complémentaire.

get_change_events

  • start_time_iso / end_time_iso (chaîne, facultatif)
  • lookback_minutes (entier, facultatif) : par défaut : 60.
  • service_name (chaîne, facultatif)
  • env (chaîne, facultatif)
  • event_name (chaîne, facultatif) : appelez d’abord sans ce paramètre pour obtenir available_event_names.

analyze_change_impact

Transmettez exactement l’un de change_event ou service + timestamp.

  • change_event (objet, facultatif) : un élément de get_change_events change_events[], sans modification. Utilise metric.service, metric.deployment_environment et le values[].timestamp le plus ancien.
  • service (chaîne, facultatif) : requis avec timestamp lorsque change_event est omis.
  • timestamp (chaîne, facultatif) : RFC3339 ou secondes Unix, arrondies à la minute inférieure.
  • env (chaîne, facultatif) : environnement exact. Par défaut : celui de l’événement, sinon tous.
  • baseline_minutes (entier, facultatif) : par défaut : 60. Limité à 30..120.
  • after_minutes (entier, facultatif) : par défaut : baseline_minutes. Limité à 30..120 et plafonné à l’heure actuelle.

regression likely lorsqu’au moins une des conditions suivantes est remplie : le taux d’erreur augmente d’au moins 1 point de pourcentage, le p95 augmente d’au moins 40 % ou le débit (rpm) diminue d’au moins 50 % pour le service ou l’un de ses 10 principaux appelants, classés selon le débit cumulé sur les deux fenêtres (avec au moins 100 requêtes avant la modification et, pour le débit, après celle-ci ; le p95 ne comptabilise que les requêtes de latency_env) ; une alerte les concernant commence à se déclencher après la modification et l’est toujours à la fin de la fenêtre postérieure (correspondance insensible à la casse par nom de groupe d’alertes ou par étiquette service, service_name ou service.name, sinon par annotation (jamais par du texte libre tel qu’un résumé) ; avec env, les alertes étiquetées avec un autre environnement, sans tenir compte de la casse, sont ignorées et celles sans étiquette sont marquées env_match: unlabelled) ; une régression de get_apm_service_deviations. insufficient data lorsque la fenêtre postérieure dure moins de 5 minutes (y compris si la modification est future), que le service a trop peu de requêtes, ou que les signaux clés, la recherche des appelants directs, les alertes ou get_apm_service_deviations ont échoué, entièrement ou dans l’une des requêtes répertoriées dans deviations.apm.unavailable : l’absence de preuves ne donne jamais no significant change, et toute régression détectée indique ce qui a échoué. no significant change est une réponse valide, pas un échec. Les écarts d’attributs de trace ne sont calculés que si env est défini, sur une période maximale de 15 minutes de chaque côté ; ils expliquent un verdict, mais ne le déterminent jamais. Les ignorer ou ne pas parvenir à les récupérer ne change donc pas le verdict. Chaque liste contient 10 éléments et indique le nombre d’éléments omis ; l’échec d’un appel en amont ajoute un error à sa seule section. La latence des signaux clés provient d’un même environnement dans les deux fenêtres, indiqué dans latency_env : en l’absence de env, celui qui a le plus de trafic. Le taux d’erreur des signaux clés comptabilise les erreurs 5xx et gRPC ; deviations.apm comptabilise également les étendues avec un statut d’erreur et les réponses 429. Les signaux d’un appelant correspondent à ses propres étendues serveur ; les appelants qui n’ont que des étendues client affichent donc 0 rpm.

regressions répertorie une entrée par déclencheur à l’origine de regression likely, dans l’ordre de reason, et vaut [] pour les autres verdicts. Chaque entrée contient service, role (changed ou dependent), env, metric (exactement l’un de error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) et baseline/after dans l’unité de la métrique (%, ms, rpm ou valeur propre au signal APM ; null pour alert). Un élément alert ajoute rule_id et state, l’état de l’instance dans la tranche la plus récente du moniteur d’alertes de la fenêtre postérieure qui la répertorie, toujours firing : une alerte qui commence après la modification mais est résolue avant la fin de la fenêtre postérieure n’est pas une régression et ne crée donc aucun ticket ; elle reste dans alerts.started avec son state, et reason la comptabilise. env est l’environnement dans lequel la métrique a été mesurée : le env demandé, sinon, pour le taux d’erreur et le débit, la somme de tous les environnements (env: ""), tandis que le p95 utilise l’environnement le plus actif, latency_env ; une alerte utilise sa propre étiquette d’environnement et un écart APM son propre environnement. Chaque régression concerne l’ensemble du service ; aucune ne désigne donc un point de terminaison.

get_alert_groups

Inventaire des groupes d’alertes Compass configurés pour les audits de changeboard / couverture des étiquettes. Inclut les groupes sans règle et ceux qui ne se déclenchent pas. Ne renvoie pas de PromQL.

  • alert_group_name / alert_group_type / data_source_name (chaîne, facultatif) : recherche de sous-chaîne sans distinction de casse.
  • team / tier (chaîne, facultatif) : correspondance exacte, sans distinction de casse, sur les métadonnées configurées.
  • label_key + label_value (chaîne, facultatif) : doivent être définis ensemble. Correspondance exacte, sans distinction de casse, sur une paire metadata.labels — clé et valeur.

Renvoie un {"count":N,"groups":[...]} JSON compact avec id, name, type, entity_class, team, tier, metadata.labels et le nombre de règles. Un team / labels vide signifie que la valeur n’est pas définie.

get_alert_operations_summary

  • start_time_iso / end_time_iso (chaîne, obligatoire) : fenêtre RFC3339, de 31 jours maximum.
  • timezone (chaîne, facultatif) : nom IANA pour les limites des jours. Par défaut : UTC.
  • severities / services (tableau, facultatif) : restreint le résumé.
  • include_rules (booléen, facultatif) : renvoie également l’hygiène par règle (les 20 premières selon fire_count, les règles instables et non acheminées, avec truncated lorsque l’API a limité sa liste de règles). Par défaut : false.

Renvoie un JSON avec alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention et coverage. Chaque métrique est {status, count?, reason?} ; un décompte partial ne couvre qu’une partie de la fenêtre et ne constitue pas une borne inférieure.

get_alert_coverage

Répond à la question « sur quoi n’ai-je pas d’alerte ? » pour un service, un environnement, un groupe d’alertes ou l’ensemble de l’organisation si aucune portée n’est indiquée. Lecture seule : ne crée, ne modifie et ne réactive jamais rien. Également disponible dans l’ensemble d’outils investigate.

  • service (chaîne, facultatif) : nom du service.
  • environment (chaîne, facultatif) : environnement de déploiement (par exemple prod).
  • entity_id (chaîne, facultatif) : UUID du groupe d’alertes (entité), tel que renvoyé par get_alert_groups.
  • muted_days (entier, facultatif) : nombre entier de jours, de 1 à 3650. Par défaut : 7 ; 0 signifie la valeur par défaut. Une règle mise en sourdine depuis plus longtemps constitue une lacune muted_too_long. Les valeurs sont supprimées des espaces en début et fin ; les chaînes vides sont ignorées. Types d’écarts : uncovered_signal (aucune règle activée pour latency, error_rate, throughput ou saturation ; indique une règle désactivée qui couvrirait le signal), all_rules_disabled (un groupe d’alertes dont toutes les règles sont désactivées), no_notification_channel (une règle dont la sévérité n’est acheminée vers aucun canal par son groupe d’alertes), muted_too_long (mise en sourdine indéfiniment ou pendant plus de muted_days ; muted_since correspond à la dernière mise à jour de la règle et mute_until est omis pour une mise en sourdine indéfinie).

Renvoie un JSON compact {scope, generated_at, complete, summary, counts, groups}. groups contient une entrée {kind, count, gaps, omitted} par type présent, avec au plus 10 écarts par type (omitted indique le nombre restant ; réduisez la portée pour les voir) ; chaque écart contient suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel ou patch_alert) et suggested_args, qui ne contient que les entrées acceptées par cet outil (patch_alert : entity_id, id et is_disabled=false ou mute_until=0 ; attach_notification_channel : alert_group_id et un breach/threat severity ; create_alert : entity_id ; create_alert_from_chart : service_name) ; les éléments propres à l’écart, entity_id, rule_id et signal, sont indiqués à côté. N’appelez l’outil suggéré que s’il est disponible dans la session et que l’utilisateur le confirme. complete vaut true uniquement si l’API ne répertorie aucun écart, si chaque décompte est égal à 0 et si au moins un groupe d’alertes correspond à la portée (libellés exacts service_name / env, vérifiés par rapport à la liste de get_alert_groups) ; une portée ne correspondant à aucun groupe, une recherche ayant échoué ou des décomptes sans écarts répertoriés ne constituent pas un résultat complet, et summary en indique la raison.

get_alert_config

  • search_term (string, optional) : Recherche en texte libre dans le nom, le groupe, la source de données et les tags.
  • rule_name (string, optional)
  • severity (string, optional)
  • rule_type (string, optional) : static ou anomaly.
  • alert_group_name / alert_group_type / data_source_name (string, optional)
  • tags (array, optional) : Tous doivent correspondre (logique AND).

Chaque règle répertorie Recent Evaluations : 5 échantillons d’une minute, du plus récent au plus ancien, chacun étiqueté avec la minute UTC à laquelle il se termine ; le plus récent se termine 1 à 2 minutes avant l’appel, car le moniteur renseigne la dernière minute avec un léger retard. firing ; ok = le moniteur a indiqué que la règle ne se déclenchait pas (état normal, résolu, en attente ou vide, selon is_firing=0 dans get_alert_rule_state) ; unknown = aucune ligne du moniteur pour la règle (pas encore évaluée, ou recherche de cette minute ayant échoué, comme indiqué en haut de la réponse), ou une ligne dont l’état n’est ni firing, normal, resolved, pending ni empty (par exemple no_data, silenced). Les règles désactivées n’en affichent aucune. Lorsque plus de 25 règles activées correspondent, l’historique est omis pour toutes et la réponse le précise.

get_entity_kpis

En lecture seule ; dans les ensembles d’outils alerts et investigate. Répertorie tous les KPI d’un groupe d’alertes, y compris ceux qu’aucune règle d’alerte n’utilise encore. Utilisez les identifiants renvoyés dans expression_args / indicators_used ; n’en inventez jamais.

  • entity_id (string, required) : UUID du groupe d’alertes/de l’entité, obtenu avec get_alert_groups ou get_alert_config.

Renvoie le JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]}, trié par nom. unit est un libellé d’affichage : les seuils sont comparés à la valeur brute de la requête. Si aucun KPI ne convient, créez-en un avec create_kpi. Le résultat d’un groupe vide ne nomme create_kpi que si la session le propose ; avec --read-only (sauf --allow-write-tools=create_kpi) ou l’ensemble d’outils investigate, il indique que la création de KPI nécessite une session alerts avec droits d’écriture.

create_kpi

Crée un KPI dans un groupe d’alertes existant ; réservé à l’ensemble d’outils alerts. À utiliser uniquement si get_entity_kpis ne contient aucun KPI avec la requête nécessaire. Vérifiez d’abord que la requête renvoie des données avec prometheus_range_query : l’API rejette uniquement les requêtes qui ne sont pas analysables et enregistre une requête valide même si la métrique n’existe pas.

  • entity_id (string, required) : UUID du groupe d’alertes/de l’entité.
  • name (string, required) : Unique au sein du groupe d’alertes ; une seconde création avec le même nom est rejetée comme conflit.
  • query (string, required) : PromQL. Pour déclencher une alerte sur un panneau de tableau de bord, récupérez la PromQL du panneau dans get_dashboard.
  • unit (string, required) : Unité de la valeur brute de la requête, par exemple seconds, ms, percent, ratio, count, req/s. Il s’agit uniquement d’un libellé, sans conversion ; les seuils sont donc comparés à la valeur brute.
  • description (string, optional)
  • data_source_id (string, optional) : Par défaut, la source de données du groupe d’alertes.

Aucun outil MCP ne supprime ni ne modifie un KPI (utilisez l’interface Last9) ; confirmez donc le nom, la requête et l’unité avant la création. Créez-le une seule fois et conservez l’identifiant renvoyé pour expression_args / indicators_used ; en cas de conflit de nom, réutilisez l’identifiant du KPI existant obtenu avec get_entity_kpis. En cas de délai d’attente dépassé ou d’erreur de connexion, la création a peut-être été appliquée ou non : vérifiez par nom avec get_entity_kpis avant de réessayer. Renvoie {"id","name","query","unit"}.

get_alerts

  • time_iso (string, optional) : Heure d’évaluation au format RFC3339.
  • window (integer, optional) : Période rétrospective en secondes. Par défaut : 900. Plage : 60–86400.
  • lookback_minutes (integer, optional) : Plage : 1–1440.

get_alert_rule_state

  • start_time (integer or string, required) : Début de la plage (inclus) : secondes Unix depuis l’époque (1718000000) ou RFC3339 (2024-06-10T06:13:20Z). Les millisecondes, microsecondes et nanosecondes depuis l’époque sont converties en secondes ; les valeurs antérieures au 2000-01-01 sont rejetées.
  • end_time (integer or string, required) : Fin de la plage (incluse), dans les mêmes formats.
  • step (integer, required) : Résolution en secondes entre les échantillons. Le nombre d’échantillons ((end_time - start_time) / step + 1) est plafonné à 100. Chaque échantillon correspond à un appel en amont couvrant les min(step, 3600) secondes se terminant à son horodatage ; les échantillons sont récupérés par groupes de 5 et l’outil renvoie une erreur avec des instructions de nouvelle tentative si leur récupération prend plus de 60 s.
  • alert_group_id (string, optional) : Filtrer par ID de groupe d’alertes.
  • rule_name (string, optional) : Filtre regex sur le nom de la règle.
  • alert_group_name (string, optional) : Filtre regex sur le nom du groupe d’alertes.
  • label_filters (string, optional) : Filtres d’étiquettes key=value séparés par des virgules.
  • state (string, optional) : Filtrer par état (par exemple firing).

Renvoie une map JSON de rule_id -> [{timestamp, is_firing}]. Un horodatage auquel une règle est absente de la réponse en amont est signalé par is_firing=0 — cela signifie « non observée en état firing », et non un état normal confirmé.

get_alert_hygiene

Audit en lecture seule des règles d’alerte activées. Il ne modifie rien : chaque correction suggérée est une proposition, appliquée uniquement après confirmation explicite de l’utilisateur, via update_alert (ajustement), patch_alert (is_disabled), delete_alert ou attach_notification_channel lorsque ces outils sont disponibles.

  • window (string, optional) : 7d ou 30d. Par défaut : 7d.
  • limit (integer, optional) : Nombre maximal de règles signalées à renvoyer, des plus problématiques aux moins problématiques. Par défaut : 20. Plage : 1–100.

La fenêtre se termine maintenant. Catégories (une règle peut en relever plusieurs) : noisy (≥ 5 déclenchements/jour avec < 20% acked; with an unavailable ack_rate it is judged on fire rate alone and the reason says so; mute time is not reported), flapping (> 4 oscillations/jour), stale (dernier déclenchement antérieur à la fenêtre, sans déclenchement pendant celle-ci, ou règle configurée et activée sans épisode dans la fenêtre alors que le cycle de vie coverage est complet et que la liste de l’API n’est pas tronquée), unrouted (aucun déclenchement pendant la fenêtre n’a atteint un canal et aucun canal n’est actuellement associé au groupe d’alertes ; si les associations ne peuvent pas être lues, la règle est plutôt comptabilisée sous unavailable.routed). Chaque statistique est {status, count|value, reason} ou null : une valeur indisponible n’est jamais interprétée comme zéro et ne désactive que la vérification qui en dépend ; unavailable compte les règles activées pour chaque valeur manquante (fire_count, flap_count, ack_rate, routed, rule_config pour les règles absentes de la liste des règles d’alerte, dont les corrections ne comportent alors aucune valeur actuelle, et activity pour les règles configurées sans épisode dont l’historique ne peut pas prouver le silence et qui ne sont donc pas évaluées). coverage indique la durée de couverture de l’historique des alertes dans la fenêtre ; les taux utilisent la période couverte, d’au moins un jour. upstream_truncated vaut true lorsque l’API n’a renvoyé que ses 200 règles les plus bruyantes ; les règles moins bruyantes n’ont donc pas été évaluées. Corrections établies à partir de la configuration de chaque règle dans la liste des règles d’alerte : augmenter bad_minutes (le N dans count_true(result) >= N) ou allonger eval_window (60 minutes maximum) ; pour les seuils statiques bruyants, déplacer le seuil dans condition (expr > 100) ou remplacer l’expression par adaptive_std_cmp(metric, sensitivity, window) ; associer un canal de notification ; désactiver ou supprimer les règles obsolètes.

Renvoie le JSON compact {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules}, dimensionné pour une cible de 32 KB : truncated vaut true lorsque le nombre de règles signalées dépasse limit ou cette cible, et omitted_for_size compte les règles supprimées de limit pour respecter la taille (la règle la plus problématique est toujours conservée ; si une seule règle dépasse 32 KB, elle est renvoyée seule et dépasse la cible) ; chaque règle contient findings (category, reason, suggested_fix, alternative_fix facultatif) et le stats brut.

get_notification_channels

  • scope (string, optional) : attached (par défaut) renvoie une ligne par association à un groupe d’alertes ; le id est un identifiant d’association, utilisé par detach_notification_channel. channels renvoie les canaux de l’organisation (id, name, type, send_resolved, created_via) ; le id est un identifiant de canal, utilisé par attach_notification_channel. Les destinations, en-têtes et certificats ne sont jamais renvoyés.

Renvoie les canaux de notification configurés (Slack, PagerDuty, e-mail, webhooks, etc.) sous forme de tableau TSV. Les lignes d’association (service_fqid défini) indiquent global false et services - ; services répertorie uniquement les anciennes liaisons de service. Pour les lignes d’association, send_resolved correspond à la valeur par défaut enregistrée sur la ligne, et non à celle utilisée pour l’envoi ; la résolution des notifications suit le propre paramètre send_resolved du canal (scope=channels). Les deux portées incluent created_via (last9-mcp pour les lignes créées par un agent MCP, sinon -).

recommend_alert_config

En lecture seule. Renvoie des recommandations sur le cycle de vie, les critères de validation et les exigences relatives au contexte des intervenants ; ces recommandations ne constituent pas des preuves à elles seules, il faut donc étayer les seuils à l’aide des outils de télémétrie.

  • signal (string, required) : Métrique ou signal d’impact utilisateur, avec unité et dimensions.
  • objective (string, required) : Symptôme ou impact utilisateur à détecter.
  • rule_type (string, optional) : static (par défaut) ou anomaly.
  • severity (string, optional) : breach (par défaut) ou threat.
  • environment (string, optional) : Environnement et profil de trafic.

validate_alert_expression

Exécute une expression à blanc sans l’enregistrer. À utiliser avant create_alert / update_alert.

  • entity_id (string, required) : UUID du groupe d’alertes/de l’entité.
  • expression (string, required) : Opération arithmétique sur des indicateurs désignés par le nom exact de leur KPI, par exemple errors / requests. Trois indicateurs maximum. Écrivez tels quels les noms contenant des espaces, des points ou des tirets (Test Alert / errors), exactement comme create_alert les enregistre.
  • indicators_used (object, required, non-empty) : Association entre le nom de l’indicateur et l’UUID du KPI appartenant à entity_id ; répertoriez les identifiants et noms des KPI du groupe avec get_entity_kpis. Utilisez le nom exact de chaque KPI : cet essai à blanc accepte n’importe quel nom, mais create_alert et update_alert rejettent les clés expression_args qui ne correspondent pas au nom du KPI associé. Seule l’expression arithmétique est vérifiée (transmettez l’expression métrique interne, pas un wrapper adaptive_std_cmp(...)) ; condition / alert_condition ne le sont pas. La vérification d’au moins une série temporelle n’est exécutée que si plusieurs indicateurs sont utilisés.

Renvoie {"valid":true} ou {"valid":false,"reason":"..."} ; une expression invalide est un résultat normal, pas une erreur d’outil.

describe_alert_chart

Lecture seule. Répertorie les signaux pouvant déclencher des alertes (key, unit, eval_query, query_kind) sur un graphique Discover pris en charge. Les jetons de rôle Viewer sont rejetés.

  • surface (string, obligatoire) : discover-service ou discover-exceptions ; toute autre surface, y compris les tableaux de bord personnalisés, est rejetée avant l’appel de l’API (utilisez create_alert avec un KPI à la place).
  • chart_key (string, obligatoire) : par ex. apdex, error_rate, response_time, exception_count.
  • service_name (string, obligatoire)
  • env (string, facultatif)
  • attributes (object, facultatif) : Dimensions d’identité supplémentaires, utilisant les noms de clés indiqués par cet outil.

create_alert

Crée une règle dans un groupe d’alertes existant, toujours désactivée (un brouillon, même si is_disabled=false est transmis). Appelez d’abord recommend_alert_config, puis activez-la avec patch_alert is_disabled=false uniquement après confirmation de l’utilisateur. Ne la créez qu’une fois et conservez l’ID de règle renvoyé. Un rule_name déjà utilisé par le groupe d’alertes (sans distinction de casse) est refusé sans rien créer ; l’ID de la règle existante est indiqué.

  • entity_id (string, obligatoire) : UUID du groupe d’alertes/de l’entité.
  • alert_rule (object, obligatoire) : Corps de règle typé complet, comprenant primary_indicator et expression_args associés à de vrais KPI de l’entité. Chaque clé expression_args doit correspondre au nom exact du KPI auquel elle est associée (pas à un espace réservé tel que x), et primary_indicator et expression utilisent ces noms. Les règles statiques nécessitent condition, alert_condition et eval_window (0–60 minutes). Les règles adaptatives utilisent expression = adaptive_std_cmp(<primary_indicator>, sensitivity, window) ; les trois champs sont alors facultatifs (valeurs par défaut expr > 0, count_true(result) >= 1, 1). algorithm ne peut pas être défini. Le contexte du responsable se place dans properties (description, runbook, annotations, query_mode).

Le routage des notifications est configuré sur le groupe d’alertes, et non sur la règle.

create_alert_from_chart

Crée une règle à seuil statique à partir d’un graphique décrit par describe_alert_chart. Comme pour create_alert, la règle est créée désactivée, sous forme de brouillon, et ne se déclenche pas ; activez-la avec patch_alert is_disabled=false uniquement après confirmation de l’utilisateur. L’API du graphique crée les règles activées ; l’outil désactive donc la règle juste après sa création. En cas d’échec, le résultat est une erreur indiquant l’ID de la règle, qui peut être active.

  • surface / chart_key / service_name / signal_key / name (string, obligatoire)
  • env (string, facultatif)
  • attributes (object, facultatif)
  • threshold (number, facultatif) : Dans l’unité du signal ; doit être supérieur ou égal à 0. Les signaux exprimés en score, comme apdex, nécessitent une valeur explicite.
  • threshold_operator (string, facultatif) : > (par défaut), <, >=, <=, ==, !=.
  • eval_window (integer, facultatif) : Minutes, de 1 à 60. Valeur par défaut : 5.
  • bad_minutes (integer, facultatif) : de 1 à eval_window. Valeur par défaut : 3.
  • severity (string, facultatif) : breach ou threat.
  • description (string, facultatif)
  • group_id (string, facultatif) : À omettre normalement.

update_alert

Remplacement complet de la configuration d’évaluation d’une règle. Récupérez d’abord la règle avec get_alert_config ou get_entity_alert_rules. Refuse toute modification si la règle n’existe pas ou appartient à un autre groupe d’alertes. La règle peut être supprimée de manière réversible puis recréée ; utilisez ensuite l’ID de remplacement renvoyé.

  • entity_id (string, obligatoire)
  • id (string, obligatoire) : UUID de la règle d’alerte.
  • alert_rule (object, obligatoire) : Configuration complète ; même structure que create_alert.

patch_alert

Modification partielle qui conserve l’ID de la règle. Au moins une modification est requise. Refuse toute modification si la règle n’existe pas ou appartient à un autre groupe d’alertes.

  • entity_id (string, obligatoire)
  • id (string, obligatoire) : UUID de la règle d’alerte.
  • is_disabled (boolean, facultatif) : false active la règle, true la met en pause.
  • mute_until (integer, facultatif) : Échéance en temps Unix ; 0 réactive les alertes.
  • properties (object, facultatif) : description, runbook, annotations, query_mode. Chaque champ transmis remplace la valeur enregistrée ; les champs omis ou vides conservent leur valeur enregistrée. annotations remplace toute la map ; transmettez donc toutes les clés à conserver ; {} l’efface.
  • recurring_mute_schedule (object, facultatif) : Remplace le calendrier hebdomadaire : enabled (false par défaut), timezone (nom IANA, obligatoire) et windows (1–20 de weekdays au format sun..sat, start_time / end_time au format HH:MM sur 24 heures). Une heure de fin antérieure ou égale à l’heure de début correspond au lendemain. Transmettez toutes les plages à conserver.
  • clear_recurring_mute_schedule (boolean, facultatif) : Supprime entièrement le calendrier ; ne peut pas être combiné avec recurring_mute_schedule. Diffère de enabled=false, qui conserve les plages enregistrées.

Les utilisateurs ayant le rôle Viewer ne peuvent modifier que mute_until. Les modifications de mise en sourdine au niveau d’une règle sont rejetées lorsque le groupe ou l’entité est en sourdine. Relisez les modifications avec get_entity_alert_rules, qui affiche mute_until, recurring_mute_schedule et properties.

delete_alert

Supprime définitivement une règle. Vérifiez avec get_alert_config et obtenez d’abord la confirmation explicite de l’utilisateur. Refuse toute suppression si la règle n’existe pas ou appartient à un autre groupe d’alertes.

  • entity_id (string, obligatoire)
  • id (string, obligatoire) : UUID de la règle d’alerte.

mute_alert_group

Met en sourdine toutes les règles actuelles et futures d’un groupe ; pour mettre une seule règle en sourdine, utilisez patch_alert avec mute_until. Nécessite un accès éditeur.

  • entity_id (string, obligatoire) : UUID du groupe d’alertes/de l’entité.
  • until (integer, obligatoire) : Horodatage Unix en secondes auquel la mise en sourdine prend fin. 0 réactive les alertes ; une valeur négative telle que -1 les met en sourdine indéfiniment.

acknowledge_alert

Prend en charge une alerte en cours ou libère cette prise en charge. Ne résout pas l’alerte et ne la met pas en sourdine. Accuser réception d’une alerte dont vous êtes déjà responsable ne fait rien, sans risque. ack refuse sans rien enregistrer, sauf si get_alerts répertorie cette alerte exacte (les trois ID) au cours de la dernière heure.

  • alert_group_id / rule_id / rule_type (string, obligatoire) : À copier depuis l’alerte dans get_alerts.
  • action (string, facultatif) : ack (par défaut) ou unack. Seul le responsable ou un administrateur de l’organisation peut annuler la prise en charge.
  • mute_until (integer, facultatif) : ack uniquement. Enregistre une mise en sourdine que vous avez déjà appliquée avec mute_alert_group ou patch_alert ; ne met rien en sourdine.

reassign_alert

Transfère une alerte déjà attribuée à un autre utilisateur ; accusez-en d’abord réception si elle n’a pas de responsable. Si rien n’est réattribué parce que l’alerte n’a pas de responsable, indique si get_alerts répertorie cette alerte au cours de la dernière heure. Last9 ne notifie pas le nouveau responsable.

  • alert_group_id / rule_id / rule_type (string, obligatoire) : À copier depuis l’alerte dans get_alerts.
  • owner_email (string, facultatif) : À privilégier ; correspondance insensible à la casse parmi les utilisateurs actifs de l’organisation.
  • owner_user_id (string, facultatif) : Fournissez exactement l’un de owner_email ou owner_user_id.

create_notification_channel

Crée un canal ; il n’achemine aucune notification tant qu’il n’est pas associé avec attach_notification_channel. Ne le créez qu’une fois et conservez son ID ; aucun outil de mise à jour n’est disponible. Renvoie uniquement id, name, type et send_resolved.

  • name (string, obligatoire) : Unique pour chaque type ; sans deux-points.
  • type (string, obligatoire) : slack, pagerduty, opsgenie, email ou generic_webhook.
  • destination (string, obligatoire) : URL de webhook entrant Slack (ou ID de canal avec slack_app_mode), clé de routage PagerDuty, clé API Opsgenie, adresses e-mail professionnelles séparées par des virgules, quel que soit le domaine et pas uniquement celui de l’organisation (l’API rejette les adresses de fournisseurs personnels tels que Gmail ; une organisation utilisant une connexion personnelle n’accepte que l’adresse de son administrateur), ou URL de webhook HTTPS.
  • slack_app_mode (boolean, facultatif) : Slack uniquement. Valeur par défaut : false.
  • mention_handles (string, facultatif) : Séparés par des virgules, par ex. user|U123ABC|name, special|here, special|channel.
  • webhook_headers (object, facultatif) : generic_webhook uniquement.
  • webhook_ca_certificate (string, facultatif) : generic_webhook uniquement ; un certificat d’autorité PEM de 64 KiB maximum.
  • send_resolved (boolean, facultatif) : Valeur par défaut : true.

attach_notification_channel

Achemine un canal existant vers un groupe d’alertes. Opération idempotente. Les associations copient les paramètres de livraison du canal (en-têtes, certificat, mentions) au moment de l’association ; si les paramètres du canal changent par la suite, associez-le à nouveau.

  • channel_id (integer, obligatoire) : ID de canal (get_notification_channels avec scope=channels), et non ID d’association.
  • alert_group_id (string, obligatoire) : Depuis get_alert_groups.
  • severity (string, obligatoire) : breach, threat ou both. both crée deux associations ; si la seconde échoue, la première reste active et l’erreur indique la gravité à réessayer.

detach_notification_channel

Supprime une association. Nécessite un jeton avec portée de suppression ; un jeton avec portée d’écriture ne permet pas de supprimer une association.

  • attachment_id (integer, obligatoire) : Le id de get_notification_channels avec scope=attached. Les ID de canal sont refusés.
  • alert_group_id (string, facultatif) : Refuse l’opération si l’association appartient à un autre groupe.

delete_notification_channel

Supprime définitivement un canal sans association ; supprimez d’abord ses associations. Nécessite un jeton avec portée de suppression. Confirme la suppression en répertoriant à nouveau les canaux.

  • channel_id (integer, obligatoire) : Le id de get_notification_channels avec scope=channels. Les ID d’association sont refusés.

did_you_mean

  • query (string, obligatoire) : Nom à rechercher — partiel, mal orthographié ou abrégé.
  • type (string, facultatif) : Limiter au type d’entité : service, environment, host, database, k8s_deployment, k8s_namespace, job.

Renvoie jusqu’à 3 correspondances les plus proches avec leurs scores de similarité. Utilisez cet outil avant tout appel d’outil lorsque le nom de l’entité est incertain. Si un appel précédent n’a renvoyé aucun résultat, essayez cet outil avant de réessayer.

get_service_profile

  • service_name (string, obligatoire) : Service pour lequel dériver un profil de télémétrie.
  • datasource (string, facultatif) : Nom de la source de données. Omettez-le pour utiliser la valeur par défaut ; un nom approximatif est résolu comme pour les outils Prometheus. Renvoie un bref compte rendu d’investigation, suivi du profil complet au format JSON brut : présence des signaux (logs/traces/metrics sous la forme present, absent ou unknown), langage et environnement d’exécution, environnements de déploiement, signal_shape des journaux (log_format, severity_set, level_field, trace_context_in_logs), ainsi qu’une correction d’ingestion recommandée, le cas échéant. Lorsque le backend signale freshness, le compte rendu ajoute une ligne last seen avec freshness.logs.last_seen et freshness.traces.last_seen (RFC3339, ou none si la valeur est nulle), ainsi qu’un avertissement traces stale lorsque freshness.traces_stale vaut true : les spans se sont arrêtés alors que les journaux continuaient ; recherchez donc une régression autour de freshness.traces.last_seen, et non un problème de configuration manquante. Dérivé en amont et mis en cache avec un TTL d’environ 15 minutes.

Appelez cet outil avant toute investigation portant sur un service afin que la sélection des outils corresponde à la télémétrie réelle du service — ignorez les outils de traces lorsque traces vaut absent, et lorsque severity_set vaut none ou partial, analysez la sévérité à partir de level_field dans le corps du journal plutôt que d’utiliser severity_filters. metrics vaut toujours unknown et dependencies n’est pas renseigné dans la v1. Lorsque logs et traces valent tous deux absent, confirmez le nom avec did_you_mean avant de conclure que le service n’est pas surveillé.

list_dashboards

  • name (string, facultatif) : sous-chaîne du nom du tableau de bord, sans distinction entre majuscules et minuscules. Réduit la liste et total.
  • limit (integer, facultatif) : nombre de tableaux de bord par page, de 1 à 200. Valeur par défaut : 100.
  • cursor (string, facultatif) : next_cursor de la page précédente ; transmettez avec lui le même name.

Renvoie {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"}, du plus récemment mis à jour au plus ancien. created_by est omis s’il est vide ; locked est omis si l’API ne renvoie pas readonly. updated_at correspond aux secondes depuis l’époque Unix, sous forme de chaîne. Une page peut se terminer plus tôt pour rester sous 32 KB ; next_cursor est absent sur la dernière page.

get_dashboard

  • id (string, obligatoire) : UUID du tableau de bord.
  • region (string, facultatif) : région utilisée pour renseigner les requêtes des panneaux. Par défaut, la région de la source de données configurée.

Le résultat ajoute les champs de premier niveau locked (false si l’API ne le fournit pas) et created_by (identifiant utilisateur de l’auteur).

Pour créer une alerte sur un panneau, consultez last9://reference/alerting.

validate_dashboard

Lecture seule. Ne crée ni ne met jamais à jour de tableaux de bord. Accepte exactement l’un de dashboard_id ou dashboard_definition.

  • dashboard_id (string, facultatif) : UUID du tableau de bord enregistré à valider.
  • dashboard_definition (object, facultatif) : corps d’un tableau de bord intégré non enregistré (simulation réelle). Une enveloppe de création {dashboard, metadata} est déballée pour obtenir son objet dashboard.
  • start_time_iso / end_time_iso (string, facultatif) : fenêtre de validation (RFC3339). Doit être ≤ 24h.
  • region (string, facultatif) : région utilisée pour l’exécution des requêtes des panneaux.

Renvoie dashboard_validation/v1 : classification de lint et d’exécution par panneau (data / no_data / invalid / error). Les résultats vides du premier jour sont classés comme valid_no_data, sans sondes de diagnostic. Un tableau de bord sans panneau renvoie success: false avec error: "no_panels". Les champs de panneau provenant d’autres formats (Grafana gridPos, title, type, et targets pour les panneaux nécessitant des requêtes), ainsi que les champs mal typés, sont répertoriés par panneau dans shape_problems, comptabilisés dans summary.panels_invalid_shape et font passer overall à fail.

preview_dashboard

Aperçu côté client en lecture seule. Transmettez soit dashboard (l’objet de tableau de bord non enregistré d’une requête de création), soit id avec ops (les mêmes opérations ordonnées que patch_dashboard). Les champs obligatoires start_time_iso et end_time_iso sont des horodatages RFC3339 couvrant au maximum 24 heures. variables facultatif contient des substitutions scalaires ; sinon, les valeurs du tableau de bord et les valeurs par défaut intégrées s’appliquent.

{
  "id": "dashboard-id",
  "ops": [{"op": "update_panel", "panel_id": "panel-id", "fields": {"name": "Request latency"}}],
  "start_time_iso": "2026-10-01T08:00:00Z",
  "end_time_iso": "2026-10-01T09:00:00Z"
}

Renvoie saved: false, un résumé de définition/requête validation (y compris definition_error en cas d’incompatibilité avec le schéma de création), et panels avec l’état ok / empty / error, les requêtes résolues et les diagnostics des cibles. PromQL et LogJSON sont exécutés ; les types de requête non pris en charge et les variables non résolues font passer le panneau en erreur. Les panneaux valides sans requête sont ok ; les définitions de panneau non valides sont error. Le correctif diff inclut les panels_added nets, les panels_changed (y compris les déplacements) et les panels_removed, ainsi que les modifications ordonnées des opérations. Les identifiants et les indices de base zéro désignent les panneaux ; les indices supprimés se rapportent au tableau de bord d’origine. Les panneaux enregistrés doivent avoir des identifiants distincts et non vides.

Limites : 50 panneaux, 100 requêtes, 100 opérations, 65536 octets JSON pour chacune des entrées et du tableau de bord candidat, et un délai d’exécution de 60 secondes. Les requêtes résolues dépassant 65536 octets JSON sont rejetées avant exécution. Les éléments de preuve conservent au maximum trois échantillons et 1024 octets JSON par cible, avec truncated: true lorsque des échantillons sont omis. Un rapport JSON dépassant 262144 octets échoue et indique comment réduire l’entrée.

Aucun tableau de bord n’est créé ni mis à jour. Cette vérification compare le candidat au schéma de création et exécute les requêtes à l’aide du validateur existant ; elle ne garantit pas l’acceptation par le backend ni le rendu. Les identifiants attribués par le backend, les valeurs par défaut, les champs supprimés ou les modifications simultanées peuvent modifier le résultat enregistré. L’aperçu utilise les mêmes opérations de correctif locales et les mêmes valeurs par défaut de version de panneau qu’une écriture.

create_dashboard

Création uniquement. Une fois que cet appel renvoie dashboard.id, modifiez les panneaux avec patch_dashboard (ou réorganisez-les avec update_dashboard) — ne relancez pas la création pour ajouter, réduire ou corriger des panneaux.

  • dashboard (object, obligatoire) : définition du tableau de bord avec name et panels[]. Chaque panneau nécessite name, version, layout (x, y, w, h), visualization.type et queries[].
  • metadata (object, facultatif) : métadonnées du tableau de bord — champs _category et _type (par exemple, {"_category":"custom","_type":"metrics"}).

update_dashboard

À utiliser uniquement pour réorganiser la majeure partie d’un tableau de bord ; pour ajouter, modifier, supprimer ou déplacer des panneaux individuels, utilisez patch_dashboard. Remplacement complet par identifiant (même corps que pour la création) : chaque panneau doit être renvoyé à l’identique.

  • id (string, obligatoire) : UUID du tableau de bord à mettre à jour.
  • dashboard (object, obligatoire) : corps complet du tableau de bord de remplacement (même structure que pour la création).
  • metadata (object, facultatif) : métadonnées de remplacement. Les tableaux de bord système en lecture seule renvoient une erreur d’outil récupérable.

patch_dashboard

Préférez cet outil à update_dashboard pour les petites modifications : les panneaux inchangés ne sont jamais renvoyés. Il lit le tableau de bord, applique ops dans l’ordre, puis l’enregistre ; toute modification effectuée ailleurs entre la lecture et l’écriture est donc écrasée. Renvoie {dashboard_id, changes[]} ; les opérations déjà satisfaites par le tableau de bord sont ignorées et, si aucune ne le modifie, rien n’est écrit. Le diff est vérifié par une nouvelle lecture après l’écriture : les fields des panneaux affichent les valeurs enregistrées, not_stored répertorie les clés supprimées par l’API et not_removed les clés conservées malgré un null. Les valeurs du diff dépassant 200 caractères sont raccourcies sur place, tout en conservant leur type JSON.

  • id (string, obligatoire) : UUID du tableau de bord à modifier.
  • ops (array, obligatoire) : opérations appliquées dans l’ordre ; si l’une d’elles est invalide, rien n’est écrit et l’erreur la désigne comme ops[i].
    • add_panel : panel (objet de panneau complet ; version vaut 1 par défaut), index facultatif (position d’insertion de base zéro, ajout en fin par défaut).
    • update_panel : panel_id, fields (clés de panneau de premier niveau à remplacer ; null supprime une clé ; id ne peut pas être modifié).
    • remove_panel : panel_id.
    • move_panel : panel_id, index (position de base zéro après le déplacement).
    • set_title : title (nom du tableau de bord).
    • set_variable : variable ; remplace la variable portant le même target, sinon l’ajoute.

delete_dashboard

  • id (string, obligatoire) : UUID du tableau de bord à supprimer. Les tableaux de bord système en lecture seule ne peuvent pas être supprimés.

set_dashboard_lock

  • id (string, obligatoire) : UUID du tableau de bord.
  • locked (boolean, obligatoire) : true verrouille le tableau de bord, false le déverrouille.

Outil d’écriture ; appelez-le uniquement si l’utilisateur le demande explicitement. Seul l’auteur du tableau de bord ou un administrateur de l’organisation peut le verrouiller ou le déverrouiller, et les tableaux de bord intégrés sont toujours en lecture seule. Renvoie {"id", "locked"} avec l’état obtenu. Tant que le tableau de bord est verrouillé, update_dashboard, patch_dashboard et delete_dashboard n’effectuent aucune écriture et renvoient une erreur d’outil récupérable commençant par dashboard is locked, qui indique le nom de l’auteur et suggère de déverrouiller le tableau de bord ou d’en faire une copie avec create_dashboard.

list_dashboard_snapshots

  • dashboard_id (string, obligatoire) : UUID du tableau de bord dont les instantanés doivent être répertoriés.

Renvoie uniquement les métadonnées (id, name, expires_at, etc.). Utilisez get_dashboard_snapshot pour les données figées des panneaux.

get_dashboard_snapshot

  • id (string, obligatoire) : UUID de l’instantané.

Renvoie l’instantané figé complet, y compris dashboard_definition, panel_data, time_range et variables.

delete_dashboard_snapshot

  • id (string, obligatoire) : UUID de l’instantané à supprimer.

get_profile_services

  • lookback_minutes / start_time_iso / end_time_iso (facultatif) : fenêtre ; privilégiez la période rétrospective ou des bornes ISO explicites (60m par défaut).
  • region (string, facultatif) : remplacement de région.

Renvoie les services disposant de données de profilage dans la fenêtre. Appelez cet outil avant get_flamegraph / get_top_functions / get_profile_summary.

get_flamegraph

  • service (string, obligatoire) : nom du service provenant de get_profile_services.
  • profile_type (string, facultatif) : cpu (par défaut), alloc ou wall. Fixez un type lorsque vous comparez des fenêtres.
  • env / cluster / namespace / runtime (string, facultatif) : filtres de portée.
  • limit (number, facultatif) : nombre maximal de lignes de pile agrégées (1000 par défaut, 10000 au maximum).
  • lookback_minutes / start_time_iso / end_time_iso / region (facultatif).

Renvoie un arbre de flamegraph imbriqué (name / value / self / children). truncated: true indique que la limite de lignes de l’API a été atteinte.

get_top_functions

Mêmes filtres que pour get_flamegraph. Renvoie le classement des fonctions les plus sollicitées selon les échantillons propres. Le résultat peut être tronqué ; vérifiez truncated.

get_profile_summary

Mêmes filtres que pour get_flamegraph. Renvoie un bref triage en langage naturel du profil du service.

grafana_search_dashboards

  • query (string, facultatif) : sous-chaîne du titre. Une valeur vide renvoie une liste étendue (dans la limite de 5,000 lignes).

Renvoie {"dashboards":[…], "truncated":bool} avec uid, title, uri, url, type, tags. Utilisez uid avec grafana_get_dashboard.

grafana_get_dashboard

  • uid (string, obligatoire) : uid du tableau de bord Grafana.
  • full_json (boolean, facultatif) : si la valeur est true, renvoie le JSON Grafana brut au lieu du résumé filtré.

Résumé par défaut : version, tags, variables de templating et type/source de données/gridPos/cibles promQL de chaque panneau. Les types de panneau de plugin inconnus apparaissent dans unsupportedPanelTypes.

grafana_list_folders

Aucun paramètre. Renvoie l’arborescence des dossiers.

grafana_list_folder_dashboards

  • folder_uid (string, obligatoire) : uid du dossier Grafana.

Renvoie {"dashboards":[…], "truncated":bool} pour les tableaux de bord de ce dossier (pagination jusqu’à 5 000).

grafana_list_datasources

Aucun paramètre. Renvoie une projection sécurisée des sources de données (sans champs d’identifiants).


Tests

Exécutez l’analyseur de goroutines de test sans lancer les tests de l’application :

make lint-test

Cela exécute l’analyseur Go testinggoroutine sur tous les packages, y compris leurs fichiers *_test.go, et le vérifie à l’aide de fixtures sûres et non sûres. Les deux workflows de test CI exécutent go vet -testinggoroutine ./... dans une étape distincte, afin que les résultats de tests de packages mis en cache ne puissent pas contourner l’application du lint.

Le package racine exécute également l’analyseur en tant que test. Utilisez go test -count=1 ./... pour lancer toute la suite sans mise en cache de cette vérification : le cache de tests de Go ne tient pas compte des fichiers source internes des packages lus par le sous-processus de l’analyseur. Une commande go test ./... simple peut réutiliser le résultat positif du test racine après la modification de ces fichiers.

Fatal, Fatalf et FailNow sur testing.T ou testing.B doivent s’exécuter dans la goroutine de test parente. Les workers doivent renvoyer les erreurs pour que le parent puisse les vérifier :

errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
    t.Fatal(err)
}

L’analyseur détecte les appels directs dans les closures go func ; il ne s’agit pas d’une vérification interprocédurale générale des assertions masquées derrière des appels à des helpers arbitraires. Les tests d’intégration sont ignorés sauf si TEST_REFRESH_TOKEN est défini.


MseeP.ai Security Assessment Badge