Last9
chính thứcMang bối cảnh sản xuất thời gian thực—log, chỉ số và dấu vết—vào môi trường cục bộ của bạn một cách liền mạch để tự động sửa mã nhanh hơn.
Bạn có thể làm gì với Last9 MCP?
- Điều tra sự cố trên môi trường production — Yêu cầu trợ lý truy xuất nhật ký, dấu vết, chỉ số, ngoại lệ và cảnh báo đang kích hoạt của một dịch vụ để chẩn đoán sự cố.
- Đối chiếu thay đổi với tác động — Kiểm tra các lần triển khai và thay đổi cấu hình, sau đó so sánh một dịch vụ và các dịch vụ gọi nó trước và sau thay đổi để xem liệu thay đổi có gây ra hồi quy hay không.
- Truy vấn chỉ số Prometheus — Chạy truy vấn PromQL dạng khoảng thời gian hoặc tức thời, đồng thời liệt kê các giá trị nhãn để khám phá mọi chỉ số trong nguồn dữ liệu của bạn.
- Kiểm tra hiệu năng cơ sở dữ liệu — Khám phá các cơ sở dữ liệu, tìm những lần thực thi truy vấn chậm, đồng thời xem xét các mẫu truy vấn và chỉ số phía máy chủ từ các span OTel.
- Phân tích dấu vết và hồ sơ hiệu năng — Lấy biểu đồ thác nước của một dấu vết theo ID, xếp hạng độ lệch thuộc tính giữa các nhóm, hoặc lấy flamegraph và danh sách các hàm hàng đầu của một dịch vụ.
- Quản lý cảnh báo và bảng điều khiển — Rà soát phạm vi bao phủ và mức độ phù hợp của cảnh báo, tạo hoặc cập nhật quy tắc cảnh báo, đồng thời liệt kê, xác thực hoặc chỉnh sửa bảng điều khiển tùy chỉnh.
Tài liệu
Last9 MCP Server

Tác nhân AI của bạn không biết điều gì đang gặp sự cố trong môi trường production. Công cụ này sẽ khắc phục điều đó.
Last9 MCP Server kết nối Claude, Cursor, Windsurf và mọi trợ lý AI khác hỗ trợ MCP trực tiếp với dữ liệu quan sát hệ thống production của bạn — nhật ký, chỉ số, dấu vết, ngoại lệ, truy vấn cơ sở dữ liệu, cảnh báo và triển khai. Tác nhân không còn phỏng đoán mà bắt đầu đọc tín hiệu thực tế.
Bắt đầu trong 30 giây (Hosted)
Không cần cài tệp nhị phân. Không cần quản lý token. Chỉ cần một URL, xác thực OAuth trong trình duyệt là xong.
Tìm slug tổ chức của bạn trong URL Last9: app.last9.io/<org_slug>/...
Claude Code
claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp
Nhập /mcp, chọn last9 rồi xác thực. Vậy là xong.
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Nhấp Connect, rồi hoàn tất OAuth.
VS Code
Yêu cầu phiên bản 1.99 trở lên. Mở Command Palette → MCP: Add Server, dán URL rồi xác thực.
Hoặc thêm trực tiếp vào settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > biểu tượng bánh răng (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. Đặt tên là last9, dán URL rồi xác thực.
Cần có quyền quản trị đối với tổ chức Claude của bạn.
Tự lưu trữ (STDIO)
Dùng cách này khi ứng dụng MCP của bạn không hỗ trợ truyền tải HTTP hoặc khi bạn cần chạy máy chủ cục bộ.
Cài đặt
Homebrew:
brew install last9/tap/last9-mcp
NPM:
Yêu cầu Node.js 22.23.4+, 24.22.1+ hoặc 26.12.1+: các bản phát hành cũ hơn chấp nhận chứng chỉ TLS từ các chứng chỉ trung gian eMudhra đã bị xâm phạm khi trình cài đặt tải tệp nhị phân xuống.
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Bản phát hành tệp nhị phân (Windows / cài đặt thủ công):
Tải xuống từ GitHub Releases:
| Nền tảng | Tệp lưu trữ |
|---|---|
| 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 |
Lấy Refresh Token
Chỉ quản trị viên mới có thể tạo token.
- Truy cập API Access
- Nhấp Generate Token với quyền Write
- Sao chép token
Cấu hình ứng dụng
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>"
}
}
}
}
Dán nội dung này vào đâu:
| Ứng dụng | Vị trí |
|---|---|
| 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 > biểu tượng bánh răng (mcp_config.json) |
| VS Code | Bọc trong { "mcp": { "servers": { ... } } } trong settings.json — chi tiết |
Cấu hình STDIO của VS Code
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
Với NPM: dùng "command": "npx" và thêm "args": ["-y", "@last9/mcp-server@latest"].
Windows
Sau khi tải xuống từ GitHub Releases, giải nén và trỏ đến đường dẫn đầy đủ:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Dùng NPM trên Windows sẽ dễ hơn — không cần quản lý đường dẫn.
Biến môi trường
| Biến | Mặc định | Mô tả |
|---|---|---|
LAST9_REFRESH_TOKEN | (bắt buộc) | Refresh token từ API Access |
LAST9_DATASOURCE | org mặc định | Tên datasource/cluster — hữu ích khi bạn có nhiều cluster Levitate |
LAST9_FAKE_NOW_ISO | (chưa đặt) | Chỉ dành cho eval/replay; không bao giờ đặt trong production. Thời điểm RFC3339 (ví dụ: 2026-01-02T15:04:05Z) thay thế thời gian hiện tại khi phân giải các khoảng thời gian tương đối như lookback_minutes, giúp các lần chạy có thể tái lập. Giá trị không hợp lệ sẽ gây lỗi khởi động. Thời gian chờ, bộ nhớ đệm và thời hạn token vẫn dùng thời gian thực |
LAST9_API_HOST | app.last9.io | Ghi đè máy chủ API |
LAST9_TOOLSETS | tất cả công cụ | Các bộ công cụ phân tách bằng dấu phẩy cần cung cấp (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Bí danh: LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | Đặt true để chỉ cung cấp các công cụ chỉ đọc; xem Chế độ chỉ đọc. Giá trị không phải boolean sẽ gây lỗi khởi động. Bí danh: LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | Các công cụ ghi phân tách bằng dấu phẩy vẫn được cung cấp trong chế độ chỉ đọc. Bí danh: LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Số mục tối đa cho các yêu cầu get_logs được chia thành nhiều phần |
LAST9_USE_LOG_SEARCH_API | false | Đặt true để trả lời get_logs và get_service_logs bằng một lệnh tìm kiếm phía máy chủ thay vì chia thành nhiều phần phía máy khách. Mỗi lệnh gọi có thời hạn 90 giây, sau đó trả về hướng dẫn thu hẹp khoảng thời gian; lỗi 502 hoặc 503 được thử lại một lần trong khoảng thời gian đó |
LAST9_DEBUG_CHUNKING | false | Đặt true để ghi nhật ký chi tiết về việc lập kế hoạch chia phần cho get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Đặt false để bật tính năng theo dõi OTel nội bộ |
OTEL_SDK_DISABLED | — | Biến môi trường OTel tiêu chuẩn. Ghi đè LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | Điểm cuối bộ thu OTLP (chỉ khi bật telemetry) |
OTEL_EXPORTER_OTLP_HEADERS | — | Tiêu đề xác thực OTLP (chỉ khi bật telemetry) |
Thời gian các giai đoạn của công cụ
Khi bật telemetry nội bộ, các span của công cụ có last9.phase.<phase>.duration_ms
(thời gian thực đã trôi qua tính bằng mili giây) và last9.phase.<phase>.failed (giai đoạn đó
có trả về lỗi hay không). Các trường tương tự cũng được ghi dưới dạng nhật ký gỡ lỗi
tool phase completed, cùng với tool và phase, khi trình ghi nhật ký được cấu hình chấp nhận các bản ghi gỡ lỗi.
Các phép đo thời gian này không bổ sung đầu vào, văn bản truy vấn, thông tin xác thực hay nội dung lỗi.
| Công cụ | Giai đoạn |
|---|---|
get_log_patterns | sample: tải và giải mã mẫu; mine: khai phá mẫu; deep_link: phân giải chỉ mục tùy chọn và tạo liên kết |
get_logs | fetch: tải, giải mã và hợp nhất kết quả, bao gồm cả các lần thử lại và kiểm tra tính hợp lý của số lượng tùy chọn; count_sanity: bước kiểm tra tùy chọn lồng bên trong; post_process: hướng dẫn, tóm tắt và định dạng JSON; deep_link: phân giải chỉ mục và tạo liên kết |
get_service_profile | request: chuẩn bị và gửi yêu cầu qua ứng dụng khách API dùng chung, rồi đọc toàn bộ phản hồi trước khi định dạng ngắn gọn |
Chỉ các giai đoạn đã thực thi mới được ghi lại, kể cả khi tải dữ liệu thất bại. Các hàm trợ giúp tùy chọn có bỏ qua lỗi vẫn giữ nguyên hành vi đó; failed: false không xác nhận rằng liên kết tùy chọn hoặc bước kiểm tra số lượng đã khả dụng. Thời lượng của count_sanity lồng bên trong đã được tính trong fetch; không cộng thêm lần nữa. Thời gian tải bao gồm cả hoạt động của ứng dụng khách, nên không chỉ đo riêng thời gian thực thi ở backend. Hãy so sánh các giai đoạn này trên những khoảng thời gian và đường dẫn tìm kiếm tương đương trước khi điều chỉnh lấy mẫu hoặc bộ nhớ đệm.
Để điều tra độ trễ, hãy phát lại cùng dịch vụ, datasource, chỉ mục, khoảng thời gian và giới hạn trên các bản dựng cơ sở và bản dựng ứng viên. Ghi lại SHA của bản dựng, tổng thời gian của công cụ, thời lượng từng giai đoạn, last9.logs.search_path, các thuộc tính thử lại nếu có và cờ phạm vi bao phủ. So sánh cả các lệnh gọi chậm lẫn các lệnh gọi điển hình. Thời gian tải hoặc yêu cầu hồ sơ chậm cho biết cần điều tra giai đoạn mạng/API; cần có bằng chứng tương quan riêng trước khi quy phần đuôi độ trễ cho backend. Chỉ riêng các chẩn đoán này không chứng minh được độ trễ đã cải thiện.
Chế độ chỉ đọc
--read-only (hoặc LAST9_MCP_READ_ONLY=true) chỉ cung cấp các công cụ được chú thích bằng readOnlyHint: true, vì vậy không công cụ nào có thể tạo, thay đổi hoặc xóa quy tắc cảnh báo, kênh thông báo, bảng điều khiển hoặc quy tắc loại bỏ; xác nhận hoặc phân công lại cảnh báo; hay tắt tiếng nhóm. Công cụ không có chú thích được xem là công cụ ghi và sẽ bị ẩn.
Để giữ lại một vài công cụ ghi, hãy liệt kê chúng bằng --allow-write-tools (hoặc LAST9_MCP_ALLOW_WRITE_TOOLS):
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- Máy chủ từ chối khởi động nếu tên được cho phép không phải là công cụ ghi (do nhập sai hoặc là tên công cụ đọc); lỗi sẽ liệt kê các công cụ ghi hợp lệ.
--allow-write-toolsmà không có--read-onlysẽ gây lỗi khởi động, vì mọi công cụ ghi vốn đã được cung cấp.- Chế độ chỉ đọc kết hợp với
--toolsets: một công cụ chỉ được cung cấp khi đáp ứng cả hai điều kiện.--toolsets=alerts --read-only --allow-write-tools=mute_alert_groupcung cấp các công cụ đọc cảnh báo cùng vớimute_alert_group; công cụ ghi được cho phép nhưng nằm ngoài các bộ công cụ đã chọn vẫn bị ẩn. - Chế độ
--httpvàdump-toolstuân theo cùng các cờ và biến môi trường:go run . dump-tools --read-onlyin ra tập công cụ chỉ đọc, cùng với hướng dẫn máy chủ được cung cấp tronginstructions. - Mô tả, lược đồ và kết quả của công cụ đọc, cũng như hướng dẫn máy chủ, không bao giờ nêu tên công cụ ghi bị ẩn. Tuy nhiên, một công cụ ghi được cho phép vẫn có thể nêu tên các công cụ liên quan bị ẩn (
create_alerttạo quy tắc bị tắt màpatch_alertbật), vì vậy hãy cho phép cả cặp công cụ đó.
Khả năng
Định hướng
get_workspace_overview— Lệnh gọi đầu tiên được khuyến nghị khi yêu cầu không nêu dịch vụ hoặc công cụ nào (nếu có nêu thì chuyển thẳng đến công cụ tương ứng): môi trường, các tín hiệu (nhật ký, dấu vết, chỉ số) được ghi nhận trong giờ qua, số lượng dịch vụ và nhóm cảnh báo, cảnh báo đang kích hoạt và thời gian hiện tại — tất cả trong một lệnh gọi ít tốn kém. Tín hiệu không xuất hiện trong giờ đó vẫn có thể có dữ liệu cũ hơn nên vẫn có thể truy vấn. Lệnh gọi con thất bại sẽ để trường tương ứng ở trạng tháinullvà thêm một mụcerrors[]. Được cung cấp trong mọi bộ công cụget_current_time— Thời gian hiện tại cùng với các giới hạn tuyệt đối cholast 2h,yesterdayhoặcsince yesterday 9am IST, theo bất kỳ múi giờ IANA hoặc tên viết tắt phổ biến nào. Được cung cấp trong mọi bộ công cụ
Tình trạng dịch vụ
get_service_summary— Các hàng(service, env)của toàn bộ hệ thống được xếp hạng: request_count trong khoảng thời gian, throughput_rpm, số lượng lỗi HTTP 4xx/5xx và lỗi gRPCget_service_environments— Các môi trường khả dụng cho dịch vụ của bạn. Hãy chạy công cụ này trước — các công cụ APM khác cầnenvtừ đâyget_service_performance_details— Phân tích đầy đủ: thông lượng, tỷ lệ lỗi, p50/p90/p95/avg/max, apdex, tính khả dụng (mặc định là bản tóm tắt; dùnginclude_seriesđể lấy chuỗi đầy đủ)get_service_operations_summary— Các thao tác được nhóm theo điểm cuối HTTP, lệnh gọi DB, nhắn tin và ứng dụng khách HTTPget_service_dependency_graph— Bản đồ phụ thuộc với thông lượng, độ trễ và tỷ lệ lỗi cho các thành phần upstream/downstream/hạ tầngget_apm_service_deviations— So sánh khoảng thời gian hiện tại với khoảng cơ sở có cùng thời lượng: các hồi quy/cải thiện, đối chiếu Apdex và kết quả cuối cùng (toàn hệ thống hoặc một dịch vụ)get_exceptions— Ngoại lệ phía máy chủ có bộ lọc dịch vụ và span
Khả năng quan sát cơ sở dữ liệu
Bốn công cụ truy vấn trực tiếp hiệu năng cơ sở dữ liệu của bạn, dựa trên các span dấu vết OpenTelemetry và, khi không có dấu vết, dựa trên các chỉ số hạ tầng như CloudWatch. Không cần bổ sung instrumentation nếu bạn đã dùng OTel.
get_databases— Khám phá tất cả cơ sở dữ liệu trên toàn bộ hạ tầng của bạn: loại DB, máy chủ, thông lượng (truy vấn/phút), độ trễ p95, tỷ lệ lỗi, số dịch vụ phụ thuộc. Cũng khám phá cơ sở dữ liệu từ các chỉ số hạ tầng như CloudWatch mà không cần đo đạc trace — các hàng đó có giá trị hoạt động thay cho chỉ số traceget_database_slow_queries— Các lần thực thi truy vấn chậm nhất thực tế, được sắp xếp theo thời lượng, kèm ID trace để đi sâu vào trace đầy đủget_database_queries— Mẫu truy vấn và số liệu tổng hợp: tần suất chạy truy vấn, thời lượng trung bình/p95, tỷ lệ lỗiget_database_server_metrics— Chỉ số phía máy chủ từ chính máy chủ DB (CPU, kết nối, tỷ lệ bộ đệm trúng — tùy thuộc vào hệ thống DB của bạn)
Hỗ trợ PostgreSQL, MySQL, MongoDB, Redis, Aerospike và mọi hệ thống khác có trace OTel với thuộc tính db_system — đồng thời hỗ trợ cơ sở dữ liệu được phát hiện từ các chỉ số hạ tầng như CloudWatch, trong đó các hàng có giá trị hoạt động thay cho chỉ số trace.
Prometheus / PromQL
prometheus_range_query— Truy vấn phạm vi PromQL trên mọi chỉ sốprometheus_instant_query— Truy vấn tức thời; dùng các hàm rollup nhưavg_over_time,sum_over_timeprometheus_label_values— Giá trị nhãn cho một chuỗi dữ liệu nhất địnhprometheus_labels— Tất cả nhãn có sẵn cho một chuỗi dữ liệu
Định tuyến các truy vấn này đến datasource/cluster khác với mặc định bằng cách đặt LAST9_DATASOURCE, hoặc theo từng lệnh gọi bằng datasource. Nếu bỏ qua datasource, hệ thống sẽ dùng mặc định; một tên gần đúng duy nhất mà bộ so khớp đánh giá là an toàn (chẳng hạn khác biệt về chữ hoa/chữ thường) sẽ dùng kết quả khớp gần nhất. Không đảm bảo tên thiếu, thừa hoặc đảo vị trí chữ cái sẽ được tự động phân giải: ngay cả khi chỉ có một ứng viên, hệ thống vẫn có thể yêu cầu xác nhận nếu thay đổi đó có thể ảnh hưởng đến mã vùng hoặc môi trường. Các kết quả khớp lỏng lẻo hoặc không rõ ràng sẽ trả về các ứng viên và không chạy truy vấn (không phải lỗi); tên không xác định sẽ trả về lỗi. Một khối nội dung bổ sung sẽ nêu tên datasource được sử dụng nếu bạn không chỉ định chính xác tên đó. get_metric_status, get_service_profile và get_apm_service_deviations phân giải datasource theo cùng cách.
Nhật ký
get_logs— Truy vấn nhật ký dạng pipeline JSON đầy đủ (tổng hợp, bộ lọc, trích xuất trường)get_service_logs— Các dòng nhật ký của một dịch vụ, có thể lọc theo mức độ nghiêm trọng và nội dung phần thân; được tóm tắt sau 20 dòng, trừ khiresponse_modelàrawget_log_patterns— Các dòng nhật ký của một dịch vụ trong một khoảng thời gian, được phân cụm thành mẫu thông điệp, kèm số lượng, thời điểm xuất hiện đầu/cuối, phân bố mức độ nghiêm trọng và một mẫuget_emerging_log_patterns— Các mẫu nhật ký mới, tăng, giảm hoặc biến mất so với khoảng thời gian cơ sở, kèm số lượng của cả hai khoảngget_log_attributes— Danh mục toàn cục các thuộc tính trong lược đồ nhật ký cho một khoảng thời gianget_log_attributes_for_pipeline— Các trường nhật ký thực sự có trong một pipeline đang chạy (khám phá theo phạm vi), mỗi trường kèmfilter_fieldchính xácget_drop_rules— Quy tắc loại bỏ nhật ký từ Last9 Control Planeadd_drop_rule— Tạo quy tắc loại bỏ mới để giảm dung lượng nhật ký ngay tại nguồnget_remapping_rules— Quy tắc ánh xạ lại (logs_extract,logs_map,traces_map) từ Last9 Control Planeadd_remapping_rule— Tạo quy tắc ánh xạ lại để trích xuất hoặc ánh xạ thuộc tính nhật ký và trace khi tiếp nhận
Trace
get_traces— Truy vấn trace dạng pipeline JSON để tìm kiếm và tổng hợp trên phạm vi rộngget_service_traces— Trace theo ID trace chính xác hoặc tên dịch vụ. Dùng cách này khi bạn có ID trace — nhanh hơnget_trace_attributes— Danh mục toàn cục các thuộc tính trong lược đồ traceget_trace_attributes_for_pipeline— Các thuộc tính thực sự có trong một pipeline đang chạy (khám phá theo phạm vi), mỗi thuộc tính kèmfilter_fieldchính xácget_trace_attribute_values— Các giá trị riêng biệt của một thuộc tính trace, có thể giới hạn theo pipelineget_trace_attribute_deviations— Xếp hạng các giá trị thuộc tính khác biệt giữa hai nhóm span có giới hạn (chậm so với nhanh, có lỗi so với không lỗi, hoặc hai khoảng thời gian). Tương quan, không phải nguyên nhânget_trace_waterfall— Một trace chính xác dưới dạng sơ đồ thác nước cha/con, kèm thời gian tự thân theo hợp khoảng, các span chậm nhất và cảnh báo về đồ thị
Sự kiện thay đổi & Cảnh báo
get_change_events— Triển khai, thay đổi cấu hình, khôi phục phiên bản. Đối chiếu sự cố với những thay đổi đã diễn raanalyze_change_impact— Thay đổi có gây ra sự cố không? So sánh một dịch vụ và các bên gọi trực tiếp trước và sau thay đổi: tín hiệu vàng, sai lệch APM và thuộc tính trace, cảnh báo mới được kích hoạt, cùng kết luận (regression likely/no significant change/insufficient data)get_alert_groups— Các nhóm cảnh báo Compass đã cấu hình, kèm nhãn siêu dữ liệu, nhóm, tầng và số lượng quy tắc — bao gồm cả nhóm không có quy tắc và nhóm không phát cảnh báoget_alert_operations_summary— Tình trạng trực ca trong một khoảng thời gian: số cảnh báo được tạo so với được xác nhận, tồn đọng, lượt gửi và, khi cóinclude_rules, các quy tắc gây nhiều nhiễu nhất, chập chờn và không được định tuyến. Mỗi số lượng đều kèmstatus(available/partial/unavailable)get_alert_coverage— Những gì bạn chưa thiết lập cảnh báo: tín hiệu vàng chưa được bao phủ, nhóm cảnh báo bị tắt hoàn toàn hoặc không được định tuyến, và quy tắc bị tắt tiếng quá lâu; mỗi mục đều có công cụ khắc phục được đề xuất. Chỉ đọc.get_alert_config— Cấu hình quy tắc cảnh báo — có thể tìm kiếm theo tên, mức độ nghiêm trọng, loại, thẻget_entity_kpis— Mọi KPI (id, tên, PromQL, đơn vị) trong một nhóm cảnh báo, bao gồm cả KPI chưa được quy tắc nào sử dụng — cần các idcreate_alertvàvalidate_alert_expressioncreate_kpi— Tạo KPI (PromQL + đơn vị) trong một nhóm cảnh báo khi không có KPI hiện có nào phù hợp. Chỉ tạo một lần và giữ lại id được trả vềget_alerts— Các cảnh báo hiện đang được kích hoạt trong một khoảng thời gianget_alert_rule_state— Trạng thái kích hoạt trong quá khứ (1/0) của từng quy tắc cảnh báo trong một khoảng thời gian, được nhóm theorule_id. Có thể lọc theo nhóm cảnh báo, tên quy tắc, bộ lọc nhãn và trạng thái.get_alert_hygiene— Các quy tắc cảnh báo gây nhiều nhiễu, chập chờn, cũ và không được định tuyến trong 7 hoặc 30 ngày, được xếp hạng; mỗi quy tắc kèm số liệu làm căn cứ cho kết luận và cách khắc phục được đề xuất. Chỉ đọc.get_notification_channels— Các kênh thông báo đã cấu hình (Slack, PagerDuty, email, v.v.).scope=channelsliệt kê chính các kênh (id để gắn);attachedmặc định liệt kê các kênh được gắn theo từng nhóm cảnh báorecommend_alert_config— Hướng dẫn thiết kế chỉ đọc (vòng đời, cổng xác thực, ngữ cảnh cho người xử lý) trước khi tạo quy tắc cảnh báovalidate_alert_expression— Chạy thử biểu thức cảnh báo trên KPI của một nhóm cảnh báo mà không lưu bất cứ thứ gìdescribe_alert_chart— Chỉ đọc: các tín hiệu có thể cảnh báo (khóa, đơn vị) trên biểu đồ Discover (discover-service,discover-exceptions)create_alert— Tạo quy tắc cảnh báo (tĩnh hoặc thích ứng quaadaptive_std_cmp) trong một nhóm cảnh báo hiện có; luôn được tạo ở trạng thái tắt dưới dạng bản nháp. Chỉ tạo một lần; tinh chỉnh bằngupdate_alert/patch_alertcreate_alert_from_chart— Tạo quy tắc cảnh báo ngưỡng tĩnh từ biểu đồ Discover chỉ trong một lệnh gọi. Tương tựcreate_alert, quy tắc được tạo ở trạng thái tắt dưới dạng bản nhápupdate_alert— Thay thế toàn bộ cấu hình đánh giá của một quy tắc (có thể trả về ID quy tắc thay thế)patch_alert— Thay đổi một phần quy tắc: bật/tạm dừng,mute_until, người xử lýproperties,recurring_mute_schedulehàng tuần (hoặcclear_recurring_mute_schedule)delete_alert— Xóa vĩnh viễn một quy tắc cảnh báomute_alert_group— Tắt tiếng (hoặc bật lại) mọi quy tắc trong một nhóm cảnh báo cho đến thời hạnacknowledge_alert— Nhận xử lý một cảnh báo đang kích hoạt hoặc nhường lại quyền xử lýreassign_alert— Chuyển một cảnh báo đã được xác nhận cho người dùng kháccreate_notification_channel— Tạo kênh Slack, PagerDuty, Opsgenie, email hoặc webhook chungattach_notification_channel— Định tuyến một kênh hiện có đến nhóm cảnh báo để nhậnbreach,threathoặc cả haidetach_notification_channel— Gỡ một liên kết giữa kênh và nhóm cảnh báodelete_notification_channel— Xóa vĩnh viễn một kênh không có liên kết
Các công cụ ghi cảnh báo (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) cần token có phạm vi ghi; delete_alert, detach_notification_channel và delete_notification_channel cần phạm vi xóa. Chúng chỉ được cung cấp trong bộ công cụ alerts.
Các quy tắc, kênh và liên kết do những công cụ này tạo ra được đánh dấu created_via: last9-mcp cùng với tên và phiên bản của ứng dụng khách MCP (đối với quy tắc, các chú thích _l9_created_via_ và _l9_created_via_client_, được patch_alert và update_alert giữ nguyên và bên gọi không thể đặt). get_entity_alert_rules và get_notification_channels hiển thị dấu đánh dấu; delete_alert, detach_notification_channel và delete_notification_channel hướng dẫn tác tử chỉ dọn dẹp các tài nguyên được đánh dấu, trừ khi người dùng nêu rõ một tài nguyên.
Bảng điều khiển tùy chỉnh
list_dashboards— Bảng điều khiển tùy chỉnh được lọc theo tên và phân trang trong giới hạn 32 KB: ID, tên, thời điểm cập nhật gần nhất, tác giả và trạng thái khóaget_dashboard— Định nghĩa đầy đủ của bảng điều khiển theo ID, bao gồm các bảng và truy vấnpreview_dashboard— Bản xem trước chỉ đọc của bảng điều khiển hoặc bản vá chưa lưu: truy vấn đã phân giải, kết quả giới hạn theo từng bảng và phần chênh lệch ròng giữa các bảng; không bao giờ lưuvalidate_dashboard— Chỉ đọc: kiểm tra lint + thực thi + phân loại cho ID bảng điều khiển đã lưu hoặcdashboard_definitionnội tuyến trong khoảng thời gian ≤24h. Không bao giờ tạo hoặc cập nhật bảng điều khiểncreate_dashboard— Tạo một bảng điều khiển tùy chỉnh hoàn toàn mới (bảng, truy vấn, siêu dữ liệu) chỉ một lần. Sau khi trả về id, chỉnh sửa bảng bằngpatch_dashboard.update_dashboard— Tái cấu trúc phần lớn một bảng điều khiển hiện có theo ID (thay thế toàn bộ; bảng điều khiển hệ thống chỉ đọc sẽ trả về lỗi). Để chỉnh sửa từng bảng, dùngpatch_dashboardpatch_dashboard— Chỉnh sửa có mục tiêu một bảng điều khiển hiện có theo ID (thêm/cập nhật/xóa/di chuyển bảng, đặt tiêu đề, đặt biến); trả về phần chênh lệch rút gọn thay vì toàn bộ bảng điều khiểndelete_dashboard— Xóa bảng điều khiển tùy chỉnh theo IDset_dashboard_lock— Khóa hoặc mở khóa bảng điều khiển tùy chỉnh theo ID (chỉ tác giả hoặc quản trị viên tổ chức); bảng điều khiển bị khóa sẽ từ chối cập nhật, vá và xóalist_dashboard_snapshots— Ảnh chụp nhanh tại một thời điểm cố định của bảng điều khiển (chỉ siêu dữ liệu)get_dashboard_snapshot— Ảnh chụp nhanh cố định đầy đủ, bao gồm dữ liệu bảng, để phân tích nguyên nhân gốc (RCA) / chia sẻ chế độ xemdelete_dashboard_snapshot— Xóa ảnh chụp nhanh cố định theo ID
Có thể tạo bảng điều khiển qua MCP bằng prompts/list và prompts/get, không cần cài đặt skill. Cả ba lời nhắc đều không nhận đối số:
create_dashboard_guide— Khám phá, bố cục và chọn bảng; xác thực toàn bộ phương án và chạy truy vấn của từng bảng trước khi phê duyệt, tạo một lần, vá các chỉnh sửa có mục tiêu, sau đó đọc lại.dashboard_examples— Ví dụ hoàn chỉnh bao gồm RED của dịch vụ, độ trễ endpoint, các lớp trạng thái, tình trạng máy chủ, số lượng nhật ký và bảng trace, cùng các biến phụ thuộc.query_guide— Ngữ nghĩa của counter/gauge/histogram và chỉ số trace dẫn xuất, tức thời so với theo phạm vi, cửa sổ rate, giới hạn phần trăm và quy tắc logjson/tracejson.
Có thể đọc cùng nội dung tại last9://reference/create_dashboard_guide, last9://reference/dashboard_examples và last9://reference/query_guide. Lời nhắc và tài nguyên vẫn có thể được khám phá trong mọi bộ công cụ; để thực thi quy trình cần có các công cụ liên quan (để tạo nội dung kết hợp nhiều tín hiệu, dùng --toolsets=dashboards,investigate, công cụ này cũng phục vụ list_datasources). Phiên chỉ đọc có thể chuẩn bị và xác thực nhưng không thể lưu. Hãy kiểm tra tính khả dụng của công cụ trước khi làm theo một bước.
Hiện tại, các bước kiểm tra bảng sử dụng prometheus_range_query, prometheus_instant_query, get_logs và get_traces cùng với validate_dashboard. Các loại truy vấn không được hỗ trợ và giá trị mặc định đơn giản hóa của trình xác thực không đảm bảo kết quả hiển thị tương đương. Bước kiểm tra truy vấn riêng sẽ chuyển sang query_panel sau khi #475 được triển khai.
Lập hồ sơ liên tục
Yêu cầu bật tính năng lập hồ sơ liên tục cho tổ chức. Trước tiên, khám phá dịch vụ bằng get_profile_services, sau đó lấy flamegraph hoặc danh sách hàm được xếp hạng.
get_profile_services— Các dịch vụ có dữ liệu profiling trong khoảng thời gian (chỉ mục trước khi truy vấn)get_flamegraph— Cây flamegraph lồng nhau cho một dịch vụ (mặc định làcpu; cũng cóalloc,wall)get_top_functions— Xếp hạng mẫu tự thân của các hàm nóng nhất cho một dịch vụget_profile_summary— Phân loại sự cố ngắn gọn bằng ngôn ngữ tự nhiên cho profile của một dịch vụ
Bảng điều khiển Grafana
Các công cụ chỉ đọc trên phiên bản Grafana của tổ chức (thông qua proxy Grafana của Last9). Các trường thông tin xác thực không bao giờ được trả về cho mô hình. Bật bằng LAST9_TOOLSETS=grafana (hoặc để trống toolsets để dùng tất cả công cụ).
grafana_search_dashboards— Tìm kiếm bảng điều khiển theo chuỗi con trong tiêu đề (có phân trang;truncated: truekhi đạt giới hạn)grafana_get_dashboard— Tóm tắt bảng điều khiển theo uid (panels, variables, mục tiêu PromQL); dùngfull_json=trueđể lấy JSON Grafana thôgrafana_list_folders— Cây thư mụcgrafana_list_folder_dashboards— Các bảng điều khiển trong một thư mục (có phân trang)grafana_list_datasources— Danh mục datasource không có thông tin xác thực
Phân giải tên gần đúng
did_you_mean— Khi agent không chắc về tên một thực thể, công cụ này trả về các kết quả gần nhất từ danh mục của bạn (dịch vụ, môi trường, máy chủ, cơ sở dữ liệu, triển khai/namespace K8s, công việc). Tối đa 3 gợi ý kèm điểm tương đồng. Máy chủ tự động gọi công cụ này trước hầu hết các công cụ khác khi tra cứu tên không có kết quả.
Hồ sơ dịch vụ
get_service_profile— Cho biết telemetry của một dịch vụ thực sự có dạng như thế nào trước khi bạn truy vấn: những tín hiệu nào tồn tại, ngôn ngữ và runtime, môi trường triển khai, cấu trúc log và cách khắc phục ingest được đề xuất nếu phù hợp. Giúp agent bỏ qua các công cụ trace khi dịch vụ không có trace, đồng thời phân tích mức độ nghiêm trọng từ nội dung log khiSeverityTexttrống, thay vì lọc theo trường này rồi không tìm thấy gì.
Cách hoạt động
Liên kết sâu trong mọi phản hồi. Mỗi công cụ trả về trường deep_link — URL trực tiếp đến bảng điều khiển Last9 cho chính xác truy vấn và khoảng thời gian đó. Agent có thể gửi liên kết cho bạn; bạn nhấp vào là đến nơi.
Toolsets. Theo mặc định, máy chủ cung cấp mọi công cụ. Các máy chủ tự động hóa chỉ cần điều tra (logs/traces/metrics/profiles) có thể đặt LAST9_TOOLSETS=investigate (hoặc truyền --toolsets=investigate) để giữ tools/list gọn nhẹ mà không cần tắt hàng loạt ở phía client. Các gói có tên: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Tên không hợp lệ sẽ báo lỗi ngay. get_current_time và get_workspace_overview được cung cấp trong mọi toolset. Ở chế độ HTTP, một yêu cầu có thể thu hẹp thêm phạm vi này bằng header X-Last9-Toolsets (xem Toolsets theo từng yêu cầu). Gói alerts cũng cung cấp các công cụ chỉ đọc prometheus_range_query và get_dashboard, được prompt author-alert gọi. Riêng gói metrics không bao gồm list_datasources hoặc did_you_mean — hãy dùng investigate (hoặc kết hợp các toolset) khi cần những công cụ hỗ trợ khám phá đó.
Tài nguyên tham khảo công cụ. Các tài liệu hướng dẫn dài về logjson/tracejson/service-logs/metrics là tài nguyên MCP (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting), không phải nội dung mô tả công cụ luôn được tải. Tài liệu hướng dẫn cảnh báo bao gồm cú pháp biểu thức cảnh báo, các trường tĩnh và thích ứng, đơn vị, những gì validate_alert_expression kiểm tra, cùng các mẫu quy tắc về độ trễ / tỷ lệ lỗi / mức độ bão hòa. Các quy tắc truy vấn quan trọng vẫn nằm trong phần mô tả công cụ để những agent không bao giờ gọi resources/read vẫn nhận được hướng dẫn tạo truy vấn chính xác. Khám phá các trường riêng của tổ chức bằng get_log_attributes / get_log_attributes_for_pipeline (và các công cụ tương đương cho trace)—chúng không được chèn vào phần mô tả.
Kết quả lớn được chia thành nhiều phần. get_logs và get_traces xử lý các tập kết quả lớn bằng cách chia thành nhiều phần thay vì cắt bớt. Giới hạn mặc định là 5000 mục đối với logs; có thể cấu hình qua LAST9_MAX_GET_LOGS_ENTRIES.
Phát triển
Chế độ HTTP, kiểm thử bằng curl, xây dựng từ mã nguồn
Chạy ở chế độ HTTP
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
Máy chủ khởi động tại http://localhost:8080/mcp.
Kiểm thử bằng curl
Trình xử lý Streamable HTTP chạy ở chế độ stateless, vì vậy mỗi yêu cầu được xử lý độc lập. Bắt tay initialize và header Mcp-Session-Id là tùy chọn — các client gửi chúng vẫn hoạt động (header được chấp nhận nhưng bỏ qua), và client cũng có thể chuyển thẳng đến tools/list / tools/call. Mỗi công cụ là một truy vấn yêu cầu/phản hồi độc lập; máy chủ không gửi thông báo server→client, vì vậy GET /mcp (luồng SSE) trả về 405.
# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
# Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service_name": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
Toolsets theo từng yêu cầu
Ở chế độ HTTP, một yêu cầu có thể thu hẹp phạm vi công cụ bằng header X-Last9-Toolsets, hoặc tham số truy vấn toolsets dành cho client không thể đặt header (/mcp?toolsets=logs,traces). Nếu cả hai được gửi, header không trống sẽ được ưu tiên. Giá trị sử dụng cùng các tên phân tách bằng dấu phẩy như --toolsets. Yêu cầu chỉ thấy phần giao với --toolsets lúc khởi động: có thể thu hẹp nhưng không thể mở rộng; all hoặc giá trị trống sẽ giữ nguyên tập lúc khởi động. Tên không hợp lệ sẽ trả về 400 kèm tên đó. tools/list, tools/call và hướng dẫn initialize đều tuân theo tập hiệu lực; get_current_time và get_workspace_overview có mặt trong mọi tập.
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": {}}'
Mỗi tập hiệu lực riêng biệt được phục vụ bởi máy chủ riêng, được tạo trong yêu cầu đầu tiên (vài chục mili giây) và duy trì đến khi tắt; yêu cầu chỉ định lại tập lúc khởi động sẽ dùng lại máy chủ khởi động. Không có cơ chế loại bỏ: chỉ chấp nhận các toolset có tên, vì vậy bộ nhớ đệm chứa tối đa một máy chủ cho mỗi tổ hợp của chúng (hiện có 135 tổ hợp, tổng cộng khoảng 75 MB heap đang hoạt động; khi ổn định, bộ nhớ đệm đầy chiếm gần 230 MB bộ nhớ thường trú trong thử nghiệm).
Xây dựng từ mã nguồn
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 dành cho phát triển cục bộ. Để sử dụng thực tế, điểm cuối HTTP được lưu trữ sẽ thuận tiện hơn.
Tham khảo công cụ
Tất cả tham số, quy ước nhập thời gian và chi tiết
Nhập thời gian
- Thời gian tuyệt đối (
start_time_iso/end_time_iso, hoặctime_iso) được ưu tiên hơnlookback_minutes. - Với khoảng thời gian tương đối: dùng
lookback_minutes. - Với khoảng thời gian tuyệt đối: dùng RFC3339/ISO8601 —
2026-02-09T15:04:05Z. YYYY-MM-DD HH:MM:SScũ chỉ được chấp nhận để tương thích.- Chuyển các cụm từ như
since yesterday 9am ISTthành giới hạn RFC3339 bằngget_current_time.
get_workspace_overview
Không có tham số. Thăm dò đồng thời 60 phút gần nhất, mỗi lệnh gọi phụ có thời gian chờ ngắn, và trả về current_time, lookback_minutes, environments, telemetry (các giá trị boolean logs/traces/metrics), service_count (các dịch vụ riêng biệt, xếp hạng get_service_summary, mọi môi trường), alert_group_count, firing_alert_count và errors ([{field, error}]). Trường có lệnh gọi phụ thất bại sẽ là null (không xác định), không bao giờ là 0 hoặc false. Các lượt thăm dò không bị thu hẹp bởi --toolsets: toolset lọc những công cụ được cung cấp, còn token API xác định phạm vi dữ liệu máy chủ có thể đọc.
get_current_time
range(chuỗi, tùy chọn):last 2h,past 30 minutes,last 7d(s, m, h, d = 24h, w = 7d; tối đa 366d);today;yesterday;since <point>;<point> to <point>. Một thời điểm có thể là RFC3339, hoặctoday/yesterday/ một ngày trong tuần (monday,mon: lần xuất hiện gần nhất, bao gồm hôm nay) /YYYY-MM-DDkèm theo9am,9:30pmhoặc14:30tùy chọn. Múi giờ ở cuối sẽ ghi đètimezonecho cả hai giới hạn; múi giờ ở vị trí khác sẽ gây lỗi. Bỏ qua để chỉ lấynow.timezone(chuỗi, tùy chọn): Tên IANA hoặc chữ viết tắt (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). Mặc định là UTC. Múi giờ không xác định sẽ gây lỗi, cũng nhưCSTkhông rõ nghĩa (hãy truyềnAmerica/ChicagohoặcAsia/Shanghai).
Trả về now (và start/end cùng với range) dưới dạng {iso, epoch_seconds, local}; local chỉ xuất hiện với múi giờ không phải UTC.
get_exceptions
limit(số nguyên, tùy chọn): Số ngoại lệ tối đa. Mặc định: 20.lookback_minutes(số nguyên, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(chuỗi, tùy chọn): Khoảng thời gian tuyệt đối.service_name(chuỗi, tùy chọn): Lọc theo dịch vụ.span_name(chuỗi, tùy chọn): Lọc theo tên span.env(chuỗi, tùy chọn): Lọc theo môi trường.
get_service_summary
start_time_iso/end_time_iso(chuỗi, tùy chọn)env(chuỗi, tùy chọn): Biểu thức chính quy PromQL. Mặc định là.*. Để khớp chính xác cần có dấu neo (ví dụ:^prod$).sort_by(chuỗi, tùy chọn):request_count(mặc định),throughput_rpm,http_4xx_count,http_5xx_counthoặcgrpc_error_count.limit(số nguyên, tùy chọn): Số hàng xếp hạng tối đa. Bỏ qua hoặc đặt thành 0 nghĩa là 10; giá trị trên 100 được giới hạn ở 100.
get_service_environments
start_time_iso/end_time_iso(chuỗi, tùy chọn)
Tất cả công cụ APM khác đều yêu cầu giá trị
env. Dùng""nếu kết quả này trống.
get_service_performance_details
Mặc định trả về bản tóm tắt theo từng chuỗi: points, missing_points (các khoảng thời gian khả dụng không có lưu lượng, bị loại khỏi thống kê), min, p50, p90, p99 (nearest-rank), max, mean, last, baseline_mean (trung bình của nửa đầu các điểm hợp lệ, không phải của toàn khoảng thời gian), delta_pct (nửa sau các điểm hợp lệ so với đường cơ sở; không có nếu đường cơ sở bằng 0) và tối đa 3 change_points (timestamp, before_mean, after_mean), cho tối đa 4 chuỗi trên mỗi chỉ số và mọi phân vị thời gian phản hồi (trung bình cao nhất trước; series_omitted đếm số còn lại). Chuỗi có points: 0 sẽ không có thống kê, còn baseline_mean/delta_pct cần ít nhất 6 điểm (3 điểm mỗi nửa). full_series cho biết có thể lấy các điểm thô qua include_series.
service_name(chuỗi, bắt buộc)lookback_minutes(số nguyên, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(chuỗi, tùy chọn)env(chuỗi, tùy chọn): Mặc định làprod.top_n(số nguyên, tùy chọn): Số mục tối đa trong mỗi danh sách top-operations/top-errors. Mặc định: 5, hoặc 10 vớiinclude_series=true. Tối đa 100.include_series(boolean, tùy chọn): Trả về mọi điểm của mọi chuỗi thay vì bản tóm tắt. Mặc định: false.
get_service_operations_summary
service_name(chuỗi, bắt buộc)lookback_minutes(số nguyên, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(chuỗi, tùy chọn)env(chuỗi, tùy chọn): Mặc định làprod.
get_service_dependency_graph
service_name(chuỗi, tùy chọn)lookback_minutes(số nguyên, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(chuỗi, tùy chọn)env(chuỗi, tùy chọn): Mặc định làprod.
get_apm_service_deviations
service_name(string, tùy chọn): Bỏ qua để áp dụng cho toàn bộ đội; cung cấp để áp dụng cho một dịch vụ và các tương quan hoạt động của dịch vụ đó.lookback_minutes(integer, tùy chọn): Cửa sổ hiện tại. Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn): Cửa sổ hiện tại được chỉ định rõ ràng.baseline_start_time_iso/baseline_end_time_iso(string, tùy chọn): Đường cơ sở được chỉ định rõ ràng. Mặc định là cửa sổ có thời lượng bằng nhau ngay trước đó.datasource(string, tùy chọn): Bỏ qua để dùng mặc định; tên gần đúng được phân giải như với các công cụ Prometheus. Phản hồi nêu tên mặc định hoặc tên khớp gần nhất được sử dụng; tên không rõ ràng sẽ trả về các ứng viên mà không truy vấn.env(string, tùy chọn): Mặc định làprod.max_services/max_operations(integer, tùy chọn): Mặc định 10, tối đa 10 cho mỗi mục.
get_databases
env(string, tùy chọn): Lọc theo môi trường. Chấp nhận biểu thức chính quy. Mặc định: tất cả.lookback_minutes(integer, tùy chọn): Mặc định: 60. Cửa sổ không được vượt quá 7 ngày.start_time_iso/end_time_iso(string, tùy chọn)
get_database_slow_queries
db_system(string, tùy chọn): ví dụpostgresql,mysql,mongodb,redis.host(string, tùy chọn): Máy chủ cơ sở dữ liệu (net_peer_name).service_name(string, tùy chọn): Tên dịch vụ gọi.env(string, tùy chọn)min_duration_ms(float, tùy chọn): Thời lượng truy vấn tối thiểu tính bằng ms.lookback_minutes(integer, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn)limit(integer, tùy chọn): Mặc định: 20.
get_database_queries
db_system(string, tùy chọn)host(string, tùy chọn)service_name(string, tùy chọn)env(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn)limit(integer, tùy chọn): Mặc định: 20.
get_database_server_metrics
db_system(string, bắt buộc): ví dụpostgresql,mysql,mongodb,redis,aerospike.host(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn)
prometheus_range_query
query(string, bắt buộc): Truy vấn PromQL.start_time_iso/end_time_iso(string, tùy chọn): Mặc định là 60 phút gần nhất.lookback_minutes(float, tùy chọn): Mặc định: 60.
prometheus_instant_query
query(string, bắt buộc)time_iso(string, tùy chọn): Mặc định là thời điểm hiện tại.lookback_minutes(float, tùy chọn)
prometheus_label_values
match_query(string, tùy chọn): Bộ lọc PromQL.label(string, bắt buộc): Tên nhãn.lookback_minutes(float, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn)
Khi không chỉ định cửa sổ và match_query chỉ định một chỉ số (metric{...} hoặc {__name__="metric"}), kết quả 60 phút trống sẽ được thử lại một lần với khoảng thời gian 4 ngày; khối văn bản thứ hai cho biết kết quả bao phủ cửa sổ nào.
prometheus_labels
match_query(string, tùy chọn): Bộ lọc PromQL.lookback_minutes(float, tùy chọn): Mặc định: 60.start_time_iso/end_time_iso(string, tùy chọn)
Thử lại tra cứu một chỉ số không có kết quả trong khoảng thời gian 4 ngày, tương tự như prometheus_label_values.
get_logs
logjson_query(array, bắt buộc): Truy vấn pipeline JSON.lookback_minutes(integer, tùy chọn): Mặc định: 5.start_time_iso/end_time_iso(string, tùy chọn)limit(integer, tùy chọn): Mặc định của máy chủ: 5000.index(string, tùy chọn):physical_index:<name>hoặcrehydration_index:<block_name>.response_mode(string, tùy chọn):summary(mặc định; cũng dùng chonull) hoặcraw. Kết quả dòng thô có hơn 20 dòng sẽ được trả về dưới dạngsummary:lines_summarized,severity_counts(sáu nhãn hàng đầu, phần còn lại nằm trongother_severities),first_timestamp/last_timestamp, mộthistogramgồm 10 nhóm trong cửa sổ truy vấn (dựa trên các dòng được trả về, kèmtruncated: truekhi giới hạn làm kết quả bị cắt), và cácpatternshàng đầu (template,count, tối đa haisamples), phần còn lại được tính tổng trongother, tối đa 4000 ký tự; siêu dữ liệu cấp cao nhất vẫn không vừa sẽ bị loại bỏ và được nêu trongdropped_fields.rawtrả về các dòng. Kết quả tổng hợp không bao giờ được tóm tắt.
Để kiểm kê dịch vụ dựa trên nhật ký, trước tiên hãy truy vấn physical_index_service_count:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
Dùng service_name làm ServiceName, dùng env làm môi trường nếu có, và dùng name làm tên chỉ mục vật lý. Nếu name="default", hãy bỏ qua index; với chỉ mục vật lý không mặc định do người dùng chọn, hãy truyền index: "physical_index:<name>". Nếu backend từ chối lọc chỉ mục vật lý tường minh, hãy thử lại mà không có index và báo rằng backend đó không hỗ trợ lọc chỉ mục vật lý tường minh.
get_service_logs
service_name(string, bắt buộc)lookback_minutes(integer, tùy chọn): Mặc định: 60.limit(integer, tùy chọn): Mặc định: 100, hoặc 20 vớiresponse_mode: "raw".env(string, tùy chọn)severity_filters(array, tùy chọn): ví dụ["error", "warn"]. Logic OR.body_filters(array, tùy chọn): ví dụ["timeout", "failed"]. Logic OR.start_time_iso/end_time_iso(string, tùy chọn)index(string, tùy chọn)response_mode(string, tùy chọn):summary(mặc định; cũng dùng chonull) hoặcraw. Với hơn 20 dòng,logsđược thay bằng cùngsummarynhưget_logs, các trường khác vẫn được giữ nguyên;rawtrả về các mục.
Các loại bộ lọc kết hợp với nhau bằng AND. Mỗi mảng dùng OR bên trong.
Trước tiên, dùng get_logs để lấy số liệu tổng hợp trên phạm vi rộng; chỉ dùng get_service_logs sau khi đã thu hẹp phạm vi xuống một dịch vụ/môi trường/chỉ mục và một tập mẫu nhỏ.
get_log_patterns
service_name(string, bắt buộc)env(string, tùy chọn)start_time_iso/end_time_iso(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 60.severity_filters/body_filters(array, tùy chọn): Logic OR, như trongget_service_logs. Chỉ đặtseverity_filterskhiget_service_profilebáo cáoseverity_setall; vớinonehoặcpartial, thao tác này sẽ loại bỏ các dòng có mức độ nghiêm trọng nằm trong phần thân.index(string, tùy chọn)sample_size(integer, tùy chọn): Số dòng được lấy mẫu từ cửa sổ, mới nhất trước. Mặc định: 1000, tối đa: 5000.top_n(integer, tùy chọn): Số mẫu trả về theo số lượng. Mặc định: 20, tối đa: 100. Phần còn lại được tính tổng trongother.
Việc phân cụm chạy trên máy chủ MCP với các dòng được lấy mẫu, vì vậy số lượng, first_seen và last_seen chỉ tính trong mẫu; window.sample_limit_reached cho biết khi nào mẫu có thể bỏ sót các dòng khớp (mẫu chứa sample_size dòng và API không báo cáo chính xác total_matching_lines bằng con số đó, hoặc tìm kiếm đã bị logs_truncated), trong trường hợp đó mẫu chỉ chứa các dòng mới nhất của cửa sổ. Mỗi template và sample bị cắt ở 500 ký tự, kết thúc bằng …, vì vậy phần thân không được phân cụm (chẳng hạn JSON không có trường message) sẽ không thể làm đầy phản hồi. Tìm kiếm có các phần bị lỗi sẽ trả về lỗi công cụ; tìm kiếm bị cắt hoặc giới hạn vẫn trả về các mẫu, được đánh dấu bằng sample_limit_reached. Danh sách patterns trống chỉ có nghĩa là không có kết quả khớp khi sample_limit_reached là false; khi giá trị này là true, tìm kiếm đã dừng sớm và có thể đã bỏ sót các dòng khớp.
get_emerging_log_patterns
Nhận mọi tham số get_log_patterns (khoảng thời gian là cửa sổ hiện tại), cùng với:
baseline_start_time_iso/baseline_end_time_iso(string, tùy chọn): Đặt cả hai hoặc không đặt mục nào. Mặc định: cửa sổ có độ dài bằng nhau ngay trước cửa sổ hiện tại.min_count(integer, tùy chọn): Số dòng mà một mẫu thay đổi cần có trong cửa sổ mà mẫu đó xuất hiện nhiều hơn: hiện tại đối vớinew/increased, đường cơ sở đối vớidecreased/disappeared. Mặc định: 3 (hoặcsample_sizenếu nhỏ hơn), tối đa:sample_size.change_factor(number, tùy chọn): Tỷ lệ tần suất lớn hơn 1 mà một mẫu xuất hiện trong cả hai cửa sổ phải đạt được (increased) hoặc giảm xuống mức nghịch đảo của tỷ lệ đó (decreased). Mặc định: 2.
Cả hai ngưỡng đều phải được đáp ứng, vì vậy mẫu có số lượng lớn nhưng tần suất không thay đổi theo change_factor sẽ không bao giờ được báo cáo. Chỉ trả về các mẫu đã thay đổi (new, increased, decreased, disappeared) cùng với số lượng current và baseline; unchanged_patterns đếm các mẫu xuất hiện trong cả hai cửa sổ nhưng thay đổi ít hơn change_factor, còn below_min_count_patterns đếm các thay đổi bị loại do có ít hơn min_count dòng. Tần suất được so sánh theo phút khi cả hai mẫu chứa mọi dòng khớp, ước tính theo phút từ total_matching_lines chính xác của mẫu bị giới hạn, và trong các trường hợp khác thì so sánh theo tỷ trọng của mẫu; khi đó increased/decreased mô tả thành phần chứ không phải tốc độ (comparison_basis). Danh sách patterns trống có nghĩa là không có thay đổi nào vượt cả hai ngưỡng, chứ không có nghĩa là nhật ký không thay đổi: các thay đổi ít phổ biến hơn được tính trong below_min_count_patterns, và cửa sổ có sample_limit_reached sẽ so sánh các mẫu chứ không phải toàn bộ cửa sổ.
get_log_attributes
lookback_minutes(integer, tùy chọn): Mặc định: 15.start_time_iso/end_time_iso(string, tùy chọn)region(string, tùy chọn)index(string, tùy chọn)
get_log_attributes_for_pipeline
pipeline(array, bắt buộc): Các giai đoạn lọc trước đó để giới hạn phạm vi khám phá, ví dụ[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, tùy chọn): Mặc định: 15.start_time_iso/end_time_iso(string, tùy chọn)region(string, tùy chọn)index(string, tùy chọn)
get_drop_rules
Không có tham số. Liệt kê các quy tắc loại bỏ thông qua GET /otel_settings/drop?region=....
add_drop_rule
name(string, bắt buộc)filters(array, bắt buộc): Mỗi bộ lọc gồm:key,value,operator(equals/not_equals),conjunction(and).- Khóa bộ lọc phải dùng
attributes["key_name"]hoặcresource.attributes["key_name"](bắt buộc theo API Last9). - Tạo quy tắc thông qua
POST /otel_settings/drop?region=...&cluster_id=....
get_remapping_rules
rule_type(string, bắt buộc):logs_extract,logs_maphoặctraces_map.region(string, tùy chọn): Mặc định: vùng của nguồn dữ liệu đã cấu hình.- Liệt kê các quy tắc thông qua
GET /otel_settings/remapping/{rule_type}?region=....
add_remapping_rule
Mỗi lần gọi tạo một quy tắc; quy tắc ánh xạ cần một lần gọi cho mỗi target_attribute.
rule_type(string, bắt buộc):logs_extract,logs_maphoặctraces_map.name(string, bắt buộc)remap_keys(array, bắt buộc): Các trường nguồn.logs_extractvớijson: tên trường body; vớipattern: chính xác một regex có nhóm bắt được đặt tên. Quy tắc ánh xạ: đường dẫn thuộc tính, giá trị không rỗng đầu tiên được ưu tiên.target_attribute(string, bắt buộc):logs_extract:log_attributeshoặcresource_attributes.logs_map:service,severityhoặcresource_deployment.environment.traces_map:service.extract_type(string, chỉlogs_extract, bắt buộc tại đó):jsonhoặcpattern.action(string, chỉlogs_extract):upsert(mặc định) hoặcinsert.prefix(string, chỉlogs_extract)preconditions(array, chỉlogs_extract): Tối đa một{key, value, operator};operatorlàequals(mặc định),not_equalshoặclike(regex).region(string, tùy chọn): Mặc định: vùng của datasource đã cấu hình.- Tạo quy tắc thông qua
POST /otel_settings/remapping/{rule_type}?region=.... Không bao giờ thử lại; sau khi hết thời gian chờ, hãy kiểm tra bằngget_remapping_rules.
get_traces
Dùng cho các tìm kiếm và phép tổng hợp trên phạm vi rộng. Để tra cứu chính xác theo ID trace, hãy dùng get_service_traces.
tracejson_query(array, bắt buộc)start_time_iso/end_time_iso(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 60.limit(integer, tùy chọn): Mặc định: 5000.
get_service_traces
Bắt buộc có chính xác một trong hai trace_id hoặc service_name.
trace_id(string, tùy chọn): Khoảng thời gian nhìn lại mặc định: 72 giờ.service_name(string, tùy chọn): Khoảng thời gian nhìn lại mặc định: 60 phút.lookback_minutes(integer, tùy chọn)start_time_iso/end_time_iso(string, tùy chọn)limit(integer, tùy chọn): Mặc định: 10.env(string, tùy chọn)
get_trace_attributes
lookback_minutes(integer, tùy chọn): Mặc định: 15.start_time_iso/end_time_iso(string, tùy chọn)region(string, tùy chọn)
get_trace_attributes_for_pipeline
pipeline(array, bắt buộc): Các giai đoạn lọc trước đó để giới hạn phạm vi khám phá, ví dụ:[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, tùy chọn): Mặc định: 15.start_time_iso/end_time_iso(string, tùy chọn)region(string, tùy chọn)
get_trace_attribute_values
tag_name(string, bắt buộc): Tên thuộc tính từget_trace_attributes(ví dụ:resource_departmenthoặcattributes['http.method']).pipeline(array, tùy chọn): Các giai đoạn lọc trước đó để giới hạn phạm vi giá trị; bỏ qua để lấy giá trị toàn cục.lookback_minutes(integer, tùy chọn): Mặc định: 15.start_time_iso/end_time_iso(string, tùy chọn): Giới hạn lịch sử theo RFC3339; được ưu tiên hơnlookback_minutes.region(string, tùy chọn)
get_trace_attribute_deviations
comparison_mode(string, bắt buộc):latency,errorshoặctime.service_name(string, bắt buộc)environment(string, bắt buộc): Giá trịdeployment.environmentchính xác.operation(string, tùy chọn)filters(array, tùy chọn): Điều kiện lọc JSON của trace.candidate_attributes(array, tùy chọn): Tối đa 8; bỏ qua để khám phá có giới hạn.latency_threshold_ms(number, tùy chọn): Bắt buộc với chế độlatency; bị từ chối ở các chế độ khác.start_time_iso/end_time_iso(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 15. Tối đa: 15.baseline_start_time_iso/baseline_end_time_iso(string, tùy chọn): Bắt buộc với chế độtime; không chồng lấn và có thời lượng bằng cửa sổ mục tiêu.minimum_cohort_size(integer, tùy chọn): Mặc định: 100. Tối thiểu: 20.minimum_value_support(integer, tùy chọn): Mặc định: 20. Tối thiểu: 10.limit(integer, tùy chọn): Mặc định: 10. Tối đa: 10.
Yêu cầu bật khả năng backend đi kèm.
get_trace_waterfall
trace_id(string, bắt buộc)environment(string, tùy chọn)start_time_iso/end_time_iso(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 4320 (72 giờ).selected_span_id(string, tùy chọn): Chỉ trả về thuộc tính, sự kiện và liên kết của span đó.max_spans(integer, tùy chọn): Mặc định: 500. Tối đa: 1000; chính sách biên tập dữ liệu của tổ chức có thể giới hạn thấp hơn.
Trả về nguyên trạng envelope investigation-evidence/v1 của dịch vụ trace; waterfall nằm trong data. Dịch vụ tạo waterfall và biên tập các giá trị theo chính sách riêng của từng tổ chức (thông tin xác thực, giá trị truy vấn, URL, email, IP, mã định danh người dùng) trước khi dữ liệu rời backend: sanitizer cho biết chính sách đã áp dụng và evidence.sanitization đếm số mục đã biên tập hoặc cắt bớt. Nếu thông tin cần thiết bị biên tập, hãy nhờ quản trị viên tổ chức điều chỉnh chính sách thay vì tìm cách lách. Công cụ từ chối phản hồi không có khối sanitizer, có sanitizer.version khác trace-evidence-sanitizer/v1, có body lặp lại khóa JSON hoặc có body lớn hơn 512 KiB (giảm max_spans). Yêu cầu bật khả năng backend đi kèm.
get_change_events
start_time_iso/end_time_iso(string, tùy chọn)lookback_minutes(integer, tùy chọn): Mặc định: 60.service_name(string, tùy chọn)env(string, tùy chọn)event_name(string, tùy chọn): Gọi trước mà không có tham số này để nhậnavailable_event_names.
analyze_change_impact
Truyền chính xác một trong hai: change_event hoặc service + timestamp.
change_event(object, tùy chọn): Một phần tử củaget_change_eventschange_events[], giữ nguyên. Dùngmetric.service,metric.deployment_environmentvàvalues[].timestampsớm nhất.service(string, tùy chọn): Bắt buộc cùng vớitimestampkhi bỏ quachange_event.timestamp(string, tùy chọn): RFC3339 hoặc giây unix, làm tròn xuống phút.env(string, tùy chọn): Môi trường chính xác. Mặc định: môi trường của sự kiện, nếu không thì tất cả.baseline_minutes(integer, tùy chọn): Mặc định: 60. Giới hạn trong khoảng 30..120.after_minutes(integer, tùy chọn): Mặc định:baseline_minutes. Giới hạn trong khoảng 30..120 và không vượt quá thời điểm hiện tại.
regression likely khi có bất kỳ điều kiện nào sau đây: tỷ lệ lỗi tăng ít nhất 1 điểm phần trăm, p95 tăng ít nhất 40% hoặc thông lượng (rpm) giảm ít nhất 50% đối với dịch vụ hoặc một trong 10 bên gọi hàng đầu, xếp hạng theo thông lượng gộp của cả hai cửa sổ (chỉ khi có ít nhất 100 yêu cầu trước thay đổi và, riêng thông lượng, sau thay đổi; p95 chỉ tính các yêu cầu của latency_env); một cảnh báo bắt đầu kích hoạt sau thay đổi và vẫn đang kích hoạt vào cuối cửa sổ sau thay đổi (đối sánh không phân biệt chữ hoa chữ thường theo tên nhóm cảnh báo hoặc nhãn service, service_name hay service.name, nếu không thì theo chú thích (không bao giờ dùng văn bản tự do như phần tóm tắt); khi có env, các cảnh báo được gắn nhãn môi trường khác sẽ bị loại bỏ, không phân biệt chữ hoa chữ thường, còn các cảnh báo không có nhãn được đánh dấu env_match: unlabelled); có hồi quy từ get_apm_service_deviations. insufficient data khi cửa sổ sau thay đổi ngắn hơn 5 phút (bao gồm cả thay đổi trong tương lai), dịch vụ có quá ít yêu cầu hoặc tín hiệu vàng, tra cứu bên gọi trực tiếp, cảnh báo hay get_apm_service_deviations gặp lỗi, toàn bộ hoặc trong bất kỳ truy vấn nào được liệt kê trong deviations.apm.unavailable: thiếu bằng chứng không bao giờ dẫn đến no significant change, và nếu vẫn phát hiện hồi quy thì kết quả sẽ nêu rõ phần nào gặp lỗi. no significant change là câu trả lời hợp lệ, không phải lỗi. Các độ lệch thuộc tính trace chỉ chạy khi đặt env, tối đa 15 phút ở mỗi phía; chúng giải thích kết luận nhưng không bao giờ tự quyết định kết luận, vì vậy bỏ qua hoặc không lấy được chúng sẽ không làm thay đổi kết luận. Mỗi danh sách giữ lại 10 mục và báo số mục đã loại bỏ; một lệnh gọi upstream thất bại chỉ để lại error trong phần tương ứng. Độ trễ của tín hiệu vàng lấy từ cùng một môi trường trong cả hai cửa sổ, được nêu trong latency_env: nếu không có env, chọn môi trường bận nhất. Tỷ lệ lỗi của tín hiệu vàng tính lỗi 5xx và gRPC; deviations.apm cũng tính các span có trạng thái lỗi và mã 429. Tín hiệu của bên gọi là các span server của chính bên đó, vì vậy bên gọi chỉ có span client sẽ hiển thị 0 rpm.
regressions liệt kê một mục cho mỗi yếu tố kích hoạt đứng sau regression likely, theo thứ tự của reason, và là [] đối với các kết luận khác. Mỗi mục có service, role (changed hoặc dependent), env, metric (chính xác một trong error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) và baseline/after theo đơn vị của chỉ số (%, ms, rpm hoặc giá trị riêng của tín hiệu APM; null đối với alert). Mục alert bổ sung rule_id và state, trạng thái của thực thể trong lát cắt alerts-monitor mới nhất của cửa sổ sau thay đổi có liệt kê thực thể đó, luôn là firing: cảnh báo bắt đầu sau thay đổi nhưng được giải quyết trước khi kết thúc cửa sổ sau thay đổi không phải là hồi quy, vì vậy không tạo phiếu; cảnh báo vẫn nằm trong alerts.started cùng với state, và reason sẽ đếm cảnh báo đó. env là môi trường nơi chỉ số được đo: môi trường env được yêu cầu, nếu không thì tỷ lệ lỗi và thông lượng cộng gộp mọi môi trường (env: ""), còn p95 dùng môi trường bận nhất, latency_env; cảnh báo dùng nhãn môi trường riêng và độ lệch APM dùng môi trường riêng. Mọi hồi quy đều áp dụng trên toàn dịch vụ, vì vậy không mục nào nêu endpoint.
get_alert_groups
Danh mục nhóm cảnh báo Compass đã cấu hình, dùng cho changeboard / kiểm tra độ bao phủ nhãn. Bao gồm các nhóm không có quy tắc và các nhóm không kích hoạt. Không trả về PromQL.
alert_group_name/alert_group_type/data_source_name(string, tùy chọn): Khớp chuỗi con, không phân biệt chữ hoa chữ thường.team/tier(string, tùy chọn): Khớp chính xác, không phân biệt chữ hoa chữ thường, trên metadata đã cấu hình.label_key+label_value(string, tùy chọn): Phải được đặt cùng nhau. Khớp chính xác, không phân biệt chữ hoa chữ thường, với một cặpmetadata.labels— cả khóa lẫn giá trị.
Trả về JSON gọn {"count":N,"groups":[...]} với id, name, type, entity_class, team, tier, metadata.labels và số lượng quy tắc. team / labels rỗng nghĩa là chưa được đặt.
get_alert_operations_summary
start_time_iso/end_time_iso(string, bắt buộc): Cửa sổ RFC3339, tối đa 31 ngày.timezone(string, tùy chọn): Tên IANA dùng cho ranh giới ngày. Mặc định:UTC.severities/services(array, tùy chọn): Thu hẹp phạm vi bản tóm tắt.include_rules(boolean, tùy chọn): Đồng thời trả về thông tin vệ sinh theo từng quy tắc (20 quy tắc hàng đầu theofire_count, các quy tắc chập chờn và không được định tuyến, kèmtruncatedkhi API giới hạn danh sách quy tắc). Mặc định:false.
Trả về JSON với alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention và coverage. Mỗi chỉ số là {status, count?, reason?}; số lượng partial chỉ bao phủ một phần cửa sổ và không phải là giới hạn dưới.
get_alert_coverage
Trả lời câu hỏi “tôi chưa đặt cảnh báo cho những gì?” đối với một dịch vụ, môi trường, nhóm cảnh báo hoặc toàn bộ tổ chức nếu không chỉ định phạm vi. Chỉ đọc: công cụ không tạo, thay đổi hoặc bỏ tắt tiếng bất cứ thứ gì. Cũng có trong bộ công cụ investigate.
service(string, tùy chọn): Tên dịch vụ.environment(string, tùy chọn): Môi trường triển khai (ví dụ:prod).entity_id(string, tùy chọn): UUID nhóm cảnh báo (thực thể), như được trả về bởiget_alert_groups.muted_days(integer, tùy chọn): Số ngày nguyên, từ 1 đến 3650. Mặc định: 7; 0 nghĩa là dùng mặc định. Quy tắc bị tắt tiếng lâu hơn khoảng thời gian này được xem là khoảng trốngmuted_too_long. Các giá trị được cắt khoảng trắng; chuỗi trống bị bỏ qua. Các loại khoảng trống: uncovered_signal (không có quy tắc được bật nào cho latency, error_rate, throughput hoặc saturation; nêu tên một quy tắc đã tắt có thể bao phủ tín hiệu đó), all_rules_disabled (nhóm cảnh báo có tất cả quy tắc đều bị tắt), no_notification_channel (quy tắc có mức độ nghiêm trọng mà không kênh nào trên nhóm cảnh báo định tuyến đến), muted_too_long (bị tắt tiếng vô thời hạn hoặc lâu hơnmuted_days;muted_sincelà lần cập nhật cuối của quy tắc vàmute_untilbị lược bỏ nếu tắt tiếng vô thời hạn).
Trả về JSON gọn {scope, generated_at, complete, summary, counts, groups}. groups chứa một mục {kind, count, gaps, omitted} cho mỗi loại hiện có, liệt kê tối đa 10 khoảng trống mỗi loại (omitted đếm số còn lại; thu hẹp phạm vi để xem chúng); mỗi khoảng trống có suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel hoặc patch_alert) và suggested_args, chỉ chứa các đầu vào mà công cụ chấp nhận (patch_alert: entity_id, id và is_disabled=false hoặc mute_until=0; attach_notification_channel: alert_group_id và breach/threat severity; create_alert: entity_id; create_alert_from_chart: service_name); entity_id, rule_id và signal của chính khoảng trống được liệt kê bên cạnh. Chỉ gọi công cụ được đề xuất nếu công cụ đó có trong phiên và người dùng xác nhận. complete chỉ là true khi API không liệt kê khoảng trống nào, mọi số đếm đều bằng 0 và có ít nhất một nhóm cảnh báo khớp phạm vi (nhãn service_name / env chính xác, được đối chiếu với danh sách get_alert_groups); phạm vi không khớp nhóm nào, tra cứu thất bại hoặc có số đếm nhưng không liệt kê khoảng trống đều không được xem là hoàn tất, và summary nêu lý do.
get_alert_config
search_term(string, optional): Tìm kiếm văn bản tự do trong tên, nhóm, nguồn dữ liệu, thẻ.rule_name(string, optional)severity(string, optional)rule_type(string, optional):statichoặcanomaly.alert_group_name/alert_group_type/data_source_name(string, optional)tags(array, optional): Tất cả phải khớp (logic AND).
Mỗi quy tắc liệt kê Recent Evaluations: 5 mẫu một phút, mới nhất trước, mỗi mẫu được gắn nhãn theo phút UTC mà nó kết thúc; mẫu mới nhất kết thúc trước thời điểm gọi 1–2 phút, vì trình giám sát cập nhật phút gần nhất trễ. firing; ok = trình giám sát báo quy tắc không kích hoạt (trạng thái bình thường, đã xử lý, đang chờ hoặc trống, theo is_firing=0 trong get_alert_rule_state); unknown = không có hàng nào của trình giám sát cho quy tắc (chưa được đánh giá hoặc tra cứu của phút đó thất bại, được ghi chú ở đầu phản hồi), hoặc có hàng với trạng thái không thuộc firing, normal, resolved, pending hay empty (ví dụ no_data, silenced). Quy tắc bị tắt hiển thị none. Khi có hơn 25 quy tắc được bật khớp, lịch sử sẽ bị lược bỏ cho tất cả các quy tắc đó và phản hồi sẽ nêu rõ điều này.
get_entity_kpis
Chỉ đọc; có trong bộ công cụ alerts và investigate. Liệt kê mọi KPI trên một nhóm cảnh báo, bao gồm cả KPI chưa được quy tắc cảnh báo nào sử dụng. Dùng các ID được trả về trong expression_args / indicators_used; không bao giờ tự tạo ID.
entity_id(string, required): UUID nhóm cảnh báo/thực thể, lấy từget_alert_groupshoặcget_alert_config.
Trả về JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]}, được sắp xếp theo tên. unit là nhãn hiển thị: ngưỡng được so sánh với giá trị truy vấn thô. Khi không có KPI phù hợp, hãy tạo một KPI bằng create_kpi. Kết quả của nhóm trống chỉ nêu create_kpi khi phiên hỗ trợ thao tác đó; với --read-only (trừ khi là --allow-write-tools=create_kpi) hoặc bộ công cụ investigate, kết quả cho biết việc tạo KPI cần một phiên alerts có quyền ghi.
create_kpi
Tạo KPI trên một nhóm cảnh báo hiện có; chỉ có trong bộ công cụ alerts. Chỉ dùng khi get_entity_kpis không có KPI nào với truy vấn bạn cần. Trước tiên, kiểm tra truy vấn có trả về dữ liệu bằng prometheus_range_query: API chỉ từ chối truy vấn không phân tích cú pháp được và sẽ lưu truy vấn hợp lệ cho một chỉ số không tồn tại.
entity_id(string, required): UUID nhóm cảnh báo/thực thể.name(string, required): Duy nhất trong nhóm cảnh báo; lần tạo thứ hai với cùng tên sẽ bị từ chối do xung đột.query(string, required): PromQL. Để cảnh báo trên một bảng điều khiển, lấy PromQL của bảng điều khiển từget_dashboard.unit(string, required): Đơn vị của giá trị thô từ truy vấn, ví dụseconds,ms,percent,ratio,count,req/s. Đây chỉ là nhãn, không chuyển đổi giá trị, vì vậy ngưỡng được so sánh với giá trị thô.description(string, optional)data_source_id(string, optional): Mặc định là nguồn dữ liệu của nhóm cảnh báo.
Không có công cụ MCP nào xóa hoặc chỉnh sửa KPI (hãy dùng giao diện người dùng Last9), vì vậy hãy xác nhận tên, truy vấn và đơn vị trước khi tạo. Chỉ tạo một lần và giữ lại ID được trả về để dùng trong expression_args / indicators_used; nếu tên bị xung đột, hãy dùng lại ID KPI hiện có từ get_entity_kpis. Khi hết thời gian chờ hoặc gặp lỗi kết nối, thao tác tạo có thể đã được áp dụng hoặc chưa: hãy kiểm tra theo tên bằng get_entity_kpis trước khi thử lại. Trả về {"id","name","query","unit"}.
get_alerts
time_iso(string, optional): Thời điểm đánh giá theo RFC3339.window(integer, optional): Khoảng thời gian nhìn lại tính bằng giây. Mặc định: 900. Phạm vi: 60–86400.lookback_minutes(integer, optional): Phạm vi: 1–1440.
get_alert_rule_state
start_time(integer or string, required): Bắt đầu phạm vi (bao gồm): giây Unix epoch (1718000000) hoặc RFC3339 (2024-06-10T06:13:20Z). Giá trị mili giây, micro giây và nano giây được chuyển đổi thành giây; các giá trị trước 2000-01-01 bị từ chối.end_time(integer or string, required): Kết thúc phạm vi (bao gồm), theo cùng định dạng.step(integer, required): Độ phân giải tính bằng giây giữa các mẫu. Số mẫu((end_time - start_time) / step + 1)bị giới hạn ở 100. Mỗi mẫu là một lệnh gọi upstream bao phủmin(step, 3600)giây kết thúc tại dấu thời gian của mẫu; các mẫu được lấy theo từng nhóm 5 mẫu và công cụ trả về lỗi kèm hướng dẫn thử lại nếu mất hơn 60 giây.alert_group_id(string, optional): Lọc theo ID nhóm cảnh báo.rule_name(string, optional): Bộ lọc regex trên tên quy tắc.alert_group_name(string, optional): Bộ lọc regex trên tên nhóm cảnh báo.label_filters(string, optional): Bộ lọc nhãnkey=valuephân tách bằng dấu phẩy.state(string, optional): Lọc theo trạng thái (ví dụfiring).
Trả về một ánh xạ JSON của rule_id -> [{timestamp, is_firing}]. Dấu thời gian mà tại đó quy tắc không có trong phản hồi upstream được báo cáo là is_firing=0 — điều này có nghĩa là “không được quan sát thấy đang kích hoạt”, chứ không xác nhận trạng thái bình thường.
get_alert_hygiene
Kiểm tra chỉ đọc các quy tắc cảnh báo đang bật. Thao tác này không thay đổi gì: mỗi đề xuất sửa lỗi chỉ được áp dụng sau khi người dùng xác nhận rõ ràng, thông qua update_alert (điều chỉnh), patch_alert (is_disabled), delete_alert hoặc attach_notification_channel khi các công cụ đó được cung cấp.
window(string, optional):7dhoặc30d. Mặc định:7d.limit(integer, optional): Số quy tắc bị gắn cờ tối đa cần trả về, theo thứ tự nghiêm trọng nhất trước. Mặc định: 20. Phạm vi: 1–100.
Khoảng thời gian kết thúc tại thời điểm hiện tại. Các danh mục (một quy tắc có thể thuộc nhiều danh mục): noisy (≥ 5 lần kích hoạt/ngày với < 20% acked; with an unavailable ack_rate it is judged on fire rate alone and the reason says so; mute time is not reported), flapping (> 4 lần chập chờn/ngày), stale (lần kích hoạt gần nhất trước khoảng thời gian này và không có thời điểm kích hoạt nào trong khoảng thời gian đó, hoặc quy tắc đã cấu hình và đang bật nhưng không có sự kiện nào trong khoảng thời gian đó trong khi vòng đời coverage đã hoàn tất và danh sách của API không bị cắt bớt), unrouted (không có lần kích hoạt nào trong khoảng thời gian này đến được một kênh và hiện nhóm cảnh báo không có kênh nào được gắn; khi không thể đọc các kênh được gắn, quy tắc sẽ được tính vào unavailable.routed). Mỗi số liệu thống kê là {status, count|value, reason} hoặc null: giá trị không khả dụng không bao giờ được xem là 0 và chỉ bỏ qua bước kiểm tra cần giá trị đó; unavailable đếm số quy tắc đang bật cho mỗi giá trị bị thiếu (fire_count, flap_count, ack_rate, routed, rule_config dành cho các quy tắc không có trong danh sách quy tắc cảnh báo, nên các đề xuất sửa lỗi của chúng không có giá trị hiện tại, và activity dành cho các quy tắc đã cấu hình nhưng không có sự kiện, mà lịch sử không thể chứng minh là im lặng; các quy tắc này không được đánh giá). coverage cho biết lịch sử cảnh báo bao phủ bao nhiêu phần của khoảng thời gian; tỷ lệ sử dụng khoảng thời gian được bao phủ, tối thiểu một ngày. upstream_truncated là true khi API chỉ trả về 200 quy tắc ồn ào nhất, nên các quy tắc ít ồn hơn không được đánh giá. Các đề xuất sửa lỗi được xây dựng từ cấu hình của từng quy tắc trong danh sách quy tắc cảnh báo: tăng bad_minutes (N trong count_true(result) >= N) hoặc kéo dài eval_window (tối đa 60 phút); với ngưỡng tĩnh gây ồn, điều chỉnh ngưỡng trong condition (expr > 100) hoặc chuyển biểu thức sang adaptive_std_cmp(metric, sensitivity, window); gắn kênh thông báo; tắt hoặc xóa các quy tắc cũ.
Trả về JSON gọn {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules}, với mục tiêu kích thước 32 KB: truncated là true khi số quy tắc bị gắn cờ vượt quá limit hoặc mục tiêu đó, và omitted_for_size đếm số quy tắc bị cắt khỏi limit do giới hạn kích thước (quy tắc nghiêm trọng nhất luôn được giữ lại, vì vậy nếu một quy tắc lớn hơn 32 KB thì chỉ quy tắc đó được trả về và vượt quá mục tiêu); mỗi quy tắc có findings (category, reason, suggested_fix, alternative_fix tùy chọn) và stats thô.
get_notification_channels
scope(string, optional):attached(mặc định) trả về một hàng cho mỗi kênh được gắn vào nhóm cảnh báo;idlà ID kênh gắn, được dùng bởidetach_notification_channel.channelstrả về các kênh của tổ chức (id,name,type,send_resolved,created_via);idlà ID kênh, được dùng bởiattach_notification_channel. Đích đến, tiêu đề và chứng chỉ không bao giờ được trả về.
Trả về các kênh thông báo đã cấu hình (Slack, PagerDuty, email, webhook, v.v.) dưới dạng bảng TSV. Các hàng kênh gắn (service_fqid được đặt) hiển thị global là false và services là -; services chỉ liệt kê các liên kết dịch vụ cũ. Trên các hàng kênh gắn, send_resolved là giá trị mặc định được lưu của hàng, không phải giá trị được dùng để gửi thông báo; thông báo giải quyết tuân theo send_resolved riêng của kênh (scope=channels). Cả hai phạm vi đều bao gồm created_via (last9-mcp đối với các hàng do tác nhân MCP tạo, nếu không thì là -).
recommend_alert_config
Chỉ đọc. Trả về hướng dẫn về vòng đời, các cổng xác thực và yêu cầu về ngữ cảnh cho người phản hồi; bản thân thông tin này không phải bằng chứng, vì vậy hãy xác định ngưỡng dựa trên các công cụ đo từ xa.
signal(string, required): Chỉ số hoặc tín hiệu tác động đến người dùng, bao gồm đơn vị và các chiều.objective(string, required): Triệu chứng hoặc tác động đến người dùng cần phát hiện.rule_type(string, optional):static(mặc định) hoặcanomaly.severity(string, optional):breach(mặc định) hoặcthreat.environment(string, optional): Môi trường và hồ sơ lưu lượng.
validate_alert_expression
Chạy thử biểu thức mà không lưu. Dùng trước create_alert / update_alert.
entity_id(string, required): UUID nhóm cảnh báo/thực thể.expression(string, required): Phép toán số học trên các chỉ báo được gọi bằng tên chính xác của KPI tương ứng, ví dụerrors / requests. Tối đa 3 chỉ báo. Giữ nguyên tên có dấu cách, dấu chấm hoặc dấu gạch ngang (Test Alert / errors), chính xác như cáchcreate_alertlưu chúng.indicators_used(object, required, non-empty): Ánh xạ tên chỉ báo sang UUID KPI thuộc sở hữu củaentity_id; liệt kê ID và tên KPI của nhóm bằngget_entity_kpis. Dùng tên chính xác của từng KPI: thao tác chạy thử này chấp nhận mọi tên, nhưngcreate_alertvàupdate_alerttừ chối các khóaexpression_argskhông phải tên của KPI được liên kết. Chỉ biểu thức số học được kiểm tra (truyền biểu thức metric bên trong, không phải wrapperadaptive_std_cmp(...));condition/alert_conditionthì không. Kiểm tra có ít nhất một timeseries chỉ chạy khi sử dụng nhiều hơn một indicator.
Trả về {"valid":true} hoặc {"valid":false,"reason":"..."}; biểu thức không hợp lệ là kết quả bình thường, không phải lỗi công cụ.
describe_alert_chart
Chỉ đọc. Liệt kê các tín hiệu có thể cảnh báo (key, unit, eval_query, query_kind) trên biểu đồ Discover được hỗ trợ. Token có vai trò viewer sẽ bị từ chối.
surface(string, bắt buộc):discover-servicehoặcdiscover-exceptions; mọi bề mặt khác, bao gồm dashboard tùy chỉnh, đều bị từ chối trước khi gọi API (thay vào đó, dùngcreate_alertvới KPI).chart_key(string, bắt buộc): ví dụ:apdex,error_rate,response_time,exception_count.service_name(string, bắt buộc)env(string, tùy chọn)attributes(object, tùy chọn): Các chiều nhận dạng bổ sung, sử dụng tên khóa mà công cụ này báo cáo.
create_alert
Tạo một quy tắc trong nhóm cảnh báo hiện có, luôn ở trạng thái tắt (bản nháp, ngay cả khi truyền is_disabled=false). Trước tiên, gọi recommend_alert_config, sau đó chỉ kích hoạt bằng patch_alert is_disabled=false sau khi người dùng xác nhận. Chỉ tạo một lần và giữ lại ID quy tắc được trả về. Nếu rule_name mà nhóm cảnh báo đã sử dụng (không phân biệt chữ hoa chữ thường), thao tác sẽ bị từ chối mà không tạo gì, đồng thời nêu ID của quy tắc hiện có.
entity_id(string, bắt buộc): UUID của nhóm cảnh báo/thực thể.alert_rule(object, bắt buộc): Nội dung quy tắc có kiểu đầy đủ, bao gồmprimary_indicatorvàexpression_argsđược liên kết với KPI thực của thực thể. Mỗi khóaexpression_argsphải là tên chính xác của KPI mà khóa đó liên kết (không phải placeholder nhưx), cònprimary_indicatorvàexpressionsử dụng các tên đó. Quy tắc tĩnh yêu cầucondition,alert_conditionvàeval_window(0–60 phút). Quy tắc thích ứng sử dụngexpression=adaptive_std_cmp(<primary_indicator>, sensitivity, window); khi đó, ba trường này là tùy chọn (mặc định làexpr > 0,count_true(result) >= 1,1). Không thể đặtalgorithm. Thông tin ngữ cảnh cho người phản hồi được đặt trongproperties(mô tả, runbook, chú thích,query_mode).
Định tuyến thông báo được cấu hình trên nhóm cảnh báo, không phải trên quy tắc.
create_alert_from_chart
Tạo quy tắc ngưỡng tĩnh từ biểu đồ được mô tả bởi describe_alert_chart. Tương tự create_alert, quy tắc được tạo ở trạng thái tắt dưới dạng bản nháp và không kích hoạt; chỉ kích hoạt bằng patch_alert is_disabled=false sau khi người dùng xác nhận. API biểu đồ tạo quy tắc ở trạng thái bật, vì vậy công cụ sẽ tắt quy tắc ngay sau khi tạo; nếu thao tác đó thất bại, kết quả là lỗi nêu ID quy tắc, và quy tắc có thể đang hoạt động.
surface/chart_key/service_name/signal_key/name(string, bắt buộc)env(string, tùy chọn)attributes(object, tùy chọn)threshold(number, tùy chọn): Theo đơn vị của tín hiệu; phải từ 0 trở lên. Các tín hiệu có đơn vị điểm số như apdex cần giá trị tường minh.threshold_operator(string, tùy chọn):>(mặc định),<,>=,<=,==,!=.eval_window(integer, tùy chọn): Số phút, 1–60. Mặc định: 5.bad_minutes(integer, tùy chọn): 1–eval_window. Mặc định: 3.severity(string, tùy chọn):breachhoặcthreat.description(string, tùy chọn)group_id(string, tùy chọn): Thông thường nên bỏ qua.
update_alert
Thay thế toàn bộ cấu hình đánh giá của một quy tắc. Trước tiên, truy xuất quy tắc bằng get_alert_config hoặc get_entity_alert_rules. Từ chối mà không thay đổi gì nếu quy tắc không tồn tại hoặc thuộc nhóm cảnh báo khác. Thao tác có thể xóa mềm rồi tạo lại quy tắc, vì vậy hãy dùng ID thay thế được trả về sau đó.
entity_id(string, bắt buộc)id(string, bắt buộc): UUID của quy tắc cảnh báo.alert_rule(object, bắt buộc): Cấu hình đầy đủ; có cùng cấu trúc vớicreate_alert.
patch_alert
Thay đổi một phần, giữ nguyên ID quy tắc. Cần có ít nhất một thay đổi. Từ chối mà không thay đổi gì nếu quy tắc không tồn tại hoặc thuộc nhóm cảnh báo khác.
entity_id(string, bắt buộc)id(string, bắt buộc): UUID của quy tắc cảnh báo.is_disabled(boolean, tùy chọn):falsekích hoạt/bật,truetạm dừng.mute_until(integer, tùy chọn): Thời hạn theo Unix epoch;0bỏ tắt tiếng.properties(object, tùy chọn):description,runbook,annotations,query_mode. Mỗi trường được gửi sẽ thay thế giá trị đã lưu; trường bị bỏ qua hoặc để trống sẽ giữ nguyên giá trị đã lưu.annotationsthay thế toàn bộ map, vì vậy hãy gửi mọi khóa cần giữ lại;{}xóa map.recurring_mute_schedule(object, tùy chọn): Thay thế lịch hằng tuần:enabled(mặc định false),timezone(tên IANA, bắt buộc) vàwindows(1–20 khoảng thời gianweekdaysdưới dạngsun..sat,start_time/end_timedưới dạngHH:MMtheo định dạng 24 giờ). Nếu giờ kết thúc bằng hoặc trước giờ bắt đầu, khoảng thời gian sẽ kết thúc vào ngày hôm sau. Gửi mọi khoảng thời gian cần giữ lại.clear_recurring_mute_schedule(boolean, tùy chọn): Xóa toàn bộ lịch; không thể kết hợp vớirecurring_mute_schedule. Khác vớienabled=false, vốn giữ lại các khoảng thời gian đã lưu.
Người dùng có vai trò viewer chỉ có thể thay đổi mute_until. Các thay đổi tắt tiếng ở cấp quy tắc sẽ bị từ chối khi nhóm hoặc thực thể đang bị tắt tiếng. Đọc lại các thay đổi bằng get_entity_alert_rules, công cụ này hiển thị mute_until, recurring_mute_schedule và properties.
delete_alert
Xóa vĩnh viễn một quy tắc. Xác minh bằng get_alert_config và trước tiên phải có xác nhận rõ ràng của người dùng. Từ chối mà không xóa gì nếu quy tắc không tồn tại hoặc thuộc nhóm cảnh báo khác.
entity_id(string, bắt buộc)id(string, bắt buộc): UUID của quy tắc cảnh báo.
mute_alert_group
Tắt tiếng mọi quy tắc hiện tại và tương lai trong một nhóm; để tắt tiếng một quy tắc, dùng patch_alert với mute_until. Yêu cầu quyền editor.
entity_id(string, bắt buộc): UUID của nhóm cảnh báo/thực thể.until(integer, bắt buộc): Thời điểm kết thúc tắt tiếng, tính bằng giây Unix epoch.0bỏ tắt tiếng; giá trị âm như-1sẽ tắt tiếng vô thời hạn.
acknowledge_alert
Nhận quyền xử lý một cảnh báo đang kích hoạt hoặc nhường quyền đó. Không giải quyết hoặc tắt tiếng cảnh báo. Xác nhận một cảnh báo mà bạn đã sở hữu là thao tác không làm gì và an toàn. ack từ chối mà không ghi nhận gì, trừ khi get_alerts liệt kê chính xác cảnh báo đó (đủ cả ba ID) trong vòng một giờ qua.
alert_group_id/rule_id/rule_type(string, bắt buộc): Sao chép từ cảnh báo trongget_alerts.action(string, tùy chọn):ack(mặc định) hoặcunack. Chỉ chủ sở hữu hoặc quản trị viên tổ chức mới có thể bỏ xác nhận.mute_until(integer, tùy chọn): Chỉack. Ghi nhận thao tác tắt tiếng mà bạn đã thực hiện bằngmute_alert_grouphoặcpatch_alert; không tắt tiếng bất kỳ thứ gì.
reassign_alert
Chuyển một cảnh báo đã có chủ sở hữu cho người dùng khác; nếu chưa có chủ sở hữu, hãy xác nhận cảnh báo trước. Nếu không thể chuyển vì cảnh báo chưa có chủ sở hữu, công cụ sẽ cho biết liệu get_alerts có liệt kê cảnh báo đó trong vòng một giờ qua hay không. Last9 không thông báo cho chủ sở hữu mới.
alert_group_id/rule_id/rule_type(string, bắt buộc): Sao chép từ cảnh báo trongget_alerts.owner_email(string, tùy chọn): Ưu tiên dùng; đối chiếu không phân biệt chữ hoa chữ thường với người dùng đang hoạt động trong tổ chức.owner_user_id(string, tùy chọn): Cung cấp chính xác một trongowner_emailhoặcowner_user_id.
create_notification_channel
Tạo một kênh; kênh sẽ không định tuyến gì cho đến khi được gắn bằng attach_notification_channel. Chỉ tạo một lần và giữ lại ID; không có công cụ cập nhật. Chỉ trả về id, name, type và send_resolved.
name(string, bắt buộc): Duy nhất theo từng loại; không có dấu hai chấm.type(string, bắt buộc):slack,pagerduty,opsgenie,emailhoặcgeneric_webhook.destination(string, bắt buộc): URL Slack Incoming Webhook (hoặc ID kênh vớislack_app_mode), khóa định tuyến PagerDuty, khóa API Opsgenie, địa chỉ email công việc phân tách bằng dấu phẩy trên mọi miền (không chỉ miền của tổ chức; API từ chối địa chỉ của nhà cung cấp email cá nhân như Gmail, và tổ chức dùng tài khoản đăng nhập cá nhân chỉ chấp nhận địa chỉ của quản trị viên), hoặc URL webhook HTTPS.slack_app_mode(boolean, tùy chọn): Chỉ dành cho Slack. Mặc định: false.mention_handles(string, tùy chọn): Phân tách bằng dấu phẩy, ví dụ:user|U123ABC|name,special|here,special|channel.webhook_headers(object, tùy chọn): Chỉgeneric_webhook.webhook_ca_certificate(string, tùy chọn): Chỉgeneric_webhook; một chứng chỉ CA PEM tối đa 64 KiB.send_resolved(boolean, tùy chọn): Mặc định: true.
attach_notification_channel
Định tuyến một kênh hiện có đến một nhóm cảnh báo. Có tính lặp an toàn. Tệp đính kèm sao chép cài đặt gửi của kênh (header, chứng chỉ, lượt nhắc đến) tại thời điểm gắn; nếu cài đặt của kênh thay đổi sau đó, hãy gắn lại.
channel_id(integer, bắt buộc): ID kênh (get_notification_channelsvớiscope=channels), không phải ID tệp đính kèm.alert_group_id(string, bắt buộc): Lấy từget_alert_groups.severity(string, bắt buộc):breach,threathoặcboth.bothtạo hai tệp đính kèm; nếu lần thứ hai thất bại, tệp đính kèm thứ nhất vẫn được giữ và lỗi sẽ nêu mức độ nghiêm trọng cần thử lại.
detach_notification_channel
Gỡ một tệp đính kèm. Yêu cầu token có phạm vi xóa; token có phạm vi ghi không thể gỡ.
attachment_id(integer, bắt buộc):idtừget_notification_channelsvớiscope=attached. ID kênh sẽ bị từ chối.alert_group_id(string, tùy chọn): Từ chối nếu tệp đính kèm thuộc một nhóm khác.
delete_notification_channel
Xóa vĩnh viễn một kênh không có tệp đính kèm; trước tiên hãy gỡ các tệp đính kèm của kênh. Yêu cầu token có phạm vi xóa. Xác nhận việc xóa bằng cách liệt kê lại các kênh.
channel_id(integer, bắt buộc):idtừget_notification_channelsvớiscope=channels. ID tệp đính kèm sẽ bị từ chối.
did_you_mean
query(string, bắt buộc): Tên cần tìm — có thể là một phần, viết sai chính tả hoặc dạng viết tắt.type(string, tùy chọn): Giới hạn theo loại thực thể:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Trả về tối đa 3 kết quả khớp gần nhất cùng điểm tương đồng. Hãy dùng công cụ này trước mọi lệnh gọi công cụ khi chưa chắc chắn về tên thực thể. Nếu lệnh gọi trước đó trả về kết quả trống, hãy dùng công cụ này trước khi thử lại.
get_service_profile
service_name(string, bắt buộc): Dịch vụ cần suy ra hồ sơ telemetry.datasource(string, tùy chọn): Tên datasource. Bỏ qua để dùng mặc định; tên gần đúng sẽ được phân giải như với các công cụ Prometheus. Trả về bản tóm tắt điều tra ngắn, sau đó là toàn bộ hồ sơ dưới dạng JSON thô: trạng thái hiện diện của tín hiệu (logs/traces/metricsdưới dạngpresent,absenthoặcunknown), ngôn ngữ và môi trường chạy, môi trường triển khai,signal_shapecủa log (log_format,severity_set,level_field,trace_context_in_logs) và cách khắc phục ingest được đề xuất nếu có. Khi backend báo cáofreshness, bản tóm tắt bổ sung một dònglast seenvớifreshness.logs.last_seenvàfreshness.traces.last_seen(RFC3339 hoặcnonenếu null), cùng cảnh báotraces stalekhifreshness.traces_stalelàtrue: span đã dừng trong khi log vẫn tiếp tục, vì vậy hãy điều tra hồi quy quanhfreshness.traces.last_seen, không phải thiếu cấu hình. Được suy ra từ upstream và lưu vào bộ nhớ đệm với TTL khoảng 15 phút.
Hãy gọi công cụ này trước mọi cuộc điều tra theo phạm vi dịch vụ để việc chọn công cụ phù hợp với telemetry thực tế của dịch vụ — bỏ qua công cụ trace khi traces là absent; và khi severity_set là none hoặc partial, hãy phân tích mức độ nghiêm trọng từ level_field trong phần thân log thay vì dùng severity_filters. metrics luôn là unknown và dependencies chưa được điền trong v1. Khi cả logs và traces đều là absent, hãy xác nhận tên bằng did_you_mean trước khi kết luận dịch vụ chưa được giám sát.
list_dashboards
name(string, tùy chọn): Chuỗi con không phân biệt chữ hoa chữ thường trong tên dashboard. Thu hẹp danh sách vàtotal.limit(integer, tùy chọn): Số dashboard mỗi trang, 1–200. Mặc định: 100.cursor(string, tùy chọn):next_cursortừ trang trước; truyền cùngnamevới giá trị này.
Trả về {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"}, sắp xếp theo thời điểm cập nhật gần nhất trước. created_by bị lược bỏ nếu rỗng; locked bị lược bỏ nếu API không báo cáo readonly. updated_at là số giây tính từ Unix epoch, dưới dạng chuỗi. Trang có thể kết thúc sớm để không vượt quá 32 KB; next_cursor không xuất hiện ở trang cuối.
get_dashboard
id(string, bắt buộc): UUID của dashboard.region(string, tùy chọn): Khu vực dùng để điền truy vấn cho panel. Mặc định là khu vực datasource đã cấu hình.
Kết quả bổ sung locked ở cấp cao nhất (false nếu API không cung cấp) và created_by (ID người dùng của tác giả).
Để tạo cảnh báo cho một panel, xem last9://reference/alerting.
validate_dashboard
Chỉ đọc. Không bao giờ tạo hoặc cập nhật dashboard. Chấp nhận chính xác một trong hai giá trị dashboard_id hoặc dashboard_definition.
dashboard_id(string, tùy chọn): UUID của dashboard đã lưu cần xác thực.dashboard_definition(object, tùy chọn): Nội dung dashboard chưa lưu, được cung cấp trực tiếp (chạy thử thực sự). Một envelope tạo{dashboard, metadata}sẽ được bóc tách để lấy đối tượngdashboard.start_time_iso/end_time_iso(string, tùy chọn): Khoảng thời gian xác thực (RFC3339). Phải ≤ 24h.region(string, tùy chọn): Khu vực dùng để thực thi truy vấn của panel.
Trả về dashboard_validation/v1: phân loại lint và thực thi theo từng panel (data / no_data / invalid / error). Kết quả rỗng trong ngày đầu tiên được phân loại là valid_no_data mà không cần các phép dò chẩn đoán. Dashboard không có panel trả về success: false cùng với error: "no_panels". Các trường panel từ định dạng khác (Grafana gridPos, title, type và targets trên các panel cần truy vấn) cùng các trường sai kiểu được liệt kê theo từng panel trong shape_problems, tính vào summary.panels_invalid_shape và khiến overall trở thành fail.
preview_dashboard
Bản xem trước chỉ đọc ở phía client. Truyền dashboard (đối tượng dashboard chưa lưu từ yêu cầu tạo) hoặc id cùng ops (các thao tác theo đúng thứ tự như patch_dashboard). Các giá trị bắt buộc start_time_iso và end_time_iso là dấu thời gian RFC3339, cách nhau tối đa 24 giờ. variables là tùy chọn, chứa các giá trị ghi đè dạng vô hướng; nếu không có, sẽ dùng giá trị dashboard và các giá trị mặc định tích hợp sẵn.
{
"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"
}
Trả về saved: false, bản tóm tắt validation về định nghĩa/truy vấn (bao gồm definition_error khi lược đồ tạo không khớp) và panels với trạng thái ok / empty / error, các truy vấn đã phân giải và chẩn đoán mục tiêu. PromQL và LogJSON được thực thi; loại truy vấn không được hỗ trợ và biến chưa phân giải khiến panel báo lỗi. Các panel hợp lệ không cần truy vấn là ok; định nghĩa panel không hợp lệ là error. Bản vá diff bao gồm panels_added ròng, panels_changed (bao gồm cả thao tác di chuyển) và panels_removed, cùng các thay đổi theo thứ tự của thao tác. ID và chỉ số bắt đầu từ 0 dùng để xác định panel; chỉ số đã xóa tham chiếu đến dashboard ban đầu. Các panel đã lưu phải có ID không rỗng và không trùng nhau.
Giới hạn: 50 panel, 100 truy vấn, 100 thao tác, 65536 byte JSON cho mỗi đầu vào và dashboard ứng viên, cùng thời hạn thực thi 60 giây. Các truy vấn đã phân giải vượt quá 65536 byte JSON sẽ bị từ chối trước khi thực thi. Bằng chứng giữ tối đa ba mẫu và 1024 byte JSON cho mỗi mục tiêu, với truncated: true khi lược bỏ mẫu. Báo cáo JSON vượt quá 262144 byte sẽ thất bại và hướng dẫn giảm kích thước đầu vào.
Không có dashboard nào được tạo hoặc cập nhật. Thao tác này kiểm tra ứng viên theo lược đồ tạo và chạy truy vấn bằng trình xác thực hiện có; không đảm bảo backend chấp nhận hoặc hiển thị được. ID do backend gán, giá trị mặc định, trường bị loại bỏ hoặc chỉnh sửa đồng thời có thể làm thay đổi kết quả đã lưu. Bản xem trước dùng cùng các thao tác vá cục bộ và giá trị mặc định phiên bản panel như thao tác ghi.
create_dashboard
Chỉ tạo mới. Sau khi lệnh gọi này trả về dashboard.id, hãy chỉnh sửa panel bằng patch_dashboard (hoặc sắp xếp lại cấu trúc bằng update_dashboard) — không tạo lại để thêm, cắt bớt hoặc sửa panel.
dashboard(object, bắt buộc): Định nghĩa dashboard vớinamevàpanels[]. Mỗi panel cần cóname,version,layout(x,y,w,h),visualization.typevàqueries[].metadata(object, tùy chọn): Metadata dashboard — các trường_categoryvà_type(ví dụ:{"_category":"custom","_type":"metrics"}).
update_dashboard
Chỉ dùng để sắp xếp lại phần lớn dashboard; để thêm, chỉnh sửa, xóa hoặc di chuyển từng panel, hãy dùng patch_dashboard. Thay thế toàn bộ theo ID (cùng nội dung như khi tạo): phải gửi lại chính xác mọi panel.
id(string, bắt buộc): UUID của dashboard cần cập nhật.dashboard(object, bắt buộc): Nội dung dashboard thay thế toàn bộ (cùng cấu trúc như khi tạo).metadata(object, tùy chọn): Metadata thay thế. Dashboard hệ thống chỉ đọc sẽ trả về lỗi công cụ có thể khôi phục.
patch_dashboard
Ưu tiên dùng cách này thay cho update_dashboard khi cần tinh chỉnh nhỏ: các panel không thay đổi sẽ không bao giờ được gửi lại. Công cụ đọc dashboard, áp dụng lần lượt ops rồi ghi lại, vì vậy mọi chỉnh sửa được thực hiện ở nơi khác giữa lúc đọc và ghi sẽ bị ghi đè. Trả về {dashboard_id, changes[]}; các thao tác mà dashboard đã đáp ứng sẽ bị loại bỏ, và nếu không có thao tác nào tạo ra thay đổi thì sẽ không ghi gì. Bản diff được kiểm tra bằng cách đọc lại sau khi ghi: fields của panel hiển thị các giá trị đã lưu, not_stored liệt kê các khóa API đã loại bỏ và not_removed liệt kê các khóa API giữ lại dù có null. Các giá trị diff dài hơn 200 ký tự sẽ được rút gọn tại chỗ, giữ nguyên kiểu JSON.
id(string, bắt buộc): UUID của dashboard cần vá.ops(array, bắt buộc): Các thao tác được áp dụng theo thứ tự; nếu có thao tác không hợp lệ thì không ghi gì và lỗi sẽ nêu tên thao tác đó làops[i].add_panel:panel(đối tượng panel đầy đủ;versionmặc định là 1), tùy chọnindex(vị trí chèn bắt đầu từ 0, mặc định là cuối danh sách).update_panel:panel_id,fields(các khóa panel cấp cao nhất cần thay thế;nullxóa một khóa; không thể thay đổiid).remove_panel:panel_id.move_panel:panel_id,index(vị trí sau khi di chuyển, bắt đầu từ 0).set_title:title(tên dashboard).set_variable:variable; thay thế biến có cùngtarget, nếu không thì thêm vào cuối.
delete_dashboard
id(string, bắt buộc): UUID của dashboard cần xóa. Không thể xóa dashboard hệ thống chỉ đọc.
set_dashboard_lock
id(string, bắt buộc): UUID của dashboard.locked(boolean, bắt buộc):truekhóa dashboard,falsemở khóa dashboard.
Công cụ ghi; chỉ gọi khi người dùng yêu cầu rõ ràng. Chỉ tác giả dashboard hoặc quản trị viên tổ chức mới có thể khóa hoặc mở khóa dashboard; dashboard tích hợp luôn ở chế độ chỉ đọc. Trả về {"id", "locked"} cùng trạng thái kết quả. Khi bị khóa, update_dashboard, patch_dashboard và delete_dashboard không gửi thao tác ghi nào và trả về lỗi công cụ có thể khôi phục, bắt đầu bằng dashboard is locked, nêu tên tác giả và đề xuất mở khóa hoặc sao chép dashboard bằng create_dashboard.
list_dashboard_snapshots
dashboard_id(string, bắt buộc): UUID của dashboard cần liệt kê snapshot.
Chỉ trả về metadata (id, name, expires_at, v.v.). Dùng get_dashboard_snapshot để lấy dữ liệu panel đã đóng băng.
get_dashboard_snapshot
id(string, bắt buộc): UUID của snapshot.
Trả về toàn bộ snapshot đã đóng băng, bao gồm dashboard_definition, panel_data, time_range và variables.
delete_dashboard_snapshot
id(string, bắt buộc): UUID của snapshot cần xóa.
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(tùy chọn): Khoảng thời gian; ưu tiên lookback hoặc các mốc ISO tường minh (mặc định 60m).region(string, tùy chọn): Ghi đè khu vực.
Trả về các dịch vụ có dữ liệu profiling trong khoảng thời gian đó. Gọi công cụ này trước get_flamegraph / get_top_functions / get_profile_summary.
get_flamegraph
service(string, bắt buộc): Tên dịch vụ lấy từget_profile_services.profile_type(string, tùy chọn):cpu(mặc định),allochoặcwall. Cố định một loại khi so sánh các khoảng thời gian.env/cluster/namespace/runtime(string, tùy chọn): Bộ lọc phạm vi.limit(number, tùy chọn): Số hàng stack tổng hợp tối đa (mặc định 1000, tối đa 10000).lookback_minutes/start_time_iso/end_time_iso/region(tùy chọn).
Trả về cây flamegraph lồng nhau (name / value / self / children). truncated: true nghĩa là đã chạm giới hạn số hàng của API.
get_top_functions
Dùng cùng bộ lọc như get_flamegraph. Trả về thứ hạng các hàm nóng nhất theo mẫu self-sample. Kết quả có thể bị cắt bớt; hãy kiểm tra truncated.
get_profile_summary
Dùng cùng bộ lọc như get_flamegraph. Trả về bản phân loại sự cố ngắn bằng ngôn ngữ tự nhiên của hồ sơ cho dịch vụ.
grafana_search_dashboards
query(string, tùy chọn): Chuỗi con trong tiêu đề. Để trống sẽ liệt kê trên phạm vi rộng (tùy thuộc giới hạn 5.000 hàng).
Trả về {"dashboards":[…], "truncated":bool} với uid, title, uri, url, type, tags. Dùng uid cùng với grafana_get_dashboard.
grafana_get_dashboard
uid(string, bắt buộc): uid của dashboard Grafana.full_json(boolean, tùy chọn): Khi là true, trả về JSON Grafana thô thay vì bản tóm tắt đã lọc.
Bản tóm tắt mặc định: phiên bản, thẻ, biến templating và loại/datasource/gridPos/đích promQL của từng panel. Các loại panel plugin không xác định xuất hiện trong unsupportedPanelTypes.
grafana_list_folders
Không có tham số. Trả về cây thư mục.
grafana_list_folder_dashboards
folder_uid(string, bắt buộc): uid của thư mục Grafana.
Trả về {"dashboards":[…], "truncated":bool} cho các dashboard trong thư mục đó (phân trang tối đa 5.000).
grafana_list_datasources
Không có tham số. Trả về bản chiếu an toàn của các nguồn dữ liệu (không có trường thông tin xác thực).
Kiểm thử
Chạy bộ phân tích goroutine của kiểm thử mà không thực thi các kiểm thử ứng dụng:
make lint-test
Lệnh này chạy bộ phân tích testinggoroutine của Go trên tất cả các gói, bao gồm cả các tệp
*_test.go của chúng, và kiểm tra bộ phân tích bằng các fixture không an toàn và an toàn. Cả hai quy trình kiểm thử CI đều chạy go vet -testinggoroutine ./... như một bước riêng, vì vậy kết quả kiểm thử gói được lưu trong bộ nhớ đệm không thể bỏ qua việc thực thi lint.
Gói gốc cũng chạy bộ phân tích như một bài kiểm thử. Dùng go test -count=1 ./...
cho toàn bộ bộ kiểm thử với bước kiểm tra đó không dùng bộ nhớ đệm: bộ nhớ đệm kiểm thử của Go không theo dõi các tệp nguồn gói nội bộ được tiến trình con của bộ phân tích đọc. Lệnh go test ./... thông thường có thể dùng lại kết quả đạt của kiểm thử gói gốc sau khi các tệp đó thay đổi.
Fatal, Fatalf và FailNow trên testing.T hoặc testing.B phải chạy trong goroutine kiểm thử cha. Các worker nên gửi lỗi về để goroutine cha xác nhận:
errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
t.Fatal(err)
}
Bộ phân tích phát hiện các lệnh gọi trực tiếp trong các closure go func; đây không phải là kiểm tra liên thủ tục tổng quát để phát hiện các lệnh xác nhận bị ẩn sau những lệnh gọi hàm trợ giúp tùy ý.
Các kiểm thử tích hợp sẽ bị bỏ qua trừ khi TEST_REFRESH_TOKEN được đặt.
