Last9
官方無縫地將即時生產環境上下文——日誌、指標和追蹤——帶入您的本地環境,以更快地自動修復程式碼。
你可以用 Last9 MCP 做什麼?
- 調查正式環境事件 — 請助理擷取某項服務的日誌、追蹤、指標、例外和觸發中的警報,以診斷故障原因。
- 關聯變更與影響 — 檢查部署和設定變更,再比較變更前後的服務及其呼叫端,確認變更是否造成回歸問題。
- 查詢 Prometheus 指標 — 執行 PromQL 範圍或即時查詢,並列出標籤值,以探索資料來源中的任何指標。
- 檢查資料庫效能 — 探索資料庫、找出執行緩慢的查詢,並檢視查詢模式和來自 OTel spans 的伺服器端指標。
- 分析追蹤與效能分析資料 — 依 ID 擷取追蹤瀑布圖、比較不同群組間的屬性差異並排序,或擷取服務的火焰圖和熱門函式。
- 管理警報與儀表板 — 檢視警報涵蓋範圍與健全狀況、建立或修補警報規則,以及列出、驗證或編輯自訂儀表板。
文件
Last9 MCP Server

你的 AI 代理不知道正式環境出了什麼問題。這個伺服器能解決這個問題。
Last9 MCP Server 可將 Claude、Cursor、Windsurf 及任何其他支援 MCP 的 AI 助理,直接連接到你的正式環境可觀測性資料——日誌、指標、追蹤、例外、資料庫查詢、警示和部署。代理不再猜測,而是開始讀取實際訊號。
30 秒內開始使用(託管版)
無需安裝二進位檔。無需管理權杖。只要一個 URL,在瀏覽器中完成 OAuth,就大功告成。
在你的 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
輸入 /mcp,選取 last9,然後完成驗證。就這麼簡單。
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
按一下 Connect,完成 OAuth。
VS Code
需要 v1.99+。開啟命令選擇區 → MCP: Add Server,貼上 URL,然後完成驗證。
或直接在 settings.json 中設定:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > 齒輪圖示 (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector。 將名稱設為 last9,貼上 URL,然後完成驗證。
需要 Claude 組織的管理員權限。
自行託管(STDIO)
當你的 MCP 用戶端不支援 HTTP 傳輸,或需要在本機執行伺服器時,請使用此方式。
安裝
Homebrew:
brew install last9/tap/last9-mcp
NPM:
需要 Node.js 22.23.4+、24.22.1+ 或 26.12.1+:較早版本在安裝程式下載二進位檔時,會接受來自遭入侵的 eMudhra 中繼憑證的 TLS 憑證。
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
二進位檔版本(Windows/手動安裝):
從 GitHub Releases 下載:
| 平台 | 壓縮檔 |
|---|---|
| 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
只有管理員可以建立權杖。
- 前往 API Access
- 按一下 Generate Token,並授予 Write 權限
- 複製權杖
用戶端設定
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>"
}
}
}
}
貼上位置:
| 用戶端 | 位置 |
|---|---|
| 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 > 齒輪圖示 (mcp_config.json) |
| VS Code | 在 settings.json 中以 { "mcp": { "servers": { ... } } } 包裝 — 詳細資訊 |
VS Code STDIO 設定
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
NPM 使用者:使用 "command": "npx" 並新增 "args": ["-y", "@last9/mcp-server@latest"]。
Windows
從 GitHub Releases 下載後,解壓縮並指定完整路徑:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
在 Windows 上使用 NPM 方式更簡單——無需管理路徑。
環境變數
| 變數 | 預設值 | 說明 |
|---|---|---|
LAST9_REFRESH_TOKEN | (必填) | 從 API Access 取得的 Refresh Token |
LAST9_DATASOURCE | 組織預設值 | 資料來源/叢集名稱——擁有多個 Levitate 叢集時很有用 |
LAST9_FAKE_NOW_ISO | (未設定) | 僅供評估/重播使用;絕不可在正式環境中設定。 RFC3339 時刻(例如 2026-01-02T15:04:05Z),在解析相對時間範圍(例如 lookback_minutes)時取代目前時間,讓執行結果可重現。無效值會導致啟動錯誤。逾時、快取和權杖到期仍使用實際時間 |
LAST9_API_HOST | app.last9.io | 覆寫 API 主機 |
LAST9_TOOLSETS | 所有工具 | 以逗號分隔要公開的工具集(logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all)。別名:LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | 將 true 設為僅提供唯讀工具;請參閱唯讀模式。非布林值會導致啟動錯誤。別名:LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | 在唯讀模式下仍提供的寫入工具,以逗號分隔。別名:LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | 分塊 get_logs 請求的項目數上限 |
LAST9_USE_LOG_SEARCH_API | false | 將 true 設為 get_logs 和 get_service_logs 啟用單次伺服器端搜尋呼叫,而非用戶端分塊。每次呼叫最多 90 秒,之後會提供縮小時間範圍的建議;若收到 502 或 503,會在此時間內重試一次 |
LAST9_DEBUG_CHUNKING | false | 將 true 設為記錄 get_logs、get_service_logs、get_traces 的分塊規劃詳細資訊 |
LAST9_DISABLE_TELEMETRY | true | 將 false 設為啟用內部 OTel 追蹤 |
OTEL_SDK_DISABLED | — | 標準 OTel 環境變數。會覆寫 LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | OTLP 收集器端點(僅在啟用遙測時使用) |
OTEL_EXPORTER_OTLP_HEADERS | — | OTLP 驗證標頭(僅在啟用遙測時使用) |
工具階段計時
啟用內部遙測後,工具 span 會帶有 last9.phase.<phase>.duration_ms
(實際經過的毫秒數)和 last9.phase.<phase>.failed(該階段是否
傳回錯誤)。當設定的記錄器接受 debug 記錄時,也會以 tool phase completed debug
日誌輸出相同欄位,並包含 tool 和 phase。
這些計時不會加入輸入內容、查詢文字、憑證或錯誤本文。
| 工具 | 階段 |
|---|---|
get_log_patterns | sample:擷取並解碼樣本;mine:模式探勘;deep_link:解析選用索引並建立連結 |
get_logs | fetch:擷取、解碼並合併結果,包括重試和選用的計數合理性檢查;count_sanity:巢狀選用檢查;post_process:指引、摘要和 JSON 格式化;deep_link:索引解析和連結建立 |
get_service_profile | request:透過共用 API 用戶端準備並傳送請求,並讀取完整回應,之後才進行簡要格式化 |
只會記錄實際執行的階段,包括失敗的擷取。會抑制錯誤的選用輔助程序仍維持原有行為;failed: false 不代表選用連結或計數檢查一定可用。巢狀的 count_sanity 時長已包含在 fetch 中;請勿重複加總。擷取時間包含用戶端作業,因此不只是後端執行時間的測量值。調整取樣或快取前,請先比較相同時間範圍和搜尋路徑的各階段。
調查延遲時,請在基準版本和候選版本上,以相同的服務、資料來源、索引、時間範圍和限制進行重播。記錄建置 SHA、工具總耗時、階段時長、last9.logs.search_path、重試屬性(若有)以及涵蓋範圍旗標。除了典型呼叫,也要比較緩慢的呼叫。擷取或設定檔請求緩慢,表示應調查網路/API 階段;在將長尾延遲歸因於後端之前,必須先取得與後端執行相關的證據。僅憑這些診斷資料,無法證明延遲有所改善。
唯讀模式
--read-only(或 LAST9_MCP_READ_ONLY=true)只會提供標註為 readOnlyHint: true 的工具,因此沒有任何工具可以建立、變更或刪除警示規則、通知管道、儀表板或 drop 規則,也無法確認或重新指派警示,或將群組設為靜音。沒有註解的工具會視為寫入工具並隱藏。
若要保留少數寫入工具,請使用 --allow-write-tools(或 LAST9_MCP_ALLOW_WRITE_TOOLS)列出它們:
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- 若允許的名稱不是寫入工具(例如拼字錯誤或讀取工具名稱),伺服器會拒絕啟動;錯誤訊息會列出有效的寫入工具。
- 若設定
--allow-write-tools卻未設定--read-only,會導致啟動錯誤,因為此時已提供所有寫入工具。 - 唯讀模式可與
--toolsets搭配使用:工具必須同時符合兩者才會提供。--toolsets=alerts --read-only --allow-write-tools=mute_alert_group會提供警示讀取工具以及mute_alert_group;不在所選工具集中的允許寫入工具仍會隱藏。 --http模式和dump-tools使用相同的旗標和環境變數:go run . dump-tools --read-only會列印唯讀介面,以及伺服器在instructions中提供的指示。- 讀取工具的說明、結構描述和結果,以及伺服器指示,都不會提及隱藏的寫入工具。允許的寫入工具仍可能提及其隱藏的同類工具(
create_alert會建立停用的規則,而patch_alert會啟用該規則),因此請一併允許這類成對工具。
功能
概覽
get_workspace_overview— 當請求未指定服務或工具時,建議優先呼叫此工具(若有指定,則直接呼叫對應工具):透過一次低成本呼叫取得環境、過去一小時內觀察到的訊號(日誌、追蹤、指標)、服務和警示群組數量、觸發中的警示,以及目前時間。若某訊號在該小時內未出現,仍可能有較早的資料,因此仍可查詢。子呼叫失敗時,其欄位會設為null,並新增一筆errors[]項目。所有工具集都會提供此工具get_current_time— 目前時間,以及last 2h、yesterday或since yesterday 9am IST的絕對界限;支援任何 IANA 時區或常見縮寫。所有工具集都會提供此工具
服務健康狀況
get_service_summary— 依排名排列的整體服務(service, env)列:區間 request_count、throughput_rpm、HTTP 4xx/5xx 計數和 gRPC 錯誤計數get_service_environments— 服務可用的環境。請先執行此工具——其他 APM 工具需要此處提供的envget_service_performance_details— 完整分析:吞吐量、錯誤率、p50/p90/p95/平均值/最大值、apdex、可用性(預設為摘要;使用include_series可取得完整序列)get_service_operations_summary— 依 HTTP 端點、資料庫呼叫、訊息傳遞和 HTTP 用戶端分組的作業get_service_dependency_graph— 依上游/下游/基礎架構顯示吞吐量、延遲和錯誤率的相依性對應圖get_apm_service_deviations— 將目前時間範圍與等長基準時間範圍比較:回歸/改善、Apdex 調節,以及最終結果(整體服務或單一服務)get_exceptions— 可依服務和 span 篩選的伺服器端例外
資料庫可觀測性
四種工具可直接檢視資料庫效能,資料來自 OpenTelemetry trace span;若沒有追蹤資料,則使用 CloudWatch 等基礎架構指標。如果你已在使用 OTel,無需額外進行檢測。
get_databases— 探索基礎架構中的所有資料庫:DB 類型、主機、吞吐量(queries/min)、p95 延遲、錯誤率、相依服務數量。也會探索 CloudWatch 等基礎架構指標中的資料庫,無需追蹤插樁 — 這些資料列會顯示活動值,而非追蹤指標get_database_slow_queries— 依執行時間排序的實際最慢查詢執行項目,附有追蹤 ID,可深入查看完整追蹤get_database_queries— 查詢模式與彙總:查詢執行頻率、平均/p95 執行時間、錯誤率get_database_server_metrics— 來自 DB 主機本身的伺服器端指標(CPU、連線數、緩衝區命中率 — 取決於您的 DB 系統)
支援 PostgreSQL、MySQL、MongoDB、Redis、Aerospike,以及任何帶有 db_system 屬性的 OTel 追蹤 — 也支援從 CloudWatch 等基礎架構指標探索到的資料庫,其資料列會顯示活動值,而非追蹤指標。
Prometheus / PromQL
prometheus_range_query— 對任何指標執行 PromQL 範圍查詢prometheus_instant_query— 即時查詢;使用avg_over_time、sum_over_time等彙總函式prometheus_label_values— 指定序列的標籤值prometheus_labels— 序列可用的所有標籤
設定 LAST9_DATASOURCE,或在個別呼叫中設定 datasource,即可將這些查詢指向不同於預設值的資料來源/叢集。省略 datasource 時會使用預設值;若有唯一且比對器認為安全的近似名稱(例如大小寫變體),則會使用最接近的比對結果。缺少、多出或調換字母的名稱不保證會自動解析:即使只有一個候選項,若編輯可能影響區域或環境代碼,也可能需要確認。較寬鬆或有歧義的比對會傳回候選項,且不會執行查詢(不算錯誤);未知名稱則會傳回錯誤。只要您未精確指定資料來源,就會在額外的內容區塊中指出所用的資料來源。get_metric_status、get_service_profile 和 get_apm_service_deviations 會以相同方式解析 datasource。
日誌
get_logs— 完整的 JSON 管線日誌查詢(彙總、篩選、欄位擷取)get_service_logs— 服務的日誌行,可依嚴重性和本文內容篩選;除非response_mode為raw,否則會彙總超過 20 行的結果get_log_patterns— 將時間範圍內服務的日誌行依訊息範本分群,並提供數量、首次/最後出現時間、嚴重性分布和範例get_emerging_log_patterns— 與基準時間範圍相比,新增、增加、減少或消失的日誌範本,並提供兩個時間範圍的數量get_log_attributes— 指定時間範圍內日誌結構描述屬性的全域目錄get_log_attributes_for_pipeline— 進行中管線實際存在的日誌欄位(範圍限定探索),每個欄位都附有其精確的filter_fieldget_drop_rules— Last9 Control Plane 中的日誌丟棄規則add_drop_rule— 建立新的丟棄規則,從來源端減少日誌量get_remapping_rules— Last9 Control Plane 中的重新映射規則(logs_extract、logs_map、traces_map)add_remapping_rule— 建立重新映射規則,在擷取時擷取或映射日誌與追蹤屬性
追蹤
get_traces— 用於廣泛搜尋與彙總的 JSON 管線追蹤查詢get_service_traces— 依精確追蹤 ID 或服務名稱查詢追蹤。若您有追蹤 ID,請使用此工具 — 速度較快get_trace_attributes— 追蹤結構描述屬性的全域目錄get_trace_attributes_for_pipeline— 進行中管線實際存在的屬性(範圍限定探索),每個屬性都附有其精確的filter_fieldget_trace_attribute_values— 追蹤屬性的不同值,可選擇限定於特定管線get_trace_attribute_deviations— 對兩組有界限的 span 群組(慢與快、錯誤與非錯誤,或兩個時間範圍)中不同的屬性值進行排名。這是相關性,不代表因果關係get_trace_waterfall— 將單一精確追蹤呈現為父/子瀑布圖,包含區間聯集自耗時、最慢 span 和圖形警告
變更事件與警示
get_change_events— 部署、設定變更、回復。將事件與變更內容關聯analyze_change_impact— 變更是否造成問題?比較變更前後的服務及其直接呼叫端:黃金訊號、APM 與追蹤屬性偏差、新觸發的警示,以及判定結果(regression likely/no significant change/insufficient data)get_alert_groups— 已設定的 Compass 警示群組,包含中繼資料標籤、團隊、層級和規則數量 — 也包括沒有規則或未觸發的群組get_alert_operations_summary— 時間範圍內的待命健康狀況:觸發與已確認的警示、待處理項目、通知傳送情況,以及使用include_rules時最吵雜、反覆觸發和未路由的規則。每個數量都附有其status(available/partial/unavailable)get_alert_coverage— 尚未設定警示的項目:未涵蓋的黃金訊號、完全停用或未路由的警示群組,以及靜音時間過長的規則;每項都附有建議的修正工具。唯讀。get_alert_config— 警示規則設定 — 可依名稱、嚴重性、類型、標籤搜尋get_entity_kpis— 單一警示群組中的所有 KPI(ID、名稱、PromQL、單位),包括尚未被任何規則使用的 KPI — IDcreate_alert和validate_alert_expression需要create_kpi— 當沒有合適的現有 KPI 時,在警示群組中建立 KPI(PromQL + 單位)。建立一次並保留傳回的 IDget_alerts— 時間範圍內目前正在觸發的警示get_alert_rule_state— 時間範圍內各警示規則的歷史觸發狀態(1/0),依rule_id分組。可依警示群組、規則名稱、標籤篩選器和狀態篩選。get_alert_hygiene— 過去 7 或 30 天內吵雜、反覆觸發、過時及未路由的警示規則,依排名列出,並附有判定依據的數據和建議修正方式。唯讀。get_notification_channels— 已設定的通知管道(Slack、PagerDuty、電子郵件等)。scope=channels會列出管道本身(用於附加的 ID);預設的attached會列出各警示群組的附加項目recommend_alert_config— 建立警示規則前的唯讀設計指引(生命週期、驗證關卡、回應者情境)validate_alert_expression— 對警示群組的 KPI 執行警示運算式試跑,不儲存任何內容describe_alert_chart— Discover 圖表上可設定警示的訊號(鍵、單位),唯讀(discover-service、discover-exceptions)create_alert— 在現有警示群組中建立警示規則(靜態或透過adaptive_std_cmp自適應);一律以停用的草稿狀態建立。建立一次;使用update_alert/patch_alert微調create_alert_from_chart— 一次呼叫即可從 Discover 圖表建立靜態閾值警示規則。與create_alert相同,規則會以停用的草稿狀態建立update_alert— 完整取代規則的評估設定(可能會傳回替代規則 ID)patch_alert— 部分變更規則:啟用/暫停、mute_until、回應者properties、每週recurring_mute_schedule(或clear_recurring_mute_schedule)delete_alert— 永久刪除警示規則mute_alert_group— 將警示群組中的每條規則靜音(或取消靜音),直到指定期限acknowledge_alert— 接手正在觸發的警示,或解除接手reassign_alert— 將已確認的警示交給其他使用者create_notification_channel— 建立 Slack、PagerDuty、Opsgenie、電子郵件或通用 webhook 管道attach_notification_channel— 將現有管道路由至警示群組,以供breach、threat或兩者使用detach_notification_channel— 移除一個管道與警示群組的附加關係delete_notification_channel— 永久刪除沒有任何附加關係的管道
警示寫入工具(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)需要具備寫入範圍的權杖;delete_alert、detach_notification_channel 和 delete_notification_channel 則需要刪除範圍。這些工具僅在 alerts 工具集內提供。
這些工具建立的規則、管道和附加關係會標記為 created_via: last9-mcp,並附上 MCP 用戶端的名稱與版本(規則上會加上 _l9_created_via_ 和 _l9_created_via_client_ 註記,patch_alert 和 update_alert 會保留這些註記,呼叫端無法設定)。get_entity_alert_rules 和 get_notification_channels 會顯示此標記,而 delete_alert、detach_notification_channel 和 delete_notification_channel 會指示代理程式只清理已標記的資源,除非使用者指定某項資源。
自訂儀表板
list_dashboards— 依名稱篩選並以低於 32 KB 的分頁方式列出自訂儀表板:ID、名稱、上次更新時間、作者和鎖定狀態get_dashboard— 依 ID 取得完整儀表板定義,包括面板和查詢preview_dashboard— 未儲存儀表板或修補內容的唯讀預覽:解析後的查詢、每個面板有界限的結果,以及面板差異摘要;絕不儲存validate_dashboard— 對已儲存的儀表板 ID 或內嵌的dashboard_definition,在 ≤24h 的時間範圍內執行唯讀 lint + 執行 + 分類。絕不建立或更新儀表板create_dashboard— 一次建立全新的自訂儀表板(面板、查詢、中繼資料)。傳回 ID 後,使用patch_dashboard編輯面板。update_dashboard— 依 ID 大幅重整現有儀表板(完整取代;唯讀系統儀表板會傳回錯誤)。若要編輯個別面板,請使用patch_dashboardpatch_dashboard— 依 ID 對現有儀表板進行目標式編輯(新增/更新/移除/移動面板、設定標題、設定變數);傳回精簡差異,而非完整儀表板delete_dashboard— 依 ID 刪除自訂儀表板set_dashboard_lock— 依 ID 鎖定或解除鎖定自訂儀表板(僅限作者或組織管理員);已鎖定的儀表板會拒絕更新、修補和刪除list_dashboard_snapshots— 儀表板的凍結時間點快照(僅中繼資料)get_dashboard_snapshot— 完整凍結快照,包含面板資料,供 RCA / 分享檢視使用delete_dashboard_snapshot— 依 ID 刪除凍結快照
無需安裝 skill,即可透過 MCP prompts/list 和 prompts/get 建立儀表板。三個提示都不需要引數:
create_dashboard_guide— 探索、版面配置和面板選擇;核准前驗證完整候選項並執行每個面板的查詢,建立一次、以修補方式進行目標式編輯,然後讀回確認。dashboard_examples— 完整範例涵蓋服務 RED、端點延遲、狀態類別、主機健康狀況、日誌數量和追蹤面板,並包含相依變數。query_guide— Counter/gauge/histogram 與衍生追蹤指標語意、即時與範圍查詢、速率視窗、百分比界限,以及 logjson/tracejson 規則。
相同內容也可在 last9://reference/create_dashboard_guide、last9://reference/dashboard_examples 和 last9://reference/query_guide 中讀取。所有工具集都能探索提示和資源;執行工作流程則需要相關工具(若要建立混合訊號儀表板,請使用 --toolsets=dashboards,investigate,它也適用於 list_datasources)。唯讀工作階段可以準備和驗證,但無法儲存。請先確認工具是否可用,再依照步驟操作。
面板檢查目前會搭配 validate_dashboard 使用 prometheus_range_query、prometheus_instant_query、get_logs 和 get_traces。驗證器不支援的查詢類型和簡化預設值,無法證明呈現結果一致。#475 完成後,獨立的查詢檢查步驟將改用 query_panel。
持續剖析
需要為組織啟用持續剖析。先使用 get_profile_services 探索服務,再擷取火焰圖或排名函式。
get_profile_services— 時間範圍內具有剖析資料的服務(查詢前先索引)get_flamegraph— 單一服務的巢狀火焰圖樹狀結構(預設為cpu;也可使用alloc、wall)get_top_functions— 單一服務中最熱門函式的自身取樣排名get_profile_summary— 以簡短自然語言對單一服務的剖析資料進行分類診斷
Grafana 儀表板
透過 Last9 的 Grafana Proxy,對組織的 Grafana 執行個體使用唯讀工具。憑證欄位絕不會傳回模型。使用 LAST9_TOOLSETS=grafana 啟用(或不設定工具集以使用所有工具)。
grafana_search_dashboards— 依標題子字串搜尋儀表板(分頁;達到上限時為truncated: true)grafana_get_dashboard— 依 uid 取得儀表板摘要(面板、變數、PromQL 目標);原始 Grafana JSON 請使用full_json=truegrafana_list_folders— 資料夾樹狀結構grafana_list_folder_dashboards— 單一資料夾中的儀表板(分頁)grafana_list_datasources— 不含憑證的資料來源清單
模糊名稱解析
did_you_mean— 當代理程式不確定實體名稱時,此工具會從目錄中傳回最接近的相符項目(服務、環境、主機、資料庫、K8s 部署/命名空間、工作)。最多提供 3 個建議及相似度分數。大多數工具在名稱查詢沒有結果時,伺服器會自動呼叫此工具。
服務設定檔
get_service_profile— 在查詢服務之前,查看其遙測資料的實際樣貌:有哪些訊號、語言與執行階段、部署環境、日誌的結構,以及適用時建議的擷取修正方式。若服務沒有追蹤資料,可讓代理程式略過追蹤工具;若SeverityText為空,則可從日誌本文解析嚴重性,而不是依此篩選後卻找不到任何結果。
運作方式
每個回應都包含深層連結。 每個工具都會傳回 deep_link 欄位,這是直接連至 Last9 儀表板中對應查詢與時間範圍的 URL。代理程式可以提供連結;你點擊後即可前往。
工具集。 伺服器預設會公開所有工具。只需要進行調查(日誌/追蹤/指標/剖析資料)的自動化主機,可以設定 LAST9_TOOLSETS=investigate(或傳入 --toolsets=investigate),讓 tools/list 保持精簡,無須在用戶端大量停用工具。具名套件:logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all。未知名稱會立即報錯。所有工具集都會提供 get_current_time 和 get_workspace_overview。在 HTTP 模式中,請求可透過 X-Last9-Toolsets 標頭進一步縮小範圍(請參閱每個請求的工具集)。alerts 套件也會提供唯讀的 prometheus_range_query 和 get_dashboard,由 author-alert 提示呼叫。單獨使用 metrics 套件時,不會包含 list_datasources 或 did_you_mean;需要這些探索輔助工具時,請使用 investigate(或組合工具集)。
工具參考資源。 詳細的 logjson/tracejson/service-logs/metrics 手冊是 MCP 資源(last9://reference/logjson、last9://reference/tracejson、last9://reference/service_logs、last9://reference/metrics、last9://reference/investigation、last9://reference/alerting),不會一律放在工具描述文字中。警示手冊涵蓋警示運算式語法、靜態與自適應欄位、單位、validate_alert_expression 的檢查內容,以及延遲/錯誤率/飽和度規則範本。重要的查詢規則會保留在工具描述中,確保從未呼叫 resources/read 的代理程式仍能正確建構查詢。使用 get_log_attributes/get_log_attributes_for_pipeline(以及對應的追蹤工具)探索組織專屬欄位;這些欄位不會注入描述中。
大型結果分塊處理。 get_logs 和 get_traces 會以分塊方式處理大型結果集,而非截斷結果。日誌的預設上限為 5000 筆;可透過 LAST9_MAX_GET_LOGS_ENTRIES 設定。
開發
HTTP 模式、curl 測試、從原始碼建置
以 HTTP 模式執行
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
伺服器會在 http://localhost:8080/mcp 啟動。
使用 curl 測試
Streamable HTTP 處理常式以無狀態模式執行,因此每個請求都會獨立處理。initialize 交握和 Mcp-Session-Id 標頭皆為選用;傳送這些內容的用戶端仍可正常運作(標頭會被接受並忽略),用戶端也可以直接略過,改用 tools/list/tools/call。每個工具都是獨立的請求/回應查詢;伺服器不會發出伺服器→用戶端通知,因此 GET /mcp(SSE 串流)會傳回 405。
# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
# Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service_name": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
每個請求的工具集
在 HTTP 模式中,請求可透過 X-Last9-Toolsets 標頭縮小可用工具範圍;無法設定標頭的用戶端則可使用 toolsets 查詢參數(/mcp?toolsets=logs,traces)。若兩者皆有傳送,非空白標頭優先。其值使用與 --toolsets 相同的逗號分隔名稱。請求可見的工具集是啟動時設定的 --toolsets 與請求工具集的交集:只能縮小,不能擴大;all 或空值會保留啟動時的工具集。若名稱未知,會傳回指出該名稱的 400。tools/list、tools/call 和 initialize 指示都會依有效工具集調整;get_current_time 和 get_workspace_overview 則會保留在所有工具集中。
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": {}}'
每個不同的有效工具集都由自己的伺服器提供服務,並在首次收到請求時建置(耗時數十毫秒),且會保留至關閉為止;若請求指定的工具集與啟動時相同,則會重用啟動時的伺服器。不會進行淘汰:只接受具名工具集,因此快取最多會為每種組合保留一個伺服器(目前共 135 種,合計約 75 MB 的即時堆積記憶體;測試中完整快取穩定後的常駐記憶體接近 230 MB)。
從原始碼建置
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 適用於本機開發。實際使用時,代管的 HTTP 端點更方便。
工具參考
所有參數、時間輸入標準與詳細資訊
時間輸入
- 絕對時間(
start_time_iso/end_time_iso,或time_iso)優先於lookback_minutes。 - 相對時間範圍:使用
lookback_minutes。 - 絕對時間範圍:使用 RFC3339/ISO8601 —
2026-02-09T15:04:05Z。 - 舊版
YYYY-MM-DD HH:MM:SS僅為相容性而接受。 - 將
since yesterday 9am IST等詞句轉換為 RFC3339 起訖時間,並使用get_current_time。
get_workspace_overview
無參數。並行探查最近 60 分鐘的資料,每個子呼叫都設有較短的逾時,並傳回 current_time、lookback_minutes、environments、telemetry(logs/traces/metrics 布林值)、service_count(不同服務的 get_service_summary 排名,涵蓋所有環境)、alert_group_count、firing_alert_count 和 errors([{field, error}])。子呼叫失敗的欄位會是 null(未知),絕不會是 0 或 false。探查不會受 --toolsets 限制:工具集會篩選可提供的工具,而 API 權杖則決定伺服器可讀取的內容。
get_current_time
range(字串,選用):last 2h、past 30 minutes、last 7d(s、m、h、d = 24h、w = 7d;最多 366d);today;yesterday;since <point>;<point> to <point>。時間點可使用 RFC3339,或使用today/yesterday/星期幾(monday、mon:最近一次出現的日期,包含今天)/YYYY-MM-DD,並可選擇搭配9am、9:30pm或14:30。結尾的時區會覆寫兩個時間界限的timezone;其他位置出現時區則會報錯。若只需要now,請省略。timezone(字串,選用):IANA 名稱或縮寫(IST = Asia/Kolkata、PST/PDT、EST/EDT、UTC、GMT)。預設為 UTC。未知時區會報錯;含糊的CST也會報錯(請傳入America/Chicago或Asia/Shanghai)。
傳回 now(以及在 range 時的 start/end),格式為 {iso, epoch_seconds, local};只有非 UTC 時區才會出現 local。
get_exceptions
limit(整數,選用):例外數量上限。預設值:20。lookback_minutes(整數,選用):預設值:60。start_time_iso/end_time_iso(字串,選用):絕對時間範圍。service_name(字串,選用):依服務篩選。span_name(字串,選用):依 span 名稱篩選。env(字串,選用):依環境篩選。
get_service_summary
start_time_iso/end_time_iso(字串,選用)env(字串,選用):PromQL 正規表示式。預設為.*。精確比對需要錨點(例如^prod$)。sort_by(字串,選用):request_count(預設值)、throughput_rpm、http_4xx_count、http_5xx_count或grpc_error_count。limit(整數,選用):排名列數上限。省略或設為 0 時表示 10;大於 100 的值會限制為 100。
get_service_environments
start_time_iso/end_time_iso(字串,選用)
所有其他 APM 工具都需要
env值。若此處傳回空值,請使用""。
get_service_performance_details
預設會傳回每個序列的摘要:points、missing_points(沒有流量的可用性區間,不納入統計)、min、p50、p90、p99(最近秩法)、max、mean、last、baseline_mean(有效資料點前半段的平均值,而非整個時間範圍的平均值)、delta_pct(有效資料點後半段相較於基準值的變化;基準值為 0 時不提供),以及最多 3 個 change_points(timestamp、before_mean、after_mean);每個指標和每個回應時間分位數最多涵蓋 4 個序列(依平均值由高至低排列;series_omitted 計算其餘序列)。具有 points: 0 的序列不包含統計資料;baseline_mean/delta_pct 至少需要 6 個資料點(每半段 3 個)。full_series 表示可透過 include_series 取得原始資料點。
service_name(字串,必填)lookback_minutes(整數,選用):預設值:60。start_time_iso/end_time_iso(字串,選用)env(字串,選用):預設為prod。top_n(整數,選用):top-operations/top-errors 清單的項目上限。預設為 5;使用include_series=true時為 10。上限為 100。include_series(布林值,選用):傳回每個序列的所有資料點,而非摘要。預設值:false。
get_service_operations_summary
service_name(字串,必填)lookback_minutes(整數,選用):預設值:60。start_time_iso/end_time_iso(字串,選用)env(字串,選用):預設為prod。
get_service_dependency_graph
service_name(字串,選用)lookback_minutes(整數,選用):預設值:60。start_time_iso/end_time_iso(字串,選用)env(字串,選用):預設為prod。
get_apm_service_deviations
service_name(字串,可選):若適用於整個機群,請省略;若適用於單一服務及其操作關聯,請提供。lookback_minutes(整數,可選):目前時間範圍。預設值:60。start_time_iso/end_time_iso(字串,可選):明確指定目前時間範圍。baseline_start_time_iso/baseline_end_time_iso(字串,可選):明確指定基準時間範圍。預設為緊接在目前時間範圍之前、時長相同的時間範圍。datasource(字串,可選):若使用預設值,請省略;近似名稱的解析方式與 Prometheus 工具相同。回應會指出使用的預設值或最接近的相符項目;若名稱有歧義,則會傳回候選項目而不執行查詢。env(字串,可選):預設為prod。max_services/max_operations(整數,可選):預設值為 10,每項上限為 10。
get_databases
env(字串,可選):依環境篩選。接受正規表示式。預設值:全部。lookback_minutes(整數,可選):預設值:60。時間範圍不得超過 7 天。start_time_iso/end_time_iso(字串,可選)
get_database_slow_queries
db_system(字串,可選):例如postgresql、mysql、mongodb、redis。host(字串,可選):資料庫主機 (net_peer_name)。service_name(字串,可選):呼叫端服務名稱。env(字串,可選)min_duration_ms(浮點數,可選):查詢持續時間下限,單位為毫秒。lookback_minutes(整數,可選):預設值:60。start_time_iso/end_time_iso(字串,可選)limit(整數,可選):預設值:20。
get_database_queries
db_system(字串,可選)host(字串,可選)service_name(字串,可選)env(字串,可選)lookback_minutes(整數,可選):預設值:60。start_time_iso/end_time_iso(字串,可選)limit(整數,可選):預設值:20。
get_database_server_metrics
db_system(字串,必填):例如postgresql、mysql、mongodb、redis、aerospike。host(字串,可選)lookback_minutes(整數,可選):預設值:60。start_time_iso/end_time_iso(字串,可選)
prometheus_range_query
query(字串,必填):PromQL 查詢。start_time_iso/end_time_iso(字串,可選):預設為最近 60 分鐘。lookback_minutes(浮點數,可選):預設值:60。
prometheus_instant_query
query(字串,必填)time_iso(字串,可選):預設為現在。lookback_minutes(浮點數,可選)
prometheus_label_values
match_query(字串,可選):PromQL 篩選條件。label(字串,必填):標籤名稱。lookback_minutes(浮點數,可選):預設值:60。start_time_iso/end_time_iso(字串,可選)
若未指定時間範圍,且 match_query 指定單一指標 (metric{...} 或 {__name__="metric"}),則會在 60 分鐘的結果為空時,改以 4 天的時間範圍重試一次;第二個文字區塊會說明結果涵蓋的時間範圍。
prometheus_labels
match_query(字串,可選):PromQL 篩選條件。lookback_minutes(浮點數,可選):預設值:60。start_time_iso/end_time_iso(字串,可選)
與 prometheus_label_values 相同,若單一指標查詢結果為空,則會改以 4 天的時間範圍重試。
get_logs
logjson_query(陣列,必填):JSON 管線查詢。lookback_minutes(整數,可選):預設值:5。start_time_iso/end_time_iso(字串,可選)limit(整數,可選):伺服器預設值:5000。index(字串,可選):physical_index:<name>或rehydration_index:<block_name>。response_mode(字串,可選):summary(預設值;也適用於null) 或raw。原始日誌行結果超過 20 行時,會以summary傳回:lines_summarized、severity_counts(前六個標籤,其餘列於other_severities)、first_timestamp/last_timestamp、涵蓋查詢時間範圍的 10 個區間histogram(依據傳回的行計算;若結果受限於上限,則會包含truncated: true),以及前幾個patterns(template、count,最多兩個samples);其餘項目會彙總至other,總長度最多 4000 個字元。若頂層中繼資料仍無法容納,則會予以省略並列於dropped_fields。raw會傳回日誌行。彙總結果絕不會摘要化。
若要建立以日誌為基礎的服務清單,請先查詢 physical_index_service_count:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
將 service_name 用作 ServiceName,若有環境,則將 env 用作環境,並將 name 用作實體索引名稱。若為 name="default",請省略 index;若使用者選取了非預設的實體索引,則傳入 index: "physical_index:<name>"。若後端拒絕明確指定實體索引篩選,請在不帶 index 的情況下重試,並回報該後端不支援明確指定實體索引篩選。
get_service_logs
service_name(字串,必填)lookback_minutes(整數,可選):預設值:60。limit(整數,可選):預設值:100;若使用response_mode: "raw",則為 20。env(字串,可選)severity_filters(陣列,可選):例如["error", "warn"]。使用 OR 邏輯。body_filters(陣列,可選):例如["timeout", "failed"]。使用 OR 邏輯。start_time_iso/end_time_iso(字串,可選)index(字串,可選)response_mode(字串,可選):summary(預設值;也適用於null) 或raw。超過 20 行時,logs會替換為與get_logs相同的summary,其他欄位則保留;raw會傳回項目。
多種篩選類型會以 AND 邏輯組合。每個陣列內部使用 OR 邏輯。
請先使用 get_logs 取得廣泛的彙總計數;只有在將範圍縮小至特定服務/環境/索引及少量樣本集後,才使用 get_service_logs。
get_log_patterns
service_name(字串,必填)env(字串,可選)start_time_iso/end_time_iso(字串,可選)lookback_minutes(整數,可選):預設值:60。severity_filters/body_filters(陣列,可選):使用 OR 邏輯,與get_service_logs相同。只有在get_service_profile回報severity_setall時才設定severity_filters;若使用none或partial,則會排除本文中嚴重性符合條件的日誌行。index(字串,可選)sample_size(整數,可選):從時間範圍內取樣的日誌行,依新到舊排序。預設值:1000,最大值:5000。top_n(整數,可選):依計數傳回的範本數量。預設值:20,最大值:100。其餘範本會彙總至other。
叢集分析會在 MCP 伺服器中對取樣的日誌行執行,因此計數、first_seen 和 last_seen 都是以樣本為範圍;若樣本可能遺漏符合條件的日誌行,window.sample_limit_reached 會說明原因 (樣本包含 sample_size 行,而 API 回報的精確 total_matching_lines 不等於該數量,或搜尋已 logs_truncated);在此情況下,樣本只包含時間範圍內最新的日誌行。每個 template 和 sample 最多保留 500 個字元,並以 … 結尾,因此無法叢集的本文 (例如沒有 message 欄位的 JSON) 不會佔滿回應。若搜尋有區塊失敗,工具會回報錯誤;若搜尋遭截斷或達到上限,仍會傳回模式,並以 sample_limit_reached 標示。只有在 sample_limit_reached 為 false 時,空的 patterns 清單才表示沒有符合項目;若為 true,則表示搜尋提前停止,可能遺漏符合條件的日誌行。
get_emerging_log_patterns
接受所有 get_log_patterns 參數 (時間範圍為目前時間範圍),另加:
baseline_start_time_iso/baseline_end_time_iso(字串,可選):兩者必須同時設定,或都不設定。預設為緊接在目前時間範圍之前、時長相同的時間範圍。min_count(整數,可選):模式在其數量較多的時間範圍內所需的日誌行數:對於new/increased,使用目前時間範圍;對於decreased/disappeared,使用基準時間範圍。預設值:3 (若sample_size較小,則使用該值),最大值:sample_size。change_factor(數字,可選):頻率比率,必須大於 1;同時出現在兩個時間範圍的模式,其頻率必須達到此比率 (increased),或降至其倒數 (decreased)。預設值:2。
兩項門檻都必須符合,因此頻率未變化達 change_factor 的高流量範本絕不會列出。只會傳回變化的範本 (new、increased、decreased、disappeared),並附上 current 和 baseline 計數;unchanged_patterns 會計算出現在兩個時間範圍、但變化幅度小於 change_factor 的範本數;below_min_count_patterns 則會計算因日誌行數少於 min_count 而遭排除的變化數。若兩個樣本都包含所有符合條件的日誌行,則會按分鐘比較頻率;若樣本受上限限制,則會根據精確的 total_matching_lines 估算每分鐘頻率;其他情況則以樣本占比比較,其中 increased/decreased 描述的是組成而非速率 (comparison_basis)。空的 patterns 清單表示沒有變化超過兩項門檻,而非日誌沒有變化:較少見的變化會計入 below_min_count_patterns;若時間範圍有 sample_limit_reached,則比較的是樣本,而非整個時間範圍。
get_log_attributes
lookback_minutes(整數,可選):預設值:15。start_time_iso/end_time_iso(字串,可選)region(字串,可選)index(字串,可選)
get_log_attributes_for_pipeline
pipeline(陣列,必填):用於限定探索範圍的前置篩選階段,例如[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。lookback_minutes(整數,可選):預設值:15。start_time_iso/end_time_iso(字串,可選)region(字串,可選)index(字串,可選)
get_drop_rules
不接受參數。透過 GET /otel_settings/drop?region=... 列出丟棄規則。
add_drop_rule
name(字串,必填)filters(陣列,必填):每個篩選條件包含:key、value、operator(equals/not_equals)、conjunction(and)。- 篩選鍵必須使用
attributes["key_name"]或resource.attributes["key_name"](Last9 API 的必要條件)。 - 透過
POST /otel_settings/drop?region=...&cluster_id=...建立規則。
get_remapping_rules
rule_type(字串,必填):logs_extract、logs_map或traces_map。region(字串,可選):預設為已設定的資料來源區域。- 透過
GET /otel_settings/remapping/{rule_type}?region=...列出規則。
add_remapping_rule
每次呼叫會建立一條規則;對應規則的每個 target_attribute 都需要分別呼叫一次。
rule_type(字串,必填):logs_extract、logs_map或traces_map。name(字串,必填)remap_keys(陣列,必填):來源欄位。logs_extract搭配json:本文欄位名稱;搭配pattern:恰好一個含有命名擷取群組的正規表示式。對應規則:屬性路徑,採用第一個非空值。target_attribute(字串,必填):logs_extract:log_attributes或resource_attributes。logs_map:service、severity或resource_deployment.environment。traces_map:service。extract_type(字串,僅限logs_extract,且在該處必填):json或pattern。action(字串,僅限logs_extract):upsert(預設) 或insert。prefix(字串,僅限logs_extract)preconditions(陣列,僅限logs_extract):最多一個{key, value, operator};operator為equals(預設)、not_equals或like(正規表示式)。region(字串,選填):預設值:已設定的資料來源區域。- 透過
POST /otel_settings/remapping/{rule_type}?region=...建立規則。絕不重試;逾時後,請使用get_remapping_rules檢查。
get_traces
用於廣泛搜尋和彙總。若要查詢確切的追蹤 ID,請使用 get_service_traces。
tracejson_query(陣列,必填)start_time_iso/end_time_iso(字串,選填)lookback_minutes(整數,選填):預設值:60。limit(整數,選填):預設值:5000。
get_service_traces
trace_id 或 service_name 必須且只能提供其中一個。
trace_id(字串,選填):預設回溯時間:72 小時。service_name(字串,選填):預設回溯時間:60 分鐘。lookback_minutes(整數,選填)start_time_iso/end_time_iso(字串,選填)limit(整數,選填):預設值:10。env(字串,選填)
get_trace_attributes
lookback_minutes(整數,選填):預設值:15。start_time_iso/end_time_iso(字串,選填)region(字串,選填)
get_trace_attributes_for_pipeline
pipeline(陣列,必填):用於限定探索範圍的先前篩選階段,例如[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]。lookback_minutes(整數,選填):預設值:15。start_time_iso/end_time_iso(字串,選填)region(字串,選填)
get_trace_attribute_values
tag_name(字串,必填):來自get_trace_attributes的屬性名稱 (例如resource_department或attributes['http.method'])。pipeline(陣列,選填):用於限定值範圍的先前篩選階段;若要取得全域值,請省略。lookback_minutes(整數,選填):預設值:15。start_time_iso/end_time_iso(字串,選填):歷史 RFC3339 時間界限;優先於lookback_minutes。region(字串,選填)
get_trace_attribute_deviations
comparison_mode(字串,必填):latency、errors或time。service_name(字串,必填)environment(字串,必填):確切的deployment.environment值。operation(字串,選填)filters(陣列,選填):追蹤 JSON 篩選條件。candidate_attributes(陣列,選填):最多 8 個;若要進行有界探索,請省略。latency_threshold_ms(數字,選填):latency模式必填;其他模式不接受。start_time_iso/end_time_iso(字串,選填)lookback_minutes(整數,選填):預設值:15。上限:15。baseline_start_time_iso/baseline_end_time_iso(字串,選填):time模式必填;兩者不得重疊,且持續時間須與目標時間範圍相同。minimum_cohort_size(整數,選填):預設值:100。下限:20。minimum_value_support(整數,選填):預設值:20。下限:10。limit(整數,選填):預設值:10。上限:10。
需要啟用配套的後端功能。
get_trace_waterfall
trace_id(字串,必填)environment(字串,選填)start_time_iso/end_time_iso(字串,選填)lookback_minutes(整數,選填):預設值:4320 (72 小時)。selected_span_id(字串,選填):僅傳回該 span 的屬性、事件和連結。max_spans(整數,選填):預設值:500。上限:1000;組織的遮蔽政策可能會將上限設得更低。
原樣傳回追蹤服務的 investigation-evidence/v1 封套;瀑布圖位於 data 下。服務會建立瀑布圖,並在資料離開後端前,依據每個組織的政策遮蔽值 (憑證、查詢字面值、URL、電子郵件、IP、使用者識別碼):sanitizer 指出所套用的政策,evidence.sanitization 則統計遭遮蔽或截斷的項目。若必要資訊遭到遮蔽,請要求組織管理員調整政策,而非嘗試繞過。若回應沒有 sanitizer 區塊、sanitizer.version 不是 trace-evidence-sanitizer/v1、本文重複出現 JSON 金鑰,或本文超過 512 KiB (較低的 max_spans),此工具會拒絕回應。需要啟用配套的後端功能。
get_change_events
start_time_iso/end_time_iso(字串,選填)lookback_minutes(整數,選填):預設值:60。service_name(字串,選填)env(字串,選填)event_name(字串,選填):第一次呼叫時請省略此項,以取得available_event_names。
analyze_change_impact
請恰好傳入 change_event 或 service + timestamp 其中一種。
change_event(物件,選填):get_change_eventschange_events[]的其中一個元素,原樣傳入。使用metric.service、metric.deployment_environment和最早的values[].timestamp。service(字串,選填):省略change_event時,必須與timestamp一起提供。timestamp(字串,選填):RFC3339 或 Unix 秒數,向下取整至分鐘。env(字串,選填):確切的環境。預設值:事件所屬環境,否則為全部環境。baseline_minutes(整數,選填):預設值:60。限制在 30..120。after_minutes(整數,選填):預設值:baseline_minutes。限制在 30..120,且不得晚於現在。
符合以下任一條件時,regression likely:服務或其前 10 大呼叫端之一的錯誤率至少上升 1 個百分點、p95 至少上升 40%,或吞吐量 (rpm) 至少下降 50%;排名依據兩個時間範圍合計的吞吐量 (變更前至少須有 100 個請求;吞吐量指標在變更後也須至少有 100 個請求;p95 僅計算 latency_env 的請求);其警示在變更後開始觸發,且在變更後時間範圍結束時仍在觸發 (依警示群組名稱或 service、service_name 或 service.name 標籤進行不區分大小寫的比對,否則比對註解 (絕不比對摘要等自由文字);若有 env,則捨棄標記了其他環境的警示 (不區分大小寫),並將未標記環境的警示標示為 env_match: unlabelled);或出現來自 get_apm_service_deviations 的退化。若變更後時間範圍不足 5 分鐘 (包括未來才會發生的變更)、服務請求數過少,或黃金訊號、直接呼叫端查詢、警示或 get_apm_service_deviations 失敗 (全部失敗或 deviations.apm.unavailable 所列的任何查詢失敗),則為 insufficient data:缺少證據絕不會產生 no significant change,若仍發現退化,則會指出失敗項目。no significant change 是有效答案,不代表失敗。只有設定 env 時才會執行追蹤屬性偏差分析,每側最多涵蓋 15 分鐘;此分析可說明判定結果,但不會決定判定結果,因此略過或擷取失敗都不會改變判定。每個清單最多保留 10 個項目,並回報捨棄的數量;上游呼叫失敗時,只會在其所屬區段留下 error。黃金訊號延遲在兩個時間範圍中都取自同一個環境,並於 latency_env 中標示:若未提供 env,則使用流量最高的環境。黃金訊號錯誤率會計入 5xx 和 gRPC 錯誤;deviations.apm 也會計入錯誤狀態 span 和 429。呼叫端的訊號來自其自身的伺服器 span,因此只有用戶端 span 的呼叫端會顯示 0 rpm。
regressions 會依照 reason 的順序,為 regression likely 背後的每個觸發條件列出一個項目;其他判定結果則為 []。每個項目包含 service、role (changed 或 dependent)、env、metric (恰好為 error_rate_pct、latency_p95_ms、throughput_rpm、alert、apm_deviation 其中之一),以及以指標單位表示的 baseline/after (%、ms、rpm 或 APM 訊號本身的值;若為 alert 則為 null)。alert 項目會新增 rule_id 和 state,表示該實例在變更後時間範圍內最新的 alerts-monitor 切片中所列的狀態,且一律為 firing:變更後開始、但在變更後時間範圍結束前已解除的警示不算退化,因此不會建立工單;該警示仍會保留在 alerts.started 中,並附上其 state,而 reason 會將其計入。env 是測量指標的環境:若有指定,則為要求的 env;否則,錯誤率和吞吐量會加總所有環境 (env: ""),而 p95 使用流量最高的環境 latency_env;警示使用自身的環境標籤,APM 偏差則使用自身的環境。所有退化都以服務整體為範圍,因此不會有任何項目指出端點。
get_alert_groups
用於 changeboard / 標籤涵蓋率稽核的 Compass 警示群組設定清單。包含沒有規則的群組,以及目前未觸發的群組。不會傳回 PromQL。
alert_group_name/alert_group_type/data_source_name(字串,選填):不區分大小寫的子字串比對。team/tier(字串,選填):對已設定的中繼資料進行不區分大小寫的完全比對。label_key+label_value(字串,選填):必須同時設定。對一組metadata.labels鍵值配對進行不區分大小寫的完全比對。
傳回精簡的 JSON {"count":N,"groups":[...]},包含 id、name、type、entity_class、team、tier、metadata.labels 和規則數量。空的 team / labels 表示未設定。
get_alert_operations_summary
start_time_iso/end_time_iso(字串,必填):RFC3339 時間範圍,最長 31 天。timezone(字串,選填):用於劃分日期的 IANA 名稱。預設值:UTC。severities/services(陣列,選填):縮小摘要範圍。include_rules(布林值,選填):同時傳回每條規則的健全狀況資訊 (依fire_count排名前 20 的規則、頻繁觸發和未路由的規則;若 API 限制了規則清單,則包含truncated)。預設值:false。
傳回包含 alerts_raised、acknowledged、unacknowledged、current_backlog、delivered、notification_outcomes、top_rules、needs_attention 和 coverage 的 JSON。每個指標都是 {status, count?, reason?};partial 計數只涵蓋部分時間範圍,並非下限。
get_alert_coverage
針對服務、環境、單一警示群組,或未指定範圍時的整個組織,回答「我有哪些項目尚未設定警示?」唯讀:絕不建立、變更或取消靜音任何項目。也可透過 investigate 工具集使用。
service(字串,選填):服務名稱。environment(字串,選填):部署環境 (例如prod)。entity_id(字串,選填):警示群組 (實體) UUID,由get_alert_groups傳回。muted_days(整數,選填):整數天數,1 到 3650。預設值:7;0 表示使用預設值。靜音時間超過此值的規則會被視為muted_too_long缺口。 數值會先去除前後空白;空白字串會忽略。缺口類型:uncovered_signal(latency、error_rate、throughput 或 saturation 沒有啟用的規則;會指出可涵蓋該訊號的停用規則)、all_rules_disabled(規則全都停用的警示群組)、no_notification_channel(警示群組未將任何通知管道路由至該規則嚴重性等級的規則)、muted_too_long(無限期靜音或靜音超過muted_days;muted_since是規則的最後更新時間,無限期靜音時會省略mute_until)。
回傳精簡 JSON {scope, generated_at, complete, summary, counts, groups}。groups 對每種存在的類型各包含一個 {kind, count, gaps, omitted} 項目,每種類型最多列出 10 個缺口(omitted 計算其餘缺口數量;縮小範圍即可查看);每個缺口都包含 suggested_tool(create_alert、create_alert_from_chart、attach_notification_channel 或 patch_alert)和 suggested_args,其中僅包含該工具接受的輸入(patch_alert:entity_id、id 和 is_disabled=false 或 mute_until=0;attach_notification_channel:alert_group_id 和 breach/threat severity;create_alert:entity_id;create_alert_from_chart:service_name);缺口本身的 entity_id、rule_id 和 signal 會列在旁邊。只有在建議的工具可於工作階段中使用,且使用者確認後,才呼叫該工具。只有在 API 未列出任何缺口、所有計數皆為 0,且至少有一個警示群組符合範圍(精確的 service_name / env 標籤,並與 get_alert_groups 的清單比對)時,complete 才為 true;範圍未符合任何項目、查詢失敗,或有計數但未列出缺口,都不算完整,而 summary 會說明原因。
get_alert_config
search_term(string, optional):跨名稱、群組、資料來源和標籤進行全文搜尋。rule_name(string, optional)severity(string, optional)rule_type(string, optional):static或anomaly。alert_group_name/alert_group_type/data_source_name(string, optional)tags(array, optional):必須全部符合(AND 邏輯)。
每條規則都會列出 Recent Evaluations:5 個一分鐘樣本,最新的排在最前面,每個樣本都標示其結束的 UTC 分鐘;最新樣本的結束時間比呼叫時間早 1–2 分鐘,因為監控器會延遲填入最新分鐘的資料。firing;ok = 監控器回報該規則未觸發(正常、已解決、待處理或空狀態,如 is_firing=0 在 get_alert_rule_state 中所示);unknown = 沒有該規則的監控器資料列(尚未評估,或該分鐘的查詢失敗,會在回應頂端註明),或資料列的狀態不屬於 firing、normal、resolved、pending 或 empty(例如 no_data、silenced)。停用的規則會顯示 none。符合條件的啟用規則超過 25 條時,所有規則都會省略歷史資料,並在回應中說明。
get_entity_kpis
唯讀;僅適用於 alerts 和 investigate 工具集。列出單一警示群組上的所有 KPI,包括尚未被任何警示規則使用的 KPI。在 expression_args / indicators_used 中使用回傳的 ID;切勿自行編造。
entity_id(string, required):警示群組/實體 UUID,取自get_alert_groups或get_alert_config。
回傳 JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]},依名稱排序。unit 是顯示標籤:閾值會與原始查詢值比較。若沒有合適的 KPI,請使用 create_kpi 建立一個。只有在工作階段提供該功能時,空群組的結果才會列出 create_kpi;若使用 --read-only(除非是 --allow-write-tools=create_kpi)或 investigate 工具集,則會指出建立 KPI 需要可寫入的 alerts 工作階段。
create_kpi
在現有警示群組上建立 KPI;僅適用於 alerts 工具集。只有在 get_entity_kpis 中沒有符合所需查詢的 KPI 時才使用。請先使用 prometheus_range_query 確認查詢會回傳資料:API 只會拒絕無法解析的查詢,並會儲存語法有效但指向不存在指標的查詢。
entity_id(string, required):警示群組/實體 UUID。name(string, required):在警示群組內必須唯一;以相同名稱再次建立會因衝突而遭拒。query(string, required):PromQL。若要對儀表板面板發出警示,請從get_dashboard取得面板的 PromQL。unit(string, required):查詢原始值的單位,例如seconds、ms、percent、ratio、count、req/s。這只是標籤,不會進行任何轉換,因此閾值會與原始值比較。description(string, optional)data_source_id(string, optional):預設為警示群組的資料來源。
沒有任何 MCP 工具可以刪除或編輯 KPI(請使用 Last9 UI),因此建立前請確認名稱、查詢和單位。只建立一次,並保留回傳的 ID 供 expression_args / indicators_used 使用;若名稱衝突,請從 get_entity_kpis 重用現有 KPI 的 ID。若發生逾時或連線錯誤,建立操作可能已套用,也可能尚未套用:重試前請使用 get_entity_kpis 依名稱查詢。回傳 {"id","name","query","unit"}。
get_alerts
time_iso(string, optional):RFC3339 格式的評估時間。window(integer, optional):回溯秒數。預設值:900。範圍:60–86400。lookback_minutes(integer, optional):範圍:1–1440。
get_alert_rule_state
start_time(integer or string, required):範圍起點(含):Unix epoch 秒數(1718000000)或 RFC3339(2024-06-10T06:13:20Z)。Epoch 毫秒、微秒和奈秒會轉換為秒;早於 2000-01-01 的值會遭拒。end_time(integer or string, required):範圍終點(含),格式相同。step(integer, required):樣本間隔秒數。樣本數((end_time - start_time) / step + 1)上限為 100。每個樣本都是一次上游呼叫,涵蓋以其時間戳記為終點的min(step, 3600)秒;每次擷取 5 個樣本,若耗時超過 60s,工具會回傳錯誤並提供重試指引。alert_group_id(string, optional):依警示群組 ID 篩選。rule_name(string, optional):依規則名稱的 regex 篩選。alert_group_name(string, optional):依警示群組名稱的 regex 篩選。label_filters(string, optional):以逗號分隔的key=value標籤篩選器。state(string, optional):依狀態篩選(例如firing)。
回傳 rule_id -> [{timestamp, is_firing}] 的 JSON 對應表。若上游回應中缺少某規則的時間戳記,會回報為 is_firing=0 — 這表示「未觀察到觸發」,而非確認為正常狀態。
get_alert_hygiene
啟用中警示規則的唯讀稽核。此工具不會變更任何內容:每項建議修正都只是提案,只有在使用者明確確認後,才會透過 update_alert(調整)、patch_alert(is_disabled)、delete_alert 或 attach_notification_channel(若有提供)套用。
window(string, optional):7d或30d。預設值:7d。limit(integer, optional):要回傳的標記規則數上限,依嚴重程度由高至低排列。預設值:20。範圍:1–100。
時間範圍截至現在。分類(同一規則可能符合多個分類):noisy(每天觸發 ≥ 5 次,且 < 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 (> 每天 flap 4 次)、stale(上次觸發時間早於時間範圍,且範圍內沒有觸發時間;或已啟用的已設定規則在範圍內沒有事件,且生命週期 coverage 已完成,API 的清單也未遭截斷)、unrouted(範圍內沒有任何觸發事件送達通知管道,且警示群組目前未附加任何管道;若無法讀取附加資訊,則該規則會歸類為 unavailable.routed)。每項統計值都是 {status, count|value, reason} 或 null:無法取得的值絕不會視為 0,且只會略過需要該值的檢查;unavailable 會計算每個缺失值所涉及的啟用規則數(fire_count、flap_count、ack_rate、routed、rule_config 表示規則未出現在警示規則清單中,因此其修正項目不會帶有目前值;activity 表示已設定但沒有事件的規則,其靜默狀態無法由歷史資料證明,因此不會進行評估)。coverage 說明警示歷史涵蓋了多少時間範圍;速率會依涵蓋時長計算,且至少為一天。若 API 只回傳最吵的 200 條規則,則 upstream_truncated 為 true,因此較安靜的規則不會納入評估。修正建議根據警示規則清單中的各規則設定產生:提高 bad_minutes(count_true(result) >= N 中的 N)或延長 eval_window(最多 60 分鐘);對於吵雜的靜態閾值,請在 condition(expr > 100)中調整閾值,或將運算式改為 adaptive_std_cmp(metric, sensitivity, window);附加通知管道;停用或刪除過時規則。
回傳精簡 JSON {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules},目標大小為 32 KB:若標記規則數超過 limit 或該目標大小,則 truncated 為 true;omitted_for_size 計算因大小限制而從 limit 中裁切的規則數(最嚴重的規則一定會保留,因此若單一規則超過 32 KB,會單獨回傳並超出目標大小);每條規則都包含 findings(category、reason、suggested_fix、可選的 alternative_fix)和原始的 stats。
get_notification_channels
scope(string, optional):attached(預設)會為每個警示群組附加項目回傳一列;id是detach_notification_channel所使用的附加項目 ID。channels會回傳組織的管道(id、name、type、send_resolved、created_via);id是attach_notification_channel所使用的管道 ID。絕不會回傳目的地、標頭或憑證。
以 TSV 表格回傳已設定的通知管道(Slack、PagerDuty、電子郵件、webhook 等)。附加項目資料列(已設定 service_fqid)會顯示 global 為 false,且 services 為 -;services 只會列出舊版服務繫結。在附加項目資料列中,send_resolved 是該資料列儲存的預設值,不是實際傳送通知時使用的值;通知解除時會依照管道本身的 send_resolved(scope=channels)處理。兩種範圍都包含 created_via(由 MCP 代理程式建立的資料列為 last9-mcp,否則為 -)。
recommend_alert_config
唯讀。回傳生命週期指引、驗證關卡和回應者情境需求;本身並非證據,因此請使用遙測工具確認閾值。
signal(string, required):指標或使用者影響訊號,包含單位和維度。objective(string, required):要偵測的症狀或使用者影響。rule_type(string, optional):static(預設)或anomaly。severity(string, optional):breach(預設)或threat。environment(string, optional):環境和流量設定檔。
validate_alert_expression
對運算式進行試執行,不會儲存。請在 create_alert / update_alert 之前使用。
entity_id(string, required):警示群組/實體 UUID。expression(string, required):以 KPI 的精確名稱指定指標,並對其進行算術運算,例如errors / requests。最多 3 個指標。名稱中若有空格、句點或連字號,請原樣書寫(Test Alert / errors),與create_alert儲存的名稱完全一致。indicators_used(object, required, non-empty):將指標名稱對應至由entity_id擁有的 KPI UUID;使用get_entity_kpis列出群組的 KPI ID 和名稱。請使用每個 KPI 的精確名稱:此試執行接受任何名稱,但create_alert和update_alert會拒絕不是所綁定 KPI 名稱的expression_args鍵。 只會檢查算術運算式(傳入內層指標運算式,而非adaptive_std_cmp(...)包裝);不會檢查condition/alert_condition。只有在使用多個指標時,才會執行至少一個時間序列檢查。
回傳 {"valid":true} 或 {"valid":false,"reason":"..."};無效的運算式是一般結果,不是工具錯誤。
describe_alert_chart
唯讀。列出涵蓋的 Discover 圖表上可設警示的訊號(key、unit、eval_query、query_kind)。拒絕檢視者角色權杖。
surface(string, required):discover-service或discover-exceptions;任何其他介面(包括自訂儀表板)都會在呼叫 API 前遭到拒絕(請改用create_alert搭配 KPI)。chart_key(string, required):例如apdex、error_rate、response_time、exception_count。service_name(string, required)env(string, optional)attributes(object, optional):額外的識別維度,使用此工具回報的鍵名稱。
create_alert
在現有警示群組中建立規則,一律停用(草稿,即使傳入 is_disabled=false 也一樣)。先呼叫 recommend_alert_config,只有在使用者確認後才使用 patch_alert is_disabled=false 將其升級。只建立一次並保留回傳的規則 ID。若 rule_name 與警示群組中現有項目(不區分大小寫)重複,則拒絕建立任何內容,並指出現有規則的 id。
entity_id(string, required):警示群組/實體 UUID。alert_rule(object, required):完整的型別化規則本文,包括primary_indicator和expression_args,且須綁定至實體的實際 KPI。每個expression_args鍵都必須是其所綁定 KPI 的確切名稱(不可使用x之類的佔位符),而primary_indicator和expression也須使用這些名稱。靜態規則需要condition、alert_condition和eval_window(0–60 分鐘)。自適應規則使用expression=adaptive_std_cmp(<primary_indicator>, sensitivity, window);此時三個欄位皆為選填(預設值為expr > 0、count_true(result) >= 1、1)。不可設定algorithm。回應者情境資訊放在properties(描述、runbook、註解、query_mode)。
通知路由是在警示群組上設定,而非規則上。
create_alert_from_chart
根據 describe_alert_chart 描述的圖表建立靜態閾值規則。與 create_alert 一樣,規則會以停用的草稿狀態建立,不會觸發;只有在使用者確認後,才使用 patch_alert is_disabled=false 將其升級。圖表 API 會建立啟用中的規則,因此此工具會在建立後立即停用規則;若停用失敗,結果會是指出規則 id 的錯誤,而該規則可能仍在運作。
surface/chart_key/service_name/signal_key/name(string, required)env(string, optional)attributes(object, optional)threshold(number, optional):以訊號的單位表示;必須大於或等於 0。Apdex 等分數單位訊號需要明確指定值。threshold_operator(string, optional):>(預設值)、<、>=、<=、==、!=。eval_window(integer, optional):分鐘,1–60。預設值:5。bad_minutes(integer, optional):1–eval_window。預設值:3。severity(string, optional):breach或threat。description(string, optional)group_id(string, optional):通常省略。
update_alert
完整取代規則的評估設定。先使用 get_alert_config 或 get_entity_alert_rules 取得規則。若規則不存在或屬於其他警示群組,則拒絕且不做任何變更。可能會軟刪除並重新建立規則,因此之後請使用回傳的替代 ID。
entity_id(string, required)id(string, required):警示規則 UUID。alert_rule(object, required):完整設定;結構與create_alert相同。
patch_alert
部分變更,保留規則 ID。至少需要一項變更。若規則不存在或屬於其他警示群組,則拒絕且不做任何變更。
entity_id(string, required)id(string, required):警示規則 UUID。is_disabled(boolean, optional):false會升級/啟用,true會暫停。mute_until(integer, optional):Unix epoch 截止時間;0會解除靜音。properties(object, optional):description、runbook、annotations、query_mode。每個傳入的欄位都會取代已儲存的欄位;省略或留白的欄位會保留已儲存的值。annotations會取代整個對應表,因此若要保留所有項目,請傳入每個鍵;{}會清除對應表。recurring_mute_schedule(object, optional):取代每週排程:enabled(預設值為 false)、timezone(IANA 名稱,必填),以及windows(weekdays的 1–20 個項目,格式為sun..sat、start_time/end_time,並以 24 小時制HH:MM表示)。結束時間若早於或等於開始時間,則會在隔天結束。若要保留所有時段,請全部傳入。clear_recurring_mute_schedule(boolean, optional):完全移除排程;不可與recurring_mute_schedule一起使用。這與enabled=false不同,後者會保留已儲存的時段。
檢視者角色使用者只能變更 mute_until。當群組或實體已靜音時,會拒絕規則層級的靜音變更。使用 get_entity_alert_rules 讀回變更,其中會顯示 mute_until、recurring_mute_schedule 和 properties。
delete_alert
永久刪除規則。先使用 get_alert_config 確認,並取得使用者明確確認。若規則不存在或屬於其他警示群組,則拒絕刪除任何內容。
entity_id(string, required)id(string, required):警示規則 UUID。
mute_alert_group
將群組中所有目前及未來的規則靜音;若要將單一規則靜音,請使用 patch_alert 搭配 mute_until。需要編輯者權限。
entity_id(string, required):警示群組/實體 UUID。until(integer, required):靜音結束時的 Unix epoch 秒數。0會解除靜音;如-1這類負值會無限期靜音。
acknowledge_alert
接手觸發中的警示,或釋出該警示。不會解決或靜音警示。確認自己已擁有的警示是安全的無操作。除非 get_alerts 在過去一小時內列出完全相同的警示(全部三個 ID),否則 ack 會拒絕且不記錄任何內容。
alert_group_id/rule_id/rule_type(string, required):從get_alerts中的警示複製。action(string, optional):ack(預設值)或unack。只有擁有者或組織管理員可以取消確認。mute_until(integer, optional):僅限ack。記錄你已使用mute_alert_group或patch_alert套用的靜音;不會執行靜音。
reassign_alert
將已有擁有者的警示交給另一位使用者;若警示沒有擁有者,請先確認警示。若因警示沒有擁有者而未重新指派,會說明 get_alerts 是否在過去一小時內列出該警示。Last9 不會通知新擁有者。
alert_group_id/rule_id/rule_type(string, required):從get_alerts中的警示複製。owner_email(string, optional):優先使用;會與啟用中的組織使用者進行不區分大小寫的比對。owner_user_id(string, optional):請恰好提供owner_email或owner_user_id其中之一。
create_notification_channel
建立通道;在使用 attach_notification_channel 附加之前,不會路由任何通知。只建立一次並保留 id;沒有更新工具。只回傳 id、name、type 和 send_resolved。
name(string, required):每種類型都必須唯一;不可包含冒號。type(string, required):slack、pagerduty、opsgenie、email或generic_webhook。destination(string, required):Slack Incoming Webhook URL(或搭配slack_app_mode使用的通道 ID)、PagerDuty routing key、Opsgenie API key、以逗號分隔的工作電子郵件地址(可使用任何網域,不限於組織的網域;API 會拒絕 Gmail 等個人電子郵件服務提供者的地址,而使用個人帳號登入的組織只接受其管理員的地址),或 HTTPS webhook URL。slack_app_mode(boolean, optional):僅限 Slack。預設值:false。mention_handles(string, optional):以逗號分隔,例如user|U123ABC|name、special|here、special|channel。webhook_headers(object, optional):僅限generic_webhook。webhook_ca_certificate(string, optional):僅限generic_webhook;一份最多 64 KiB 的 PEM CA 憑證。send_resolved(boolean, optional):預設值:true。
attach_notification_channel
將現有通道路由至一個警示群組。具冪等性。附加項目會在附加時複製通道的傳遞設定(標頭、憑證、提及);若之後通道設定有所變更,請重新附加。
channel_id(integer, required):通道 id(使用get_notification_channels搭配scope=channels),不是附加項目 id。alert_group_id(string, required):來自get_alert_groups。severity(string, required):breach、threat或both。both會建立兩個附加項目;若第二個失敗,第一個仍會保留,錯誤訊息會指出要重試的嚴重性。
detach_notification_channel
移除一個附加項目。需要 delete-scope 權杖;write-scope 權杖無法解除附加。
attachment_id(integer, required):使用scope=attached搭配get_notification_channels時,來自id的項目。拒絕通道 id。alert_group_id(string, optional):若附加項目屬於不同群組,則拒絕操作。
delete_notification_channel
永久刪除沒有任何附加項目的通道;請先解除其附加項目。需要 delete-scope 權杖。會透過重新列出通道來確認刪除。
channel_id(integer, required):使用scope=channels搭配get_notification_channels時,來自id的項目。拒絕附加項目 id。
did_you_mean
query(string, required):要搜尋的名稱,可以是不完整、拼錯或縮寫的名稱。type(string, optional):限制實體類型:service、environment、host、database、k8s_deployment、k8s_namespace、job。
最多回傳 3 個最接近的比對結果及相似度分數。若實體名稱不確定,請在呼叫任何工具前使用此工具。若先前呼叫回傳空結果,請在重試前先使用此工具。
get_service_profile
service_name(string, required):要推導遙測設定檔的服務。datasource(string, optional):資料來源名稱。若使用預設值則省略;近似名稱的解析方式與 Prometheus 工具相同。 回傳簡短的調查摘要,後接原始 JSON 格式的完整設定檔:訊號是否存在(logs/traces/metrics為present、absent或unknown)、語言與執行環境、部署環境、日誌signal_shape(log_format、severity_set、level_field、trace_context_in_logs),以及適用時建議的資料匯入修正方式。當後端回報freshness時,摘要會新增一行last seen,包含freshness.logs.last_seen和freshness.traces.last_seen(RFC3339;若為 null 則使用none);當freshness.traces_stale為true時,還會顯示traces stale警告:追蹤跨度已停止,但日誌仍持續,因此應調查freshness.traces.last_seen附近是否發生回歸,而非缺少設定。資料衍生自上游並經快取,TTL 約為 15 分鐘。
在任何服務範圍的調查之前呼叫此工具,讓工具選擇符合服務實際的遙測資料 — 若 traces 為 absent,請略過追蹤工具;若 severity_set 為 none 或 partial,請從日誌本文中的 level_field 解析嚴重性,而非使用 severity_filters。metrics 一律為 unknown,且 v1 中不會填入 dependencies。若 logs 和 traces 同時為 absent,請先使用 did_you_mean 確認名稱,再判定服務未受監控。
list_dashboards
name(string, optional):儀表板名稱中不區分大小寫的子字串。縮小清單範圍並total。limit(integer, optional):每頁儀表板數量,1–200。預設值:100。cursor(string, optional):上一頁的next_cursor;傳入時須搭配相同的name。
回傳 {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"},並依最近更新時間由新到舊排序。若為空,則省略 created_by;若 API 未回報 readonly,則省略 locked。updated_at 是以字串表示的 Unix epoch 秒數。為避免超過 32 KB,頁面可能提早結束;最後一頁不會包含 next_cursor。
get_dashboard
id(string, required):儀表板 UUID。region(string, optional):用於填入面板查詢的區域。預設為已設定的資料來源區域。
結果會新增頂層欄位 locked(若 API 未提供,則為 false)和 created_by(作者的使用者 ID)。
若要對面板設定警示,請參閱 last9://reference/alerting。
validate_dashboard
唯讀。絕不建立或更新儀表板。只能指定 dashboard_id 或 dashboard_definition 其中之一。
dashboard_id(string, optional):要驗證的已儲存儀表板 UUID。dashboard_definition(object, optional):未儲存的儀表板內嵌本文(真正的試執行)。若傳入{dashboard, metadata}建立封套,會解開並取出其中的dashboard物件。start_time_iso/end_time_iso(string, optional):驗證時間範圍(RFC3339)。必須 ≤ 24h。region(string, optional):執行面板查詢的區域。
回傳 dashboard_validation/v1:每個面板的 lint + 執行分類(data / no_data / invalid / error)。Day-1 的空結果會分類為 valid_no_data,不會執行診斷探測。沒有面板的儀表板會回傳 success: false 和 error: "no_panels"。其他格式的面板欄位(Grafana 的 gridPos、title、type,以及需要查詢的面板上的 targets)和型別錯誤的欄位會逐一列在各面板的 shape_problems 中,計入 summary.panels_invalid_shape,並使 overall 成為 fail。
preview_dashboard
唯讀的用戶端預覽。傳入 dashboard(建立請求中的未儲存儀表板物件),或傳入 id 加上 ops(與 patch_dashboard 相同順序的操作)。必填的 start_time_iso 和 end_time_iso 是 RFC3339 時間戳記,涵蓋時間不得超過 24 小時。選填的 variables 包含純量覆寫值;否則會套用儀表板值和內建預設值。
{
"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"
}
回傳 saved: false、定義/查詢 validation 摘要(包括建立結構描述不相符時的 definition_error),以及包含 ok / empty / error 狀態、解析後查詢和目標診斷的 panels。PromQL 和 LogJSON 會執行;不支援的查詢類型和無法解析的變數會使面板發生錯誤。有效的非查詢面板會標示為 ok;無效的面板定義會標示為 error。Patch diff 包含淨 panels_added、panels_changed(包括移動)和 panels_removed,以及依序排列的操作變更。面板以 ID 和從零開始的索引識別;已移除面板的索引指的是原始儀表板。已儲存的面板必須有不重複且非空的 ID。
限制:50 個面板、100 個查詢、100 個操作;輸入和候選儀表板的 JSON 大小各為 65536 位元組;執行期限為 60 秒。超過 65536 個 JSON 位元組的解析後查詢會在執行前遭到拒絕。每個目標的證據最多保留三個樣本和 1024 個 JSON 位元組;若省略樣本,會包含 truncated: true。若 JSON 報告超過 262144 位元組,則會失敗並提供縮減輸入的指引。
不會建立或更新任何儀表板。此工具會依照建立結構描述檢查候選項目,並使用現有驗證器執行查詢;但不保證後端會接受或正確呈現。後端指派的 ID、預設值、捨棄的欄位或並行編輯,都可能改變儲存結果。預覽使用與寫入相同的本機 patch 操作和面板版本預設值。
create_dashboard
僅限新增。此呼叫回傳 dashboard.id 後,請使用 patch_dashboard 編輯面板(或使用 update_dashboard 重新調整結構)— 不要再次建立儀表板來新增、刪減或修正面板。
dashboard(object, required):包含name和panels[]的儀表板定義。每個面板都必須包含name、version、layout(x、y、w、h)、visualization.type和queries[]。metadata(object, optional):儀表板中繼資料 —_category和_type欄位(例如{"_category":"custom","_type":"metrics"})。
update_dashboard
僅用於重新調整儀表板的大部分結構;若要新增、編輯、移除或移動個別面板,請使用 patch_dashboard。依 ID 完整取代(本文與建立時相同):必須重新傳送每個面板。
id(string, required):要更新的儀表板 UUID。dashboard(object, required):完整取代用的儀表板本文(結構與建立時相同)。metadata(object, optional):取代用的中繼資料。唯讀系統儀表板會回傳可復原的工具錯誤。
patch_dashboard
小幅調整時優先使用此工具,而非 update_dashboard:不會重新傳送未變更的面板。此工具會讀取儀表板、依序套用 ops,再寫回,因此在讀取與寫入之間於其他位置所做的編輯會遭到覆寫。回傳 {dashboard_id, changes[]};若儀表板已符合某項操作,該操作會略過;若所有操作都未造成變更,則不會寫入任何內容。寫入後會重新讀取並比對差異:面板 fields 顯示儲存的值,not_stored 列出 API 捨棄的鍵,而 not_removed 列出 API 在收到 null 時仍保留的鍵。超過 200 個字元的差異值會就地縮短,並保留其 JSON 型別。
id(string, required):要修補的儀表板 UUID。ops(array, required):依序套用的操作;若有任何操作無效,就不會寫入任何內容,且錯誤會以ops[i]指出該操作。add_panel:panel(完整面板物件;version預設為 1),選填的index(從零開始的插入位置,預設為附加至末尾)。update_panel:panel_id、fields(要取代的頂層面板鍵;null會移除鍵;id不可變更)。remove_panel:panel_id。move_panel:panel_id、index(移動後從零開始的位置)。set_title:title(儀表板名稱)。set_variable:variable;取代具有相同target的變數,否則附加至末尾。
delete_dashboard
id(string, required):要刪除的儀表板 UUID。唯讀系統儀表板無法刪除。
set_dashboard_lock
id(string, required):儀表板 UUID。locked(boolean, required):true會鎖定儀表板,false會解除鎖定。
寫入工具;只有在使用者明確要求時才呼叫。只有儀表板作者或組織管理員可以鎖定或解除鎖定儀表板,內建儀表板一律為唯讀。回傳 {"id", "locked"} 及其結果狀態。鎖定期間,update_dashboard、patch_dashboard 和 delete_dashboard 不會送出寫入請求,並會回傳可復原的工具錯誤;錯誤以 dashboard is locked 開頭,指出作者,並建議解除鎖定或使用 create_dashboard 複製儀表板。
list_dashboard_snapshots
dashboard_id(string, required):要列出快照的儀表板 UUID。
僅回傳中繼資料(id、name、expires_at 等)。若要取得凍結的面板資料,請使用 get_dashboard_snapshot。
get_dashboard_snapshot
id(string, required):快照 UUID。
回傳完整的凍結快照,包括 dashboard_definition、panel_data、time_range 和 variables。
delete_dashboard_snapshot
id(string, required):要刪除的快照 UUID。
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(optional):時間範圍;優先使用回溯時間或明確的 ISO 邊界(預設 60m)。region(string, optional):區域覆寫值。
回傳在該時間範圍內有剖析資料的服務。請在呼叫 get_flamegraph / get_top_functions / get_profile_summary 之前先呼叫此工具。
get_flamegraph
service(string, required):來自get_profile_services的服務名稱。profile_type(string, optional):cpu(預設)、alloc或wall。比較不同時間範圍時,請固定類型。env/cluster/namespace/runtime(string, optional):範圍篩選條件。limit(number, optional):彙總堆疊列的上限(預設 1000,最大 10000)。lookback_minutes/start_time_iso/end_time_iso/region(optional)。
回傳巢狀火焰圖樹(name / value / self / children)。truncated: true 表示已達 API 列數上限。
get_top_functions
篩選條件與 get_flamegraph 相同。回傳依自身樣本排序的最熱門函式。結果可能遭截斷;請檢查 truncated。
get_profile_summary
篩選條件與 get_flamegraph 相同。回傳該服務剖析資料的簡短自然語言分流摘要。
grafana_search_dashboards
query(string, optional):標題子字串。留空時會廣泛列出(受 5,000 列上限限制)。
回傳包含 uid、title、uri、url、type、tags 的 {"dashboards":[…], "truncated":bool}。搭配 grafana_get_dashboard 使用 uid。
grafana_get_dashboard
uid(string, required):Grafana 儀表板 uid。full_json(boolean, optional):為 true 時,回傳原始 Grafana JSON,而非篩選後的摘要。
預設摘要:版本、標籤、範本變數,以及每個面板的類型/資料來源/gridPos/promQL 目標。未知的外掛面板類型會出現在 unsupportedPanelTypes 中。
grafana_list_folders
無參數。回傳資料夾樹。
grafana_list_folder_dashboards
folder_uid(string, 必填):Grafana 資料夾 uid。
傳回該資料夾中儀表板的 {"dashboards":[…], "truncated":bool}(分頁上限為 5,000)。
grafana_list_datasources
不接受參數。傳回資料來源的安全投影(不含憑證欄位)。
測試
執行測試 goroutine 分析器,但不執行應用程式測試:
make lint-test
這會對所有套件執行 Go 的 testinggoroutine 分析器,包括其
*_test.go 檔案,並使用不安全與安全的測試案例進行檢查。兩個 CI 測試
工作流程都會將 go vet -testinggoroutine ./... 作為獨立步驟執行,因此快取的
套件測試結果無法略過 lint 檢查。
根套件也會將分析器作為測試執行。若要執行完整測試套件並確保該檢查不使用快取,請使用 go test -count=1 ./...:Go 的測試快取不會追蹤分析器子程序讀取的
內部套件原始碼檔案。這些檔案變更後,單純執行
go test ./... 可能會重用根測試先前通過的結果。
在 testing.T 或 testing.B 上,Fatal、Fatalf 和 FailNow 必須在
父測試 goroutine 中執行。工作 goroutine 應將錯誤傳回,供父測試進行斷言:
errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
t.Fatal(err)
}
分析器會偵測 go func 閉包中的直接呼叫;它不是通用的
跨程序檢查,無法偵測隱藏在任意輔助函式呼叫後的斷言。
除非設定了 TEST_REFRESH_TOKEN,否則整合測試會略過。
