Last9

官方

無縫地將即時生產環境上下文——日誌、指標和追蹤——帶入您的本地環境,以更快地自動修復程式碼。

你可以用 Last9 MCP 做什麼?

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

文件

Last9 MCP Server

last9 mcp demo

你的 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

只有管理員可以建立權杖。

  1. 前往 API Access
  2. 按一下 Generate Token,並授予 Write 權限
  3. 複製權杖

用戶端設定

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/DesktopSettings > Developer > Edit Config (claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > 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_HOSTapp.last9.io覆寫 API 主機
LAST9_TOOLSETS所有工具以逗號分隔要公開的工具集(logs、traces、metrics、alerts、dashboards、profiles、grafana、investigate、all)。別名:LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalse將 true 設為僅提供唯讀工具;請參閱唯讀模式。非布林值會導致啟動錯誤。別名:LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—在唯讀模式下仍提供的寫入工具,以逗號分隔。別名:LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000分塊 get_logs 請求的項目數上限
LAST9_USE_LOG_SEARCH_APIfalse將 true 設為 get_logs 和 get_service_logs 啟用單次伺服器端搜尋呼叫,而非用戶端分塊。每次呼叫最多 90 秒,之後會提供縮小時間範圍的建議;若收到 502 或 503,會在此時間內重試一次
LAST9_DEBUG_CHUNKINGfalse將 true 設為記錄 get_logs、get_service_logs、get_traces 的分塊規劃詳細資訊
LAST9_DISABLE_TELEMETRYtrue將 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_patternssample:擷取並解碼樣本;mine:模式探勘;deep_link:解析選用索引並建立連結
get_logsfetch:擷取、解碼並合併結果,包括重試和選用的計數合理性檢查;count_sanity:巢狀選用檢查;post_process:指引、摘要和 JSON 格式化;deep_link:索引解析和連結建立
get_service_profilerequest:透過共用 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 工具需要此處提供的 env
  • get_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_field
  • get_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_field
  • get_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 — ID create_alert 和 validate_alert_expression 需要
  • create_kpi — 當沒有合適的現有 KPI 時,在警示群組中建立 KPI(PromQL + 單位)。建立一次並保留傳回的 ID
  • get_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_dashboard
  • patch_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=true
  • grafana_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_set all 時才設定 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_events change_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,否則整合測試會略過。


MseeP.ai Security Assessment Badge