Last9
offiziellBringen Sie nahtlos Echtzeit-Produktionskontext—Logs, Metriken und Traces—in Ihre lokale Umgebung, um Code schneller automatisch zu reparieren.
Was kann man mit Last9 MCP machen?
- Produktionsvorfälle untersuchen — Bitte deinen Assistenten, Logs, Traces, Metriken, Ausnahmen und ausgelöste Alerts für einen Dienst abzurufen, damit er die Ursache des Problems diagnostizieren kann.
- Änderungen mit Auswirkungen in Zusammenhang bringen — Prüfe Deployments und Konfigurationsänderungen und vergleiche anschließend einen Dienst und seine aufrufenden Dienste vor und nach der Änderung, um festzustellen, ob sie eine Regression verursacht hat.
- Prometheus-Metriken abfragen — Führe PromQL-Bereichs- oder Sofortabfragen aus und liste Labelwerte auf, um beliebige Metriken in deiner Datenquelle zu untersuchen.
- Datenbankleistung untersuchen — Ermittle Datenbanken, finde langsame Abfrageausführungen und prüfe Abfragemuster sowie serverseitige Metriken aus OTel-Spans.
- Traces und Profile analysieren — Rufe anhand einer ID einen Trace-Wasserfall ab, ordne Attributabweichungen zwischen Kohorten oder rufe ein Flamegraph und die häufigsten Funktionen für einen Dienst ab.
- Alerts und Dashboards verwalten — Prüfe die Alert-Abdeckung und -Qualität, erstelle oder ändere Alert-Regeln und liste benutzerdefinierte Dashboards auf, validiere oder bearbeite sie.
Dokumentation
Last9 MCP Server

Dein KI-Agent weiß nicht, was in der Produktion nicht funktioniert. Das ändert sich jetzt.
Der Last9 MCP Server verbindet Claude, Cursor, Windsurf und jeden anderen MCP-fähigen KI-Assistenten direkt mit deinen Observability-Daten aus der Produktion — Logs, Metriken, Traces, Ausnahmen, Datenbankabfragen, Alerts und Deployments. Der Agent rät nicht mehr, sondern liest die tatsächlichen Signale.
In 30 Sekunden starten (gehostet)
Keine Binärdatei zu installieren. Keine Tokens zu verwalten. Eine URL, OAuth im Browser, fertig.
Finde den Slug deiner Organisation in deiner Last9-URL: app.last9.io/<org_slug>/...
Claude Code
claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp
Gib /mcp ein, wähle last9 aus und authentifiziere dich. Das war's.
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Klicke auf Connect und schließe OAuth ab.
VS Code
Erfordert v1.99+. Öffne die Befehlspalette → MCP: Add Server, füge die URL ein und authentifiziere dich.
Oder direkt in settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > gear icon (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. Nenne ihn last9, füge die URL ein und authentifiziere dich.
Erfordert Administratorzugriff auf deine Claude-Organisation.
Selbst gehostet (STDIO)
Verwende diese Option, wenn dein MCP-Client HTTP-Transport nicht unterstützt oder der Server lokal ausgeführt werden muss.
Installieren
Homebrew:
brew install last9/tap/last9-mcp
NPM:
Erfordert Node.js 22.23.4+, 24.22.1+ oder 26.12.1+: Frühere Versionen akzeptieren beim Herunterladen der Binärdatei durch das Installationsprogramm TLS-Zertifikate der kompromittierten eMudhra-Zwischenzertifizierungsstellen.
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Binärversionen (Windows / manuell):
Lade sie von GitHub Releases herunter:
| Plattform | Archiv |
|---|---|
| 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 |
Refresh-Token abrufen
Nur Administratoren können Tokens erstellen.
- Gehe zu API Access
- Klicke auf Generate Token mit Schreibberechtigungen
- Kopiere es
Client-Konfiguration
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>"
}
}
}
}
Hier einfügen:
| Client | Speicherort |
|---|---|
| Claude Web/Desktop | Settings > Developer > Edit Config (claude_desktop_config.json) |
| Cursor | Settings > Cursor Settings > MCP > Add New Global MCP Server |
| Windsurf | Settings > Cascade > MCP Marketplace > gear icon (mcp_config.json) |
| VS Code | In settings.json in { "mcp": { "servers": { ... } } } einfügen — Details |
VS Code STDIO-Konfiguration
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
Für NPM: Verwende "command": "npx" und füge "args": ["-y", "@last9/mcp-server@latest"] hinzu.
Windows
Lade die Datei von GitHub Releases herunter, entpacke sie und gib den vollständigen Pfad an:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Unter Windows ist der NPM-Weg einfacher — keine Pfadverwaltung.
Umgebungsvariablen
| Variable | Standardwert | Beschreibung |
|---|---|---|
LAST9_REFRESH_TOKEN | (erforderlich) | Refresh-Token von API Access |
LAST9_DATASOURCE | Standard der Organisation | Name der Datenquelle/des Clusters — nützlich, wenn du mehrere Levitate-Cluster hast |
LAST9_FAKE_NOW_ISO | (nicht gesetzt) | Nur für Evals/Replays; niemals in der Produktion setzen. RFC3339-Zeitpunkt (z. B. 2026-01-02T15:04:05Z), der beim Auflösen relativer Zeitfenster wie lookback_minutes die aktuelle Zeit ersetzt, damit Läufe reproduzierbar sind. Ein ungültiger Wert führt zu einem Startfehler. Timeouts, Caches und Token-Ablauf verwenden weiterhin die tatsächliche Zeit |
LAST9_API_HOST | app.last9.io | API-Host überschreiben |
LAST9_TOOLSETS | alle Tools | Durch Kommas getrennte Toolsets, die bereitgestellt werden sollen (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias: LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | Setze true, um nur schreibgeschützte Tools bereitzustellen; siehe Schreibgeschützter Modus. Ein Wert, der kein boolescher Wert ist, führt zu einem Startfehler. Alias: LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | Durch Kommas getrennte Schreib-Tools, die im schreibgeschützten Modus weiterhin bereitgestellt werden. Alias: LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Maximale Anzahl von Einträgen für segmentierte get_logs-Anfragen |
LAST9_USE_LOG_SEARCH_API | false | Setze true, damit get_logs und get_service_logs mit einem serverseitigen Suchaufruf statt mit clientseitiger Segmentierung beantwortet werden. Jeder Aufruf erhält 90 Sekunden und gibt anschließend den Hinweis zurück, das Zeitfenster einzugrenzen; ein 502- oder 503-Fehler wird innerhalb dieses Zeitraums einmal wiederholt |
LAST9_DEBUG_CHUNKING | false | Setze true, um Details zur Segmentplanung für get_logs, get_service_logs, get_traces zu protokollieren |
LAST9_DISABLE_TELEMETRY | true | Setze false, um internes OTel-Tracing zu aktivieren |
OTEL_SDK_DISABLED | — | Standard-OTel-Umgebungsvariable. Überschreibt LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | OTLP-Collector-Endpunkt (nur bei aktivierter Telemetrie) |
OTEL_EXPORTER_OTLP_HEADERS | — | OTLP-Authentifizierungsheader (nur bei aktivierter Telemetrie) |
Zeitmessung der Tool-Phasen
Bei aktivierter interner Telemetrie enthalten Tool-Spans last9.phase.<phase>.duration_ms
(tatsächlich verstrichene Millisekunden) und last9.phase.<phase>.failed (ob die Phase
mit einem Fehler endete). Dieselben Felder werden als tool phase completed-Debug-
Logs ausgegeben, zusammen mit tool und phase, wenn der konfigurierte Logger Debug-Einträge akzeptiert.
Diese Zeitmessungen fügen keine Eingaben, Abfragetexte, Zugangsdaten oder Fehlerantworten hinzu.
| Tool | Phasen |
|---|---|
get_log_patterns | sample: Beispiel abrufen und dekodieren; mine: Muster ermitteln; deep_link: optionalen Index auflösen und Link erstellen |
get_logs | fetch: Ergebnisse abrufen, dekodieren und zusammenführen, einschließlich Wiederholungsversuchen und optionalen Plausibilitätsprüfungen der Anzahl; count_sanity: die verschachtelte optionale Prüfung; post_process: Hinweise, Zusammenfassung und JSON-Formatierung; deep_link: Index auflösen und Link erstellen |
get_service_profile | request: Anfrage über den gemeinsam genutzten API-Client vorbereiten und senden und die vollständige Antwort lesen, bevor sie knapp formatiert wird |
Es werden nur ausgeführte Phasen erfasst, auch fehlgeschlagene Abrufe. Optionale Hilfsfunktionen, die Fehler unterdrücken, behalten dieses Verhalten bei; failed: false bestätigt nicht, dass ein optionaler Link oder eine optionale Anzahlprüfung verfügbar war. Die Dauer des verschachtelten count_sanity ist bereits in fetch enthalten; addiere sie nicht doppelt. Die Abrufzeit umfasst die Arbeit des Clients und misst daher nicht ausschließlich die Backend-Ausführung. Vergleiche diese Phasen anhand gleichwertiger Zeitfenster und Suchpfade, bevor du Sampling oder Caching anpasst.
Für eine Latenzuntersuchung kannst du denselben Dienst, dieselbe Datenquelle, denselben Index, dasselbe Zeitfenster und dieselben Limits mit den Basis- und Kandidaten-Builds erneut ausführen. Erfasse die Build-SHA, die Tool-Gesamtdauer, die Phasendauern, last9.logs.search_path, Wiederholungsattribute, sofern vorhanden, und Abdeckungsflags. Vergleiche sowohl langsame als auch typische Aufrufe. Ein langsamer Abruf oder eine langsame Profilanfrage weist auf eine Netzwerk-/API-Phase hin, die untersucht werden sollte; bevor die Verzögerung dem Backend zugeschrieben wird, sind eigene korrelierte Belege für die Backend-Ausführung erforderlich.
Diese Diagnosen allein belegen keine Latenzverbesserung.
Schreibgeschützter Modus
--read-only (oder LAST9_MCP_READ_ONLY=true) stellt nur Tools bereit, die mit readOnlyHint: true annotiert sind. Kein Tool kann daher Alert-Regeln, Benachrichtigungskanäle, Dashboards oder Drop-Regeln erstellen, ändern oder löschen, Alerts bestätigen oder neu zuweisen oder Gruppen stummschalten. Ein Tool ohne Annotationen gilt als Schreib-Tool und wird ausgeblendet.
Um einige Schreib-Tools beizubehalten, liste sie mit --allow-write-tools (oder LAST9_MCP_ALLOW_WRITE_TOOLS) auf:
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- Der Server verweigert den Start, wenn ein zulässiger Name kein Schreib-Tool ist (etwa wegen eines Tippfehlers oder weil es sich um den Namen eines Lese-Tools handelt); der Fehler listet die gültigen Schreib-Tools auf.
--allow-write-toolsohne--read-onlyführt zu einem Startfehler, da andernfalls bereits jedes Schreib-Tool bereitgestellt wird.- Schreibgeschützter Modus lässt sich mit
--toolsetskombinieren: Ein Tool wird nur bereitgestellt, wenn es beide Bedingungen erfüllt.--toolsets=alerts --read-only --allow-write-tools=mute_alert_groupstellt die Lese-Tools für Alerts sowiemute_alert_groupbereit; ein zulässiges Schreib-Tool außerhalb der ausgewählten Toolsets bleibt ausgeblendet. - Der Modus
--httpunddump-toolsberücksichtigen dieselben Flags und Umgebungsvariablen:go run . dump-tools --read-onlygibt die schreibgeschützte Oberfläche aus, zusammen mit den Serveranweisungen, die unterinstructionsbereitgestellt werden. - Beschreibungen, Schemas und Ergebnisse von Lese-Tools sowie die Serveranweisungen nennen niemals ein ausgeblendetes Schreib-Tool. Ein zulässiges Schreib-Tool kann jedoch seine ausgeblendeten Gegenstücke nennen (
create_alerterstellt eine deaktivierte Regel, diepatch_alertaktiviert). Erlaube solche Tool-Paare daher gemeinsam.
Was es kann
Orientierung
get_workspace_overview— Empfohlener erster Aufruf, wenn eine Anfrage keinen Dienst oder kein Tool nennt (wird eines genannt, geht es direkt zum entsprechenden Tool): Umgebungen, erkannte Signale (Logs, Traces, Metriken) der letzten Stunde, Anzahl der Dienste und Alert-Gruppen, ausgelöste Alerts und die aktuelle Uhrzeit in einem kostengünstigen Aufruf. Ein Signal, das in dieser Stunde nicht erkannt wurde, kann dennoch ältere Daten haben und bleibt daher abfragbar. Bei einem fehlgeschlagenen Teilaufruf bleibt das Feldnullund ein Eintragerrors[]wird hinzugefügt. In jedem Toolset verfügbarget_current_time— Aktuelle Uhrzeit sowie absolute Grenzen fürlast 2h,yesterdayodersince yesterday 9am ISTin jeder IANA-Zeitzone oder gängigen Abkürzung. In jedem Toolset verfügbar
Dienstzustand
get_service_summary— Nach(service, env)sortierte Flottenzeilen: request_count und throughput_rpm für das Intervall, HTTP-4xx-/5xx-Anzahlen und gRPC-Fehleranzahlenget_service_environments— Verfügbare Umgebungen für deine Dienste. Führe dies zuerst aus — andere APM-Tools benötigenenvvon hierget_service_performance_details— Vollständige Aufschlüsselung: Durchsatz, Fehlerrate, p50/p90/p95/avg/max, Apdex, Verfügbarkeit (standardmäßig zusammengefasst; vollständige Zeitreihe mitinclude_series)get_service_operations_summary— Nach HTTP-Endpunkten, DB-Aufrufen, Messaging und HTTP-Clients gruppierte Vorgängeget_service_dependency_graph— Abhängigkeitsübersicht mit Durchsatz, Latenz und Fehlerraten für Upstream, Downstream und Infrastrukturget_apm_service_deviations— Vergleicht ein aktuelles Zeitfenster mit einer gleich langen Basisperiode: Regressionen/Verbesserungen, Apdex-Abgleich und ein abschließendes Ergebnis (Flotte oder einzelner Dienst)get_exceptions— Serverseitige Ausnahmen mit Dienst- und Span-Filtern
Datenbank-Observability
Vier Tools, die direkt die Performance deiner Datenbank untersuchen. Sie basieren auf OpenTelemetry-Trace-Spans und, wenn keine Traces vorhanden sind, auf Infrastrukturmetriken wie CloudWatch. Wenn du bereits OTel verwendest, ist keine zusätzliche Instrumentierung erforderlich.
get_databases— Entdecken Sie alle Datenbanken in Ihrer Infrastruktur: DB-Typ, Host, Durchsatz (Abfragen/Min.), p95-Latenz, Fehlerrate und Anzahl abhängiger Dienste. Entdeckt außerdem Datenbanken anhand von Infrastrukturmetriken wie CloudWatch, ohne dass Trace-Instrumentierung erforderlich ist — diese Zeilen enthalten statt Trace-Metriken einen Aktivitätswertget_database_slow_queries— Die tatsächlich langsamsten Abfrageausführungen, nach Dauer sortiert, mit Trace-IDs zum Aufrufen vollständiger Tracesget_database_queries— Abfragemuster und Aggregate: wie oft eine Abfrage ausgeführt wird, durchschnittliche/p95-Dauer, Fehlerrateget_database_server_metrics— Serverseitige Metriken direkt vom DB-Host (CPU, Verbindungen, Buffer-Trefferraten — abhängig von Ihrem DB-System)
Unterstützt PostgreSQL, MySQL, MongoDB, Redis, Aerospike und alles andere, was OTel-Traces mit einem db_system-Attribut erzeugt — sowie Datenbanken, die anhand von Infrastrukturmetriken wie CloudWatch entdeckt werden und deren Zeilen statt Trace-Metriken einen Aktivitätswert enthalten.
Prometheus / PromQL
prometheus_range_query— PromQL-Bereichsabfragen für beliebige Metrikenprometheus_instant_query— Momentabfragen; verwenden Sie Rollup-Funktionen wieavg_over_time,sum_over_timeprometheus_label_values— Labelwerte für eine bestimmte Zeitreiheprometheus_labels— Alle für eine Zeitreihe verfügbaren Labels
Richten Sie diese auf eine andere Datenquelle/einen anderen Cluster als den Standard aus, indem Sie LAST9_DATASOURCE festlegen, oder pro Aufruf mit datasource. Ein ausgelassenes datasource verwendet den Standard; ein eindeutiger Beinahetreffer, den der Matcher als sicher einstuft (z. B. eine Variante der Groß-/Kleinschreibung), verwendet den nächstliegenden Treffer. Bei einem fehlenden, zusätzlichen oder vertauschten Buchstaben ist eine automatische Auflösung nicht garantiert: Selbst bei nur einem Kandidaten kann eine Bestätigung erforderlich sein, wenn die Änderung einen Regions- oder Umgebungscode betreffen könnte. Weniger genaue oder mehrdeutige Treffer geben Kandidaten zurück und führen keine Abfrage aus (kein Fehler); unbekannte Namen geben einen Fehler zurück. Ein zusätzlicher Inhaltsblock nennt die verwendete Datenquelle, wenn Sie sie nicht exakt benannt haben. get_metric_status, get_service_profile und get_apm_service_deviations lösen datasource auf dieselbe Weise auf.
Logs
get_logs— Vollständige JSON-Pipeline-Logabfragen (Aggregationen, Filter, Felderkennung)get_service_logs— Logzeilen für einen Dienst, nach Schweregrad und Inhalt filterbar; standardmäßig über 20 Zeilen zusammengefasst, sofernresponse_modenichtrawistget_log_patterns— Logzeilen eines Dienstes in einem Zeitfenster, gruppiert nach Nachrichtenvorlagen, mit Anzahl, erstem/letztem Auftreten, Schweregradverteilung und einem Beispielget_emerging_log_patterns— Logvorlagen, die im Vergleich zu einem Basiszeitfenster neu sind, häufiger oder seltener auftreten oder verschwunden sind, mit den Anzahlen aus beiden Zeitfensternget_log_attributes— Globaler Katalog der Attribute im Logschema für ein Zeitfensterget_log_attributes_for_pipeline— Tatsächlich vorhandene Logfelder für eine laufende Pipeline (bereichsbezogene Erkennung), jeweils mit ihrem exaktenfilter_fieldget_drop_rules— Log-Verwerfungsregeln aus der Last9 Control Planeadd_drop_rule— Neue Verwerfungsregel erstellen, um das Logvolumen an der Quelle zu reduzierenget_remapping_rules— Neuzuordnungsregeln (logs_extract,logs_map,traces_map) aus der Last9 Control Planeadd_remapping_rule— Neuzuordnungsregel erstellen, die Log- und Trace-Attribute bei der Aufnahme extrahiert oder zuordnet
Traces
get_traces— JSON-Pipeline-Traceabfragen für umfassende Suchen und Aggregationenget_service_traces— Traces anhand einer exakten Trace-ID oder eines Dienstnamens. Verwenden Sie dies, wenn Sie eine Trace-ID haben — es ist schnellerget_trace_attributes— Globaler Katalog der Attribute im Traceschemaget_trace_attributes_for_pipeline— Tatsächlich vorhandene Attribute für eine laufende Pipeline (bereichsbezogene Erkennung), jeweils mit ihrem exaktenfilter_fieldget_trace_attribute_values— Eindeutige Werte für ein Trace-Attribut, optional auf eine Pipeline beschränktget_trace_attribute_deviations— Ermittelt Attributwerte, die sich zwischen zwei begrenzten Span-Kohorten unterscheiden (langsam vs. schnell, Fehler vs. kein Fehler oder zwei Zeitfenster). Korrelation, keine Ursacheget_trace_waterfall— Ein exakter Trace als Eltern-/Kind-Wasserfalldiagramm mit Intervallvereinigungs-Eigenzeit, langsamsten Spans und Graphwarnungen
Änderungsereignisse und Alerts
get_change_events— Deployments, Konfigurationsänderungen, Rollbacks. Vorfälle mit den vorgenommenen Änderungen korrelierenanalyze_change_impact— Hat eine Änderung etwas beschädigt? Vergleicht einen Dienst und seine direkten Aufrufer vor und nach einer Änderung: Golden Signals, APM- und Trace-Attributabweichungen, neu ausgelöste Alerts und ein Urteil (regression likely/no significant change/insufficient data)get_alert_groups— Konfigurierte Compass-Alertgruppen mit Metadatenlabels, Team, Tier und Regelanzahl — einschließlich Gruppen ohne Regeln und Gruppen, die nicht ausgelöst werdenget_alert_operations_summary— Bereitschaftszustand über ein Zeitfenster: ausgelöste und bestätigte Alerts, Rückstand, Zustellungen und mitinclude_rulesdie lautesten, flappenden und nicht weitergeleiteten Regeln. Jede Anzahl enthält ihrenstatus(available/partial/unavailable)get_alert_coverage— Was nicht überwacht wird: nicht abgedeckte Golden Signals, vollständig deaktivierte oder nicht weitergeleitete Alertgruppen und zu lange stummgeschaltete Regeln, jeweils mit einem vorgeschlagenen Korrekturtool. Nur lesend.get_alert_config— Alert-Regelkonfigurationen — durchsuchbar nach Name, Schweregrad, Typ und Tagsget_entity_kpis— Alle KPIs (ID, Name, PromQL, Einheit) einer Alertgruppe, einschließlich KPIs, die noch von keiner Regel verwendet werden — die IDs, diecreate_alertundvalidate_alert_expressionbenötigencreate_kpi— KPI (PromQL + Einheit) für eine Alertgruppe erstellen, wenn keine vorhandene KPI passt. Einmal erstellen und die zurückgegebene ID beibehaltenget_alerts— Aktuell ausgelöste Alerts innerhalb eines Zeitfenstersget_alert_rule_state— Historischer Auslösestatus (1/0) pro Alert-Regel über einen Zeitraum, gruppiert nachrule_id. Filterbar nach Alertgruppe, Regelname, Label-Filtern und Status.get_alert_hygiene— Laute, flappende, veraltete und nicht weitergeleitete Alert-Regeln über 7 oder 30 Tage, nach Rang sortiert, jeweils mit den Zahlen hinter dem Urteil und einem vorgeschlagenen Korrekturvorschlag. Nur lesend.get_notification_channels— Konfigurierte Benachrichtigungskanäle (Slack, PagerDuty, E-Mail usw.).scope=channelslistet die Kanäle selbst (IDs zum Verknüpfen); das standardmäßigeattachedlistet die Verknüpfungen pro Alertgrupperecommend_alert_config— Nur lesende Designhinweise (Lebenszyklus, Validierungsschranken, Kontext für Einsatzkräfte) vor dem Erstellen einer Alert-Regelvalidate_alert_expression— Alert-Ausdruck anhand der KPIs einer Alertgruppe testen, ohne etwas zu speicherndescribe_alert_chart— Nur lesend: die alertfähigen Signale (Schlüssel, Einheit) eines Discover-Diagramms (discover-service,discover-exceptions)create_alert— Alert-Regel (statisch oder adaptiv überadaptive_std_cmp) in einer vorhandenen Alertgruppe erstellen; wird immer deaktiviert als Entwurf erstellt. Einmal erstellen; mitupdate_alert/patch_alertverfeinerncreate_alert_from_chart— Alert-Regel mit statischem Schwellenwert aus einem Discover-Diagramm in einem Aufruf erstellen. Wie beicreate_alertwird die Regel deaktiviert als Entwurf erstelltupdate_alert— Vollständiger Ersatz der Auswertungskonfiguration einer Regel (kann eine Ersatzregel-ID zurückgeben)patch_alert— Teiländerung einer Regel: aktivieren/pausieren,mute_until, Einsatzkräfte-properties, wöchentlichesrecurring_mute_schedule(oderclear_recurring_mute_schedule)delete_alert— Alert-Regel dauerhaft löschenmute_alert_group— Alle Regeln einer Alertgruppe bis zu einem Stichtag stummschalten (oder die Stummschaltung aufheben)acknowledge_alert— Einen ausgelösten Alert übernehmen oder freigebenreassign_alert— Einen bereits bestätigten Alert an einen anderen Benutzer übergebencreate_notification_channel— Slack-, PagerDuty-, Opsgenie-, E-Mail- oder generischen Webhook-Kanal erstellenattach_notification_channel— Einen vorhandenen Kanal fürbreach,threatoder beides an eine Alertgruppe weiterleitendetach_notification_channel— Eine Verknüpfung zwischen Kanal und Alertgruppe entfernendelete_notification_channel— Einen Kanal ohne Verknüpfungen dauerhaft löschen
Die Alert-Schreibtools (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) benötigen ein Token mit Schreibberechtigung; delete_alert, detach_notification_channel und delete_notification_channel benötigen stattdessen Löschberechtigung. Sie sind nur im Toolset alerts verfügbar.
Regeln, Kanäle und Verknüpfungen, die diese Tools erstellen, werden mit created_via: last9-mcp sowie dem Namen und der Version des MCP-Clients gekennzeichnet (bei Regeln mit den Annotationen _l9_created_via_ und _l9_created_via_client_, die patch_alert und update_alert beibehalten und die Aufrufer nicht festlegen können). get_entity_alert_rules und get_notification_channels zeigen die Kennzeichnung an, und delete_alert, detach_notification_channel und delete_notification_channel weisen Agents an, nur gekennzeichnete Ressourcen zu bereinigen, sofern der Benutzer keine bestimmte Ressource nennt.
Benutzerdefinierte Dashboards
list_dashboards— Benutzerdefinierte Dashboards, nach Namen gefiltert und auf unter 32 KB paginiert: IDs, Namen, letzte Aktualisierungszeiten, Autoren und Sperrstatusget_dashboard— Vollständige Dashboard-Definition anhand der ID, einschließlich Panels und Abfragenpreview_dashboard— Nur lesende Vorschau eines nicht gespeicherten Dashboards oder Patches: aufgelöste Abfragen, begrenzte Ergebnisse pro Panel und Netto-Panel-Diff; wird nie gespeichertvalidate_dashboard— Nur lesendes Linting, Ausführen und Klassifizieren für eine gespeicherte Dashboard-ID oder ein Inline-dashboard_definitionüber ein Zeitfenster von ≤24h. Erstellt oder aktualisiert niemals Dashboardscreate_dashboard— Ein neues benutzerdefiniertes Dashboard einmalig erstellen (Panels, Abfragen, Metadaten). Nach Rückgabe der ID Panels mitpatch_dashboardbearbeiten.update_dashboard— Den Großteil eines vorhandenen Dashboards anhand der ID neu strukturieren (vollständiger Ersatz; schreibgeschützte System-Dashboards geben einen Fehler zurück). Für einzelne Panel-Bearbeitungenpatch_dashboardverwendenpatch_dashboard— Gezielte Änderungen an einem vorhandenen Dashboard anhand der ID (Panel hinzufügen/aktualisieren/entfernen/verschieben, Titel festlegen, Variable festlegen); gibt einen kompakten Diff statt des vollständigen Dashboards zurückdelete_dashboard— Ein benutzerdefiniertes Dashboard anhand der ID löschenset_dashboard_lock— Ein benutzerdefiniertes Dashboard anhand der ID sperren oder entsperren (nur Autor oder Org-Admin); ein gesperrtes Dashboard verweigert Aktualisierungen, Patches und Löschungenlist_dashboard_snapshots— Eingefrorene Momentaufnahmen eines Dashboards (nur Metadaten)get_dashboard_snapshot— Vollständige eingefrorene Momentaufnahme einschließlich Paneldaten für RCA-/teilbare Ansichtendelete_dashboard_snapshot— Eine eingefrorene Momentaufnahme anhand der ID löschen
Das Erstellen von Dashboards ist über MCP prompts/list und prompts/get verfügbar, ohne einen Skill zu installieren. Alle drei Prompts benötigen keine Argumente:
create_dashboard_guide— Erkennung, Layout und Panelauswahl; den vollständigen Kandidaten validieren und die Abfrage jedes Panels vor der Freigabe ausführen, einmalig erstellen, gezielte Änderungen patchen und anschließend erneut auslesen.dashboard_examples— Ein vollständiges Beispiel mit Service-RED, Endpunktlatenz, Statusklassen, Host-Zustand, Loganzahlen und Trace-Panels sowie abhängigen Variablen.query_guide— Semantik von Counter/Gauge/Histogramm und abgeleiteten Trace-Metriken, Moment- gegenüber Bereichsabfragen, Rate-Fenster, Prozentgrenzen sowie logjson-/tracejson-Regeln.
Derselbe Inhalt ist unter last9://reference/create_dashboard_guide, last9://reference/dashboard_examples und last9://reference/query_guide lesbar. Prompts und Ressourcen bleiben in jedem Toolset auffindbar; zum Ausführen des Workflows sind die entsprechenden Tools erforderlich (für das Erstellen von Dashboards mit gemischten Signalen --toolsets=dashboards,investigate verwenden, das auch list_datasources bereitstellt). Sitzungen mit Nur-Lesezugriff können vorbereiten und validieren, aber nicht speichern. Prüfen Sie die Verfügbarkeit der Tools, bevor Sie einen Schritt ausführen.
Panelprüfungen verwenden derzeit prometheus_range_query, prometheus_instant_query, get_logs und get_traces zusammen mit validate_dashboard. Die nicht unterstützten Abfragetypen und vereinfachten Standardwerte des Validators belegen keine Rendering-Parität. Der separate Schritt zur Abfrageprüfung wird nach der Bereitstellung von #475 zu query_panel wechseln.
Kontinuierliches Profiling
Erfordert, dass kontinuierliches Profiling für die Organisation aktiviert ist. Entdecken Sie zuerst Dienste mit get_profile_services und rufen Sie anschließend ein Flamegraph oder eine Rangliste der Funktionen ab.
get_profile_services— Services mit Profiling-Daten im Zeitfenster (Index vor der Abfrage)get_flamegraph— Verschachtelter Flamegraph-Baum für einen Service (cpuStandard; außerdemalloc,wall)get_top_functions— Rangliste der Self-Samples der heißesten Funktionen für einen Serviceget_profile_summary— Kurze natürlichsprachliche Triage des Profils für einen Service
Grafana-Dashboards
Schreibgeschützte Tools für die Grafana-Instanz der Organisation (über den Grafana-Proxy von Last9). Anmeldedaten werden dem Modell niemals zurückgegeben. Aktivieren mit LAST9_TOOLSETS=grafana (oder Toolsets nicht festlegen, um alle Tools zu verwenden).
grafana_search_dashboards— Dashboards anhand eines Teilstrings im Titel suchen (paginiert;truncated: true, wenn das Limit erreicht ist)grafana_get_dashboard— Dashboard-Zusammenfassung anhand der UID (Panels, Variablen, PromQL-Ziele);full_json=truefür rohes Grafana-JSONgrafana_list_folders— Ordnerstrukturgrafana_list_folder_dashboards— Dashboards in einem Ordner (paginiert)grafana_list_datasources— Datenquelleninventar ohne Anmeldedaten
Unscharfe Namensauflösung
did_you_mean— Wenn der Agent bei einem Entitätsnamen unsicher ist, gibt dieses Tool die ähnlichsten Treffer aus Ihrem Katalog zurück (Services, Umgebungen, Hosts, Datenbanken, K8s-Deployments/Namespaces, Jobs). Bis zu 3 Vorschläge mit Ähnlichkeitswerten. Der Server ruft dieses Tool automatisch vor den meisten anderen Tools auf, wenn eine Namenssuche keine Treffer ergibt.
Serviceprofil
get_service_profile— Wie die Telemetrie eines Services tatsächlich aussieht, bevor Sie sie abfragen: welche Signale vorhanden sind, Sprache und Laufzeitumgebung, Deployment-Umgebungen, die Struktur der Logs und eine empfohlene Korrektur der Datenerfassung, sofern zutreffend. So kann der Agent Trace-Tools überspringen, wenn ein Service keine Traces hat, und den Schweregrad aus dem Log-Body auslesen, wennSeverityTextleer ist, statt danach zu filtern und nichts zu finden.
Funktionsweise
Direktlinks in jeder Antwort. Jedes Tool gibt ein Feld deep_link zurück — eine direkte URL zum Last9-Dashboard für genau diese Abfrage und diesen Zeitraum. Der Agent kann Ihnen den Link geben; Sie klicken darauf und sind direkt dort.
Toolsets. Standardmäßig stellt der Server alle Tools bereit. Automatisierungs-Hosts, die nur Untersuchungen benötigen (Logs/Traces/Metriken/Profile), können LAST9_TOOLSETS=investigate festlegen (oder --toolsets=investigate übergeben), damit tools/list klein bleibt, ohne dass Tools clientseitig massenhaft deaktiviert werden müssen. Benannte Pakete: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Unbekannte Namen führen zu einem sofortigen Fehler. get_current_time und get_workspace_overview werden in jedem Toolset bereitgestellt. Im HTTP-Modus kann eine Anfrage die Auswahl mit dem Header X-Last9-Toolsets weiter einschränken (siehe Toolsets pro Anfrage). Das Paket alerts stellt außerdem die schreibgeschützten Tools prometheus_range_query und get_dashboard bereit, die der Prompt author-alert aufruft. Das Paket metrics allein enthält nicht list_datasources oder did_you_mean — verwenden Sie investigate (oder kombinieren Sie Toolsets), wenn Sie diese Ermittlungshilfen benötigen.
Ressourcen zur Toolreferenz. Umfangreiche Handbücher zu logjson/tracejson/service-logs/metrics sind MCP-Ressourcen (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting) und kein ständig verfügbarer Text in Toolbeschreibungen. Das Handbuch zur Alarmierung behandelt die Grammatik für Alarmausdrücke, statische und adaptive Felder, Einheiten, die Prüfungen von validate_alert_expression sowie Vorlagen für Regeln zu Latenz, Fehlerrate und Auslastung. Kritische Abfrageregeln bleiben in der Toolbeschreibung, damit auch Agenten, die resources/read nie aufrufen, korrekte Hinweise zur Erstellung von Abfragen erhalten. Ermitteln Sie organisationsspezifische Felder mit get_log_attributes / get_log_attributes_for_pipeline (und den entsprechenden Trace-Tools) — sie werden nicht in Beschreibungen eingefügt.
Große Ergebnisse in Blöcken. get_logs und get_traces verarbeiten große Ergebnismengen in Blöcken, statt sie abzuschneiden. Das Standardlimit für Logs beträgt 5000 Einträge; konfigurierbar über LAST9_MAX_GET_LOGS_ENTRIES.
Entwicklung
HTTP-Modus, curl-Tests, aus dem Quellcode erstellen
Im HTTP-Modus ausführen
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
Der Server startet unter http://localhost:8080/mcp.
Mit curl testen
Der Streamable-HTTP-Handler läuft im zustandslosen Modus, sodass jede Anfrage unabhängig verarbeitet wird. Ein initialize-Handshake und ein Mcp-Session-Id-Header sind optional — Clients, die sie senden, funktionieren weiterhin (der Header wird akzeptiert und ignoriert), und Clients können auch direkt zu tools/list / tools/call wechseln. Jedes Tool ist eine unabhängige Anfrage-Antwort-Abfrage; der Server sendet keine Benachrichtigungen an Clients, daher gibt GET /mcp (der SSE-Stream) 405 zurück.
# 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 pro Anfrage
Im HTTP-Modus kann eine Anfrage die verfügbaren Tools mit dem Header X-Last9-Toolsets oder dem Abfrageparameter toolsets für Clients einschränken, die keine Header setzen können (/mcp?toolsets=logs,traces). Wenn beide gesendet werden, hat ein nicht leerer Header Vorrang. Der Wert verwendet dieselben durch Kommas getrennten Namen wie --toolsets. Für die Anfrage gilt die Schnittmenge mit dem beim Start festgelegten --toolsets: Sie kann die Auswahl einschränken, aber niemals erweitern; all oder ein leerer Wert lässt die beim Start festgelegte Auswahl unverändert. Bei einem unbekannten Namen wird 400 zurückgegeben, das den Namen nennt. tools/list, tools/call und die Anweisungen für initialize richten sich alle nach der effektiven Auswahl; get_current_time und get_workspace_overview sind in jeder Auswahl enthalten.
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": {}}'
Jede unterschiedliche effektive Auswahl wird von einem eigenen Server bereitgestellt, der bei der ersten Anfrage erstellt (Dutzende Millisekunden) und bis zum Herunterfahren beibehalten wird; eine Anfrage, die die beim Start festgelegte Auswahl erneut angibt, verwendet den Startserver wieder. Es gibt keine Bereinigung: Es werden nur benannte Toolsets akzeptiert, daher enthält der Cache höchstens einen Server pro Kombination dieser Toolsets (heute 135, zusammen etwa 75 MB belegter Heap; ein vollständig gefüllter Cache stabilisierte sich in Tests bei knapp 230 MB residentem Speicher).
Aus dem Quellcode erstellen
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 ist für die lokale Entwicklung gedacht. Für die tatsächliche Nutzung ist der gehostete HTTP-Endpunkt einfacher.
Toolreferenz
Alle Parameter, Zeitangaben und Details
Zeiteingabe
- Absolute Zeitangaben (
start_time_iso/end_time_isoodertime_iso) haben Vorrang vorlookback_minutes. - Für relative Zeitfenster:
lookback_minutesverwenden. - Für absolute Zeitfenster: RFC3339/ISO8601 verwenden —
2026-02-09T15:04:05Z. - Das veraltete
YYYY-MM-DD HH:MM:SSwird nur aus Kompatibilitätsgründen akzeptiert. - Formulierungen wie
since yesterday 9am ISTmitget_current_timein RFC3339-Grenzwerte umwandeln.
get_workspace_overview
Keine Parameter. Prüft parallel die letzten 60 Minuten, wobei jeder Teilaufruf ein kurzes Zeitlimit hat, und gibt current_time, lookback_minutes, environments, telemetry (logs/traces/metrics-Boolesche Werte), service_count (Ränge der unterschiedlichen Services get_service_summary, alle Umgebungen), alert_group_count, firing_alert_count und errors ([{field, error}]) zurück. Ein Feld, dessen Teilaufruf fehlgeschlagen ist, ist null (unbekannt), niemals 0 oder false. Die Prüfungen werden nicht durch --toolsets eingeschränkt: Toolsets bestimmen, welche Tools bereitgestellt werden, und das API-Token legt fest, worauf der Server zugreifen kann.
get_current_time
range(String, optional):last 2h,past 30 minutes,last 7d(s, m, h, d = 24 h, w = 7 d; höchstens 366 d);today;yesterday;since <point>;<point> to <point>. Ein Zeitpunkt ist im RFC3339-Format odertoday/yesterday/ ein Wochentag (monday,mon: das letzte Vorkommen, einschließlich heute) /YYYY-MM-DDmit optionalem9am,9:30pmoder14:30. Eine nachgestellte Zeitzone überschreibttimezonefür beide Grenzen; eine Zeitzone an anderer Stelle führt zu einem Fehler. Weglassen, um nurnowzu erhalten.timezone(String, optional): IANA-Name oder Abkürzung (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). Standard: UTC. Unbekannte Zeitzonen führen zu einem Fehler, ebenso das mehrdeutigeCST(übergeben SieAmerica/ChicagooderAsia/Shanghai).
Gibt now (und start/end mit range) als {iso, epoch_seconds, local} zurück; local erscheint nur bei einer Nicht-UTC-Zeitzone.
get_exceptions
limit(Ganzzahl, optional): Maximale Anzahl von Ausnahmen. Standard: 20.lookback_minutes(Ganzzahl, optional): Standard: 60.start_time_iso/end_time_iso(String, optional): Absoluter Zeitraum.service_name(String, optional): Nach Service filtern.span_name(String, optional): Nach Span-Namen filtern.env(String, optional): Nach Umgebung filtern.
get_service_summary
start_time_iso/end_time_iso(String, optional)env(String, optional): PromQL-RegEx. Standardmäßig.*. Für eine exakte Übereinstimmung sind Anker erforderlich (z. B.^prod$).sort_by(String, optional):request_count(Standard),throughput_rpm,http_4xx_count,http_5xx_countodergrpc_error_count.limit(Ganzzahl, optional): Maximale Anzahl der Ranglisteneinträge. Weglassen oder 0 bedeutet 10; Werte über 100 werden auf 100 begrenzt.
get_service_environments
start_time_iso/end_time_iso(String, optional)
Für alle anderen APM-Tools ist ein Wert für
enverforderlich. Verwenden Sie"", wenn dieses Tool keine Ergebnisse zurückgibt.
get_service_performance_details
Gibt standardmäßig eine Zusammenfassung pro Zeitreihe zurück: points, missing_points (Verfügbarkeitsintervalle ohne Datenverkehr, die aus der Statistik ausgeschlossen werden), min, p50, p90, p99 (Nearest-Rank), max, mean, last, baseline_mean (Mittelwert der ersten Hälfte der gültigen Punkte, nicht des Zeitfensters), delta_pct (zweite Hälfte der gültigen Punkte im Vergleich zur Basislinie; fehlt, wenn die Basislinie 0 ist) und bis zu 3 change_points (timestamp, before_mean, after_mean), für bis zu 4 Zeitreihen pro Metrik und jedes Quantil der Antwortzeit (höchster Mittelwert zuerst; series_omitted zählt die übrigen). Eine Zeitreihe mit points: 0 enthält keine Statistiken, und baseline_mean/delta_pct erfordern mindestens 6 Punkte (3 pro Hälfte). full_series kennzeichnet, dass Rohdatenpunkte über include_series verfügbar sind.
service_name(String, erforderlich)lookback_minutes(Ganzzahl, optional): Standard: 60.start_time_iso/end_time_iso(String, optional)env(String, optional): Standardmäßigprod.top_n(Ganzzahl, optional): Maximale Anzahl von Einträgen pro Liste der häufigsten Operationen/Fehler. Standard: 5 oder 10 mitinclude_series=true. Höchstens 100.include_series(Boolesch, optional): Gibt jeden Punkt jeder Zeitreihe statt der Zusammenfassung zurück. Standard: false.
get_service_operations_summary
service_name(String, erforderlich)lookback_minutes(Ganzzahl, optional): Standard: 60.start_time_iso/end_time_iso(String, optional)env(String, optional): Standardmäßigprod.
get_service_dependency_graph
service_name(String, optional)lookback_minutes(Ganzzahl, optional): Standard: 60.start_time_iso/end_time_iso(String, optional)env(String, optional): Standardmäßigprod.
get_apm_service_deviations
service_name(string, optional): Für den Fleet-Bereich weglassen; für einen Dienst und dessen Operationskorrelationen angeben.lookback_minutes(integer, optional): Aktuelles Zeitfenster. Standard: 60.start_time_iso/end_time_iso(string, optional): Explizites aktuelles Zeitfenster.baseline_start_time_iso/baseline_end_time_iso(string, optional): Explizite Baseline. Standardmäßig das unmittelbar vorhergehende Zeitfenster gleicher Dauer.datasource(string, optional): Für den Standardwert weglassen; ungefähre Namen werden wie bei den Prometheus-Tools aufgelöst. Die Antwort nennt den verwendeten Standardwert oder die nächstliegende Übereinstimmung; bei mehrdeutigen Namen werden Kandidaten zurückgegeben, ohne eine Abfrage auszuführen.env(string, optional): Standardwert istprod.max_services/max_operations(integer, optional): Standardwert 10, jeweils maximal 10.
get_databases
env(string, optional): Nach Umgebung filtern. Akzeptiert einen regulären Ausdruck. Standard: alle.lookback_minutes(integer, optional): Standard: 60. Das Zeitfenster darf 7 Tage nicht überschreiten.start_time_iso/end_time_iso(string, optional)
get_database_slow_queries
db_system(string, optional): z. B.postgresql,mysql,mongodb,redis.host(string, optional): Datenbankhost (net_peer_name).service_name(string, optional): Name des aufrufenden Dienstes.env(string, optional)min_duration_ms(float, optional): Mindestdauer der Abfrage in ms.lookback_minutes(integer, optional): Standard: 60.start_time_iso/end_time_iso(string, optional)limit(integer, optional): Standard: 20.
get_database_queries
db_system(string, optional)host(string, optional)service_name(string, optional)env(string, optional)lookback_minutes(integer, optional): Standard: 60.start_time_iso/end_time_iso(string, optional)limit(integer, optional): Standard: 20.
get_database_server_metrics
db_system(string, required): z. B.postgresql,mysql,mongodb,redis,aerospike.host(string, optional)lookback_minutes(integer, optional): Standard: 60.start_time_iso/end_time_iso(string, optional)
prometheus_range_query
query(string, required): Die PromQL-Abfrage.start_time_iso/end_time_iso(string, optional): Standardmäßig die letzten 60 Minuten.lookback_minutes(float, optional): Standard: 60.
prometheus_instant_query
query(string, required)time_iso(string, optional): Standardmäßig jetzt.lookback_minutes(float, optional)
prometheus_label_values
match_query(string, optional): PromQL-Filter.label(string, required): Labelname.lookback_minutes(float, optional): Standard: 60.start_time_iso/end_time_iso(string, optional)
Wenn kein Zeitfenster angegeben ist und match_query eine einzelne Metrik bezeichnet (metric{...} oder {__name__="metric"}), wird ein leeres Ergebnis für 60 Minuten einmal über 4 Tage erneut abgefragt; ein zweiter Textblock gibt an, welches Zeitfenster das Ergebnis abdeckt.
prometheus_labels
match_query(string, optional): PromQL-Filter.lookback_minutes(float, optional): Standard: 60.start_time_iso/end_time_iso(string, optional)
Eine leere Suche nach einer einzelnen Metrik wird wie bei prometheus_label_values über 4 Tage erneut ausgeführt.
get_logs
logjson_query(array, required): JSON-Pipeline-Abfrage.lookback_minutes(integer, optional): Standard: 5.start_time_iso/end_time_iso(string, optional)limit(integer, optional): Serverstandard: 5000.index(string, optional):physical_index:<name>oderrehydration_index:<block_name>.response_mode(string, optional):summary(Standard; auch fürnull) oderraw. Ein Ergebnis mit Rohzeilen von mehr als 20 Zeilen wird alssummaryzurückgegeben:lines_summarized,severity_counts(die sechs häufigsten Labels, der Rest inother_severities),first_timestamp/last_timestamp, einhistogrammit 10 Buckets über das Abfragezeitfenster (über die zurückgegebenen Zeilen, mittruncated: true, wenn das Limit das Ergebnis abgeschnitten hat) und die häufigstenpatterns(template,count, bis zu zweisamples), wobei der Rest inotheraufsummiert wird; maximal 4000 Zeichen. Metadaten der obersten Ebene, die weiterhin nicht hineinpassen, werden verworfen und indropped_fieldsaufgeführt.rawgibt die Zeilen zurück. Aggregierte Ergebnisse werden nie zusammengefasst.
Für ein logbasiertes Dienstinventar zuerst physical_index_service_count abfragen:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
service_name als ServiceName, env als Umgebung, sofern vorhanden, und name als physischen Indexnamen verwenden. Wenn name="default", index weglassen; für einen vom Benutzer ausgewählten, nicht standardmäßigen physischen Index index: "physical_index:<name>" übergeben. Wenn das Backend die explizite Filterung nach physischem Index ablehnt, ohne index erneut versuchen und melden, dass die explizite Filterung nach physischem Index für dieses Backend nicht verfügbar ist.
get_service_logs
service_name(string, required)lookback_minutes(integer, optional): Standard: 60.limit(integer, optional): Standard: 100 oder 20 mitresponse_mode: "raw".env(string, optional)severity_filters(array, optional): z. B.["error", "warn"]. ODER-Logik.body_filters(array, optional): z. B.["timeout", "failed"]. ODER-Logik.start_time_iso/end_time_iso(string, optional)index(string, optional)response_mode(string, optional):summary(Standard; auch fürnull) oderraw. Bei mehr als 20 Zeilen wirdlogsdurch dieselbesummarywie beiget_logsersetzt; die übrigen Felder bleiben erhalten.rawgibt die Einträge zurück.
Mehrere Filtertypen werden mit UND verknüpft. Innerhalb jedes Arrays gilt ODER.
Für breite aggregierte Zählungen zuerst get_logs verwenden; get_service_logs erst nach dem Eingrenzen auf einen Dienst/eine Umgebung/einen Index und eine kleine Stichprobe verwenden.
get_log_patterns
service_name(string, required)env(string, optional)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): Standard: 60.severity_filters/body_filters(array, optional): ODER-Logik wie beiget_service_logs.severity_filtersnur setzen, wennget_service_profileseverity_setallmeldet; mitnoneoderpartialwerden Zeilen verworfen, deren Schweregrad im Body steht.index(string, optional)sample_size(integer, optional): Aus dem Zeitfenster entnommene Zeilen, neueste zuerst. Standard: 1000, maximal: 5000.top_n(integer, optional): Zurückgegebene Vorlagen nach Anzahl. Standard: 20, maximal: 100. Der Rest wird inotheraufsummiert.
Die Clusterbildung erfolgt im MCP-Server anhand der entnommenen Zeilen. Daher beziehen sich Anzahl, first_seen und last_seen auf die Stichprobe. window.sample_limit_reached weist darauf hin, wenn in der Stichprobe passende Zeilen fehlen könnten (sie enthält sample_size Zeilen und die API meldet keine exakte total_matching_lines in dieser Höhe, oder die Suche war logs_truncated); in diesem Fall enthält sie nur die neuesten Zeilen des Zeitfensters. Jedes template und sample wird bei 500 Zeichen abgeschnitten und endet mit …, sodass ein Body, der keine Clusterbildung ermöglicht (etwa JSON ohne ein Feld message), die Antwort nicht füllen kann. Eine Suche mit fehlgeschlagenen Chunks ist ein Toolfehler; eine abgeschnittene oder begrenzte Suche gibt weiterhin Muster zurück, gekennzeichnet durch sample_limit_reached. Eine leere Liste patterns bedeutet nur dann, dass nichts übereinstimmte, wenn sample_limit_reached false ist; ist der Wert true, wurde die Suche vorzeitig beendet und passende Zeilen könnten fehlen.
get_emerging_log_patterns
Übernimmt alle Parameter von get_log_patterns (der Zeitbereich ist das aktuelle Zeitfenster) sowie:
baseline_start_time_iso/baseline_end_time_iso(string, optional): Beide oder keinen setzen. Standardmäßig das unmittelbar vorhergehende Zeitfenster gleicher Länge.min_count(integer, optional): Anzahl der Zeilen, die ein geändertes Muster in dem Zeitfenster benötigt, in dem es häufiger ist: aktuell fürnew/increased, Baseline fürdecreased/disappeared. Standard: 3 (odersample_size, falls kleiner), maximal:sample_size.change_factor(number, optional): Häufigkeitsverhältnis größer als 1, das ein Muster, das in beiden Zeitfenstern vorkommt, erreichen (increased) oder auf dessen Kehrwert fallen muss (decreased). Standard: 2.
Beide Schwellenwerte müssen erfüllt sein. Daher wird eine Vorlage mit hohem Volumen, deren Häufigkeit sich nicht um change_factor geändert hat, nie gemeldet. Zurückgegeben werden nur geänderte Vorlagen (new, increased, decreased, disappeared) mit den Zählwerten current und baseline; unchanged_patterns zählt Vorlagen, die in beiden Zeitfenstern vorkommen und sich um weniger als change_factor geändert haben, und below_min_count_patterns zählt Änderungen, die wegen weniger als min_count Zeilen verworfen wurden. Häufigkeiten werden pro Minute verglichen, wenn beide Stichproben alle passenden Zeilen enthalten; pro Minute geschätzt anhand der exakten total_matching_lines einer begrenzten Stichprobe; andernfalls als Anteile der Stichprobe. Dabei beschreiben increased/decreased die Zusammensetzung statt der Rate (comparison_basis). Eine leere Liste patterns bedeutet, dass keine Änderung beide Schwellenwerte überschreitet, nicht, dass die Logs unverändert sind: seltenere Änderungen werden in below_min_count_patterns gezählt, und ein Zeitfenster mit sample_limit_reached vergleicht Stichproben, nicht ganze Zeitfenster.
get_log_attributes
lookback_minutes(integer, optional): Standard: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)index(string, optional)
get_log_attributes_for_pipeline
pipeline(array, required): Vorherige Filterstufen zur Eingrenzung der Ermittlung, z. B.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, optional): Standard: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)index(string, optional)
get_drop_rules
Keine Parameter. Listet Drop-Regeln über GET /otel_settings/drop?region=... auf.
add_drop_rule
name(string, required)filters(array, required): Jeder Filter:key,value,operator(equals/not_equals),conjunction(and).- Filterschlüssel müssen
attributes["key_name"]oderresource.attributes["key_name"]verwenden (von der Last9-API verlangt). - Erstellt die Regel über
POST /otel_settings/drop?region=...&cluster_id=....
get_remapping_rules
rule_type(string, required):logs_extract,logs_mapodertraces_map.region(string, optional): Standardmäßig die konfigurierte Datasource-Region.- Listet Regeln über
GET /otel_settings/remapping/{rule_type}?region=...auf.
add_remapping_rule
Erstellt pro Aufruf eine Regel; für Zuordnungsregeln ist ein Aufruf pro target_attribute erforderlich.
rule_type(string, erforderlich):logs_extract,logs_mapodertraces_map.name(string, erforderlich)remap_keys(array, erforderlich): Quellfelder.logs_extractmitjson: Namen der Body-Felder; mitpattern: genau ein Regex mit einer benannten Capture-Gruppe. Zuordnungsregeln: Attributpfade, der erste nicht leere Wert gewinnt.target_attribute(string, erforderlich):logs_extract:log_attributesoderresource_attributes.logs_map:service,severityoderresource_deployment.environment.traces_map:service.extract_type(string, nurlogs_extract, dort erforderlich):jsonoderpattern.action(string, nurlogs_extract):upsert(Standard) oderinsert.prefix(string, nurlogs_extract)preconditions(array, nurlogs_extract): Höchstens ein{key, value, operator};operatoristequals(Standard),not_equalsoderlike(Regex).region(string, optional): Standard: die konfigurierte Datenquellenregion.- Erstellt die Regel über
POST /otel_settings/remapping/{rule_type}?region=.... Wird nie erneut versucht; nach einem Timeout mitget_remapping_rulesprüfen.
get_traces
Für umfassende Suchen und Aggregationen verwenden. Für die Suche nach einer exakten Trace-ID get_service_traces verwenden.
tracejson_query(array, erforderlich)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): Standard: 60.limit(integer, optional): Standard: 5000.
get_service_traces
Genau eines von trace_id oder service_name ist erforderlich.
trace_id(string, optional): Standard-Rückblick: 72 Stunden.service_name(string, optional): Standard-Rückblick: 60 min.lookback_minutes(integer, optional)start_time_iso/end_time_iso(string, optional)limit(integer, optional): Standard: 10.env(string, optional)
get_trace_attributes
lookback_minutes(integer, optional): Standard: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)
get_trace_attributes_for_pipeline
pipeline(array, erforderlich): Vorherige Filterstufen zur Eingrenzung der Ermittlung, z. B.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, optional): Standard: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)
get_trace_attribute_values
tag_name(string, erforderlich): Attributname ausget_trace_attributes(z. B.resource_departmentoderattributes['http.method']).pipeline(array, optional): Vorherige Filterstufen zur Eingrenzung der Werte; für globale Werte weglassen.lookback_minutes(integer, optional): Standard: 15.start_time_iso/end_time_iso(string, optional): Historische RFC3339-Grenzwerte; haben Vorrang vorlookback_minutes.region(string, optional)
get_trace_attribute_deviations
comparison_mode(string, erforderlich):latency,errorsodertime.service_name(string, erforderlich)environment(string, erforderlich): Exakter Wert vondeployment.environment.operation(string, optional)filters(array, optional): Trace-JSON-Filterbedingungen.candidate_attributes(array, optional): Höchstens 8; für eine begrenzte Ermittlung weglassen.latency_threshold_ms(number, optional): Für den Moduslatencyerforderlich; für andere Modi abgelehnt.start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): Standard: 15. Maximum: 15.baseline_start_time_iso/baseline_end_time_iso(string, optional): Für den Modustimeerforderlich; nicht überlappend und von gleicher Dauer wie das Zielfenster.minimum_cohort_size(integer, optional): Standard: 100. Minimum: 20.minimum_value_support(integer, optional): Standard: 20. Minimum: 10.limit(integer, optional): Standard: 10. Maximum: 10.
Erfordert, dass die zugehörige Backend-Funktion aktiviert ist.
get_trace_waterfall
trace_id(string, erforderlich)environment(string, optional)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): Standard: 4320 (72 Stunden).selected_span_id(string, optional): Gibt Attribute, Ereignisse und Links nur für diesen Span zurück.max_spans(integer, optional): Standard: 500. Maximum: 1000; die Schwärzungsrichtlinie der Organisation kann den Wert weiter begrenzen.
Gibt den investigation-evidence/v1-Envelope des Trace-Dienstes unverändert zurück; der Waterfall befindet sich unter data. Der Dienst erstellt den Waterfall und schwärzt Werte gemäß einer organisationsspezifischen Richtlinie (Anmeldedaten, Abfrage-Literale, URLs, E-Mail-Adressen, IPs, Benutzerkennungen), bevor die Daten das Backend verlassen: sanitizer benennt die angewendete Richtlinie und evidence.sanitization zählt die geschwärzten oder abgeschnittenen Werte. Wenn benötigte Daten geschwärzt sind, bitte einen Organisationsadministrator, die Richtlinie anzupassen, statt sie zu umgehen. Das Tool lehnt eine Antwort ohne sanitizer-Block, mit einem anderen sanitizer.version als trace-evidence-sanitizer/v1, mit einem Body, der einen JSON-Schlüssel wiederholt, oder mit einem Body über 512 KiB ab (niedrigeres max_spans). Erfordert, dass die zugehörige Backend-Funktion aktiviert ist.
get_change_events
start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): Standard: 60.service_name(string, optional)env(string, optional)event_name(string, optional): Diesen Parameter zunächst weglassen, umavailable_event_namesabzurufen.
analyze_change_impact
Genau eines von change_event oder service + timestamp übergeben.
change_event(object, optional): Ein Element ausget_change_eventschange_events[], unverändert. Verwendetmetric.service,metric.deployment_environmentund das frühestevalues[].timestamp.service(string, optional): Erforderlich zusammen mittimestamp, wennchange_eventweggelassen wird.timestamp(string, optional): RFC3339 oder Unix-Sekunden, auf die Minute abgerundet.env(string, optional): Exakte Umgebung. Standard: die des Ereignisses, andernfalls alle.baseline_minutes(integer, optional): Standard: 60. Auf 30..120 begrenzt.after_minutes(integer, optional): Standard:baseline_minutes. Auf 30..120 begrenzt und bei jetzt gedeckelt.
regression likely, wenn eine der folgenden Bedingungen zutrifft: Die Fehlerrate steigt um mindestens 1 Prozentpunkt, p95 steigt um mindestens 40 % oder der Durchsatz (rpm) sinkt für den Dienst oder einen seiner 10 wichtigsten Aufrufer um mindestens 50 %, sortiert nach Durchsatz über beide Zeitfenster zusammen (nur bei mindestens 100 Anfragen vor der Änderung und, außer beim Durchsatz, danach; p95 berücksichtigt nur die Anfragen von latency_env); ein Alarm für sie beginnt nach der Änderung auszulösen und löst am Ende des Nachher-Zeitfensters weiterhin aus (ohne Beachtung der Groß-/Kleinschreibung anhand des Alarmgruppennamens oder eines Labels service, service_name oder service.name abgeglichen, andernfalls anhand einer Annotation (niemals anhand von Freitext wie einer Zusammenfassung); mit env werden Alarme mit einer anderen Umgebung als Label ohne Beachtung der Groß-/Kleinschreibung verworfen und Alarme ohne Umgebungslabel als env_match: unlabelled markiert); eine Regression aus get_apm_service_deviations. insufficient data, wenn das Nachher-Zeitfenster kürzer als 5 Minuten ist (einschließlich einer Änderung in der Zukunft), der Dienst zu wenige Anfragen hat oder Golden Signals, die Suche nach direkten Aufrufern, Alarme oder get_apm_service_deviations fehlgeschlagen sind, vollständig oder bei einer der in deviations.apm.unavailable aufgeführten Abfragen: Fehlende Nachweise führen nie zu no significant change, und eine dennoch gefundene Regression benennt den Fehler. no significant change ist eine gültige Antwort, kein Fehler. Abweichungen von Trace-Attributen werden nur ausgeführt, wenn env gesetzt ist, und umfassen höchstens 15 Minuten auf jeder Seite; sie erläutern ein Urteil, bestimmen es aber nie. Werden sie übersprungen oder können sie nicht abgerufen werden, bleibt das Urteil unverändert. Jede Liste enthält 10 Elemente und gibt an, wie viele ausgelassen wurden; bei einem fehlgeschlagenen Upstream-Aufruf wird nur der betreffende Abschnitt mit einem error versehen. Die Latenz der Golden Signals stammt in beiden Zeitfenstern aus derselben Umgebung, die in latency_env genannt wird: ohne env aus der Umgebung mit dem höchsten Durchsatz. Die Fehlerrate der Golden Signals zählt 5xx- und gRPC-Fehler; deviations.apm zählt zusätzlich Spans mit Fehlerstatus und 429er. Die Signale eines Aufrufers stammen aus dessen eigenen Server-Spans, daher zeigen Aufrufer mit ausschließlich Client-Spans 0 rpm.
regressions führt für jeden Auslöser hinter regression likely einen Eintrag in der Reihenfolge von reason auf und ist bei den anderen Urteilen []. Jeder Eintrag enthält service, role (changed oder dependent), env, metric (genau eines von error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) und baseline/after in der Einheit der Metrik (%, ms, rpm oder dem eigenen Wert des APM-Signals; null für alert). Ein Element vom Typ alert enthält zusätzlich rule_id und state, den Status der Instanz im neuesten Alerts-Monitor-Zeitabschnitt des Nachher-Zeitfensters, in dem sie aufgeführt ist, immer firing: Ein Alarm, der nach der Änderung begann, aber bis zum Ende des Nachher-Zeitfensters behoben wurde, ist keine Regression und löst daher kein Ticket aus; er bleibt mit seinem state in alerts.started, und reason zählt ihn. env ist die Umgebung, in der die Metrik gemessen wurde: die angeforderte env, andernfalls summieren Fehlerrate und Durchsatz alle Umgebungen (env: ""), während p95 die Umgebung mit dem höchsten Durchsatz verwendet, latency_env; ein Alarm verwendet sein eigenes Umgebungslabel und eine APM-Abweichung ihre eigene Umgebung. Jede Regression gilt für den gesamten Dienst, daher benennt keine einen Endpunkt.
get_alert_groups
Konfiguriertes Inventar der Compass-Alarmgruppen für Changeboard- und Label-Abdeckungsprüfungen. Enthält Gruppen ohne Regeln und Gruppen, die nicht ausgelöst werden. Gibt kein PromQL zurück.
alert_group_name/alert_group_type/data_source_name(string, optional): Teilzeichenfolgenabgleich ohne Beachtung der Groß-/Kleinschreibung.team/tier(string, optional): Exakter Abgleich konfigurierter Metadaten ohne Beachtung der Groß-/Kleinschreibung.label_key+label_value(string, optional): Müssen gemeinsam gesetzt werden. Exakter Abgleich einesmetadata.labels-Paars ohne Beachtung der Groß-/Kleinschreibung — sowohl Schlüssel als auch Wert.
Gibt kompaktes JSON {"count":N,"groups":[...]} mit id, name, type, entity_class, team, tier, metadata.labels und Regelanzahlen zurück. Leere team / labels bedeutet, dass kein Wert gesetzt ist.
get_alert_operations_summary
start_time_iso/end_time_iso(string, erforderlich): RFC3339-Zeitfenster, höchstens 31 Tage.timezone(string, optional): IANA-Name für Tagesgrenzen. Standard:UTC.severities/services(array, optional): Schränkt die Zusammenfassung ein.include_rules(boolean, optional): Gibt zusätzlich die Hygiene pro Regel zurück (Top 20 nachfire_count, flappende und nicht weitergeleitete Regeln, mittruncated, wenn die API die Regelliste begrenzt hat). Standard:false.
Gibt JSON mit alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention und coverage zurück. Jede Metrik ist {status, count?, reason?}; eine partial-Anzahl deckt nur einen Teil des Zeitfensters ab und ist keine Untergrenze.
get_alert_coverage
Beantwortet die Frage „Wofür fehlen mir Alarme?“ für einen Dienst, eine Umgebung, eine Alarmgruppe oder — wenn kein Bereich angegeben ist — die gesamte Organisation. Schreibgeschützt: Es erstellt, ändert oder entstummt nichts. Auch im Toolset investigate verfügbar.
service(string, optional): Dienstname.environment(string, optional): Bereitstellungsumgebung (zum Beispielprod).entity_id(string, optional): UUID der Alarmgruppe (Entität), wie vonget_alert_groupszurückgegeben.muted_days(integer, optional): Ganze Tage, 1 bis 3650. Standard: 7; 0 bedeutet den Standardwert. Eine Regel, die länger als diesen Zeitraum stummgeschaltet ist, stellt einemuted_too_long-Lücke dar. Werte werden getrimmt; leere Zeichenfolgen werden ignoriert. Arten von Lücken: uncovered_signal (keine aktivierte Regel für latency, error_rate, throughput oder saturation; nennt eine deaktivierte Regel, die das Signal abdecken würde), all_rules_disabled (eine Alarmgruppe, deren Regeln alle deaktiviert sind), no_notification_channel (eine Regel, deren Schweregrad von keinem Kanal weitergeleitet wird, der der Alarmgruppe zugeordnet ist), muted_too_long (auf unbestimmte Zeit oder länger alsmuted_daysstummgeschaltet;muted_sinceist die letzte Aktualisierung der Regel undmute_untilwird bei einer Stummschaltung auf unbestimmte Zeit weggelassen).
Gibt kompaktes JSON {scope, generated_at, complete, summary, counts, groups} zurück. groups enthält einen Eintrag {kind, count, gaps, omitted} pro vorhandener Art und listet höchstens 10 Lücken pro Art auf (omitted zählt die übrigen; schränke den Umfang ein, um sie zu sehen); jede Lücke enthält suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel oder patch_alert) und suggested_args, das nur Eingaben enthält, die das Tool akzeptiert (patch_alert: entity_id, id und is_disabled=false oder mute_until=0; attach_notification_channel: alert_group_id und ein breach/threat severity; create_alert: entity_id; create_alert_from_chart: service_name); das eigene entity_id, rule_id und signal der Lücke werden daneben aufgeführt. Rufe das vorgeschlagene Tool nur auf, wenn es in der Sitzung verfügbar ist und der Benutzer zustimmt. complete ist nur dann true, wenn die API keine Lücken auflistet, alle Zählwerte 0 sind und mindestens eine Alarmgruppe dem Umfang entspricht (exakte Bezeichnungen service_name / env, abgeglichen mit der Liste von get_alert_groups); ein Umfang, der keiner Gruppe entspricht, eine fehlgeschlagene Abfrage oder Zählwerte ohne aufgelistete Lücken gelten nicht als vollständig, und summary gibt den Grund an.
get_alert_config
search_term(string, optional): Freitextsuche über Name, Gruppe, Datenquelle und Tags.rule_name(string, optional)severity(string, optional)rule_type(string, optional):staticoderanomaly.alert_group_name/alert_group_type/data_source_name(string, optional)tags(array, optional): Alle müssen übereinstimmen (UND-Logik).
Jede Regel listet Recent Evaluations auf: 5 Ein-Minuten-Messwerte, neueste zuerst, jeweils mit der UTC-Minute beschriftet, zu deren Ende sie erfasst wurden; der neueste endet 1–2 Minuten vor dem Aufruf, da der Monitor die letzte Minute verzögert auffüllt. firing; ok = der Monitor meldete, dass die Regel nicht ausgelöst wurde (normaler, behobener, ausstehender oder leerer Zustand, wie is_firing=0 in get_alert_rule_state); unknown = keine Monitorzeile für die Regel (noch nicht ausgewertet oder die Abfrage für diese Minute ist fehlgeschlagen; darauf wird am Anfang der Antwort hingewiesen) oder eine Zeile mit einem Zustand, der nicht firing, normal, resolved, pending oder empty ist (z. B. no_data, silenced). Deaktivierte Regeln zeigen none. Wenn mehr als 25 aktivierte Regeln übereinstimmen, wird der Verlauf für alle weggelassen und die Antwort weist darauf hin.
get_entity_kpis
Schreibgeschützt; in den Toolsets alerts und investigate. Listet alle KPIs einer Alarmgruppe auf, einschließlich KPIs, die noch von keiner Alarmregel verwendet werden. Verwende die zurückgegebenen IDs in expression_args / indicators_used; erfinde niemals eine ID.
entity_id(string, required): UUID der Alarmgruppe/Entität, ausget_alert_groupsoderget_alert_config.
Gibt JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]} zurück, sortiert nach Name. unit ist eine Anzeigebezeichnung: Schwellenwerte werden mit dem Rohwert der Abfrage verglichen. Wenn keine KPI passt, erstelle eine mit create_kpi. Das Ergebnis einer leeren Gruppe nennt create_kpi nur, wenn die Sitzung dies bereitstellt; mit --read-only (außer --allow-write-tools=create_kpi) oder dem Toolset investigate wird stattdessen angegeben, dass zum Erstellen einer KPI eine beschreibbare alerts-Sitzung erforderlich ist.
create_kpi
Erstellt eine KPI in einer vorhandenen Alarmgruppe; nur im Toolset alerts. Verwende es nur, wenn get_entity_kpis keine KPI mit der benötigten Abfrage enthält. Prüfe zuerst mit prometheus_range_query, ob die Abfrage Daten zurückgibt: Die API lehnt nur Abfragen ab, die nicht geparst werden können, und speichert eine gültige Abfrage auch dann, wenn die Metrik nicht existiert.
entity_id(string, required): UUID der Alarmgruppe/Entität.name(string, required): Innerhalb der Alarmgruppe eindeutig; ein zweiter Erstellungsversuch mit demselben Namen wird als Konflikt abgelehnt.query(string, required): PromQL. Um einen Alarm für ein Dashboard-Panel einzurichten, übernimm die PromQL des Panels ausget_dashboard.unit(string, required): Einheit des Rohwerts der Abfrage, z. B.seconds,ms,percent,ratio,count,req/s. Sie ist nur eine Bezeichnung und führt keine Umrechnung durch; Schwellenwerte werden daher mit dem Rohwert verglichen.description(string, optional)data_source_id(string, optional): Standardmäßig die Datenquelle der Alarmgruppe.
Kein MCP-Tool kann eine KPI löschen oder bearbeiten (verwende die Last9-Benutzeroberfläche). Bestätige daher vor dem Erstellen Name, Abfrage und Einheit. Erstelle sie einmal und bewahre die zurückgegebene ID für expression_args / indicators_used auf; bei einem Namenskonflikt verwende die vorhandene KPI-ID aus get_entity_kpis. Bei einem Timeout oder Verbindungsfehler wurde die Erstellung möglicherweise angewendet oder auch nicht: Prüfe vor einem erneuten Versuch den Namen mit get_entity_kpis. Gibt {"id","name","query","unit"} zurück.
get_alerts
time_iso(string, optional): Auswertungszeitpunkt im RFC3339-Format.window(integer, optional): Rückblick in Sekunden. Standard: 900. Bereich: 60–86400.lookback_minutes(integer, optional): Bereich: 1–1440.
get_alert_rule_state
start_time(integer or string, required): Beginn des Bereichs (einschließlich): Unix-Epoch-Sekunden (1718000000) oder RFC3339 (2024-06-10T06:13:20Z). Epoch-Millisekunden, -Mikrosekunden und -Nanosekunden werden in Sekunden umgerechnet; Werte vor dem 01.01.2000 werden abgelehnt.end_time(integer or string, required): Ende des Bereichs (einschließlich), in denselben Formaten.step(integer, required): Auflösung in Sekunden zwischen Messwerten. Die Anzahl der Messwerte((end_time - start_time) / step + 1)ist auf 100 begrenzt. Jeder Messwert entspricht einem Upstream-Aufruf über diemin(step, 3600)Sekunden bis zu seinem Zeitstempel; die Messwerte werden in Gruppen zu je 5 abgerufen. Dauert der Abruf länger als 60 s, gibt das Tool einen Fehler mit Hinweisen zum erneuten Versuch zurück.alert_group_id(string, optional): Nach Alarmgruppen-ID filtern.rule_name(string, optional): Regex-Filter für den Regelnamen.alert_group_name(string, optional): Regex-Filter für den Namen der Alarmgruppe.label_filters(string, optional): Durch Kommas getrenntekey=value-Label-Filter.state(string, optional): Nach Zustand filtern (z. B.firing).
Gibt eine JSON-Zuordnung von rule_id -> [{timestamp, is_firing}] zurück. Ein Zeitstempel, zu dem eine Regel in der Upstream-Antwort fehlt, wird als is_firing=0 gemeldet — das bedeutet „nicht als ausgelöst beobachtet“, nicht, dass ein normaler Zustand bestätigt wurde.
get_alert_hygiene
Schreibgeschützte Prüfung aktivierter Alarmregeln. Sie ändert nichts: Jede vorgeschlagene Korrektur ist ein Vorschlag und wird erst angewendet, wenn der Benutzer sie ausdrücklich bestätigt, und zwar über update_alert (Anpassung), patch_alert (is_disabled), delete_alert oder attach_notification_channel, sofern diese verfügbar sind.
window(string, optional):7doder30d. Standard:7d.limit(integer, optional): Maximale Anzahl zurückzugebender markierter Regeln, beginnend mit den problematischsten. Standard: 20. Bereich: 1–100.
Das Zeitfenster endet jetzt. Kategorien (eine Regel kann mehreren angehören): noisy (≥ 5 Auslösungen/Tag mit < 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 Flattern/Tag), stale (zuletzt vor dem Zeitfenster ausgelöst, ohne Auslösung darin, oder eine aktivierte konfigurierte Regel ohne Episode im Zeitfenster, während der Lebenszyklus coverage abgeschlossen ist und die API-Liste nicht abgeschnitten wurde), unrouted (keine Auslösung im Zeitfenster erreichte einen Kanal und der Alarmgruppe ist derzeit kein Kanal zugeordnet; wenn Zuordnungen nicht gelesen werden können, wird die Regel stattdessen unter unavailable.routed gezählt). Jede Statistik ist {status, count|value, reason} oder null: Ein nicht verfügbarer Wert wird niemals als null gelesen und überspringt nur die Prüfung, die ihn benötigt; unavailable zählt aktivierte Regeln pro fehlendem Wert (fire_count, flap_count, ack_rate, routed, rule_config für Regeln, die in der Liste der Alarmregeln fehlen und deren Korrekturen daher keinen aktuellen Wert enthalten, sowie activity für konfigurierte Regeln ohne Episode, deren Stille der Verlauf nicht belegen kann und die nicht bewertet werden). coverage gibt an, wie viel des Zeitfensters vom Alarmverlauf abgedeckt wurde; Raten werden anhand des abgedeckten Zeitraums berechnet, mindestens jedoch eines Tages. upstream_truncated ist true, wenn die API nur ihre 200 lautesten Regeln zurückgegeben hat, sodass leisere Regeln nicht ausgewertet wurden. Korrekturen basieren auf der Konfiguration jeder Regel in der Liste der Alarmregeln: bad_minutes erhöhen (das N in count_true(result) >= N) oder eval_window verlängern (höchstens 60 Minuten); bei verrauschten statischen Schwellenwerten den Schwellenwert in condition (expr > 100) verschieben oder den Ausdruck zu adaptive_std_cmp(metric, sensitivity, window) ändern; einen Benachrichtigungskanal zuordnen; veraltete Regeln deaktivieren oder löschen.
Gibt kompaktes JSON {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules} zurück, ausgelegt auf ein Ziel von 32 KB: truncated ist true, wenn die Anzahl markierter Regeln limit oder das Ziel überschreitet, und omitted_for_size zählt die Regeln innerhalb von limit, die aus Platzgründen abgeschnitten wurden (die problematischste Regel bleibt immer erhalten; ist eine einzelne Regel größer als 32 KB, wird sie allein zurückgegeben und überschreitet das Ziel); jede Regel enthält findings (category, reason, suggested_fix, optional alternative_fix) und das rohe stats.
get_notification_channels
scope(string, optional):attached(Standard) gibt eine Zeile pro Zuordnung zu einer Alarmgruppe zurück;idist eine Zuordnungs-ID, wie sie vondetach_notification_channelverwendet wird.channelsgibt die Kanäle der Organisation zurück (id,name,type,send_resolved,created_via);idist eine Kanal-ID, wie sie vonattach_notification_channelverwendet wird. Ziele, Header und Zertifikate werden niemals zurückgegeben.
Gibt konfigurierte Benachrichtigungskanäle (Slack, PagerDuty, E-Mail, Webhooks usw.) als TSV-Tabelle zurück. Zuordnungszeilen (service_fqid gesetzt) zeigen global false und services -; services listet nur veraltete Dienstbindungen auf. Bei Zuordnungszeilen ist send_resolved der gespeicherte Standardwert der Zeile, nicht der für die Zustellung verwendete Wert; Benachrichtigungen zur Auflösung folgen dem eigenen send_resolved des Kanals (scope=channels). Beide Bereiche enthalten created_via (last9-mcp für Zeilen, die ein MCP-Agent erstellt hat, andernfalls -).
recommend_alert_config
Schreibgeschützt. Gibt Hinweise zum Lebenszyklus, Validierungsschranken und Anforderungen an den Kontext für Einsatzkräfte zurück; die Angaben sind für sich genommen kein Beleg, daher sollten Schwellenwerte mit Telemetrie-Tools untermauert werden.
signal(string, required): Metrik oder Signal für die Auswirkungen auf Benutzer, einschließlich Einheit und Dimensionen.objective(string, required): Zu erkennendes Symptom oder Auswirkung auf Benutzer.rule_type(string, optional):static(Standard) oderanomaly.severity(string, optional):breach(Standard) oderthreat.environment(string, optional): Umgebung und Traffic-Profil.
validate_alert_expression
Testet einen Ausdruck, ohne ihn zu speichern. Vor create_alert / update_alert verwenden.
entity_id(string, required): UUID der Alarmgruppe/Entität.expression(string, required): Arithmetischer Ausdruck über Indikatoren, die mit dem exakten Namen ihrer KPI bezeichnet werden, z. B.errors / requests. Höchstens 3 Indikatoren. Namen mit Leerzeichen, Punkten oder Bindestrichen unverändert schreiben (Test Alert / errors), genau so, wiecreate_alertsie speichert.indicators_used(object, required, non-empty): Zuordnung von Indikatornamen zu KPI-UUIDs, dieentity_idgehören; mitget_entity_kpisdie IDs und Namen der KPIs der Gruppe auflisten. Verwende den exakten Namen jeder KPI: Dieser Testlauf akzeptiert beliebige Namen, abercreate_alertundupdate_alertlehnenexpression_args-Schlüssel ab, die nicht dem Namen der gebundenen KPI entsprechen. Nur der arithmetische Ausdruck wird geprüft (übergeben Sie den inneren Metrikausdruck, nicht einenadaptive_std_cmp(...)-Wrapper);condition/alert_conditionwerden nicht geprüft. Die Prüfung, ob mindestens eine Zeitreihe vorhanden ist, wird nur ausgeführt, wenn mehr als ein Indikator verwendet wird.
Gibt {"valid":true} oder {"valid":false,"reason":"..."} zurück; ein ungültiger Ausdruck ist ein normales Ergebnis und kein Toolfehler.
describe_alert_chart
Schreibgeschützt. Listet die alarmierbaren Signale (key, unit, eval_query, query_kind) in einem unterstützten Discover-Diagramm auf. Tokens mit Viewer-Rolle werden abgelehnt.
surface(string, erforderlich):discover-serviceoderdiscover-exceptions; jede andere Oberfläche, einschließlich benutzerdefinierter Dashboards, wird vor dem API-Aufruf abgelehnt (verwenden Sie stattdessencreate_alertmit einer KPI).chart_key(string, erforderlich): z. B.apdex,error_rate,response_time,exception_count.service_name(string, erforderlich)env(string, optional)attributes(object, optional): Zusätzliche Identitätsdimensionen unter Verwendung der Schlüsselnamen, die dieses Tool meldet.
create_alert
Erstellt eine Regel in einer vorhandenen Alarmgruppe, die immer deaktiviert ist (ein Entwurf, auch wenn is_disabled=false übergeben wird). Rufen Sie zuerst recommend_alert_config auf und aktivieren Sie die Regel anschließend mit patch_alert is_disabled=false erst, nachdem der Benutzer dies bestätigt hat. Erstellen Sie die Regel nur einmal und bewahren Sie die zurückgegebene Regel-ID auf. Ein rule_name, das die Alarmgruppe bereits verwendet (ohne Beachtung der Groß-/Kleinschreibung), wird abgelehnt, ohne etwas zu erstellen; dabei wird die ID der vorhandenen Regel genannt.
entity_id(string, erforderlich): UUID der Alarmgruppe/Entität.alert_rule(object, erforderlich): Vollständiger, typisierter Regelinhalt, einschließlichprimary_indicatorundexpression_args, die an echte KPIs der Entität gebunden sind. Jeder Schlüssel vonexpression_argsmuss exakt dem Namen der KPI entsprechen, an die er gebunden ist (kein Platzhalter wiex), undprimary_indicatorsowieexpressionverwenden diese Namen. Statische Regeln erforderncondition,alert_conditionundeval_window(0–60 Minuten). Adaptive Regeln verwendenexpression=adaptive_std_cmp(<primary_indicator>, sensitivity, window); die drei Felder sind dann optional (Standardwerteexpr > 0,count_true(result) >= 1,1).algorithmkann nicht festgelegt werden. Kontext für den Bereitschaftsdienst gehört inproperties(Beschreibung, Runbook, Anmerkungen,query_mode).
Die Benachrichtigungsweiterleitung wird für die Alarmgruppe konfiguriert, nicht für die Regel.
create_alert_from_chart
Erstellt eine Regel mit statischem Schwellenwert aus einem Diagramm, das von describe_alert_chart beschrieben wird. Wie bei create_alert wird die Regel deaktiviert als Entwurf erstellt und löst keinen Alarm aus; aktivieren Sie sie mit patch_alert is_disabled=false erst, nachdem der Benutzer dies bestätigt hat. Die Diagramm-API erstellt Regeln aktiviert, daher deaktiviert das Tool die Regel direkt nach ihrer Erstellung; schlägt dies fehl, wird ein Fehler mit der Regel-ID zurückgegeben, die möglicherweise aktiv ist.
surface/chart_key/service_name/signal_key/name(string, erforderlich)env(string, optional)attributes(object, optional)threshold(number, optional): In der Einheit des Signals; muss mindestens 0 sein. Für Signale mit Score-Einheit, etwa apdex, ist ein expliziter Wert erforderlich.threshold_operator(string, optional):>(Standard),<,>=,<=,==,!=.eval_window(integer, optional): Minuten, 1–60. Standard: 5.bad_minutes(integer, optional): 1–eval_window. Standard: 3.severity(string, optional):breachoderthreat.description(string, optional)group_id(string, optional): Normalerweise weglassen.
update_alert
Ersetzt die Auswertungskonfiguration einer Regel vollständig. Rufen Sie die Regel zuerst mit get_alert_config oder get_entity_alert_rules ab. Die Änderung wird abgelehnt, ohne etwas zu ändern, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört. Die Regel kann vorübergehend gelöscht und neu erstellt werden; verwenden Sie anschließend die zurückgegebene Ersatz-ID.
entity_id(string, erforderlich)id(string, erforderlich): UUID der Alarmregel.alert_rule(object, erforderlich): Vollständige Konfiguration; gleiche Struktur wiecreate_alert.
patch_alert
Ändert einen Teil der Regel und behält dabei ihre ID bei. Mindestens eine Änderung ist erforderlich. Die Änderung wird abgelehnt, ohne etwas zu ändern, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört.
entity_id(string, erforderlich)id(string, erforderlich): UUID der Alarmregel.is_disabled(boolean, optional):falseaktiviert die Regel,truepausiert sie.mute_until(integer, optional): Unix-Epoch-Frist;0hebt die Stummschaltung auf.properties(object, optional):description,runbook,annotations,query_mode. Jedes übermittelte Feld ersetzt den gespeicherten Wert; ausgelassene oder leere Felder behalten ihren gespeicherten Wert bei.annotationsersetzt die gesamte Zuordnung. Senden Sie daher alle Schlüssel, die erhalten bleiben sollen;{}löscht sie.recurring_mute_schedule(object, optional): Ersetzt den Wochenplan:enabled(Standardwert false),timezone(IANA-Name, erforderlich) undwindows(1–20 vonweekdaysalssun..sat,start_time/end_timealsHH:MMim 24-Stunden-Format). Eine Endzeit, die der Startzeit entspricht oder davor liegt, gilt für den nächsten Tag. Senden Sie alle Zeitfenster, die erhalten bleiben sollen.clear_recurring_mute_schedule(boolean, optional): Entfernt den Zeitplan vollständig; kann nicht mitrecurring_mute_schedulekombiniert werden. Unterscheidet sich vonenabled=false, wodurch die Zeitfenster gespeichert bleiben.
Benutzer mit Viewer-Rolle dürfen nur mute_until ändern. Änderungen an der Stummschaltung auf Regelebene werden abgelehnt, solange die Gruppe oder Entität stummgeschaltet ist. Lesen Sie Änderungen mit get_entity_alert_rules zurück; dort werden mute_until, recurring_mute_schedule und properties angezeigt.
delete_alert
Löscht eine Regel dauerhaft. Überprüfen Sie sie mit get_alert_config und holen Sie zuerst die ausdrückliche Bestätigung des Benutzers ein. Das Löschen wird abgelehnt, ohne etwas zu löschen, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört.
entity_id(string, erforderlich)id(string, erforderlich): UUID der Alarmregel.
mute_alert_group
Schaltet alle aktuellen und zukünftigen Regeln einer Gruppe stumm. Um eine einzelne Regel stummzuschalten, verwenden Sie patch_alert mit mute_until. Erfordert Editor-Zugriff.
entity_id(string, erforderlich): UUID der Alarmgruppe/Entität.until(integer, erforderlich): Unix-Epoch-Zeitpunkt, zu dem die Stummschaltung endet.0hebt die Stummschaltung auf; ein negativer Wert wie-1schaltet die Gruppe dauerhaft stumm.
acknowledge_alert
Übernimmt einen ausgelösten Alarm oder gibt ihn frei. Löst den Alarm nicht auf und schaltet ihn nicht stumm. Einen Alarm zu bestätigen, den Sie bereits besitzen, ist ein sicherer Vorgang ohne Auswirkungen. ack wird abgelehnt, ohne etwas zu speichern, sofern get_alerts nicht innerhalb der letzten Stunde genau diesen Alarm (alle drei IDs) aufführt.
alert_group_id/rule_id/rule_type(string, erforderlich): Aus dem Alarm inget_alertskopieren.action(string, optional):ack(Standard) oderunack. Nur der Besitzer oder ein Org-Administrator kann die Bestätigung aufheben.mute_until(integer, optional): Nurack. Zeichnet eine Stummschaltung auf, die Sie bereits mitmute_alert_groupoderpatch_alertangewendet haben; schaltet nichts stumm.
reassign_alert
Weist einen Alarm, der bereits einen Besitzer hat, einem anderen Benutzer zu. Hat der Alarm noch keinen Besitzer, bestätigen Sie ihn zuerst. Wenn keine Neuzuweisung erfolgt, weil der Alarm keinen Besitzer hat, wird angegeben, ob get_alerts diesen Alarm innerhalb der letzten Stunde überhaupt aufführt. Last9 benachrichtigt den neuen Besitzer nicht.
alert_group_id/rule_id/rule_type(string, erforderlich): Aus dem Alarm inget_alertskopieren.owner_email(string, optional): Bevorzugt; wird ohne Beachtung der Groß-/Kleinschreibung mit aktiven Benutzern der Organisation abgeglichen.owner_user_id(string, optional): Geben Sie genau eines vonowner_emailoderowner_user_idan.
create_notification_channel
Erstellt einen Kanal; er leitet erst dann Benachrichtigungen weiter, wenn er mit attach_notification_channel verknüpft wurde. Erstellen Sie ihn nur einmal und bewahren Sie die ID auf; es gibt kein Tool zum Aktualisieren. Gibt nur id, name, type und send_resolved zurück.
name(string, erforderlich): Muss pro Typ eindeutig sein; darf keinen Doppelpunkt enthalten.type(string, erforderlich):slack,pagerduty,opsgenie,emailodergeneric_webhook.destination(string, erforderlich): Slack-Incoming-Webhook-URL (oder Kanal-ID mitslack_app_mode), PagerDuty-Routing-Key, Opsgenie-API-Key, durch Kommas getrennte geschäftliche E-Mail-Adressen beliebiger Domains, nicht nur der Organisation (die API lehnt Adressen persönlicher Anbieter wie Gmail ab; bei einer Organisation mit persönlichem Login wird nur die Adresse des Administrators akzeptiert) oder eine HTTPS-Webhook-URL.slack_app_mode(boolean, optional): Nur für Slack. Standard: false.mention_handles(string, optional): Durch Kommas getrennt, z. B.user|U123ABC|name,special|here,special|channel.webhook_headers(object, optional): Nurgeneric_webhook.webhook_ca_certificate(string, optional): Nurgeneric_webhook; ein PEM-CA-Zertifikat mit bis zu 64 KiB.send_resolved(boolean, optional): Standard: true.
attach_notification_channel
Leitet Benachrichtigungen eines vorhandenen Kanals an eine Alarmgruppe weiter. Idempotent. Verknüpfungen übernehmen die Zustellungseinstellungen des Kanals (Header, Zertifikat, Erwähnungen) zum Zeitpunkt der Verknüpfung. Ändern sich die Kanaleinstellungen später, verknüpfen Sie den Kanal erneut.
channel_id(integer, erforderlich): Eine Kanal-ID (get_notification_channelsmitscope=channels), keine Verknüpfungs-ID.alert_group_id(string, erforderlich): Ausget_alert_groups.severity(string, erforderlich):breach,threatoderboth.botherstellt zwei Verknüpfungen; schlägt die zweite fehl, bleibt die erste bestehen und der Fehler nennt den Schweregrad, für den ein erneuter Versuch erforderlich ist.
detach_notification_channel
Entfernt eine Verknüpfung. Erfordert ein Token mit Löschberechtigung; ein Token mit Schreibberechtigung kann keine Verknüpfung entfernen.
attachment_id(integer, erforderlich): Dieidausget_notification_channelsmitscope=attached. Kanal-IDs werden abgelehnt.alert_group_id(string, optional): Wird abgelehnt, wenn die Verknüpfung zu einer anderen Gruppe gehört.
delete_notification_channel
Löscht einen Kanal dauerhaft, sofern er keine Verknüpfungen hat; entfernen Sie zuerst seine Verknüpfungen. Erfordert ein Token mit Löschberechtigung. Bestätigt das Löschen, indem die Kanäle erneut aufgelistet werden.
channel_id(integer, erforderlich): Dieidausget_notification_channelsmitscope=channels. Verknüpfungs-IDs werden abgelehnt.
did_you_mean
query(string, erforderlich): Der zu suchende Name – teilweise, falsch geschrieben oder abgekürzt.type(string, optional): Auf Entitätstyp beschränken:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Gibt bis zu 3 ähnlichste Treffer mit Ähnlichkeitswerten zurück. Verwenden Sie dieses Tool vor jedem Tool-Aufruf, bei dem der Entitätsname unklar ist. Wenn ein vorheriger Aufruf keine Ergebnisse zurückgegeben hat, verwenden Sie dieses Tool vor einem erneuten Versuch.
get_service_profile
service_name(string, erforderlich): Dienst, für den ein Telemetrieprofil abgeleitet werden soll.datasource(string, optional): Datenquellenname. Für den Standardwert weglassen; ein ungefährer Name wird wie bei den Prometheus-Tools aufgelöst. Gibt einen kurzen Untersuchungsbericht gefolgt vom vollständigen Profil als unformatiertes JSON zurück: Signalverfügbarkeit (logs/traces/metricsalspresent,absentoderunknown), Sprache und Laufzeitumgebung, Bereitstellungsumgebungen, Log-signal_shape(log_format,severity_set,level_field,trace_context_in_logs) sowie eine empfohlene Korrektur für die Ingestion, sofern zutreffend. Wenn das Backendfreshnessmeldet, enthält der Bericht eine Zeile zulast seenmitfreshness.logs.last_seenundfreshness.traces.last_seen(RFC3339 odernone, wenn null) sowie eine Warnung zutraces stale, wennfreshness.traces_staletrueist: Spans wurden nicht mehr erfasst, während Logs weiterhin eingingen. Untersuche daher eine Regression im Bereichfreshness.traces.last_seenund nicht eine fehlende Einrichtung. Abgeleitet aus vorgelagerten Daten und zwischengespeichert mit einer TTL von etwa 15 Minuten.
Rufe es vor jeder dienstbezogenen Untersuchung auf, damit die Toolauswahl zur tatsächlichen Telemetrie des Dienstes passt — überspringe Trace-Tools, wenn traces absent ist, und parse bei severity_set mit dem Wert none oder partial den Schweregrad aus level_field im Log-Body, statt severity_filters zu verwenden. metrics ist immer unknown, und dependencies ist in v1 nicht befüllt. Wenn logs und traces beide absent sind, bestätige den Namen mit did_you_mean, bevor du zu dem Schluss kommst, dass der Dienst nicht überwacht wird.
list_dashboards
name(string, optional): Groß-/Kleinschreibung ignorierter Teilstring des Dashboardnamens. Schränkt die Liste ein undtotal.limit(integer, optional): Dashboards pro Seite, 1–200. Standard: 100.cursor(string, optional):next_cursorder vorherigen Seite; übergib dazu dasselbename.
Gibt {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"} zurück, zuerst die zuletzt aktualisierten. created_by wird weggelassen, wenn es leer ist; locked wird weggelassen, wenn die API readonly nicht meldet. updated_at ist die Unix-Epochenzeit in Sekunden als String. Eine Seite endet vorzeitig, damit die Antwort unter 32 KB bleibt; auf der letzten Seite fehlt next_cursor.
get_dashboard
id(string, required): Dashboard-UUID.region(string, optional): Region zum Befüllen der Panelabfragen. Standardmäßig wird die konfigurierte Datasource-Region verwendet.
Das Ergebnis ergänzt die oberste Ebene um locked (false, wenn die API es weglässt) und created_by (die Benutzer-ID des Autors).
Informationen zum Erstellen eines Alerts für ein Panel findest du unter last9://reference/alerting.
validate_dashboard
Schreibgeschützt. Erstellt oder aktualisiert niemals Dashboards. Akzeptiert genau eines von dashboard_id oder dashboard_definition.
dashboard_id(string, optional): UUID des gespeicherten Dashboards, das validiert werden soll.dashboard_definition(object, optional): Inline-Body eines nicht gespeicherten Dashboards (echter Dry Run). Ein{dashboard, metadata}-Create-Envelope wird in seindashboard-Objekt entpackt.start_time_iso/end_time_iso(string, optional): Validierungszeitraum (RFC3339). Muss ≤ 24h sein.region(string, optional): Region für die Ausführung von Panelabfragen.
Gibt dashboard_validation/v1 zurück: Klassifizierung der Lint- und Ausführungsergebnisse pro Panel (data / no_data / invalid / error). Leere Ergebnisse am ersten Tag werden als valid_no_data klassifiziert, ohne Diagnoseprüfungen. Ein Dashboard ohne Panels gibt success: false mit error: "no_panels" zurück. Panel-Felder aus anderen Formaten (Grafana gridPos, title, type sowie targets bei Panels, die Abfragen benötigen) und falsch typisierte Felder werden pro Panel unter shape_problems aufgeführt, in summary.panels_invalid_shape gezählt und bewirken, dass overall fail ist.
preview_dashboard
Schreibgeschützte clientseitige Vorschau. Übergib entweder dashboard (das nicht gespeicherte Dashboard-Objekt aus einer Create-Anfrage) oder id zusammen mit ops (dieselben geordneten Operationen wie bei patch_dashboard). Die erforderlichen Werte start_time_iso und end_time_iso sind RFC3339-Zeitstempel mit einem Abstand von höchstens 24 Stunden. Optional enthält variables skalare Überschreibungen; andernfalls gelten die Dashboard-Werte und integrierten Standardwerte.
{
"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"
}
Gibt saved: false, eine Zusammenfassung der Definition/Abfrage mit validation (einschließlich definition_error bei einer Abweichung vom Create-Schema) sowie panels mit dem Status ok / empty / error, aufgelösten Abfragen und Diagnosen der Ziele zurück. PromQL und LogJSON werden ausgeführt; nicht unterstützte Abfragetypen und nicht aufgelöste Variablen führen zu einem Fehler des Panels. Gültige Panels ohne Abfragen sind ok; ungültige Paneldefinitionen sind error. Der Patch diff enthält die Nettoänderungen an panels_added, panels_changed (einschließlich Verschiebungen) und panels_removed sowie Änderungen durch geordnete Operationen. IDs und nullbasierte Indizes identifizieren Panels; entfernte Indizes beziehen sich auf das ursprüngliche Dashboard. Gespeicherte Panels müssen eindeutige, nicht leere IDs haben.
Grenzwerte: 50 Panels, 100 Abfragen, 100 Operationen, jeweils 65536 JSON-Bytes für Eingabe und Kandidaten-Dashboard sowie ein Ausführungszeitlimit von 60 Sekunden. Aufgelöste Abfragen mit mehr als 65536 JSON-Bytes werden vor der Ausführung abgelehnt. Die Evidenz umfasst höchstens drei Stichproben und 1024 JSON-Bytes pro Ziel; truncated: true wird angegeben, wenn Stichproben ausgelassen werden. Ein JSON-Bericht mit mehr als 262144 Bytes schlägt fehl und enthält Hinweise zur Verkleinerung der Eingabe.
Es wird kein Dashboard erstellt oder aktualisiert. Dabei wird der Kandidat anhand des Create-Schemas und der Abfragen mit dem vorhandenen Validator geprüft; dies garantiert weder die Annahme durch das Backend noch die Darstellung. Vom Backend zugewiesene IDs, Standardwerte, verworfene Felder oder gleichzeitige Änderungen können das gespeicherte Ergebnis verändern. Die Vorschau verwendet dieselben lokalen Patch-Operationen und Panel-Versionsstandardwerte wie ein Schreibvorgang.
create_dashboard
Nur für neue Dashboards. Nachdem dieser Aufruf dashboard.id zurückgibt, bearbeite Panels mit patch_dashboard (oder strukturiere das Dashboard mit update_dashboard um) — erstelle es nicht erneut, um Panels hinzuzufügen, zu kürzen oder zu korrigieren.
dashboard(object, required): Dashboarddefinition mitnameundpanels[]. Jedes Panel benötigtname,version,layout(x,y,w,h),visualization.typeundqueries[].metadata(object, optional): Dashboard-Metadaten — Felder_categoryund_type(z. B.{"_category":"custom","_type":"metrics"}).
update_dashboard
Nur zum Umstrukturieren eines Großteils eines Dashboards verwenden; zum Hinzufügen, Bearbeiten, Entfernen oder Verschieben einzelner Panels patch_dashboard verwenden. Vollständiger Ersatz anhand der ID (derselbe Body wie beim Erstellen): Jedes Panel muss erneut exakt übermittelt werden.
id(string, required): UUID des zu aktualisierenden Dashboards.dashboard(object, required): Vollständiger Ersatz-Body des Dashboards (dieselbe Struktur wie beim Erstellen).metadata(object, optional): Ersatzmetadaten. Schreibgeschützte System-Dashboards geben einen behebbaren Toolfehler zurück.
patch_dashboard
Für kleinere Anpassungen gegenüber update_dashboard bevorzugen: Unveränderte Panels werden nie erneut übermittelt. Liest das Dashboard, wendet ops der Reihe nach an und schreibt es zurück. Änderungen, die zwischen Lesen und Schreiben an anderer Stelle vorgenommen wurden, werden dadurch überschrieben. Gibt {dashboard_id, changes[]} zurück; Operationen, die das Dashboard bereits erfüllt, werden ausgelassen. Wenn keine Operation etwas ändert, wird nichts geschrieben. Der Diff wird nach dem Schreiben mit einem erneuten Lesen abgeglichen: Panel-fields zeigen gespeicherte Werte, not_stored listet Schlüssel auf, die die API verworfen hat, und not_removed listet Schlüssel auf, die sie trotz eines null beibehalten hat. Diff-Werte mit mehr als 200 Zeichen werden direkt gekürzt, wobei ihr JSON-Typ erhalten bleibt.
id(string, required): UUID des zu patchenden Dashboards.ops(array, required): Der Reihe nach angewendete Operationen; ist eine davon ungültig, wird nichts geschrieben und der Fehler nennt sie alsops[i].add_panel:panel(vollständiges Panel-Objekt;versionist standardmäßig 1), optionalindex(nullbasierte Einfügeposition, standardmäßig am Ende).update_panel:panel_id,fields(zu ersetzende Panel-Schlüssel der obersten Ebene;nullentfernt einen Schlüssel;idkann nicht geändert werden).remove_panel:panel_id.move_panel:panel_id,index(nullbasierte Position nach dem Verschieben).set_title:title(der Dashboardname).set_variable:variable; ersetzt die Variable mit demselbentarget, andernfalls wird sie angehängt.
delete_dashboard
id(string, required): UUID des zu löschenden Dashboards. Schreibgeschützte System-Dashboards können nicht gelöscht werden.
set_dashboard_lock
id(string, required): Dashboard-UUID.locked(boolean, required):truesperrt das Dashboard,falseentsperrt es.
Schreib-Tool; nur aufrufen, wenn der Benutzer ausdrücklich darum bittet. Nur der Autor des Dashboards oder ein Org-Admin kann es sperren oder entsperren; integrierte Dashboards sind immer schreibgeschützt. Gibt {"id", "locked"} mit dem resultierenden Status zurück. Solange das Dashboard gesperrt ist, führen update_dashboard, patch_dashboard und delete_dashboard keine Schreibvorgänge aus und geben einen behebbaren Toolfehler zurück, der mit dashboard is locked beginnt, den Autor nennt und zum Entsperren oder Kopieren des Dashboards mit create_dashboard auffordert.
list_dashboard_snapshots
dashboard_id(string, required): UUID des Dashboards, dessen Snapshots aufgelistet werden sollen.
Gibt nur Metadaten zurück (id, name, expires_at usw.). Verwende get_dashboard_snapshot für eingefrorene Paneldaten.
get_dashboard_snapshot
id(string, required): Snapshot-UUID.
Gibt den vollständigen eingefrorenen Snapshot einschließlich dashboard_definition, panel_data, time_range und variables zurück.
delete_dashboard_snapshot
id(string, required): UUID des zu löschenden Snapshots.
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(optional): Zeitraum; bevorzuge Lookback oder explizite ISO-Grenzwerte (Standard: 60m).region(string, optional): Regionsüberschreibung.
Gibt Dienste zurück, für die im Zeitraum Profiling-Daten vorliegen. Vor get_flamegraph / get_top_functions / get_profile_summary aufrufen.
get_flamegraph
service(string, required): Dienstname ausget_profile_services.profile_type(string, optional):cpu(Standard),allocoderwall. Beim Vergleichen von Zeiträumen einen Typ festlegen.env/cluster/namespace/runtime(string, optional): Bereichsfilter.limit(number, optional): Maximale Anzahl aggregierter Stack-Zeilen (Standard: 1000, Maximum: 10000).lookback_minutes/start_time_iso/end_time_iso/region(optional).
Gibt einen verschachtelten Flamegraph-Baum zurück (name / value / self / children). truncated: true bedeutet, dass das API-Zeilenlimit erreicht wurde.
get_top_functions
Dieselben Filter wie bei get_flamegraph. Gibt eine Rangliste der heißesten Funktionen nach Self-Samples zurück. Das Ergebnis kann abgeschnitten sein; prüfe truncated.
get_profile_summary
Dieselben Filter wie bei get_flamegraph. Gibt eine kurze natürlichsprachliche Triage des Profils für den Dienst zurück.
grafana_search_dashboards
query(string, optional): Teilstring des Titels. Eine leere Angabe listet breit gefächert auf (vorbehaltlich des Limits von 5.000 Zeilen).
Gibt {"dashboards":[…], "truncated":bool} mit uid, title, uri, url, type und tags zurück. Verwende uid mit grafana_get_dashboard.
grafana_get_dashboard
uid(string, required): Grafana-Dashboard-UID.full_json(boolean, optional): Bei true wird das rohe Grafana-JSON statt der gefilterten Zusammenfassung zurückgegeben.
Standardzusammenfassung: Version, Tags, Templating-Variablen und für jedes Panel Typ/Datasource/gridPos/PromQL-Ziele. Unbekannte Paneltypen von Plugins erscheinen in unsupportedPanelTypes.
grafana_list_folders
Keine Parameter. Gibt den Ordnerbaum zurück.
grafana_list_folder_dashboards
folder_uid(string, erforderlich): Grafana-Ordner-UID.
Gibt {"dashboards":[…], "truncated":bool} für Dashboards in diesem Ordner zurück (paginiert, bis zu 5.000).
grafana_list_datasources
Keine Parameter. Gibt eine sichere Projektion der Datenquellen zurück (keine Anmeldedatenfelder).
Tests
Führe den Goroutine-Analyzer für Tests aus, ohne die Anwendungstests auszuführen:
make lint-test
Dabei wird Go's testinggoroutine-Analyzer auf alle Pakete angewendet, einschließlich ihrer
*_test.go-Dateien, und anhand unsicherer und sicherer Fixtures geprüft. Beide CI-Test-
Workflows führen go vet -testinggoroutine ./... als separaten Schritt aus, sodass zwischengespeicherte
Paketergebnisse die Lint-Prüfung nicht umgehen können.
Das Root-Paket führt den Analyzer außerdem als Test aus. Verwende go test -count=1 ./...
für die vollständige Testsuite mit deaktiviertem Cache für diese Prüfung: Go's Test-Cache erfasst keine
internen Paketquelldateien, die vom Analyzer-Unterprozess gelesen werden. Ein einfaches
go test ./... kann das erfolgreiche Testergebnis des Root-Tests wiederverwenden, nachdem sich diese Dateien geändert haben.
Fatal, Fatalf und FailNow auf testing.T oder testing.B müssen in der
übergeordneten Test-Goroutine ausgeführt werden. Worker sollten Fehler zurücksenden, damit der übergeordnete Test sie prüfen kann:
errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
t.Fatal(err)
}
Der Analyzer erkennt direkte Aufrufe in go func-Closures; er prüft nicht allgemein
interprozedural auf Assertions, die hinter beliebigen Hilfsaufrufen verborgen sind.
Integrationstests werden nur ausgeführt, wenn TEST_REFRESH_TOKEN gesetzt ist.
