Last9
officielInté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 ?
-
Examiner la santé du service — Demandez un résumé classé de la flotte avec les comptes de requêtes, le débit et les taux d'erreur via
get_service_summary. -
Extraire les journaux bruts du service — Récupérez les lignes de journal filtrées par sévérité ou contenu du corps pour un service spécifique à l'aide de
get_service_logs. -
Tracer les performances de la base de données — Découvrez les bases de données, les requêtes lentes et les modèles de requêtes avec
get_databaseset les outils associés. -
Exécuter des requêtes PromQL — Lancez des requêtes de plage ou instantanées sur n'importe quelle métrique en utilisant
prometheus_range_queryouprometheus_instant_query. -
Corréler les changements avec les incidents — Récupérez les événements de déploiement et de modification de configuration pour comprendre ce qui a altéré le comportement de production via
get_change_events. -
Gérer les tableaux de bord personnalisés — Listez, créez, mettez à jour ou validez des tableaux de bord par programmation avec
list_dashboardsetcreate_dashboard.
Documentation
Serveur MCP Last9

Votre agent IA ne sait pas ce qui est cassé en production. Ceci corrige cela.
Serveur MCP Last9 connecte Claude, Cursor, Windsurf et tout autre assistant IA compatible MCP directement à vos données d'observabilité de 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 le signal réel.
Démarrage en 30 secondes (Hébergé)
Aucun binaire à installer. Aucun jeton à gérer. Une URL, OAuth dans votre navigateur, terminé.
Trouvez votre slug d'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
Tapez /mcp, sélectionnez last9, authentifiez-vous. C'est tout.
Cursor
Paramètres > MCP > Ajouter un nouveau serveur MCP :
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Cliquez sur Connecter, complétez OAuth.
VS Code
Nécessite v1.99+. Ouvrez la Palette de commandes → MCP : Ajouter un serveur, collez l'URL, authentifiez-vous.
Ou directement dans settings.json :
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Paramètres > Cascade > Ouvrir le marché MCP > icône d'engrenage (mcp_config.json) :
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Bureau
Paramètres > Connecteurs > Ajouter un connecteur personnalisé. Nommez-le last9, collez l'URL, authentifiez-vous.
Nécessite un accès administrateur à votre organisation Claude.
Auto-hébergé (STDIO)
Utilisez ceci lorsque votre client MCP ne prend pas en charge le transport HTTP, ou lorsque vous avez besoin que le serveur s'exécute localement.
Installation
Homebrew :
brew install last9/tap/last9-mcp
NPM :
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Versions binaires (Windows / manuel) :
Téléchargez depuis Versions GitHub :
| Plateforme | Archive |
|---|---|
| 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.
- Allez dans Accès API
- Cliquez sur Générer un jeton avec les autorisations d'écriture
- 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 :
| Client | Emplacement |
|---|---|
| Claude Web/Bureau | Paramètres > Développeur > Modifier la configuration (claude_desktop_config.json) |
| Cursor | Paramètres > Paramètres Cursor > MCP > Ajouter un nouveau serveur MCP global |
| Windsurf | Paramètres > Cascade > Marché MCP > icône d'engrenage (mcp_config.json) |
| VS Code | Enveloppez dans { "mcp": { "servers": { ... } } } dans settings.json — détails |
Configuration STDIO 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 téléchargement depuis Versions GitHub, extrayez et pointez vers le chemin complet :
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
La voie NPM est plus simple sur Windows — aucune gestion de chemin.
Variables d'environnement
| Variable | Défaut | Description |
|---|---|---|
LAST9_REFRESH_TOKEN | (requis) | Jeton d'actualisation depuis Accès API |
LAST9_DATASOURCE | défaut de l'org | Nom de la source de données/cluster — utile lorsque vous avez plusieurs clusters Levitate |
LAST9_API_HOST | app.last9.io | Remplacer l'hôte API |
LAST9_TOOLSETS | tous les outils | Ensembles d'outils séparés par des virgules à exposer (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias : LAST9_MCP_TOOLSETS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Nombre maximal d'entrées pour les requêtes get_logs segmentées |
LAST9_USE_LOG_SEARCH_API | false | Dé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 |
LAST9_DEBUG_CHUNKING | false | Définissez true pour journaliser les détails de planification des segments pour get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Dé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) |
Ce qu'il peut faire
Santé des services
get_service_summary— Lignes(service, env)de flotte classées : request_count d'intervalle, throughput_rpm, compteurs HTTP 4xx/5xx et compteurs d'erreurs gRPCget_service_environments— Environnements disponibles pour vos services. Exécutez ceci d'abord — les autres outils APM ont besoin deenvd'iciget_service_performance_details— Répartition complète : débit, taux d'erreur, p50/p90/p95/moyenne/max, apdex, disponibilitéget_service_operations_summary— Opérations groupées par points de terminaison HTTP, appels de base de données, messagerie, clients HTTPget_service_dependency_graph— Carte des dépendances avec débit, latence et taux d'erreur pour amont/aval/infrastructureget_apm_service_deviations— Comparez une fenêtre actuelle à une ligne de base de durée égale : régressions/améliorations, réconciliation Apdex et un résultat terminal (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 ciblent directement les performances de votre base de données, dérivés des spans de trace OpenTelemetry et, lorsque les traces sont absentes, des métriques d'infrastructure telles que CloudWatch. Aucune instrumentation supplémentaire 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écouvre également les bases de données à partir de métriques d'infrastructure telles que CloudWatch, sans instrumentation de trace nécessaire — ces lignes portent une valeur d'activité au lieu de métriques de traceget_database_slow_queries— Les exécutions de requêtes les plus lentes réelles, classées par durée, avec ID de trace pour explorer les traces complètesget_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'erreurget_database_server_metrics— Métriques côté serveur de l'hôte de base de données lui-même (CPU, connexions, taux de succès du tampon — dépend de votre système de base de données)
Prend en charge PostgreSQL, MySQL, MongoDB, Redis, Aerospike et tout ce que OTel trace avec un attribut db_system — plus les bases de données découvertes à partir de métriques d'infrastructure telles que CloudWatch, dont les lignes portent une valeur d'activité au lieu de métriques de trace.
Prometheus / PromQL
prometheus_range_query— Requêtes de plage PromQL sur n'importe quelle métriqueprometheus_instant_query— Requêtes instantanées ; utilisez des fonctions de cumul commeavg_over_time,sum_over_timeprometheus_label_values— Valeurs d'étiquettes pour une série donnéeprometheus_labels— Toutes les étiquettes disponibles pour une série
Pointez-les vers une source de données/cluster différente du défaut en définissant LAST9_DATASOURCE.
Journaux
get_logs— Requêtes complètes de pipeline de journaux JSON (agrégations, filtres, extraction de champs)get_service_logs— Lignes de journal brutes pour un service, filtrables par sévérité et contenu du corpsget_log_attributes— Catalogue global des attributs dans le schéma de journal pour une fenêtre temporelleget_log_attributes_for_pipeline— Champs de journal réellement présents pour un pipeline en cours (découverte ciblée), chacun avec sonfilter_fieldexactget_drop_rules— Règles de suppression de journaux depuis Plan de contrôle Last9add_drop_rule— Créez une nouvelle règle de suppression pour réduire le volume de journaux à la source
Traces
get_traces— Requêtes de pipeline de traces JSON pour des recherches larges et des agrégationsget_service_traces— Traces par ID de trace exact ou nom de service. Utilisez ceci lorsque vous avez un ID de trace — c'est plus rapideget_trace_attributes— Catalogue global des attributs dans le schéma de traceget_trace_attributes_for_pipeline— Attributs réellement présents pour un pipeline en cours (découverte ciblée), chacun avec sonfilter_fieldexactget_trace_attribute_values— Valeurs distinctes pour un attribut de trace, éventuellement limitées à un pipelineget_trace_attribute_deviations— Classe les valeurs d'attributs qui diffèrent entre deux cohortes de spans bornées (lent vs rapide, erreur vs non-erreur, ou deux fenêtres temporelles). Corrélation, pas causalitéget_trace_waterfall— Une trace exacte en cascade parent/enfant avec temps propre d'union d'intervalles, spans les plus lents et avertissements de graphe
Événements de changement et alertes
get_change_events— Déploiements, changements de configuration, retours en arrière. Corrélez les incidents avec ce qui a changéget_alert_groups— Groupes d'alertes Compass configurés avec étiquettes de métadonnées, équipe, niveau et nombres de règles — y compris les groupes sans règles et les groupes qui ne déclenchent pasget_alert_config— Configurations de règles d'alerte — recherchables par nom, sévérité, type, étiquettesget_alerts— Alertes actuellement déclenchées dans une fenêtre temporelleget_alert_rule_state— État de déclenchement historique (1/0) par règle d'alerte sur une plage temporelle, groupé parrule_id. Filtrable par groupe d'alertes, nom de règle, filtres d'étiquettes et état.get_notification_channels— Canaux de notification configurés (Slack, PagerDuty, e-mail, etc.)
Tableaux de bord personnalisés
list_dashboards— Tous les tableaux de bord personnalisés de votre organisation : ID, noms et métadonnéesget_dashboard— Définition complète du tableau de bord par ID, y compris les panneaux et les requêtesvalidate_dashboard— Lint en lecture seule + exécution + classification pour un ID de tableau de bord enregistré ou undashboard_definitionen ligne sur une fenêtre ≤24h. Ne crée ni ne met jamais à jour les tableaux de bordcreate_dashboard— Créez un tableau de bord personnalisé entièrement nouveau une fois (panneaux, requêtes, métadonnées). Une fois l'ID renvoyé, affinez avecupdate_dashboard.update_dashboard— Affinez un tableau de bord existant par ID (remplacement complet ; les tableaux de bord système en lecture seule renvoient une erreur)delete_dashboard— Supprimez un tableau de bord personnalisé par IDlist_dashboard_snapshots— Instantanés figés à un moment précis pour un tableau de bord (métadonnées uniquement)get_dashboard_snapshot— Instantané figé complet incluant les données de panneau pour RCA / vues partageablesdelete_dashboard_snapshot— Supprimez un instantané figé par ID
Profilage continu
Nécessite que le profilage continu soit activé pour l'organisation. Découvrez d'abord les services avec get_profile_services, puis extrayez un flamegraph ou des fonctions classées.
get_profile_services— Services qui ont des données de profilage dans la fenêtre (index avant interrogation)get_flamegraph— Arbre flamegraph imbriqué pour un service (cpupar défaut ; aussialloc,wall)get_top_functions— Classement des auto-échantillons des fonctions les plus actives pour un serviceget_profile_summary— Triage court en langage naturel du profil pour un service
Tableaux de bord Grafana
Outils en lecture seule contre l'instance Grafana de l'organisation (via le proxy Grafana de Last9). Les champs d'identification ne sont jamais renvoyés au modèle. Activez avec LAST9_TOOLSETS=grafana (ou laissez les ensembles d'outils non définis pour tous les outils).
grafana_search_dashboards— Recherche de tableaux de bord par sous-chaîne de titre (paginé ;truncated: truelorsque la limite est atteinte)grafana_get_dashboard— Résumé du tableau de bord par uid (panneaux, variables, cibles PromQL) ;full_json=truepour le JSON Grafana brutgrafana_list_folders— Arborescence des dossiersgrafana_list_folder_dashboards— Tableaux de bord dans un dossier (paginé)grafana_list_datasources— Inventaire des sources de données sans informations d'identification
Résolution floue des noms
did_you_mean— Lorsque l'agent n'est pas sûr d'un nom d'entité, cette fonction 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 scores de similarité. Le serveur appelle automatiquement cette fonction avant la plupart des outils lorsqu'une recherche de nom renvoie un résultat vide.
Profil de service
get_service_profile— À quoi ressemble réellement la télémétrie d'un service, avant de l'interroger : quels signaux existent, langage et runtime, environnements de déploiement, la forme de ses journaux, et une correction d'ingestion recommandée le cas échéant. Permet à l'agent d'ignorer les outils de traces lorsqu'un service n'a pas de traces, et d'analyser la sévérité à partir du corps du journal lorsqueSeverityTextest vide au lieu de filtrer dessus et de ne rien trouver.
Comment ça fonctionne
Liens profonds sur chaque réponse. Chaque outil renvoie un champ deep_link — une URL directe vers le tableau de bord Last9 pour cette requête et cette plage horaire exactes. L'agent peut vous transmettre le lien ; vous cliquez dessus ; vous y êtes.
Ensembles d'outils. 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 passer --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 échouent rapidement. Le pack metrics seul n'inclut pas list_datasources ni did_you_mean — utilisez investigate (ou combinez les ensembles d'outils) lorsque vous avez besoin de ces aides à la 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), pas du texte de description d'outil toujours actif. Les règles de requête critiques restent dans la description de l'outil afin que les agents qui n'appellent jamais resources/read reçoivent quand même des instructions de construction correctes. Découvrez les champs spécifiques à l'organisation avec get_log_attributes / get_log_attributes_for_pipeline (et les équivalents pour les traces) — ils ne sont pas injectés dans les descriptions.
Résultats volumineux fragmentés. get_logs et get_traces gèrent les grands ensembles de résultats par fragmentation plutôt que par troncature. La limite par défaut est de 5000 entrées pour les journaux ; configurable via LAST9_MAX_GET_LOGS_ENTRIES.
Développement
Mode HTTP, tests 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.
Test avec curl
Le gestionnaire HTTP Streamable fonctionne en mode sans état, donc toute requête est servie indépendamment. Une poignée de main initialize et un en-tête Mcp-Session-Id sont facultatifs — les clients qui les envoient fonctionnent toujours (l'en-tête est accepté et ignoré), et les clients peuvent aussi passer directement à tools/list / tools/call. Chaque outil est une requête/réponse indépendante ; le serveur n'émet 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
}
}
}'
Compilation 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 de l'heure et détails
Saisie de l'heure
- Les heures absolues (
start_time_iso/end_time_iso, outime_iso) ont priorité surlookback_minutes. - Pour les fenêtres relatives : utilisez
lookback_minutes. - Pour les fenêtres absolues : utilisez RFC3339/ISO8601 —
2026-02-09T15:04:05Z. - Le
YYYY-MM-DD HH:MM:SShérité est accepté uniquement pour compatibilité.
get_exceptions
limit(entier, facultatif) : Nombre maximal d'exceptions. Défaut : 20.lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif) : Plage horaire 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) : Regex PromQL. Défaut :.*. La correspondance exacte nécessite des ancres (par ex.^prod$).sort_by(chaîne, facultatif) :request_count(défaut),throughput_rpm,http_4xx_count,http_5xx_countougrpc_error_count.limit(entier, facultatif) : Nombre maximal de lignes classées. Omettre ou 0 signifie 10 ; les valeurs supérieures à 100 sont plafonné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 cela renvoie un résultat vide.
get_service_performance_details
service_name(chaîne, obligatoire)lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)env(chaîne, facultatif) : Défaut :prod.
get_service_operations_summary
service_name(chaîne, obligatoire)lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)env(chaîne, facultatif) : Défaut :prod.
get_service_dependency_graph
service_name(chaîne, facultatif)lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)env(chaîne, facultatif) : Défaut :prod.
get_apm_service_deviations
service_name(chaîne, facultatif) : Omettre pour la portée du parc ; fournir pour un service et ses corrélations d'opérations.lookback_minutes(entier, facultatif) : Fenêtre actuelle. Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif) : Fenêtre actuelle explicite.baseline_start_time_iso/baseline_end_time_iso(chaîne, facultatif) : Ligne de base explicite. Défaut : la fenêtre de durée égale immédiatement précédente.datasource(chaîne, facultatif) : Restreindre la comparaison à une seule source de données.env(chaîne, facultatif) : Défaut :prod.max_services/max_operations(entier, facultatif) : Défaut 10, maximum 10 chacun.
get_databases
env(chaîne, facultatif) : Filtrer par environnement. Accepte une expression régulière. Défaut : tous.lookback_minutes(entier, facultatif) : Défaut : 60. La fenêtre ne peut pas dépasser 7 jours.start_time_iso/end_time_iso(chaîne, facultatif)
get_database_slow_queries
db_system(chaîne, facultatif) : par ex.postgresql,mysql,mongodb,redis.host(chaîne, facultatif) : Hôte de la base de données (net_peer_name).service_name(chaîne, facultatif) : Nom du service appelant.env(chaîne, facultatif)min_duration_ms(flottant, facultatif) : Durée minimale de la requête en ms.lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)limit(entier, facultatif) : Défaut : 20.
get_database_queries
db_system(chaîne, facultatif)host(chaîne, facultatif)service_name(chaîne, facultatif)env(chaîne, facultatif)lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)limit(entier, facultatif) : Défaut : 20.
get_database_server_metrics
db_system(chaîne, obligatoire) : par ex.postgresql,mysql,mongodb,redis,aerospike.host(chaîne, facultatif)lookback_minutes(entier, facultatif) : Défaut : 60.start_time_iso/end_time_iso(chaîne, facultatif)
prometheus_range_query
query(chaîne, obligatoire) : La requête PromQL.start_time_iso/end_time_iso(chaîne, facultatif) : Défaut : les 60 dernières minutes.lookback_minutes(flottant, facultatif) : Défaut : 60.
prometheus_instant_query
query(chaîne, obligatoire)time_iso(chaîne, facultatif) : Défaut : maintenant.lookback_minutes(flottant, facultatif)
prometheus_label_values
match_query(chaîne, facultatif) : Filtre PromQL.label(chaîne, obligatoire) : Nom du libellé.start_time_iso/end_time_iso(chaîne, facultatif)
prometheus_labels
match_query(chaîne, facultatif) : Filtre PromQL.start_time_iso/end_time_iso(chaîne, facultatif)
get_logs
logjson_query(tableau, obligatoire) : Requête de pipeline JSON.lookback_minutes(entier, facultatif) : Défaut : 5.start_time_iso/end_time_iso(chaîne, facultatif)limit(entier, facultatif) : Défaut serveur : 5000.index(chaîne, facultatif) :physical_index:<name>ourehydration_index:<block_name>.
Pour l'inventaire des services basé sur les journaux, interrogez d'abord physical_index_service_count :
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
Utilisez service_name comme ServiceName, env comme environnement lorsqu'il est présent, et name comme nom d'index physique. Si name="default", omettez index ; pour un index physique non défini par défaut sélectionné par l'utilisateur, passez index: "physical_index:<name>". Si le backend rejette le filtrage explicite par index physique, réessayez sans index et signalez que le filtrage explicite par index physique n'est pas disponible pour ce backend.
get_service_logs
service_name(chaîne, obligatoire)lookback_minutes(entier, facultatif) : Défaut : 60.limit(entier, facultatif) : Défaut : 20.env(chaîne, facultatif)severity_filters(tableau, facultatif) : par ex.["error", "warn"]. Logique OU.body_filters(tableau, facultatif) : par ex.["timeout", "failed"]. Logique OU.start_time_iso/end_time_iso(chaîne, facultatif)index(chaîne, facultatif)
Plusieurs types de filtres se combinent avec ET. Chaque tableau utilise OU en interne.
Utilisez d'abord get_logs pour des comptes agrégés larges ; utilisez get_service_logs uniquement après avoir réduit à un service/environnement/index et un petit échantillon.
get_log_attributes
lookback_minutes(entier, facultatif) : Défaut : 15.start_time_iso/end_time_iso(chaîne, facultatif)region(chaîne, facultatif)index(chaîne, facultatif)
get_log_attributes_for_pipeline
pipeline(tableau, obligatoire) : Étapes de filtrage antérieures pour limiter la découverte, par ex.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(entier, facultatif) : Défaut : 15.start_time_iso/end_time_iso(chaîne, facultatif)region(chaîne, facultatif)index(chaîne, facultatif)
get_drop_rules
Aucun paramètre. Liste les règles de suppression via GET /otel_settings/drop?region=....
add_drop_rule
name(chaîne, obligatoire)filters(tableau, obligatoire) : Chaque filtre :key,value,operator(equals/not_equals),conjunction(and).- Les clés de filtre doivent utiliser
attributes["key_name"]ouresource.attributes["key_name"](requis par l'API Last9). - Crée la règle via
POST /otel_settings/drop?region=...&cluster_id=....
get_traces
Utilisez pour les recherches larges et les agrégations. Pour une recherche exacte par ID de trace, utilisez get_service_traces.
tracejson_query(tableau, obligatoire)start_time_iso/end_time_iso(chaîne, facultatif)lookback_minutes(entier, facultatif) : Défaut : 60.limit(entier, facultatif) : Défaut : 5000.
get_service_traces
Exactement un de trace_id ou service_name est obligatoire.
trace_id(chaîne, optionnel) : Fenêtre de recherche par défaut : 72 heures.service_name(chaîne, optionnel) : Fenêtre de recherche par défaut : 60 min.lookback_minutes(entier, optionnel)start_time_iso/end_time_iso(chaîne, optionnel)limit(entier, optionnel) : Défaut : 10.env(chaîne, optionnel)
get_trace_attributes
lookback_minutes(entier, optionnel) : Défaut : 15.start_time_iso/end_time_iso(chaîne, optionnel)region(chaîne, optionnel)
get_trace_attributes_for_pipeline
pipeline(tableau, requis) : Étapes de filtre antérieures pour limiter la découverte, p. ex.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(entier, optionnel) : Défaut : 15.start_time_iso/end_time_iso(chaîne, optionnel)region(chaîne, optionnel)
get_trace_attribute_values
tag_name(chaîne, requis) : Nom d'attribut issu deget_trace_attributes(p. ex.resource_departmentouattributes['http.method']).pipeline(tableau, optionnel) : Étapes de filtre antérieures pour limiter les valeurs ; à omettre pour les valeurs globales.lookback_minutes(entier, optionnel) : Défaut : 15.start_time_iso/end_time_iso(chaîne, optionnel) : Bornes historiques RFC3339 ; prioritaires surlookback_minutes.region(chaîne, optionnel)
get_trace_attribute_deviations
comparison_mode(chaîne, requis) :latency,errorsoutime.service_name(chaîne, requis)environment(chaîne, requis) : Valeur exacte dedeployment.environment.operation(chaîne, optionnel)filters(tableau, optionnel) : Conditions de filtre JSON de trace.candidate_attributes(tableau, optionnel) : Maximum 8 ; à omettre pour une découverte bornée.latency_threshold_ms(nombre, optionnel) : Requis pour le modelatency; rejeté pour les autres modes.start_time_iso/end_time_iso(chaîne, optionnel)lookback_minutes(entier, optionnel) : Défaut : 15. Maximum : 15.baseline_start_time_iso/baseline_end_time_iso(chaîne, optionnel) : Requis pour le modetime; non chevauchants et de durée égale à la fenêtre cible.minimum_cohort_size(entier, optionnel) : Défaut : 100. Minimum : 20.minimum_value_support(entier, optionnel) : Défaut : 20. Minimum : 10.limit(entier, optionnel) : Défaut : 10. Maximum : 10.
Nécessite que la capacité backend associée soit activée.
get_trace_waterfall
trace_id(chaîne, requis)environment(chaîne, optionnel)start_time_iso/end_time_iso(chaîne, optionnel)lookback_minutes(entier, optionnel) : Défaut : 4320 (72 heures).selected_span_id(chaîne, optionnel) : Renvoie les attributs, événements et liens pour ce span uniquement.max_spans(entier, optionnel) : Défaut : 500. Maximum : 1000.
Renvoie une enveloppe investigation-evidence/v1 ; la cascade se trouve sous data.
get_change_events
start_time_iso/end_time_iso(chaîne, optionnel)lookback_minutes(entier, optionnel) : Défaut : 60.service_name(chaîne, optionnel)env(chaîne, optionnel)event_name(chaîne, optionnel) : Appeler sans ce paramètre d'abord pour obteniravailable_event_names.
get_alert_groups
Inventaire configuré des groupes d'alertes Compass pour les audits de changeboard / couverture d'étiquettes. Inclut les groupes sans règles et les groupes non déclenchés. Ne renvoie pas de PromQL.
alert_group_name/alert_group_type/data_source_name(chaîne, optionnel) : Correspondance de sous-chaîne insensible à la casse.team/tier(chaîne, optionnel) : Correspondance exacte insensible à la casse sur les métadonnées configurées.label_key+label_value(chaîne, optionnel) : Doivent être définis ensemble. Correspondance exacte insensible à la casse sur une pairemetadata.labels— clé et valeur.
Renvoie un JSON compact {"count":N,"groups":[...]} avec id, name, type, entity_class, team, tier, metadata.labels et les comptes de règles. team / labels vide signifie non défini.
get_alert_config
search_term(chaîne, optionnel) : Recherche en texte libre sur le nom, le groupe, la source de données, les étiquettes.rule_name(chaîne, optionnel)severity(chaîne, optionnel)rule_type(chaîne, optionnel) :staticouanomaly.alert_group_name/alert_group_type/data_source_name(chaîne, optionnel)tags(tableau, optionnel) : Tous doivent correspondre (logique ET).
get_alerts
time_iso(chaîne, optionnel) : Heure d'évaluation au format RFC3339.window(entier, optionnel) : Fenêtre de recherche en secondes. Défaut : 900. Plage : 60–86400.lookback_minutes(entier, optionnel) : Plage : 1–1440.
get_alert_rule_state
start_time(entier, requis) : Début Unix epoch de la plage (inclusif).end_time(entier, requis) : Fin Unix epoch de la plage (inclusif).step(entier, requis) : Résolution en secondes entre les échantillons. Le nombre d'échantillons((end_time - start_time) / step + 1)est plafonné à 100.alert_group_id(chaîne, optionnel) : Filtrer par ID de groupe d'alertes.rule_name(chaîne, optionnel) : Filtre regex sur le nom de la règle.alert_group_name(chaîne, optionnel) : Filtre regex sur le nom du groupe d'alertes.label_filters(chaîne, optionnel) : Filtres d'étiquetteskey=valueséparés par des virgules.state(chaîne, optionnel) : Filtrer par état (p. ex.firing).
Renvoie une carte JSON de rule_id -> [{timestamp, is_firing}]. Un horodatage auquel une règle est absente de la réponse en amont est signalé comme is_firing=0 — cela signifie « non observé comme déclenché », et non un état normal confirmé.
get_notification_channels
Aucun paramètre. Renvoie tous les canaux de notification configurés (Slack, PagerDuty, e-mail, webhooks, etc.).
did_you_mean
query(chaîne, requis) : Le nom à rechercher — partiel, mal orthographié ou abrégé.type(chaîne, optionnel) : Restreindre au type d'entité :service,environment,host,database,k8s_deployment,k8s_namespace,job.
Renvoie jusqu'à 3 correspondances les plus proches avec des scores de similarité. Utilisez ceci avant tout appel d'outil où le nom de l'entité est incertain. Si un appel précédent a renvoyé des résultats vides, essayez ceci avant de réessayer.
get_service_profile
service_name(chaîne, requis) : Service pour lequel dériver un profil de télémétrie.datasource(chaîne, optionnel) : Nom de la source de données. À omettre pour la valeur par défaut.
Renvoie un bref résumé d'investigation suivi du profil complet en JSON brut : présence de signaux (logs/traces/metrics comme present, absent ou unknown), langage et runtime, environnements de déploiement, signal_shape de journaux (log_format, severity_set, level_field) et un correctif d'ingestion recommandé le cas échéant. Dérivé en amont et mis en cache avec un TTL d'environ 15 minutes.
Appelez-le avant toute investigation à l'échelle d'un service afin que la sélection d'outils corresponde à la télémétrie réelle du service — ignorez les outils de trace lorsque traces est absent, et lorsque severity_set est 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 est toujours unknown et dependencies n'est pas renseigné en v1. Lorsque logs et traces sont tous deux absent, confirmez le nom avec did_you_mean avant de conclure que le service n'est pas surveillé.
list_dashboards
Aucun paramètre. Renvoie tous les tableaux de bord personnalisés de l'organisation sous forme de tableau JSON avec id, name et les métadonnées.
get_dashboard
id(chaîne, requis) : UUID du tableau de bord.region(chaîne, optionnel) : Région pour le remplissage des requêtes de panneaux. Par défaut, région de la source de données configurée.
validate_dashboard
Lecture seule. Ne crée ni ne met jamais à jour de tableaux de bord. Accepte exactement un de dashboard_id ou dashboard_definition.
dashboard_id(chaîne, optionnel) : UUID du tableau de bord enregistré à valider.dashboard_definition(objet, optionnel) : Corps de tableau de bord non enregistré en ligne (vrai essai à blanc).start_time_iso/end_time_iso(chaîne, optionnel) : Fenêtre de validation (RFC3339). Doit être ≤ 24 h.region(chaîne, optionnel) : Région pour l'exécution des requêtes de panneaux.
Renvoie dashboard_validation/v1 : classification lint + exécution par panneau (data / no_data / invalid / error). Les résultats vides au jour 1 sont classés comme valid_no_data sans sondes de diagnostic.
create_dashboard
Uniquement nouveau. Après que cet appel renvoie dashboard.id, affinez avec update_dashboard — ne recréez pas pour ajouter, réduire ou corriger des panneaux.
dashboard(objet, requis) : Définition du tableau de bord avecnameetpanels[]. Chaque panneau nécessitename,version,layout(x,y,w,h),visualization.typeetqueries[].metadata(objet, optionnel) : Métadonnées du tableau de bord — champs_categoryet_type(p. ex.{"_category":"custom","_type":"metrics"}).
update_dashboard
À privilégier après create. Remplacement complet par identifiant (même corps que create).
id(chaîne, requis) : UUID du tableau de bord à mettre à jour.dashboard(objet, requis) : Corps complet de remplacement du tableau de bord (même forme que create).metadata(objet, optionnel) : Métadonnées de remplacement. Les tableaux de bord système en lecture seule renvoient une erreur 403.
delete_dashboard
id(chaîne, requis) : UUID du tableau de bord à supprimer. Les tableaux de bord système en lecture seule ne peuvent pas être supprimés.
list_dashboard_snapshots
dashboard_id(chaîne, requis) : UUID du tableau de bord dont les instantanés doivent être listés.
Renvoie uniquement les métadonnées (id, name, expires_at, etc.). Utilisez get_dashboard_snapshot pour les données de panneaux figées.
get_dashboard_snapshot
id(chaîne, requis) : UUID de l'instantané.
Renvoie l'instantané figé complet, y compris dashboard_definition, panel_data, time_range et variables.
delete_dashboard_snapshot
id(chaîne, requis) : UUID de l'instantané à supprimer.
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(optionnel) : Fenêtre ; préférez la fenêtre de recherche ou des bornes ISO explicites (défaut 60 min).region(chaîne, optionnel) : Remplacement de région.
Renvoie les services qui ont des données de profilage dans la fenêtre. Appelez ceci avant get_flamegraph / get_top_functions / get_profile_summary.
get_flamegraph
service(chaîne, requis) : Nom du service issu deget_profile_services.profile_type(chaîne, optionnel) :cpu(défaut),allocouwall. Épinglez un type lors de la comparaison de fenêtres.env/cluster/namespace/runtime(chaîne, optionnel) : Filtres de portée.limit(nombre, optionnel) : Nombre maximal de lignes de pile agrégées (défaut 1000, max 10000).lookback_minutes/start_time_iso/end_time_iso/region(optionnel).
Renvoie un arbre de flamegraph imbriqué (name / value / self / children). truncated: true signifie que la limite de lignes de l'API a été atteinte.
get_top_functions
Mêmes filtres que get_flamegraph. Renvoie le classement des échantillons propres des fonctions les plus actives. Peut être tronqué ; vérifiez truncated.
get_profile_summary
Mêmes filtres que get_flamegraph. Renvoie un court triage en langage naturel du profil pour le service.
grafana_search_dashboards
query(chaîne, optionnel) : Sous-chaîne du titre. Vide liste largement (sous réserve de 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(chaîne, requis) : UID du tableau de bord Grafana.full_json(booléen, optionnel) : Lorsque vrai, renvoie le JSON Grafana brut au lieu du résumé filtré. Résumé par défaut : version, tags, variables de templating, et le type/datasource/gridPos/cibles promQL de chaque panneau. Les types de panneaux de plugin inconnus apparaissent dansunsupportedPanelTypes.
grafana_list_folders
Aucun paramètre. Renvoie l'arborescence des dossiers.
grafana_list_folder_dashboards
folder_uid(chaîne, obligatoire) : uid du dossier Grafana.
Renvoie {"dashboards":[…], "truncated":bool} pour les tableaux de bord de ce dossier (paginé jusqu'à 5 000).
grafana_list_datasources
Aucun paramètre. Renvoie une projection sûre des sources de données (sans champs d'identifiants).
Tests
Voir TESTING.md pour la configuration et les instructions des tests d'intégration.
