Last9
ทางการนำบริบทการผลิตแบบเรียลไทม์—ล็อก เมตริก และเทรซ—มาสู่สภาพแวดล้อมในเครื่องของคุณได้อย่างราบรื่น เพื่อแก้ไขโค้ดอัตโนมัติได้เร็วขึ้น
คุณทำอะไรได้บ้างด้วย Last9 MCP?
- ตรวจสอบเหตุขัดข้องในระบบจริง — ขอให้ผู้ช่วยดึงบันทึกการทำงาน เทรซ เมตริก ข้อยกเว้น และการแจ้งเตือนที่ทำงานอยู่ของบริการ เพื่อวินิจฉัยว่าเกิดอะไรขัดข้อง
- เชื่อมโยงการเปลี่ยนแปลงกับผลกระทบ — ตรวจสอบการนำระบบขึ้นใช้งานและการเปลี่ยนแปลงการกำหนดค่า จากนั้นเปรียบเทียบบริการและบริการที่เรียกใช้บริการนั้นก่อนและหลัง เพื่อดูว่าการเปลี่ยนแปลงทำให้เกิดปัญหาถดถอยหรือไม่
- ค้นหาเมตริก Prometheus — เรียกใช้คิวรี PromQL แบบช่วงเวลาหรือแบบทันที และแสดงค่าป้ายกำกับเพื่อสำรวจเมตริกใดก็ได้ในแหล่งข้อมูลของคุณ
- ตรวจสอบประสิทธิภาพฐานข้อมูล — ค้นหาฐานข้อมูล ค้นหาการทำงานของคิวรีที่ช้า และตรวจสอบรูปแบบคิวรีกับเมตริกฝั่งเซิร์ฟเวอร์จากสแปน OTel
- วิเคราะห์เทรซและโปรไฟล์ — ดึงแผนภาพน้ำตกของเทรซด้วย ID จัดอันดับความเบี่ยงเบนของแอตทริบิวต์ระหว่างกลุ่ม หรือดึงกราฟเปลวไฟและฟังก์ชันที่ใช้เวลาสูงสุดของบริการ
- จัดการการแจ้งเตือนและแดชบอร์ด — ตรวจสอบความครอบคลุมและความเรียบร้อยของการแจ้งเตือน สร้างหรือแก้ไขกฎการแจ้งเตือน และแสดง ตรวจสอบความถูกต้อง หรือแก้ไขแดชบอร์ดแบบกำหนดเอง
เอกสาร
Last9 MCP Server

เอเจนต์ AI ของคุณไม่รู้ว่าอะไรเสียอยู่ในระบบ production สิ่งนี้จะช่วยแก้ปัญหานั้น
Last9 MCP Server เชื่อมต่อ Claude, Cursor, Windsurf และผู้ช่วย AI อื่น ๆ ที่รองรับ MCP เข้ากับข้อมูล observability ในระบบ production ของคุณโดยตรง ไม่ว่าจะเป็น logs, metrics, traces, exceptions, database queries, alerts และ deployments เอเจนต์จะเลิกคาดเดาและเริ่มอ่านสัญญาณจริง
เริ่มใช้งานใน 30 วินาที (Hosted)
ไม่ต้องติดตั้งไบนารี ไม่ต้องจัดการโทเค็น ใช้ URL เดียว ยืนยันตัวตนผ่าน OAuth ในเบราว์เซอร์ แล้วก็พร้อมใช้งาน
ค้นหา org slug ของคุณใน 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
พิมพ์ /mcp เลือก last9 แล้วยืนยันตัวตน เท่านี้ก็เรียบร้อย
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
คลิก Connect แล้วดำเนินการ OAuth ให้เสร็จ
VS Code
ต้องใช้ v1.99 ขึ้นไป เปิด Command Palette → MCP: Add Server วาง URL แล้วยืนยันตัวตน
หรือกำหนดค่าโดยตรงใน settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > ไอคอนรูปเฟือง (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. ตั้งชื่อเป็น last9 วาง URL แล้วยืนยันตัวตน
ต้องมีสิทธิ์ผู้ดูแลระบบขององค์กร Claude
Self-Hosted (STDIO)
ใช้วิธีนี้เมื่อ MCP client ของคุณไม่รองรับ HTTP transport หรือต้องการให้เซิร์ฟเวอร์ทำงานในเครื่อง
ติดตั้ง
Homebrew:
brew install last9/tap/last9-mcp
NPM:
ต้องใช้ Node.js 22.23.4+, 24.22.1+ หรือ 26.12.1+: รุ่นก่อนหน้านี้จะยอมรับใบรับรอง TLS จาก eMudhra intermediates ที่ถูกบุกรุก เมื่อตัวติดตั้งดาวน์โหลดไบนารี
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
ไบนารีรุ่นต่าง ๆ (Windows / ติดตั้งด้วยตนเอง):
ดาวน์โหลดจาก GitHub Releases:
| แพลตฟอร์ม | ไฟล์เก็บถาวร |
|---|---|
| Windows (x64) | last9-mcp-server_Windows_x86_64.zip |
| Windows (ARM64) | last9-mcp-server_Windows_arm64.zip |
| Linux (x64) | last9-mcp-server_Linux_x86_64.tar.gz |
| Linux (ARM64) | last9-mcp-server_Linux_arm64.tar.gz |
| macOS (x64) | last9-mcp-server_Darwin_x86_64.tar.gz |
| macOS (ARM64) | last9-mcp-server_Darwin_arm64.tar.gz |
รับ Refresh Token
เฉพาะ ผู้ดูแลระบบ เท่านั้นที่สร้างโทเค็นได้
- ไปที่ API Access
- คลิก Generate Token โดยกำหนดสิทธิ์ Write
- คัดลอกโทเค็น
การกำหนดค่า Client
Homebrew:
{
"mcpServers": {
"last9": {
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
NPM:
{
"mcpServers": {
"last9": {
"command": "npx",
"args": ["-y", "@last9/mcp-server@latest"],
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
ตำแหน่งที่ต้องวาง:
| Client | ตำแหน่ง |
|---|---|
| Claude Web/Desktop | Settings > Developer > Edit Config (claude_desktop_config.json) |
| Cursor | Settings > Cursor Settings > MCP > Add New Global MCP Server |
| Windsurf | Settings > Cascade > MCP Marketplace > ไอคอนรูปเฟือง (mcp_config.json) |
| VS Code | ครอบด้วย { "mcp": { "servers": { ... } } } ใน settings.json — รายละเอียด |
การกำหนดค่า VS Code STDIO
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
สำหรับ NPM: ใช้ "command": "npx" และเพิ่ม "args": ["-y", "@last9/mcp-server@latest"].
Windows
หลังดาวน์โหลดจาก GitHub Releases ให้แตกไฟล์และระบุพาธแบบเต็ม:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
วิธีใช้ NPM สะดวกกว่าบน Windows เพราะไม่ต้องจัดการพาธ
ตัวแปรสภาพแวดล้อม
| ตัวแปร | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
LAST9_REFRESH_TOKEN | (จำเป็น) | Refresh token จาก API Access |
LAST9_DATASOURCE | org default | ชื่อ datasource/cluster — มีประโยชน์เมื่อคุณมี Levitate clusters หลายรายการ |
LAST9_FAKE_NOW_ISO | (ไม่ได้กำหนด) | ใช้สำหรับ evals/replays เท่านั้น ห้ามกำหนดใน production RFC3339 instant (เช่น 2026-01-02T15:04:05Z) ที่ใช้แทนเวลาปัจจุบันเมื่อคำนวณช่วงเวลาแบบสัมพัทธ์ เช่น lookback_minutes เพื่อให้รันซ้ำได้ผลเหมือนเดิม หากค่าไม่ถูกต้องจะเกิดข้อผิดพลาดตอนเริ่มต้น การหมดเวลา แคช และการหมดอายุของโทเค็นยังคงใช้เวลาจริง |
LAST9_API_HOST | app.last9.io | กำหนด API host เอง |
LAST9_TOOLSETS | เครื่องมือทั้งหมด | toolsets ที่ต้องการเปิดให้ใช้งาน คั่นด้วยจุลภาค (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all) ชื่อเรียก: LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | กำหนด true เพื่อให้บริการเฉพาะเครื่องมือแบบอ่านอย่างเดียว ดู โหมดอ่านอย่างเดียว หากค่าไม่ใช่ boolean จะเกิดข้อผิดพลาดตอนเริ่มต้น ชื่อเรียก: LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | เครื่องมือเขียนที่คั่นด้วยจุลภาคซึ่งยังให้บริการในโหมดอ่านอย่างเดียว ชื่อเรียก: LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | จำนวนรายการสูงสุดสำหรับคำขอ get_logs แบบแบ่งส่วน |
LAST9_USE_LOG_SEARCH_API | false | กำหนด true เพื่อให้ตอบ get_logs และ get_service_logs ด้วยการค้นหาฝั่งเซิร์ฟเวอร์เพียงครั้งเดียว แทนการแบ่งส่วนฝั่ง client แต่ละครั้งใช้เวลาได้ 90 วินาที จากนั้นจะแนะนำให้จำกัดช่วงเวลาให้แคบลง หากได้ 502 หรือ 503 จะลองใหม่หนึ่งครั้งภายในเวลานั้น |
LAST9_DEBUG_CHUNKING | false | กำหนด true เพื่อบันทึกรายละเอียดการวางแผนแบ่งส่วนสำหรับ get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | กำหนด false เพื่อเปิดใช้การติดตาม OTel ภายใน |
OTEL_SDK_DISABLED | — | ตัวแปรสภาพแวดล้อม OTel มาตรฐาน ใช้แทนค่า LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | OTLP collector endpoint (เฉพาะเมื่อเปิดใช้ telemetry) |
OTEL_EXPORTER_OTLP_HEADERS | — | OTLP auth headers (เฉพาะเมื่อเปิดใช้ telemetry) |
การจับเวลาระยะของเครื่องมือ
เมื่อเปิดใช้ telemetry ภายใน spans ของเครื่องมือจะมี last9.phase.<phase>.duration_ms
(เวลาที่ผ่านไปจริงเป็นมิลลิวินาที) และ last9.phase.<phase>.failed (ระบุว่าระยะนั้น
ส่งคืนข้อผิดพลาดหรือไม่) ฟิลด์เดียวกันนี้จะถูกบันทึกเป็น debug
logs ของ tool phase completed พร้อมกับ tool และ phase เมื่อ logger ที่กำหนดไว้ยอมรับ debug records
การจับเวลาเหล่านี้จะไม่เพิ่ม inputs, query text, credentials หรือ error bodies
| เครื่องมือ | ระยะ |
|---|---|
get_log_patterns | sample: ดึงและถอดรหัสตัวอย่าง; mine: วิเคราะห์หารูปแบบ; deep_link: ระบุ index ที่ไม่บังคับและสร้างลิงก์ |
get_logs | fetch: ดึง ถอดรหัส และรวมผลลัพธ์ รวมถึงการลองใหม่และการตรวจสอบจำนวนที่ไม่บังคับ; count_sanity: การตรวจสอบแบบซ้อนที่ไม่บังคับ; post_process: คำแนะนำ สรุป และจัดรูปแบบ JSON; deep_link: ระบุ index และสร้างลิงก์ |
get_service_profile | request: เตรียมและส่งคำขอผ่าน API client ที่ใช้ร่วมกัน แล้วอ่าน response ทั้งหมดก่อนจัดรูปแบบสรุป |
ระบบจะบันทึกเฉพาะระยะที่มีการทำงาน รวมถึงกรณีดึงข้อมูลล้มเหลว ตัวช่วยที่ไม่บังคับซึ่งระงับข้อผิดพลาดจะยังคงทำงานแบบเดิม; failed: false ไม่ได้ยืนยันว่ามีลิงก์หรือการตรวจสอบจำนวนที่ไม่บังคับพร้อมใช้งาน ระยะเวลาของ count_sanity ที่ซ้อนอยู่รวมอยู่ใน fetch แล้ว อย่านำมาบวกซ้ำ เวลาดึงข้อมูลรวมการทำงานของ client จึงไม่ได้วัดเฉพาะการทำงานของ backend เปรียบเทียบระยะเหล่านี้บนช่วงเวลาและเส้นทางการค้นหาที่เทียบเคียงกันก่อนปรับ sampling หรือ caching
เมื่อตรวจสอบ latency ให้ replay service, datasource, index, window และ limits เดียวกันบน build พื้นฐานและ build ที่ต้องการทดสอบ บันทึก build SHA, tool total, ระยะเวลาแต่ละ phase, last9.logs.search_path, retry attributes เมื่อมี และ coverage flags เปรียบเทียบทั้งการเรียกที่ช้าและการเรียกทั่วไป หาก fetch หรือ profile request ช้า แสดงว่าควรตรวจสอบ phase ของ network/API; การระบุว่า tail latency เกิดจาก backend ต้องมีหลักฐานที่เชื่อมโยงกันจากแหล่งอื่น การวินิจฉัยเหล่านี้เพียงอย่างเดียวไม่สามารถยืนยันได้ว่า latency ดีขึ้น
โหมดอ่านอย่างเดียว
--read-only (หรือ LAST9_MCP_READ_ONLY=true) ให้บริการเฉพาะเครื่องมือที่มีคำอธิบายประกอบเป็น readOnlyHint: true ดังนั้นจึงไม่มีเครื่องมือใดสร้าง เปลี่ยนแปลง หรือลบ alert rules, notification channels, dashboards หรือ drop rules รวมถึง acknowledge หรือมอบหมาย alerts ใหม่ หรือ mute groups ได้ เครื่องมือที่ไม่มีคำอธิบายประกอบจะถือเป็นเครื่องมือเขียนและถูกซ่อนไว้
หากต้องการเก็บเครื่องมือเขียนไว้บางรายการ ให้ระบุชื่อด้วย --allow-write-tools (หรือ LAST9_MCP_ALLOW_WRITE_TOOLS):
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- เซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงานหากชื่อที่อนุญาตไม่ใช่เครื่องมือเขียน (เช่น พิมพ์ผิด หรือเป็นชื่อเครื่องมืออ่าน) โดยข้อผิดพลาดจะแสดงรายชื่อเครื่องมือเขียนที่ถูกต้อง
- การกำหนด
--allow-write-toolsโดยไม่มี--read-onlyจะทำให้เกิดข้อผิดพลาดตอนเริ่มต้น เพราะมีการให้บริการเครื่องมือเขียนทั้งหมดอยู่แล้ว - โหมดอ่านอย่างเดียวทำงานร่วมกับ
--toolsets: เครื่องมือจะให้บริการก็ต่อเมื่อผ่านทั้งสองเงื่อนไข--toolsets=alerts --read-only --allow-write-tools=mute_alert_groupให้บริการเครื่องมืออ่าน alerts พร้อมกับmute_alert_group; เครื่องมือเขียนที่อนุญาตแต่ไม่อยู่ใน toolsets ที่เลือกจะยังคงถูกซ่อนไว้ - โหมด
--httpและdump-toolsใช้ flags และ env vars ชุดเดียวกัน:go run . dump-tools --read-onlyแสดงรายการเครื่องมืออ่านอย่างเดียว พร้อมคำแนะนำของเซิร์ฟเวอร์ที่ให้บริการในinstructions - คำอธิบาย schemas และผลลัพธ์ของเครื่องมืออ่าน รวมถึงคำแนะนำของเซิร์ฟเวอร์ จะไม่ระบุชื่อเครื่องมือเขียนที่ถูกซ่อน เครื่องมือเขียนที่อนุญาตอาจยังระบุชื่อเครื่องมือที่เกี่ยวข้องซึ่งถูกซ่อนไว้ได้ (
create_alertสร้าง rule ที่ปิดใช้งาน ซึ่งpatch_alertเปิดใช้งาน) ดังนั้นควรอนุญาตเครื่องมือที่เกี่ยวข้องเหล่านี้พร้อมกัน
ทำอะไรได้บ้าง
การเริ่มต้นใช้งาน
get_workspace_overview— แนะนำให้เรียกใช้เป็นครั้งแรกเมื่อคำขอไม่ได้ระบุ service หรือ tool (หากระบุ จะเรียกใช้ tool นั้นโดยตรง): environments, สัญญาณใดบ้าง (logs, traces, metrics) ที่พบในชั่วโมงที่ผ่านมา จำนวน service และ alert groups, alerts ที่กำลังทำงาน และเวลาปัจจุบัน ทั้งหมดนี้ได้จากการเรียกใช้ที่มีค่าใช้จ่ายต่ำ สัญญาณที่ไม่พบในชั่วโมงนั้นอาจยังมีข้อมูลเก่ากว่า จึงยังค้นหาได้ หากการเรียกย่อยล้มเหลว ฟิลด์นั้นจะเป็นnullและเพิ่มรายการerrors[]ให้บริการในทุก toolsetget_current_time— เวลาปัจจุบัน พร้อมขอบเขตเวลาแบบสัมบูรณ์สำหรับlast 2h,yesterdayหรือsince yesterday 9am ISTในเขตเวลา IANA หรือชื่อย่อที่ใช้กันทั่วไป ให้บริการในทุก toolset
สถานะของ Service
get_service_summary— แสดงรายการ(service, env)ของ fleet โดยเรียงตามอันดับ: request_count ของช่วงเวลา, throughput_rpm, จำนวน HTTP 4xx/5xx และจำนวนข้อผิดพลาด gRPCget_service_environments— environments ที่พร้อมใช้งานสำหรับ services ของคุณ เรียกใช้รายการนี้ก่อน เพราะเครื่องมือ APM อื่น ๆ ต้องใช้envจากที่นี่get_service_performance_details— รายละเอียดครบถ้วน: throughput, error rate, p50/p90/p95/avg/max, apdex, availability (สรุปเป็นค่าเริ่มต้น; ดู series ทั้งหมดได้ด้วยinclude_series)get_service_operations_summary— จัดกลุ่ม operations ตาม HTTP endpoints, DB calls, messaging และ HTTP clientsget_service_dependency_graph— แผนผัง dependencies พร้อม throughput, latency และ error rates สำหรับ upstream/downstream/infraget_apm_service_deviations— เปรียบเทียบ window ปัจจุบันกับ baseline ที่มีระยะเวลาเท่ากัน: regressions/improvements, การกระทบยอด Apdex และผลลัพธ์สุดท้าย (ทั้ง fleet หรือ service เดียว)get_exceptions— exceptions ฝั่งเซิร์ฟเวอร์ พร้อมตัวกรอง service และ span
Observability ของฐานข้อมูล
เครื่องมือสี่รายการที่ตรวจสอบประสิทธิภาพฐานข้อมูลของคุณโดยตรง โดยอาศัย trace spans จาก OpenTelemetry และ metrics ของโครงสร้างพื้นฐาน เช่น CloudWatch ในกรณีที่ไม่มี traces ไม่จำเป็นต้องเพิ่ม instrumentation หากคุณใช้ OTel อยู่แล้ว
get_databases— ค้นพบฐานข้อมูลทั้งหมดทั่วทั้งโครงสร้างพื้นฐานของคุณ: ประเภท DB, โฮสต์, ปริมาณงาน (queries/min), p95 latency, อัตราข้อผิดพลาด และจำนวนบริการที่ขึ้นต่อกัน นอกจากนี้ยังค้นพบฐานข้อมูลจากเมตริกโครงสร้างพื้นฐาน เช่น CloudWatch โดยไม่ต้องใช้ trace instrumentation — แถวเหล่านั้นจะแสดงค่ากิจกรรมแทนเมตริก traceget_database_slow_queries— การเรียกใช้คิวรีที่ช้าที่สุดจริง เรียงตามระยะเวลา พร้อม trace IDs สำหรับเจาะลึกดู trace ฉบับเต็มget_database_queries— รูปแบบคิวรีและข้อมูลสรุป: คิวรีทำงานบ่อยเพียงใด ระยะเวลาเฉลี่ย/p95 และอัตราข้อผิดพลาดget_database_server_metrics— เมตริกฝั่งเซิร์ฟเวอร์จากโฮสต์ DB เอง (CPU, การเชื่อมต่อ, อัตรา buffer hit — ขึ้นอยู่กับระบบ DB ของคุณ)
รองรับ PostgreSQL, MySQL, MongoDB, Redis, Aerospike และระบบอื่น ๆ ที่มี OTel traces พร้อมแอตทริบิวต์ db_system — รวมถึงฐานข้อมูลที่ค้นพบจากเมตริกโครงสร้างพื้นฐาน เช่น CloudWatch ซึ่งแถวจะแสดงค่ากิจกรรมแทนเมตริก trace
Prometheus / PromQL
prometheus_range_query— คิวรีช่วงเวลา PromQL สำหรับเมตริกใดก็ได้prometheus_instant_query— คิวรีแบบทันที ใช้ฟังก์ชัน rollup เช่นavg_over_time,sum_over_timeprometheus_label_values— ค่า label สำหรับซีรีส์ที่ระบุprometheus_labels— label ทั้งหมดที่มีสำหรับซีรีส์
กำหนดให้ใช้ datasource/cluster อื่นที่ไม่ใช่ค่าเริ่มต้นได้โดยตั้งค่า LAST9_DATASOURCE หรือระบุในแต่ละการเรียกด้วย datasource หากไม่ระบุ datasource จะใช้ค่าเริ่มต้น ส่วนชื่อที่ใกล้เคียงแต่ไม่ตรงกันและตัวจับคู่เห็นว่าปลอดภัย (เช่น ตัวพิมพ์เล็ก/ใหญ่ต่างกัน) จะใช้ชื่อที่ตรงกันใกล้ที่สุด ชื่อที่ขาดตัวอักษร มีตัวอักษรเกิน หรือสลับตำแหน่งกัน ไม่รับประกันว่าจะจับคู่ได้โดยอัตโนมัติ แม้มีตัวเลือกเพียงรายการเดียว ก็อาจต้องยืนยันหากการแก้ไขอาจส่งผลต่อรหัสภูมิภาคหรือสภาพแวดล้อม การจับคู่ที่ผ่อนปรนกว่าหรือกำกวมจะแสดงตัวเลือกและไม่เรียกใช้คิวรี (ไม่ใช่ข้อผิดพลาด) ส่วนชื่อที่ไม่รู้จักจะแสดงข้อผิดพลาด บล็อกเนื้อหาเพิ่มเติมจะระบุ datasource ที่ใช้เมื่อคุณไม่ได้ระบุชื่อให้ตรงกันทุกประการ get_metric_status, get_service_profile และ get_apm_service_deviations จะค้นหา datasource ด้วยวิธีเดียวกัน
Logs
get_logs— คิวรี log แบบ JSON pipeline ฉบับเต็ม (การรวมข้อมูล ตัวกรอง การดึงฟิลด์)get_service_logs— บรรทัด log ของบริการ กรองตามระดับความรุนแรงและเนื้อหา body ได้ โดยสรุปผลเมื่อมีมากกว่า 20 บรรทัด เว้นแต่response_modeจะเป็นrawget_log_patterns— บรรทัด log ของบริการในช่วงเวลาหนึ่ง ซึ่งจัดกลุ่มเป็นเทมเพลตข้อความ พร้อมจำนวน เวลาที่พบครั้งแรก/ล่าสุด สัดส่วนระดับความรุนแรง และตัวอย่างget_emerging_log_patterns— เทมเพลต log ที่เกิดใหม่ เพิ่มขึ้น ลดลง หรือหายไปเมื่อเทียบกับช่วงเวลาฐาน พร้อมจำนวนจากทั้งสองช่วงget_log_attributes— แค็ตตาล็อกส่วนกลางของแอตทริบิวต์ในสคีมา log สำหรับช่วงเวลาหนึ่งget_log_attributes_for_pipeline— ฟิลด์ log ที่มีอยู่จริงสำหรับ pipeline ที่กำลังดำเนินการ (การค้นหาแบบจำกัดขอบเขต) โดยแต่ละฟิลด์มีfilter_fieldที่ตรงตามจริงget_drop_rules— กฎการทิ้ง log จาก Last9 Control Planeadd_drop_rule— สร้างกฎใหม่เพื่อทิ้ง log และลดปริมาณข้อมูลตั้งแต่ต้นทางget_remapping_rules— กฎการแมปใหม่ (logs_extract,logs_map,traces_map) จาก Last9 Control Planeadd_remapping_rule— สร้างกฎการแมปใหม่เพื่อดึงหรือแมปแอตทริบิวต์ของ log และ trace ขณะรับข้อมูลเข้า
Traces
get_traces— คิวรี trace แบบ JSON pipeline สำหรับการค้นหาและการรวมข้อมูลในวงกว้างget_service_traces— Traces ตาม trace ID หรือชื่อบริการที่ตรงกันทุกประการ ใช้เมื่อมี trace ID เพราะทำงานได้เร็วกว่าget_trace_attributes— แค็ตตาล็อกส่วนกลางของแอตทริบิวต์ในสคีมา traceget_trace_attributes_for_pipeline— แอตทริบิวต์ที่มีอยู่จริงสำหรับ pipeline ที่กำลังดำเนินการ (การค้นหาแบบจำกัดขอบเขต) โดยแต่ละรายการมีfilter_fieldที่ตรงตามจริงget_trace_attribute_values— ค่าเฉพาะของแอตทริบิวต์ trace โดยเลือกจำกัดขอบเขตตาม pipeline ได้get_trace_attribute_deviations— จัดอันดับค่าแอตทริบิวต์ที่แตกต่างกันระหว่างกลุ่ม span ที่มีขอบเขตสองกลุ่ม (ช้าเทียบกับเร็ว ข้อผิดพลาดเทียบกับไม่มีข้อผิดพลาด หรือช่วงเวลาสองช่วง) เป็นความสัมพันธ์ ไม่ใช่สาเหตุget_trace_waterfall— Trace รายการเดียวที่ตรงกันทุกประการในรูปแบบแผนผังลำดับชั้น parent/child พร้อม self-time แบบรวมช่วงเวลา span ที่ช้าที่สุด และคำเตือนเกี่ยวกับกราฟ
Change Events & Alerts
get_change_events— การ deploy การเปลี่ยนแปลง config และการ rollback ใช้เชื่อมโยงเหตุขัดข้องกับสิ่งที่เปลี่ยนแปลงanalyze_change_impact— การเปลี่ยนแปลงทำให้เกิดปัญหาหรือไม่ เปรียบเทียบบริการและผู้เรียกใช้โดยตรงก่อนและหลังการเปลี่ยนแปลง ได้แก่ golden signals, ความเบี่ยงเบนของ APM และแอตทริบิวต์ trace, การแจ้งเตือนใหม่ที่กำลังทำงาน และผลสรุป (regression likely/no significant change/insufficient data)get_alert_groups— กลุ่มการแจ้งเตือน Compass ที่กำหนดค่าไว้ พร้อม label เมตาดาตา ทีม ระดับ tier และจำนวนกฎ — รวมถึงกลุ่มที่ไม่มีกฎและกลุ่มที่ไม่มีการแจ้งเตือนทำงานget_alert_operations_summary— สถานะสุขภาพการเข้าเวรในช่วงเวลาหนึ่ง: จำนวนการแจ้งเตือนที่เกิดขึ้นเทียบกับที่รับทราบ งานค้าง การส่งแจ้งเตือน และเมื่อใช้include_rulesจะรวมกฎที่ส่งเสียงรบกวนมากที่สุด สลับสถานะบ่อย และไม่มีการกำหนดเส้นทาง ทุกจำนวนจะระบุstatusของตน (available/partial/unavailable)get_alert_coverage— สิ่งที่คุณยังไม่ได้ตั้งค่าการแจ้งเตือน: golden signals ที่ไม่มีการครอบคลุม กลุ่มการแจ้งเตือนที่ปิดใช้งานทั้งหมดหรือไม่มีการกำหนดเส้นทาง และกฎที่ถูกปิดเสียงนานเกินไป โดยแต่ละรายการมีเครื่องมือแก้ไขที่แนะนำ เป็นแบบอ่านอย่างเดียวget_alert_config— การกำหนดค่ากฎการแจ้งเตือน — ค้นหาได้ตามชื่อ ระดับความรุนแรง ประเภท และแท็กget_entity_kpis— KPI ทุกรายการ (id, name, PromQL, unit) ในกลุ่มการแจ้งเตือนหนึ่งกลุ่ม รวมถึง KPI ที่ยังไม่มีกฎใช้งาน — ต้องใช้ idcreate_alertและvalidate_alert_expressioncreate_kpi— สร้าง KPI (PromQL + unit) ในกลุ่มการแจ้งเตือนเมื่อไม่มี KPI ที่มีอยู่ตรงตามต้องการ สร้างเพียงครั้งเดียวและเก็บ id ที่ส่งกลับไว้get_alerts— การแจ้งเตือนที่กำลังทำงานอยู่ในช่วงเวลาหนึ่งget_alert_rule_state— สถานะการทำงานย้อนหลัง (1/0) ของกฎการแจ้งเตือนแต่ละข้อในช่วงเวลา โดยจัดกลุ่มตามrule_idกรองได้ตามกลุ่มการแจ้งเตือน ชื่อกฎ ตัวกรอง label และสถานะget_alert_hygiene— กฎการแจ้งเตือนที่ส่งเสียงรบกวน สลับสถานะบ่อย ค้างเก่า และไม่มีการกำหนดเส้นทางในช่วง 7 หรือ 30 วัน จัดอันดับพร้อมตัวเลขประกอบผลสรุปและวิธีแก้ไขที่แนะนำ เป็นแบบอ่านอย่างเดียวget_notification_channels— ช่องทางการแจ้งเตือนที่กำหนดค่าไว้ (Slack, PagerDuty, email ฯลฯ)scope=channelsแสดงช่องทางเอง (ids สำหรับแนบ) ส่วนattachedซึ่งเป็นค่าเริ่มต้นจะแสดงช่องทางที่แนบไว้แยกตามกลุ่มการแจ้งเตือนrecommend_alert_config— คำแนะนำการออกแบบแบบอ่านอย่างเดียว (วงจรชีวิต จุดตรวจสอบความถูกต้อง บริบทสำหรับผู้ตอบสนอง) ก่อนสร้างกฎการแจ้งเตือนvalidate_alert_expression— ทดลองรันนิพจน์การแจ้งเตือนกับ KPI ของกลุ่มการแจ้งเตือนโดยไม่บันทึกสิ่งใดdescribe_alert_chart— แบบอ่านอย่างเดียว: สัญญาณที่ใช้ตั้งค่าการแจ้งเตือนได้ (key, unit) บนแผนภูมิ Discover (discover-service,discover-exceptions)create_alert— สร้างกฎการแจ้งเตือน (แบบคงที่ หรือแบบปรับตามเงื่อนไขผ่านadaptive_std_cmp) ในกลุ่มการแจ้งเตือนที่มีอยู่ โดยจะสร้างเป็นฉบับร่างที่ปิดใช้งานเสมอ สร้างเพียงครั้งเดียว แล้วปรับแก้ด้วยupdate_alert/patch_alertcreate_alert_from_chart— สร้างกฎการแจ้งเตือนแบบเกณฑ์คงที่จากแผนภูมิ Discover ในการเรียกครั้งเดียว เช่นเดียวกับcreate_alertกฎจะถูกสร้างเป็นฉบับร่างที่ปิดใช้งานupdate_alert— แทนที่ config การประเมินผลของกฎทั้งหมด (อาจส่งคืน rule ID ใหม่)patch_alert— เปลี่ยนแปลงกฎบางส่วน: เปิดใช้/หยุดชั่วคราว,mute_until, ผู้ตอบสนองproperties,recurring_mute_scheduleรายสัปดาห์ (หรือclear_recurring_mute_schedule)delete_alert— ลบกฎการแจ้งเตือนอย่างถาวรmute_alert_group— ปิดเสียง (หรือเปิดเสียง) กฎทุกข้อในกลุ่มการแจ้งเตือนจนถึงกำหนดเวลาacknowledge_alert— รับผิดชอบการแจ้งเตือนที่กำลังทำงานอยู่ หรือปล่อยการรับผิดชอบreassign_alert— ส่งต่อการแจ้งเตือนที่รับทราบแล้วให้ผู้ใช้อื่นcreate_notification_channel— สร้างช่องทาง Slack, PagerDuty, Opsgenie, email หรือ generic webhookattach_notification_channel— กำหนดเส้นทางช่องทางที่มีอยู่ไปยังกลุ่มการแจ้งเตือนสำหรับbreach,threatหรือทั้งสองอย่างdetach_notification_channel— นำการแนบช่องทางกับกลุ่มการแจ้งเตือนรายการหนึ่งออกdelete_notification_channel— ลบช่องทางที่ไม่มีการแนบอยู่อย่างถาวร
เครื่องมือเขียนการแจ้งเตือน (create_kpi, create_alert, update_alert, patch_alert, delete_alert, create_alert_from_chart, mute_alert_group, acknowledge_alert, reassign_alert, create_notification_channel, attach_notification_channel, detach_notification_channel, delete_notification_channel) ต้องใช้ token ที่มี write scope ส่วน delete_alert, detach_notification_channel และ delete_notification_channel ต้องใช้ delete scope แทน เครื่องมือเหล่านี้จะแสดงเฉพาะใน toolset alerts
กฎ ช่องทาง และการแนบที่เครื่องมือเหล่านี้สร้างจะถูกทำเครื่องหมายเป็น created_via: last9-mcp พร้อมชื่อและเวอร์ชันของ MCP client (สำหรับกฎ จะใช้คำอธิบายประกอบ _l9_created_via_ และ _l9_created_via_client_ ซึ่ง patch_alert และ update_alert จะเก็บรักษาไว้ และผู้เรียกใช้ไม่สามารถกำหนดได้) get_entity_alert_rules และ get_notification_channels จะแสดงเครื่องหมายดังกล่าว ส่วน delete_alert, detach_notification_channel และ delete_notification_channel จะแนะนำให้ agent ล้างข้อมูลเฉพาะทรัพยากรที่มีเครื่องหมาย เว้นแต่ผู้ใช้จะระบุชื่อทรัพยากร
Custom Dashboards
list_dashboards— แดชบอร์ดแบบกำหนดเองที่กรองตามชื่อและแบ่งหน้าให้มีขนาดไม่เกิน 32 KB: IDs, ชื่อ เวลาอัปเดตล่าสุด ผู้สร้าง และสถานะการล็อกget_dashboard— นิยามแดชบอร์ดฉบับเต็มตาม ID รวมถึง panels และ queriespreview_dashboard— ดูตัวอย่างแบบอ่านอย่างเดียวของแดชบอร์ดหรือแพตช์ที่ยังไม่บันทึก: คิวรีที่แก้ไขแล้ว ผลลัพธ์ต่อ panel ที่มีขอบเขต และความแตกต่างสุทธิของ panel โดยไม่บันทึกvalidate_dashboard— ตรวจ lint + ดำเนินการ + จัดประเภทแบบอ่านอย่างเดียว สำหรับ dashboard id ที่บันทึกไว้หรือdashboard_definitionแบบ inline ในช่วงเวลา ≤24h โดยไม่สร้างหรืออัปเดตแดชบอร์ดcreate_dashboard— สร้างแดชบอร์ดแบบกำหนดเองใหม่ทั้งหมดเพียงครั้งเดียว (panels, queries, metadata) หลังได้รับ id แล้ว ให้แก้ไข panels ด้วยpatch_dashboardupdate_dashboard— ปรับโครงสร้างแดชบอร์ดที่มีอยู่เป็นส่วนใหญ่ตาม ID (แทนที่ทั้งหมด; system dashboards แบบอ่านอย่างเดียวจะแสดงข้อผิดพลาด) หากต้องการแก้ไข panel รายการเดียว ให้ใช้patch_dashboardpatch_dashboard— แก้ไขแดชบอร์ดที่มีอยู่ตาม ID แบบเจาะจง (เพิ่ม/อัปเดต/นำออก/ย้าย panel, ตั้งชื่อเรื่อง, ตั้งค่า variable) โดยส่งคืน diff แบบย่อ ไม่ใช่แดชบอร์ดฉบับเต็มdelete_dashboard— ลบแดชบอร์ดแบบกำหนดเองตาม IDset_dashboard_lock— ล็อกหรือปลดล็อกแดชบอร์ดแบบกำหนดเองตาม ID (ทำได้เฉพาะผู้สร้างหรือผู้ดูแลระบบขององค์กร); แดชบอร์ดที่ล็อกจะปฏิเสธการอัปเดต การแพตช์ และการลบlist_dashboard_snapshots— สแนปช็อตแดชบอร์ด ณ จุดเวลาใดเวลาหนึ่งที่หยุดนิ่ง (เฉพาะ metadata)get_dashboard_snapshot— สแนปช็อตฉบับเต็มที่หยุดนิ่ง รวมข้อมูล panel สำหรับ RCA / มุมมองที่แชร์ได้delete_dashboard_snapshot— ลบสแนปช็อตที่หยุดนิ่งตาม ID
การสร้างแดชบอร์ดทำได้ผ่าน MCP prompts/list และ prompts/get โดยไม่ต้องติดตั้ง skill ทั้งสาม prompts ไม่รับอาร์กิวเมนต์:
create_dashboard_guide— การค้นหา การจัดวาง และการเลือก panel; ตรวจสอบ candidate ทั้งหมดและเรียกใช้คิวรีของแต่ละ panel ก่อนอนุมัติ สร้างเพียงครั้งเดียว แพตช์การแก้ไขเฉพาะจุด แล้วอ่านข้อมูลกลับdashboard_examples— ตัวอย่างฉบับสมบูรณ์ที่ครอบคลุม service RED, latency ของ endpoint, คลาสสถานะ, สุขภาพโฮสต์, จำนวน log และ panels ของ trace พร้อม variables ที่ขึ้นต่อกันquery_guide— ความหมายของ counter/gauge/histogram และ derived trace metric, instant เทียบกับ range, rate windows, ขอบเขตเปอร์เซ็นต์ และกฎ logjson/tracejson
เนื้อหาเดียวกันอ่านได้ที่ last9://reference/create_dashboard_guide, last9://reference/dashboard_examples และ last9://reference/query_guide prompts และ resources ยังคงค้นพบได้ในทุก toolset; การดำเนิน workflow ต้องใช้เครื่องมือที่เกี่ยวข้อง (สำหรับการสร้างเนื้อหาที่ผสมหลายสัญญาณ ให้ใช้ --toolsets=dashboards,investigate ซึ่งใช้กับ list_datasources ได้ด้วย) เซสชันแบบอ่านอย่างเดียวสามารถเตรียมและตรวจสอบความถูกต้องได้ แต่บันทึกไม่ได้ ตรวจสอบความพร้อมใช้งานของเครื่องมือก่อนทำตามขั้นตอน
ขณะนี้การตรวจสอบ panel ใช้ prometheus_range_query, prometheus_instant_query, get_logs และ get_traces ร่วมกับ validate_dashboard ประเภทคิวรีที่ validator ไม่รองรับและค่าเริ่มต้นแบบง่ายไม่ได้ยืนยันว่าการแสดงผลจะเหมือนกัน ขั้นตอนตรวจสอบคิวรีแยกต่างหากจะเปลี่ยนไปใช้ query_panel หลังจาก #475 เสร็จสิ้น
Continuous Profiling
ต้องเปิดใช้ continuous profiling สำหรับองค์กรก่อน ค้นหาบริการด้วย get_profile_services ก่อน จากนั้นดึง flamegraph หรือฟังก์ชันที่จัดอันดับ
get_profile_services— บริการที่มีข้อมูล profiling ในช่วงเวลานี้ (จัดทำดัชนีก่อนค้นหา)get_flamegraph— แผนผัง flamegraph แบบซ้อนกันสำหรับบริการหนึ่งรายการ (cpuเป็นค่าเริ่มต้น; รวมถึงalloc,wall)get_top_functions— จัดอันดับ self-sample ของฟังก์ชันที่ร้อนแรงที่สุดสำหรับบริการหนึ่งรายการget_profile_summary— สรุปการตรวจสอบเบื้องต้นของโปรไฟล์สำหรับบริการหนึ่งรายการด้วยภาษาธรรมชาติแบบกระชับ
แดชบอร์ด Grafana
เครื่องมือแบบอ่านอย่างเดียวที่เชื่อมต่อกับอินสแตนซ์ Grafana ขององค์กร (ผ่านพร็อกซี Grafana ของ Last9) ระบบจะไม่ส่งคืนฟิลด์ข้อมูลรับรองให้โมเดล เปิดใช้ด้วย LAST9_TOOLSETS=grafana (หรือไม่กำหนด toolsets เพื่อใช้เครื่องมือทั้งหมด)
grafana_search_dashboards— ค้นหาแดชบอร์ดด้วยส่วนหนึ่งของชื่อเรื่อง (แบ่งหน้า;truncated: trueเมื่อถึงขีดจำกัด)grafana_get_dashboard— สรุปแดชบอร์ดตาม uid (พาเนล ตัวแปร เป้าหมาย PromQL); ใช้full_json=trueเพื่อรับ JSON ดิบจาก Grafanagrafana_list_folders— โครงสร้างโฟลเดอร์grafana_list_folder_dashboards— แดชบอร์ดในโฟลเดอร์เดียว (แบ่งหน้า)grafana_list_datasources— รายการแหล่งข้อมูลโดยไม่มีข้อมูลรับรอง
การแก้ไขชื่อแบบคลุมเครือ
did_you_mean— เมื่อเอเจนต์ไม่แน่ใจเกี่ยวกับชื่อเอนทิตี เครื่องมือนี้จะแสดงรายการที่ตรงกันมากที่สุดจากแค็ตตาล็อกของคุณ (บริการ สภาพแวดล้อม โฮสต์ ฐานข้อมูล การติดตั้งใช้งาน/เนมสเปซของ K8s และงาน) โดยแสดงคำแนะนำได้สูงสุด 3 รายการพร้อมคะแนนความคล้ายคลึง เซิร์ฟเวอร์จะเรียกใช้เครื่องมือนี้โดยอัตโนมัติก่อนใช้เครื่องมือส่วนใหญ่ เมื่อค้นหาชื่อแล้วไม่พบผลลัพธ์
โปรไฟล์บริการ
get_service_profile— ลักษณะข้อมูล telemetry ของบริการก่อนที่คุณจะค้นหา: มีสัญญาณใดบ้าง ภาษาและ runtime สภาพแวดล้อมการติดตั้งใช้งาน รูปแบบของ logs และคำแนะนำในการแก้ไขการนำเข้าข้อมูลเมื่อเกี่ยวข้อง ช่วยให้เอเจนต์ข้ามเครื่องมือ trace ได้เมื่อบริการไม่มี traces และแยกระดับความรุนแรงจากเนื้อหา log เมื่อSeverityTextว่าง แทนการกรองด้วยฟิลด์ดังกล่าวแล้วไม่พบอะไร
วิธีการทำงาน
ลิงก์ตรงในทุกการตอบกลับ เครื่องมือทุกตัวส่งคืนฟิลด์ deep_link ซึ่งเป็น URL โดยตรงไปยังแดชบอร์ด Last9 สำหรับคำค้นและช่วงเวลานั้นโดยเฉพาะ เอเจนต์ส่งลิงก์ให้คุณได้ คุณคลิก แล้วก็ไปถึงหน้าที่ต้องการ
Toolsets โดยค่าเริ่มต้น เซิร์ฟเวอร์จะแสดงเครื่องมือทั้งหมด โฮสต์ระบบอัตโนมัติที่ต้องการเพียงการตรวจสอบ (logs/traces/metrics/profiles) สามารถกำหนด LAST9_TOOLSETS=investigate (หรือส่ง --toolsets=investigate) เพื่อให้ tools/list มีขนาดเล็ก โดยไม่ต้องปิดใช้งานเครื่องมือจำนวนมากจากฝั่งไคลเอ็นต์ ชุดที่มีชื่อ ได้แก่ logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all หากระบุชื่อที่ไม่รู้จัก ระบบจะแจ้งข้อผิดพลาดทันที get_current_time และ get_workspace_overview พร้อมใช้งานในทุก toolset ในโหมด HTTP คำขอสามารถจำกัดชุดนี้ให้แคบลงได้อีกด้วยส่วนหัว X-Last9-Toolsets (ดู Toolsets ต่อคำขอ) ชุด alerts ยังมี prometheus_range_query และ get_dashboard แบบอ่านอย่างเดียว ซึ่งพรอมป์ต์ author-alert เรียกใช้ เฉพาะชุด metrics ไม่มี list_datasources หรือ did_you_mean — ใช้ investigate (หรือผสม toolsets) เมื่อต้องการตัวช่วยค้นหาข้อมูลเหล่านั้น
แหล่งข้อมูลอ้างอิงเครื่องมือ คู่มือ logjson/tracejson/service-logs/metrics ฉบับยาวเป็นทรัพยากร MCP (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting) ไม่ใช่ข้อความคำอธิบายเครื่องมือที่แสดงตลอดเวลา คู่มือการแจ้งเตือนครอบคลุมไวยากรณ์นิพจน์การแจ้งเตือน ฟิลด์แบบคงที่เทียบกับแบบปรับตามข้อมูล หน่วย การตรวจสอบของ validate_alert_expression และเทมเพลตกฎสำหรับ latency / error rate / saturation กฎการค้นหาที่สำคัญยังคงอยู่ในคำอธิบายเครื่องมือ เพื่อให้เอเจนต์ที่ไม่เคยเรียกใช้ resources/read ยังคงได้รับคำแนะนำในการสร้างคำค้นที่ถูกต้อง ค้นหาฟิลด์เฉพาะขององค์กรด้วย get_log_attributes / get_log_attributes_for_pipeline (และเครื่องมือเทียบเท่าสำหรับ trace)—ระบบจะไม่แทรกฟิลด์เหล่านี้ลงในคำอธิบาย
ผลลัพธ์ขนาดใหญ่แบบแบ่งส่วน get_logs และ get_traces จัดการชุดผลลัพธ์ขนาดใหญ่ด้วยการแบ่งส่วนแทนการตัดทอน ค่าเริ่มต้นคือ 5000 รายการสำหรับ logs และกำหนดค่าได้ผ่าน LAST9_MAX_GET_LOGS_ENTRIES
การพัฒนา
โหมด HTTP การทดสอบด้วย curl การสร้างจากซอร์สโค้ด
เรียกใช้ในโหมด HTTP
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
เซิร์ฟเวอร์เริ่มทำงานที่ http://localhost:8080/mcp
ทดสอบด้วย curl
ตัวจัดการ Streamable HTTP ทำงานในโหมด stateless ดังนั้นแต่ละคำขอจึงได้รับการประมวลผลแยกจากกัน การจับมือ initialize และส่วนหัว Mcp-Session-Id เป็นตัวเลือก — ไคลเอ็นต์ที่ส่งข้อมูลเหล่านี้ยังคงใช้งานได้ (ระบบยอมรับส่วนหัวแต่ไม่สนใจ) และไคลเอ็นต์ยังสามารถข้ามไปยัง tools/list / tools/call ได้โดยตรง เครื่องมือแต่ละตัวเป็นคำขอ/การตอบกลับแบบอิสระ เซิร์ฟเวอร์จะไม่ส่งการแจ้งเตือนจากเซิร์ฟเวอร์ไปยังไคลเอ็นต์ ดังนั้น GET /mcp (สตรีม SSE) จึงส่งคืน 405
# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
# Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service_name": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
Toolsets ต่อคำขอ
ในโหมด HTTP คำขอสามารถจำกัดชุดเครื่องมือให้แคบลงได้ด้วยส่วนหัว X-Last9-Toolsets หรือพารามิเตอร์ query toolsets สำหรับไคลเอ็นต์ที่ตั้งค่าส่วนหัวไม่ได้ (/mcp?toolsets=logs,traces) หากส่งมาทั้งคู่ ส่วนหัวที่ไม่ว่างจะมีลำดับความสำคัญสูงกว่า ค่าที่ระบุใช้ชื่อแบบคั่นด้วยจุลภาคเช่นเดียวกับ --toolsets ชุดเครื่องมือที่คำขอเห็นคือส่วนตัดกับชุด --toolsets ที่กำหนดตอนเริ่มต้น: คำขอจำกัดให้แคบลงได้ แต่ขยายให้กว้างขึ้นไม่ได้ และ all หรือค่าว่างจะคงชุดที่กำหนดตอนเริ่มต้นไว้ หากระบุชื่อที่ไม่รู้จัก ระบบจะส่งคืน 400 พร้อมชื่อดังกล่าว tools/list, tools/call และคำแนะนำ initialize จะเป็นไปตามชุดที่มีผล ส่วน get_current_time และ get_workspace_overview จะอยู่ในทุกชุด
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Last9-Toolsets: logs,alerts" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
ชุดที่มีผลแต่ละชุดจะให้บริการโดยเซิร์ฟเวอร์ของตัวเอง ซึ่งสร้างขึ้นเมื่อมีคำขอครั้งแรก (ใช้เวลาหลักสิบมิลลิวินาที) และคงอยู่จนกว่าจะปิดระบบ คำขอที่ระบุชุดเริ่มต้นซ้ำจะใช้เซิร์ฟเวอร์เริ่มต้น ไม่มีการนำรายการออกจากแคช: ยอมรับเฉพาะ toolsets ที่มีชื่อ ดังนั้นแคชจึงมีเซิร์ฟเวอร์ได้สูงสุดหนึ่งตัวต่อชุดผสม (ปัจจุบันมี 135 ชุด ใช้ heap ที่ทำงานอยู่รวมกันประมาณ 75 MB; ในการทดสอบ แคชเต็มมีหน่วยความจำ resident คงที่ใกล้ 230 MB)
สร้างจากซอร์สโค้ด
git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server
LAST9_HTTP=true มีไว้สำหรับการพัฒนาในเครื่อง สำหรับการใช้งานจริง ปลายทาง HTTP ที่โฮสต์ไว้ สะดวกกว่า
ข้อมูลอ้างอิงเครื่องมือ
พารามิเตอร์ทั้งหมด มาตรฐานการป้อนเวลา และรายละเอียดต่าง ๆ
การป้อนเวลา
- เวลาสัมบูรณ์ (
start_time_iso/end_time_isoหรือtime_iso) มีลำดับความสำคัญเหนือlookback_minutes - สำหรับช่วงเวลาแบบสัมพัทธ์: ใช้
lookback_minutes - สำหรับช่วงเวลาแบบสัมบูรณ์: ใช้ RFC3339/ISO8601 —
2026-02-09T15:04:05Z - ระบบยอมรับ
YYYY-MM-DD HH:MM:SSแบบเดิมเพื่อความเข้ากันได้เท่านั้น - แปลงวลีอย่าง
since yesterday 9am ISTเป็นขอบเขต RFC3339 ด้วยget_current_time
get_workspace_overview
ไม่มีพารามิเตอร์ ตรวจสอบข้อมูลในช่วง 60 นาทีล่าสุดพร้อมกัน โดยแต่ละการเรียกย่อยมี timeout สั้น ๆ และส่งคืน current_time, lookback_minutes, environments, telemetry (บูลีน logs/traces/metrics), service_count (บริการที่ไม่ซ้ำกัน จัดอันดับ get_service_summary ทุกสภาพแวดล้อม), alert_group_count, firing_alert_count และ errors ([{field, error}]) ฟิลด์ที่การเรียกย่อยล้มเหลวจะเป็น null (ไม่ทราบค่า) ไม่ใช่ 0 หรือ false การตรวจสอบเหล่านี้ไม่ได้ถูกจำกัดด้วย --toolsets: toolsets ใช้กรองว่าเครื่องมือใดพร้อมให้บริการ ส่วนโทเค็น API จะกำหนดขอบเขตข้อมูลที่เซิร์ฟเวอร์อ่านได้
get_current_time
range(สตริง ไม่บังคับ):last 2h,past 30 minutes,last 7d(s, m, h, d = 24h, w = 7d; สูงสุด 366d);today;yesterday;since <point>;<point> to <point>จุดเวลาต้องเป็น RFC3339 หรือtoday/yesterday/ วันในสัปดาห์ (monday,mon: ครั้งล่าสุดที่ตรงกัน โดยรวมวันนี้ด้วย) /YYYY-MM-DDพร้อม9am,9:30pmหรือ14:30ที่ไม่บังคับ เขตเวลาที่ต่อท้ายจะใช้แทนtimezoneสำหรับขอบเขตทั้งสองค่า ส่วนเขตเวลาที่อยู่ตำแหน่งอื่นจะทำให้เกิดข้อผิดพลาด ไม่ต้องระบุหากต้องการเพียงnowtimezone(สตริง ไม่บังคับ): ชื่อ IANA หรือชื่อย่อ (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT) ค่าเริ่มต้นคือ UTC เขตเวลาที่ไม่รู้จักจะทำให้เกิดข้อผิดพลาด เช่นเดียวกับCSTที่กำกวม (ให้ส่งAmerica/ChicagoหรือAsia/Shanghai)
ส่งคืน now (และ start/end พร้อม range) ในรูปแบบ {iso, epoch_seconds, local}; local จะปรากฏเฉพาะเมื่อใช้เขตเวลาที่ไม่ใช่ UTC
get_exceptions
limit(จำนวนเต็ม ไม่บังคับ): จำนวนข้อยกเว้นสูงสุด ค่าเริ่มต้น: 20lookback_minutes(จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(สตริง ไม่บังคับ): ช่วงเวลาแบบสัมบูรณ์service_name(สตริง ไม่บังคับ): กรองตามบริการspan_name(สตริง ไม่บังคับ): กรองตามชื่อ spanenv(สตริง ไม่บังคับ): กรองตามสภาพแวดล้อม
get_service_summary
start_time_iso/end_time_iso(สตริง ไม่บังคับ)env(สตริง ไม่บังคับ): regex ของ PromQL ค่าเริ่มต้นคือ.*การจับคู่แบบตรงตัวต้องใช้ anchor (เช่น^prod$)sort_by(สตริง ไม่บังคับ):request_count(ค่าเริ่มต้น),throughput_rpm,http_4xx_count,http_5xx_countหรือgrpc_error_countlimit(จำนวนเต็ม ไม่บังคับ): จำนวนแถวที่จัดอันดับสูงสุด ไม่ระบุหรือใส่ 0 หมายถึง 10; ค่าที่มากกว่า 100 จะถูกจำกัดไว้ที่ 100
get_service_environments
start_time_iso/end_time_iso(สตริง ไม่บังคับ)
เครื่องมือ APM อื่นทั้งหมดต้องใช้ค่า
envหากค่านี้ว่าง ให้ใช้""
get_service_performance_details
โดยค่าเริ่มต้นจะส่งคืนสรุปแยกตามซีรีส์: points, missing_points (ช่วงเวลาที่ไม่มีทราฟฟิกซึ่งถูกตัดออกจากสถิติ), min, p50, p90, p99 (nearest-rank), max, mean, last, baseline_mean (ค่าเฉลี่ยของจุดข้อมูลที่ใช้ได้ในครึ่งแรก ไม่ใช่ของทั้งช่วงเวลา), delta_pct (ครึ่งหลังของจุดข้อมูลที่ใช้ได้เทียบกับ baseline; ไม่มีฟิลด์นี้หาก baseline เป็น 0) และ change_points สูงสุด 3 รายการ (timestamp, before_mean, after_mean) สำหรับซีรีส์สูงสุด 4 รายการต่อเมตริกและทุก quantile ของ response time (เรียงตามค่าเฉลี่ยจากมากไปน้อย; series_omitted นับรายการที่เหลือ) ซีรีส์ที่มี points: 0 จะไม่มีสถิติ และ baseline_mean/delta_pct ต้องมีจุดข้อมูลอย่างน้อย 6 จุด (ครึ่งละ 3 จุด) full_series ระบุว่ามีจุดข้อมูลดิบให้เรียกดูผ่าน include_series
service_name(สตริง จำเป็น)lookback_minutes(จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(สตริง ไม่บังคับ)env(สตริง ไม่บังคับ): ค่าเริ่มต้นคือprodtop_n(จำนวนเต็ม ไม่บังคับ): จำนวนรายการสูงสุดในแต่ละรายการ top-operations/top-errors ค่าเริ่มต้น: 5 หรือ 10 เมื่อใช้include_series=trueสูงสุด 100include_series(บูลีน ไม่บังคับ): ส่งคืนทุกจุดข้อมูลของทุกซีรีส์แทนสรุป ค่าเริ่มต้น: false
get_service_operations_summary
service_name(สตริง จำเป็น)lookback_minutes(จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(สตริง ไม่บังคับ)env(สตริง ไม่บังคับ): ค่าเริ่มต้นคือprod
get_service_dependency_graph
service_name(สตริง ไม่บังคับ)lookback_minutes(จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(สตริง ไม่บังคับ)env(สตริง ไม่บังคับ): ค่าเริ่มต้นคือprod
get_apm_service_deviations
service_name(string, optional): เว้นว่างไว้สำหรับขอบเขตทั้ง fleet; ระบุสำหรับบริการหนึ่งรายการและความสัมพันธ์ของการดำเนินการlookback_minutes(integer, optional): ช่วงเวลาปัจจุบัน ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional): ระบุช่วงเวลาปัจจุบันอย่างชัดเจนbaseline_start_time_iso/baseline_end_time_iso(string, optional): ระบุช่วงเวลา baseline อย่างชัดเจน ค่าเริ่มต้นคือช่วงเวลาก่อนหน้าทันทีที่มีระยะเวลาเท่ากันdatasource(string, optional): เว้นว่างไว้เพื่อใช้ค่าเริ่มต้น; ชื่อโดยประมาณจะจับคู่เช่นเดียวกับเครื่องมือ Prometheus การตอบกลับจะระบุค่าเริ่มต้นหรือรายการที่ตรงกันมากที่สุดที่ใช้; หากชื่อกำกวม จะส่งคืนตัวเลือกโดยไม่ทำการค้นหาenv(string, optional): ค่าเริ่มต้นคือprodmax_services/max_operations(integer, optional): ค่าเริ่มต้น 10, สูงสุดรายการละ 10
get_databases
env(string, optional): กรองตาม environment รองรับ regular expression ค่าเริ่มต้น: ทั้งหมดlookback_minutes(integer, optional): ค่าเริ่มต้น: 60 ช่วงเวลาต้องไม่เกิน 7 วันstart_time_iso/end_time_iso(string, optional)
get_database_slow_queries
db_system(string, optional): เช่นpostgresql,mysql,mongodb,redishost(string, optional): โฮสต์ฐานข้อมูล (net_peer_name)service_name(string, optional): ชื่อบริการที่เรียกใช้env(string, optional)min_duration_ms(float, optional): ระยะเวลาคิวรีขั้นต่ำเป็น mslookback_minutes(integer, optional): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional)limit(integer, optional): ค่าเริ่มต้น: 20
get_database_queries
db_system(string, optional)host(string, optional)service_name(string, optional)env(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional)limit(integer, optional): ค่าเริ่มต้น: 20
get_database_server_metrics
db_system(string, required): เช่นpostgresql,mysql,mongodb,redis,aerospikehost(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional)
prometheus_range_query
query(string, required): คิวรี PromQLstart_time_iso/end_time_iso(string, optional): ค่าเริ่มต้นคือ 60 นาทีล่าสุดlookback_minutes(float, optional): ค่าเริ่มต้น: 60
prometheus_instant_query
query(string, required)time_iso(string, optional): ค่าเริ่มต้นคือเวลาปัจจุบันlookback_minutes(float, optional)
prometheus_label_values
match_query(string, optional): ตัวกรอง PromQLlabel(string, required): ชื่อ labellookback_minutes(float, optional): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional)
เมื่อไม่ได้ระบุช่วงเวลาและ match_query ระบุเมตริกหนึ่งรายการ (metric{...} หรือ {__name__="metric"}) ระบบจะลองค้นหาอีกครั้งหนึ่งในช่วง 4 วัน หากผลลัพธ์ในช่วง 60 นาทีว่างเปล่า; บล็อกข้อความที่สองจะระบุว่าผลลัพธ์ครอบคลุมช่วงเวลาใด
prometheus_labels
match_query(string, optional): ตัวกรอง PromQLlookback_minutes(float, optional): ค่าเริ่มต้น: 60start_time_iso/end_time_iso(string, optional)
ลองค้นหาเมตริกรายการเดียวที่ไม่พบผลลัพธ์อีกครั้งในช่วง 4 วัน เช่นเดียวกับ prometheus_label_values
get_logs
logjson_query(array, required): คิวรี pipeline แบบ JSONlookback_minutes(integer, optional): ค่าเริ่มต้น: 5start_time_iso/end_time_iso(string, optional)limit(integer, optional): ค่าเริ่มต้นของเซิร์ฟเวอร์: 5000index(string, optional):physical_index:<name>หรือrehydration_index:<block_name>response_mode(string, optional):summary(ค่าเริ่มต้น; ใช้กับnullด้วย) หรือrawผลลัพธ์แบบบรรทัดดิบที่มีมากกว่า 20 บรรทัดจะถูกส่งกลับเป็นsummary:lines_summarized,severity_counts(label หกรายการแรก ส่วนที่เหลืออยู่ในother_severities),first_timestamp/last_timestamp,histogramแบบ 10 bucket ครอบคลุมช่วงเวลาของคิวรี (จากบรรทัดที่ส่งคืน โดยมีtruncated: trueเมื่อขีดจำกัดทำให้ผลลัพธ์ถูกตัด) และpatternsอันดับต้น ๆ (template,count, สูงสุดสองรายการsamples) โดยรวมส่วนที่เหลือไว้ในotherจำกัดไม่เกิน 4000 อักขระ; หากข้อมูลเมตาระดับบนสุดยังมีขนาดเกิน ระบบจะตัดออกและระบุชื่อไว้ในdropped_fieldsrawจะส่งคืนบรรทัด ผลลัพธ์แบบ aggregate จะไม่มีการสรุป
สำหรับคลังบริการที่อิงตาม log ให้ค้นหา physical_index_service_count ก่อน:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
ใช้ service_name เป็น ServiceName, ใช้ env เป็น environment เมื่อมี และใช้ name เป็นชื่อ physical index หากเป็น name="default" ให้ละ index; หากผู้ใช้เลือก physical index ที่ไม่ใช่ค่าเริ่มต้น ให้ส่ง index: "physical_index:<name>" หาก backend ปฏิเสธการกรอง physical index อย่างชัดเจน ให้ลองอีกครั้งโดยไม่ใช้ index และแจ้งว่ backend นั้นไม่รองรับการกรอง physical index อย่างชัดเจน
get_service_logs
service_name(string, required)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60limit(integer, optional): ค่าเริ่มต้น: 100 หรือ 20 เมื่อใช้response_mode: "raw"env(string, optional)severity_filters(array, optional): เช่น["error", "warn"]ใช้ตรรกะ ORbody_filters(array, optional): เช่น["timeout", "failed"]ใช้ตรรกะ ORstart_time_iso/end_time_iso(string, optional)index(string, optional)response_mode(string, optional):summary(ค่าเริ่มต้น; ใช้กับnullด้วย) หรือrawเมื่อมีมากกว่า 20 บรรทัดlogsจะถูกแทนที่ด้วยsummaryแบบเดียวกับget_logsโดยคงฟิลด์อื่นไว้;rawจะส่งคืนรายการ
ตัวกรองหลายประเภทจะรวมกันด้วย AND แต่ละ array ใช้ OR ภายใน
ใช้ get_logs สำหรับจำนวน aggregate แบบกว้างก่อน; ใช้ get_service_logs หลังจากจำกัดขอบเขตให้เหลือ service/env/index และชุดตัวอย่างขนาดเล็กแล้วเท่านั้น
get_log_patterns
service_name(string, required)env(string, optional)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60severity_filters/body_filters(array, optional): ใช้ตรรกะ OR เช่นเดียวกับget_service_logsตั้งค่าseverity_filtersเฉพาะเมื่อget_service_profileรายงานseverity_setall; เมื่อใช้noneหรือpartialระบบจะตัดบรรทัดที่ severity อยู่ใน body ออกindex(string, optional)sample_size(integer, optional): จำนวนบรรทัดที่สุ่มจากช่วงเวลา โดยเรียงจากใหม่ไปเก่า ค่าเริ่มต้น: 1000, สูงสุด: 5000top_n(integer, optional): จำนวน template ที่ส่งคืนตามจำนวน ค่าเริ่มต้น: 20, สูงสุด: 100 ส่วนที่เหลือจะถูกรวมยอดไว้ในother
การจัดกลุ่มทำงานบนบรรทัดตัวอย่างภายในเซิร์ฟเวอร์ MCP ดังนั้นจำนวน, first_seen และ last_seen จะอ้างอิงเฉพาะตัวอย่าง; window.sample_limit_reached จะระบุเมื่อมีโอกาสที่ตัวอย่างจะพลาดบรรทัดที่ตรงกัน (มีบรรทัด sample_size และ API ไม่รายงานค่า total_matching_lines ที่ตรงกันพอดี หรือการค้นหาเป็นแบบ logs_truncated) ซึ่งในกรณีนี้ตัวอย่างจะมีเฉพาะบรรทัดล่าสุดของช่วงเวลา แต่ละ template และ sample จะถูกตัดที่ 500 อักขระ โดยลงท้ายด้วย … ดังนั้น body ที่จัดกลุ่มไม่ได้ (เช่น JSON ที่ไม่มีฟิลด์ message) จะไม่ทำให้ผลลัพธ์เต็มได้ การค้นหาที่มี chunk ล้มเหลวถือเป็นข้อผิดพลาดของเครื่องมือ; การค้นหาที่ถูกตัดหรือจำกัดเพดานยังคงส่งคืนรูปแบบ โดยมีเครื่องหมาย sample_limit_reached รายการ patterns ที่ว่างเปล่าหมายความว่าไม่มีรายการที่ตรงกันก็ต่อเมื่อ sample_limit_reached เป็น false; หากเป็น true การค้นหาหยุดก่อนกำหนดและอาจพลาดบรรทัดที่ตรงกัน
get_emerging_log_patterns
รับพารามิเตอร์ get_log_patterns ทั้งหมด (ช่วงเวลาคือช่วงเวลาปัจจุบัน) และเพิ่ม:
baseline_start_time_iso/baseline_end_time_iso(string, optional): ระบุทั้งคู่หรือไม่ระบุเลย ค่าเริ่มต้น: ช่วงเวลาที่มีความยาวเท่ากันและอยู่ก่อนช่วงเวลาปัจจุบันทันทีmin_count(integer, optional): จำนวนบรรทัดที่รูปแบบที่เปลี่ยนแปลงต้องมีในช่วงเวลาที่มีจำนวนมากกว่า: ช่วงเวลาปัจจุบันสำหรับnew/increased, baseline สำหรับdecreased/disappearedค่าเริ่มต้น: 3 (หรือsample_sizeหากน้อยกว่า), สูงสุด:sample_sizechange_factor(number, optional): อัตราส่วนความถี่ที่มากกว่า 1 ซึ่งรูปแบบที่พบในทั้งสองช่วงเวลาต้องมีค่าอย่างน้อยถึง (increased) หรือลดลงเหลือค่าผกผันของ (decreased) ค่าเริ่มต้น: 2
ต้องผ่านเกณฑ์ทั้งสองข้อ ดังนั้น template ที่มีปริมาณสูงแต่ความถี่ไม่ได้เปลี่ยนตาม change_factor จะไม่ถูกรายงาน ส่งคืนเฉพาะ template ที่เปลี่ยนแปลง (new, increased, decreased, disappeared) พร้อมจำนวน current และ baseline; unchanged_patterns นับ template ที่อยู่ในทั้งสองช่วงเวลาและเปลี่ยนแปลงน้อยกว่า change_factor ส่วน below_min_count_patterns นับการเปลี่ยนแปลงที่ถูกตัดออกเพราะมีบรรทัดน้อยกว่า min_count ระบบเปรียบเทียบความถี่ต่อนาทีเมื่อทั้งสองตัวอย่างมีบรรทัดที่ตรงกันทั้งหมด, เปรียบเทียบต่อนาทีโดยประมาณจากค่า total_matching_lines ที่แน่นอนของตัวอย่างที่ถูกจำกัดเพดาน และในกรณีอื่นจะเปรียบเทียบเป็นสัดส่วนของตัวอย่าง โดย increased/decreased จะอธิบายองค์ประกอบแทนอัตรา (comparison_basis) รายการ patterns ที่ว่างเปล่าหมายความว่าไม่มีการเปลี่ยนแปลงที่เกินเกณฑ์ทั้งสองข้อ ไม่ได้หมายความว่า log ไม่มีการเปลี่ยนแปลง: การเปลี่ยนแปลงที่พบได้น้อยกว่าจะถูกนับใน below_min_count_patterns และช่วงเวลาที่มี sample_limit_reached จะเปรียบเทียบตัวอย่าง ไม่ใช่ทั้งช่วงเวลา
get_log_attributes
lookback_minutes(integer, optional): ค่าเริ่มต้น: 15start_time_iso/end_time_iso(string, optional)region(string, optional)index(string, optional)
get_log_attributes_for_pipeline
pipeline(array, required): ขั้นตอนตัวกรองก่อนหน้าเพื่อกำหนดขอบเขตการค้นหา เช่น[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}]lookback_minutes(integer, optional): ค่าเริ่มต้น: 15start_time_iso/end_time_iso(string, optional)region(string, optional)index(string, optional)
get_drop_rules
ไม่มีพารามิเตอร์ แสดงรายการกฎ drop ผ่าน GET /otel_settings/drop?region=...
add_drop_rule
name(string, required)filters(array, required): ตัวกรองแต่ละรายการ:key,value,operator(equals/not_equals),conjunction(and)- คีย์ตัวกรองต้องใช้
attributes["key_name"]หรือresource.attributes["key_name"](ตามที่ Last9 API กำหนด) - สร้างกฎผ่าน
POST /otel_settings/drop?region=...&cluster_id=...
get_remapping_rules
rule_type(string, required):logs_extract,logs_mapหรือtraces_mapregion(string, optional): ค่าเริ่มต้น: region ของ datasource ที่กำหนดค่าไว้- แสดงรายการกฎผ่าน
GET /otel_settings/remapping/{rule_type}?region=...
add_remapping_rule
สร้างหนึ่งกฎต่อการเรียกหนึ่งครั้ง; กฎ map ต้องเรียกหนึ่งครั้งต่อ target_attribute
rule_type(string, required):logs_extract,logs_mapหรือtraces_map.name(string, required)remap_keys(array, required): ฟิลด์ต้นทางlogs_extractที่มีjson: ชื่อฟิลด์ body; ที่มีpattern: regex หนึ่งรายการพอดีที่มีกลุ่มจับชื่อ กฎการแมป: เส้นทางแอตทริบิวต์ ใช้ค่าแรกที่ไม่ว่างtarget_attribute(string, required):logs_extract:log_attributesหรือresource_attributeslogs_map:service,severityหรือresource_deployment.environmenttraces_map:service.extract_type(string,logs_extractonly, required there):jsonหรือpattern.action(string,logs_extractonly):upsert(ค่าเริ่มต้น) หรือinsert.prefix(string,logs_extractonly)preconditions(array,logs_extractonly): มี{key, value, operator}ได้ไม่เกินหนึ่งรายการ;operatorคือequals(ค่าเริ่มต้น),not_equalsหรือlike(regex).region(string, optional): ค่าเริ่มต้น: ภูมิภาคของ datasource ที่กำหนดค่าไว้- สร้างกฎผ่าน
POST /otel_settings/remapping/{rule_type}?region=...โดยจะไม่ลองใหม่ หากหมดเวลา ให้ตรวจสอบด้วยget_remapping_rules.
get_traces
ใช้สำหรับการค้นหาและการรวมข้อมูลในวงกว้าง หากต้องการค้นหาด้วย trace ID ที่ตรงกันทุกประการ ให้ใช้ get_service_traces.
tracejson_query(array, required)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60.limit(integer, optional): ค่าเริ่มต้น: 5000.
get_service_traces
ต้องระบุ trace_id หรือ service_name เพียงรายการเดียวเท่านั้น
trace_id(string, optional): ช่วงย้อนหลังเริ่มต้น: 72 ชั่วโมงservice_name(string, optional): ช่วงย้อนหลังเริ่มต้น: 60 นาทีlookback_minutes(integer, optional)start_time_iso/end_time_iso(string, optional)limit(integer, optional): ค่าเริ่มต้น: 10.env(string, optional)
get_trace_attributes
lookback_minutes(integer, optional): ค่าเริ่มต้น: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)
get_trace_attributes_for_pipeline
pipeline(array, required): ขั้นตอนตัวกรองก่อนหน้าเพื่อจำกัดขอบเขตการค้นหา เช่น[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, optional): ค่าเริ่มต้น: 15.start_time_iso/end_time_iso(string, optional)region(string, optional)
get_trace_attribute_values
tag_name(string, required): ชื่อแอตทริบิวต์จากget_trace_attributes(เช่นresource_departmentหรือattributes['http.method']).pipeline(array, optional): ขั้นตอนตัวกรองก่อนหน้าเพื่อจำกัดขอบเขตของค่า; ละเว้นเพื่อใช้ค่าทั่วไปlookback_minutes(integer, optional): ค่าเริ่มต้น: 15.start_time_iso/end_time_iso(string, optional): ขอบเขตเวลา RFC3339 ย้อนหลัง; มีลำดับความสำคัญเหนือlookback_minutes.region(string, optional)
get_trace_attribute_deviations
comparison_mode(string, required):latency,errorsหรือtime.service_name(string, required)environment(string, required): ค่าdeployment.environmentที่ตรงกันทุกประการoperation(string, optional)filters(array, optional): เงื่อนไขตัวกรอง JSON ของ tracecandidate_attributes(array, optional): สูงสุด 8 รายการ; ละเว้นเพื่อค้นหาแบบมีขอบเขตlatency_threshold_ms(number, optional): จำเป็นสำหรับโหมดlatency; โหมดอื่นจะปฏิเสธค่านี้start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 15. สูงสุด: 15.baseline_start_time_iso/baseline_end_time_iso(string, optional): จำเป็นสำหรับโหมดtime; ช่วงเวลาต้องไม่ทับซ้อนกันและมีระยะเวลาเท่ากับหน้าต่างเป้าหมายminimum_cohort_size(integer, optional): ค่าเริ่มต้น: 100. ขั้นต่ำ: 20.minimum_value_support(integer, optional): ค่าเริ่มต้น: 20. ขั้นต่ำ: 10.limit(integer, optional): ค่าเริ่มต้น: 10. สูงสุด: 10.
ต้องเปิดใช้ความสามารถของแบ็กเอนด์ที่ทำงานร่วมกัน
get_trace_waterfall
trace_id(string, required)environment(string, optional)start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 4320 (72 ชั่วโมง).selected_span_id(string, optional): ส่งคืนแอตทริบิวต์ เหตุการณ์ และลิงก์ของ span นั้นเท่านั้นmax_spans(integer, optional): ค่าเริ่มต้น: 500. สูงสุด: 1000; นโยบายการปกปิดข้อมูลขององค์กรอาจกำหนดเพดานให้ต่ำกว่านี้
ส่งคืน envelope investigation-evidence/v1 ของบริการ trace โดยไม่เปลี่ยนแปลง; waterfall อยู่ภายใต้ data บริการจะสร้าง waterfall และปกปิดค่าตามนโยบายเฉพาะองค์กร (ข้อมูลรับรองความถูกต้อง ค่าตัวอักษรใน query, URL, อีเมล, IP และตัวระบุผู้ใช้) ก่อนออกจากแบ็กเอนด์: sanitizer ระบุชื่อนโยบายที่ใช้ และ evidence.sanitization นับจำนวนรายการที่ถูกปกปิดหรือตัดทอน หากข้อมูลที่จำเป็นถูกปกปิด ให้ขอให้ผู้ดูแลระบบขององค์กรปรับนโยบาย แทนการหาวิธีหลีกเลี่ยง เครื่องมือนี้จะปฏิเสธการตอบกลับที่ไม่มีบล็อก sanitizer, มี sanitizer.version ที่ไม่ใช่ trace-evidence-sanitizer/v1, มี body ที่ใช้คีย์ JSON ซ้ำ หรือมี body ขนาดเกิน 512 KiB (ลดได้ด้วย max_spans) ต้องเปิดใช้ความสามารถของแบ็กเอนด์ที่ทำงานร่วมกัน
get_change_events
start_time_iso/end_time_iso(string, optional)lookback_minutes(integer, optional): ค่าเริ่มต้น: 60.service_name(string, optional)env(string, optional)event_name(string, optional): เรียกใช้โดยไม่ระบุค่านี้ก่อนเพื่อรับavailable_event_names.
analyze_change_impact
ส่ง change_event หรือ service + timestamp เพียงชุดเดียวเท่านั้น
change_event(object, optional): องค์ประกอบหนึ่งรายการของget_change_eventschange_events[]โดยไม่เปลี่ยนแปลง ใช้metric.service,metric.deployment_environmentและvalues[].timestampที่เก่าที่สุดservice(string, optional): จำเป็นต้องใช้ร่วมกับtimestampเมื่อไม่ได้ระบุchange_eventtimestamp(string, optional): RFC3339 หรือ unix seconds โดยปัดลงเป็นนาทีenv(string, optional): สภาพแวดล้อมที่ตรงกันทุกประการ ค่าเริ่มต้น: ของเหตุการณ์ มิฉะนั้นใช้ทั้งหมดbaseline_minutes(integer, optional): ค่าเริ่มต้น: 60. จำกัดให้อยู่ในช่วง 30..120.after_minutes(integer, optional): ค่าเริ่มต้น:baseline_minutes. จำกัดให้อยู่ในช่วง 30..120 และไม่เกินเวลาปัจจุบัน
regression likely เมื่อมีเงื่อนไขใดเงื่อนไขหนึ่งต่อไปนี้: อัตราข้อผิดพลาดเพิ่มขึ้นอย่างน้อย 1 จุดเปอร์เซ็นต์, p95 เพิ่มขึ้นอย่างน้อย 40% หรือ throughput (rpm) ลดลงอย่างน้อย 50% สำหรับบริการหรือผู้เรียกใช้ 10 อันดับแรก โดยจัดอันดับตาม throughput รวมของทั้งสองหน้าต่าง (ต้องมีคำขออย่างน้อย 100 รายการก่อนการเปลี่ยนแปลง และสำหรับทุกกรณียกเว้น throughput ต้องมีหลังการเปลี่ยนแปลงด้วย; p95 นับเฉพาะคำขอของ latency_env); การแจ้งเตือนของรายการเหล่านั้นเริ่มทำงานหลังการเปลี่ยนแปลงและยังทำงานอยู่เมื่อสิ้นสุดหน้าต่างหลังการเปลี่ยนแปลง (จับคู่โดยไม่สนตัวพิมพ์เล็กใหญ่จากชื่อกลุ่มการแจ้งเตือน หรือป้ายกำกับ service, service_name หรือ service.name มิฉะนั้นใช้คำอธิบายประกอบ (ไม่ใช้ข้อความอิสระ เช่น สรุป); เมื่อระบุ env ให้ตัดการแจ้งเตือนที่ติดป้ายกำกับสภาพแวดล้อมอื่นโดยไม่สนตัวพิมพ์เล็กใหญ่ และทำเครื่องหมายรายการที่ไม่มีป้ายกำกับเป็น env_match: unlabelled); พบการถดถอยจาก get_apm_service_deviations insufficient data เมื่อหน้าต่างหลังการเปลี่ยนแปลงสั้นกว่า 5 นาที (รวมถึงการเปลี่ยนแปลงในอนาคต) บริการมีคำขอน้อยเกินไป หรือ golden signals, การค้นหาผู้เรียกใช้โดยตรง, การแจ้งเตือน หรือ get_apm_service_deviations ล้มเหลว ทั้งหมดหรือใน query ใดก็ตามที่ระบุไว้ใน deviations.apm.unavailable: การไม่มีหลักฐานจะไม่ทำให้ได้ผลลัพธ์เป็น no significant change และหากพบการถดถอยอยู่แล้ว จะระบุสิ่งที่ล้มเหลว no significant change เป็นคำตอบที่ถูกต้อง ไม่ใช่ความล้มเหลว การตรวจสอบความเบี่ยงเบนของแอตทริบิวต์ trace จะทำงานเฉพาะเมื่อกำหนด env โดยตรวจสอบแต่ละด้านไม่เกิน 15 นาที; การตรวจสอบนี้ช่วยอธิบายผลการตัดสิน แต่ไม่กำหนดผลการตัดสิน ดังนั้นการข้ามหรือดึงข้อมูลไม่สำเร็จจะไม่เปลี่ยนผลลัพธ์ แต่ละรายการจะแสดงสูงสุด 10 รายการและรายงานจำนวนที่ถูกตัดออก; การเรียก upstream ที่ล้มเหลวจะเพิ่ม error เฉพาะในส่วนของตนเท่านั้น ค่า latency ของ golden signal มาจากสภาพแวดล้อมเดียวกันในทั้งสองหน้าต่าง โดยระบุชื่อไว้ใน latency_env: หากไม่มี env จะใช้สภาพแวดล้อมที่มีการใช้งานสูงสุด อัตราข้อผิดพลาดของ golden signal นับข้อผิดพลาด 5xx และ gRPC; deviations.apm ยังนับ span ที่มีสถานะข้อผิดพลาดและ 429 ด้วย สัญญาณของผู้เรียกใช้มาจาก server span ของผู้เรียกใช้เอง ดังนั้นผู้เรียกใช้ที่มีเฉพาะ client จะแสดง 0 rpm
regressions แสดงหนึ่งรายการต่อทริกเกอร์ที่อยู่เบื้องหลัง regression likely ตามลำดับของ reason และเป็น [] สำหรับผลการตัดสินอื่น แต่ละรายการมี service, role (changed หรือ dependent), env, metric (มีเพียงหนึ่งรายการจาก error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) และ baseline/after ในหน่วยของเมตริก (%, ms, rpm หรือค่าของสัญญาณ APM เอง; เป็น null สำหรับ alert) รายการ alert จะเพิ่ม rule_id และ state ซึ่งเป็นสถานะของอินสแตนซ์ในช่วง alerts-monitor ล่าสุดของหน้าต่างหลังการเปลี่ยนแปลงที่แสดงรายการนั้น โดยเป็น firing เสมอ: การแจ้งเตือนที่เริ่มหลังการเปลี่ยนแปลงแต่ได้รับการแก้ไขก่อนสิ้นสุดหน้าต่างหลังการเปลี่ยนแปลงไม่ถือเป็นการถดถอย จึงไม่สร้าง ticket; รายการดังกล่าวยังคงอยู่ใน alerts.started พร้อมกับ state และ reason จะนับรายการนั้น env คือสภาพแวดล้อมที่ใช้วัดเมตริก: ใช้ env ที่ร้องขอ มิฉะนั้นอัตราข้อผิดพลาดและ throughput จะรวมทุกสภาพแวดล้อม (env: "") ส่วน p95 ใช้สภาพแวดล้อมที่มีการใช้งานสูงสุด latency_env; การแจ้งเตือนใช้ป้ายกำกับ env ของตนเอง และการเบี่ยงเบนของ APM ใช้ env ของตนเอง การถดถอยทุกรายการครอบคลุมทั้งบริการ จึงไม่มีรายการใดระบุ endpoint
get_alert_groups
รายการกลุ่มการแจ้งเตือน Compass ที่กำหนดค่าไว้ สำหรับการตรวจสอบ changeboard / ความครอบคลุมของป้ายกำกับ รวมกลุ่มที่ไม่มีกฎและกลุ่มที่ไม่ได้กำลังทำงาน ไม่ส่งคืน PromQL
alert_group_name/alert_group_type/data_source_name(string, optional): จับคู่ข้อความย่อยโดยไม่สนตัวพิมพ์เล็กใหญ่team/tier(string, optional): จับคู่แบบตรงกันทุกประการโดยไม่สนตัวพิมพ์เล็กใหญ่กับข้อมูลเมตาที่กำหนดค่าไว้label_key+label_value(string, optional): ต้องกำหนดทั้งคู่ จับคู่แบบตรงกันทุกประการโดยไม่สนตัวพิมพ์เล็กใหญ่กับคู่metadata.labelsหนึ่งคู่ — ทั้งคีย์และค่า
ส่งคืน JSON แบบกระชับ {"count":N,"groups":[...]} ที่มี id, name, type, entity_class, team, tier, metadata.labels และจำนวนกฎ ค่า team / labels ที่ว่างเปล่าหมายถึงไม่ได้กำหนด
get_alert_operations_summary
start_time_iso/end_time_iso(string, required): ช่วงเวลา RFC3339 ไม่เกิน 31 วันtimezone(string, optional): ชื่อ IANA สำหรับกำหนดขอบเขตวัน ค่าเริ่มต้น:UTC.severities/services(array, optional): จำกัดขอบเขตของสรุปinclude_rules(boolean, optional): ส่งคืนข้อมูลสุขอนามัยรายกฎด้วย (20 อันดับแรกตามfire_count, กฎที่เกิดการแจ้งเตือนถี่และกฎที่ไม่ได้กำหนดเส้นทาง พร้อมtruncatedเมื่อ API จำกัดรายการกฎ) ค่าเริ่มต้น:false.
ส่งคืน JSON ที่มี alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention และ coverage เมตริกแต่ละรายการเป็น {status, count?, reason?}; จำนวน partial ครอบคลุมเพียงบางส่วนของช่วงเวลา และไม่ใช่ค่าขอบเขตล่าง
get_alert_coverage
ตอบคำถามว่า “มีอะไรบ้างที่ยังไม่มีการแจ้งเตือน?” สำหรับบริการ สภาพแวดล้อม กลุ่มการแจ้งเตือนหนึ่งกลุ่ม หรือทั้งองค์กรเมื่อไม่ได้ระบุขอบเขต เป็นแบบอ่านอย่างเดียว: จะไม่สร้าง เปลี่ยนแปลง หรือเปิดเสียงรายการใด นอกจากนี้ยังให้บริการในชุดเครื่องมือ investigate.
service(string, optional): ชื่อบริการenvironment(string, optional): สภาพแวดล้อมการติดตั้งใช้งาน (เช่นprod)entity_id(string, optional): UUID ของกลุ่มการแจ้งเตือน (entity) ตามที่ส่งคืนโดยget_alert_groups.muted_days(integer, optional): จำนวนวันเต็ม ตั้งแต่ 1 ถึง 3650 ค่าเริ่มต้น: 7; 0 หมายถึงใช้ค่าเริ่มต้น กฎที่ถูกปิดเสียงนานกว่านี้ถือเป็นช่องว่างmuted_too_long. ค่าจะถูกตัดช่องว่างหัวท้าย และละเว้นสตริงว่าง ประเภทช่องว่าง: uncovered_signal (ไม่มี rule ที่เปิดใช้งานสำหรับ latency, error_rate, throughput หรือ saturation; ระบุชื่อ rule ที่ปิดใช้งานซึ่งจะครอบคลุมค่านั้น), all_rules_disabled (กลุ่มการแจ้งเตือนที่ rule ทั้งหมดถูกปิดใช้งาน), no_notification_channel (rule ที่ระดับความรุนแรงไม่มี channel ใดในกลุ่มการแจ้งเตือนที่กำหนดเส้นทางไปถึง), muted_too_long (ปิดเสียงอย่างไม่มีกำหนดหรือเกินmuted_days;muted_sinceคือการอัปเดตล่าสุดของ rule และจะละmute_untilไว้เมื่อปิดเสียงอย่างไม่มีกำหนด)
ส่งคืน JSON แบบกะทัดรัด {scope, generated_at, complete, summary, counts, groups} โดย groups มีรายการ {kind, count, gaps, omitted} หนึ่งรายการต่อประเภทที่พบ โดยแสดงช่องว่างแต่ละประเภทไม่เกิน 10 รายการ (omitted นับรายการที่เหลือ; จำกัดขอบเขตให้แคบลงเพื่อดูรายการเหล่านั้น); แต่ละช่องว่างมี suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel หรือ patch_alert) และ suggested_args ซึ่งมีเฉพาะอินพุตที่เครื่องมือนั้นยอมรับ (patch_alert: entity_id, id และ is_disabled=false หรือ mute_until=0; attach_notification_channel: alert_group_id และ breach/threat แบบ severity; create_alert: entity_id; create_alert_from_chart: service_name); ส่วน entity_id, rule_id และ signal ของช่องว่างนั้นจะแสดงอยู่ข้างกัน เรียกใช้เครื่องมือที่แนะนำเฉพาะเมื่อมีให้ใช้ในเซสชันและผู้ใช้ยืนยันเท่านั้น complete จะเป็น true ก็ต่อเมื่อ API ไม่แสดงช่องว่างใด ๆ ทุกจำนวนเป็น 0 และมีกลุ่มการแจ้งเตือนอย่างน้อยหนึ่งกลุ่มที่ตรงกับขอบเขต (ป้ายกำกับ service_name / env แบบตรงกันทุกประการ โดยตรวจสอบกับรายการของ get_alert_groups); ขอบเขตที่ไม่ตรงกับรายการใด การค้นหาที่ล้มเหลว หรือจำนวนที่ไม่มีช่องว่างแสดงอยู่ ถือว่ายังไม่ครบถ้วน และ summary จะระบุเหตุผล
get_alert_config
search_term(string, optional): ค้นหาข้อความอิสระในชื่อ กลุ่ม แหล่งข้อมูล และแท็กrule_name(string, optional)severity(string, optional)rule_type(string, optional):staticหรือanomalyalert_group_name/alert_group_type/data_source_name(string, optional)tags(array, optional): ต้องตรงกันทั้งหมด (ตรรกะ AND)
แต่ละ rule แสดง Recent Evaluations: ตัวอย่าง 5 รายการ รายการละหนึ่งนาที เรียงจากใหม่ไปเก่า โดยแต่ละรายการระบุนาที UTC ที่สิ้นสุด ตัวอย่างล่าสุดสิ้นสุดก่อนเรียกใช้ 1–2 นาที เนื่องจาก monitor เติมข้อมูลของนาทีล่าสุดล่าช้า firing; ok = monitor รายงานว่า rule ไม่ได้กำลังทำงาน (สถานะปกติ แก้ไขแล้ว รอดำเนินการ หรือว่าง ตามที่ระบุใน is_firing=0 ใน get_alert_rule_state); unknown = ไม่มีแถวของ monitor สำหรับ rule นั้น (ยังไม่ได้ประเมิน หรือการค้นหาของนาทีนั้นล้มเหลว ซึ่งระบุไว้ที่ส่วนต้นของการตอบกลับ) หรือมีแถวที่สถานะไม่ใช่ firing, normal, resolved, pending หรือ empty (เช่น no_data, silenced) rule ที่ปิดใช้งานจะแสดง none เมื่อมี rule ที่เปิดใช้งานตรงกันมากกว่า 25 รายการ จะละประวัติของทุกรายการและระบุไว้ในคำตอบ
get_entity_kpis
อ่านอย่างเดียว; อยู่ในชุดเครื่องมือ alerts และ investigate แสดง KPI ทุกตัวในกลุ่มการแจ้งเตือนหนึ่งกลุ่ม รวมถึง KPI ที่ยังไม่มี rule การแจ้งเตือนใช้งาน ใช้ ID ที่ส่งคืนใน expression_args / indicators_used; ห้ามสร้างขึ้นเอง
entity_id(string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตี จากget_alert_groupsหรือget_alert_config
ส่งคืน JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]} โดยเรียงตามชื่อ unit เป็นป้ายกำกับสำหรับแสดงผล: เกณฑ์เปรียบเทียบกับค่าคิวรีดิบ เมื่อไม่มี KPI ที่เหมาะสม ให้สร้างด้วย create_kpi ผลลัพธ์ของกลุ่มว่างจะระบุชื่อ create_kpi เฉพาะเมื่อเซสชันให้บริการเครื่องมือนี้เท่านั้น หากใช้ --read-only (ยกเว้น --allow-write-tools=create_kpi) หรือชุดเครื่องมือ investigate ระบบจะแจ้งว่าการสร้าง KPI ต้องใช้เซสชัน alerts ที่เขียนข้อมูลได้แทน
create_kpi
สร้าง KPI ในกลุ่มการแจ้งเตือนที่มีอยู่; ใช้ได้เฉพาะชุดเครื่องมือ alerts ใช้เมื่อ get_entity_kpis ไม่มี KPI ที่มีคิวรีตามต้องการเท่านั้น ตรวจสอบก่อนว่าคิวรีส่งคืนข้อมูลด้วย prometheus_range_query: API ปฏิเสธเฉพาะคิวรีที่แยกวิเคราะห์ไม่ได้ และจะบันทึกคิวรีที่ถูกต้องแม้เมตริกนั้นไม่มีอยู่
entity_id(string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตีname(string, required): ต้องไม่ซ้ำภายในกลุ่มการแจ้งเตือน การสร้างครั้งที่สองด้วยชื่อเดิมจะถูกปฏิเสธเนื่องจากขัดแย้งquery(string, required): PromQL หากต้องการแจ้งเตือนจากแผงแดชบอร์ด ให้นำ PromQL ของแผงจากget_dashboardunit(string, required): หน่วยของค่าดิบจากคิวรี เช่นseconds,ms,percent,ratio,count,req/sใช้เป็นป้ายกำกับเท่านั้นและไม่แปลงค่า ดังนั้นเกณฑ์จึงเปรียบเทียบกับค่าดิบdescription(string, optional)data_source_id(string, optional): ค่าเริ่มต้นคือแหล่งข้อมูลของกลุ่มการแจ้งเตือน
ไม่มีเครื่องมือ MCP ใดลบหรือแก้ไข KPI ได้ (ให้ใช้ UI ของ Last9) ดังนั้นโปรดยืนยันชื่อ คิวรี และหน่วยก่อนสร้าง สร้างเพียงครั้งเดียวและเก็บ ID ที่ส่งคืนไว้สำหรับ expression_args / indicators_used; หากชื่อขัดแย้งกัน ให้นำ ID ของ KPI ที่มีอยู่จาก get_entity_kpis มาใช้ซ้ำ เมื่อหมดเวลาหรือเกิดข้อผิดพลาดในการเชื่อมต่อ การสร้างอาจสำเร็จหรือไม่ก็ได้ ให้ตรวจสอบด้วยชื่อผ่าน get_entity_kpis ก่อนลองอีกครั้ง ส่งคืน {"id","name","query","unit"}
get_alerts
time_iso(string, optional): เวลาประเมินในรูปแบบ RFC3339window(integer, optional): ช่วงเวลาย้อนหลังเป็นวินาที ค่าเริ่มต้น: 900 ช่วงที่ใช้ได้: 60–86400lookback_minutes(integer, optional): ช่วงที่ใช้ได้: 1–1440
get_alert_rule_state
start_time(integer or string, required): จุดเริ่มต้นของช่วง (รวม): วินาที Unix epoch (1718000000) หรือ RFC3339 (2024-06-10T06:13:20Z) ค่า epoch แบบมิลลิวินาที ไมโครวินาที และนาโนวินาทีจะถูกแปลงเป็นวินาที; ปฏิเสธค่าก่อน 2000-01-01end_time(integer or string, required): จุดสิ้นสุดของช่วง (รวม) ในรูปแบบเดียวกันstep(integer, required): ความละเอียดเป็นวินาทีระหว่างตัวอย่าง จำนวนตัวอย่าง((end_time - start_time) / step + 1)จำกัดไว้ที่ 100 แต่ละตัวอย่างเป็นการเรียก upstream หนึ่งครั้ง ครอบคลุมช่วงmin(step, 3600)วินาทีที่สิ้นสุด ณ เวลาประทับของตัวอย่าง ระบบดึงตัวอย่างครั้งละ 5 รายการ และเครื่องมือจะแสดงข้อผิดพลาดพร้อมคำแนะนำให้ลองใหม่หากใช้เวลานานกว่า 60 วินาทีalert_group_id(string, optional): กรองตาม ID กลุ่มการแจ้งเตือนrule_name(string, optional): กรองชื่อ rule ด้วย regexalert_group_name(string, optional): กรองชื่อกลุ่มการแจ้งเตือนด้วย regexlabel_filters(string, optional): ตัวกรองป้ายกำกับkey=valueที่คั่นด้วยจุลภาคstate(string, optional): กรองตามสถานะ (เช่นfiring)
ส่งคืนแมป JSON ของ rule_id -> [{timestamp, is_firing}] หาก rule ไม่ปรากฏในคำตอบจาก upstream ณ เวลาประทับใด ระบบจะรายงานเป็น is_firing=0 — หมายถึง “ไม่พบว่ากำลังทำงาน” ไม่ใช่ยืนยันว่าอยู่ในสถานะปกติ
get_alert_hygiene
การตรวจสอบ rule การแจ้งเตือนที่เปิดใช้งานแบบอ่านอย่างเดียว ไม่มีการเปลี่ยนแปลงใด ๆ: การแก้ไขที่แนะนำแต่ละรายการเป็นเพียงข้อเสนอ และจะนำไปใช้เมื่อผู้ใช้ยืนยันอย่างชัดเจนเท่านั้น ผ่าน update_alert (การปรับแต่ง), patch_alert (is_disabled), delete_alert หรือ attach_notification_channel เมื่อมีให้บริการ
window(string, optional):7dหรือ30dค่าเริ่มต้น:7dlimit(integer, optional): จำนวน rule ที่ถูกระบุสูงสุดที่จะส่งคืน โดยเรียงจากปัญหารุนแรงที่สุดก่อน ค่าเริ่มต้น: 20 ช่วงที่ใช้ได้: 1–100
ช่วงเวลาสิ้นสุด ณ เวลาปัจจุบัน หมวดหมู่ (rule หนึ่งรายการอาจอยู่ได้หลายหมวด): noisy (ทำงาน ≥ 5 ครั้ง/วัน โดยมี < 20% acked; with an unavailable ack_rate it is judged on fire rate alone and the reason says so; mute time is not reported), flapping (> การสลับสถานะ 4 ครั้ง/วัน), stale (ทำงานครั้งล่าสุดก่อนช่วงเวลานี้และไม่มีเวลาที่ทำงานอยู่ในช่วงดังกล่าว หรือเป็น rule ที่กำหนดค่าและเปิดใช้งานแต่ไม่มี episode ในช่วงดังกล่าว ขณะที่วงจรชีวิต coverage เสร็จสมบูรณ์และรายการของ API ไม่ถูกตัดทอน), unrouted (ไม่มีการทำงานในช่วงดังกล่าวที่ส่งไปถึง channel และขณะนี้กลุ่มการแจ้งเตือนไม่มี channel แนบอยู่; หากอ่านข้อมูลการแนบไม่ได้ rule จะถูกจัดอยู่ใน unavailable.routed แทน) สถิติแต่ละรายการเป็น {status, count|value, reason} หรือ null: ค่าที่ไม่มีจะไม่ถูกอ่านเป็นศูนย์ และจะข้ามเฉพาะการตรวจสอบที่ต้องใช้ค่านั้น; unavailable นับจำนวน rule ที่เปิดใช้งานแยกตามค่าที่ขาดหาย (fire_count, flap_count, ack_rate, routed, rule_config สำหรับ rule ที่ไม่มีในรายการ rule การแจ้งเตือน ซึ่งการแก้ไขจะไม่มีค่าปัจจุบัน และ activity สำหรับ rule ที่กำหนดค่าไว้แต่ไม่มี episode ซึ่งประวัติไม่สามารถยืนยันช่วงที่ไม่มีการทำงานได้ จึงไม่นำมาประเมิน) coverage ระบุว่าประวัติการแจ้งเตือนครอบคลุมช่วงเวลามากน้อยเพียงใด; อัตราจะคำนวณจากช่วงที่ครอบคลุม โดยมีระยะเวลาอย่างน้อยหนึ่งวัน upstream_truncated เป็น true เมื่อ API ส่งคืนเฉพาะ 200 rule ที่มีเสียงดังที่สุด ดังนั้นจึงไม่ได้ประเมิน rule ที่เงียบกว่า การแก้ไขสร้างจากการกำหนดค่าของแต่ละ rule ในรายการ rule การแจ้งเตือน: เพิ่ม bad_minutes (ค่า N ใน count_true(result) >= N) หรือเพิ่มระยะเวลา eval_window (สูงสุด 60 นาที); สำหรับเกณฑ์คงที่ที่มีเสียงดัง ให้ปรับเกณฑ์ใน condition (expr > 100) หรือเปลี่ยนนิพจน์เป็น adaptive_std_cmp(metric, sensitivity, window); แนบ notification channel; ปิดใช้งานหรือลบ rule ที่ล้าสมัย
ส่งคืน JSON แบบกะทัดรัด {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules} โดยกำหนดเป้าหมายขนาดไว้ที่ 32 KB: truncated เป็น true เมื่อจำนวน rule ที่ถูกระบุเกิน limit หรือเกินเป้าหมายดังกล่าว และ omitted_for_size นับ rule ที่ถูกตัดออกจาก limit เนื่องจากขนาด (เก็บ rule ที่แย่ที่สุดไว้เสมอ ดังนั้นหาก rule เดียวมีขนาดเกิน 32 KB ก็จะส่งคืนเพียงรายการเดียวและเกินเป้าหมาย); แต่ละ rule มี findings (category, reason, suggested_fix, alternative_fix ซึ่งเป็นตัวเลือกเสริม) และ stats ดิบ
get_notification_channels
scope(string, optional):attached(ค่าเริ่มต้น) ส่งคืนหนึ่งแถวต่อการแนบกับกลุ่มการแจ้งเตือน;idคือ ID ของการแนบ ซึ่งใช้โดยdetach_notification_channelchannelsส่งคืน channel ขององค์กร (id,name,type,send_resolved,created_via);idคือ ID ของ channel ซึ่งใช้โดยattach_notification_channelระบบจะไม่ส่งคืนปลายทาง ส่วนหัว หรือใบรับรอง
ส่งคืน notification channel ที่กำหนดค่าไว้ (Slack, PagerDuty, อีเมล, เว็บฮุก ฯลฯ) ในรูปแบบตาราง TSV แถวการแนบ (กำหนด service_fqid ไว้) แสดง global เป็น false และ services เป็น -; services แสดงเฉพาะการผูกบริการแบบเดิม ในแถวการแนบ send_resolved คือค่าเริ่มต้นที่บันทึกไว้ของแถวนั้น ไม่ใช่ค่าที่ใช้ส่งการแจ้งเตือน การแจ้งเตือนเมื่อแก้ไขแล้วจะเป็นไปตาม send_resolved ของ channel เอง (scope=channels) ทั้งสองขอบเขตมี created_via (last9-mcp สำหรับแถวที่สร้างโดยเอเจนต์ MCP มิฉะนั้นเป็น -)
recommend_alert_config
อ่านอย่างเดียว ส่งคืนคำแนะนำเกี่ยวกับวงจรชีวิต เงื่อนไขการตรวจสอบ และข้อกำหนดด้านบริบทสำหรับผู้ตอบสนอง แต่ไม่ใช่หลักฐานในตัวเอง ดังนั้นให้ใช้เครื่องมือ telemetry เพื่อกำหนดเกณฑ์
signal(string, required): เมตริกหรือสัญญาณผลกระทบต่อผู้ใช้ รวมถึงหน่วยและมิติข้อมูลobjective(string, required): อาการหรือผลกระทบต่อผู้ใช้ที่ต้องการตรวจจับrule_type(string, optional):static(ค่าเริ่มต้น) หรือanomalyseverity(string, optional):breach(ค่าเริ่มต้น) หรือthreatenvironment(string, optional): สภาพแวดล้อมและรูปแบบทราฟฟิก
validate_alert_expression
ทดลองประเมินนิพจน์โดยไม่บันทึก ใช้ก่อน create_alert / update_alert
entity_id(string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตีexpression(string, required): นิพจน์เลขคณิตที่ใช้ตัวบ่งชี้ซึ่งระบุด้วยชื่อ KPI ที่ตรงกันทุกประการ เช่นerrors / requestsหากชื่อมีช่องว่าง จุด หรือขีด ให้เขียนตามเดิม (Test Alert / errors) ตรงตามที่create_alertบันทึกไว้ทุกประการindicators_used(object, required, non-empty): ชื่อ indicator ที่แมปกับ UUID ของ KPI ซึ่งเป็นของentity_id; แสดง ID และชื่อ KPI ของกลุ่มด้วยget_entity_kpisใช้ชื่อที่ตรงกันทุกประการของ KPI แต่ละรายการ: การทดลองนี้ยอมรับชื่อใดก็ได้ แต่create_alertและupdate_alertจะปฏิเสธคีย์expression_argsที่ไม่ใช่ชื่อของ KPI ที่ผูกไว้ ตรวจสอบเฉพาะนิพจน์เลขคณิตเท่านั้น (ส่งนิพจน์เมตริกด้านใน ไม่ใช่ตัวครอบadaptive_std_cmp(...)); ไม่ตรวจสอบcondition/alert_conditionการตรวจสอบว่ามี timeseries อย่างน้อยหนึ่งรายการจะทำงานเฉพาะเมื่อใช้ตัวบ่งชี้มากกว่าหนึ่งรายการ
ส่งคืน {"valid":true} หรือ {"valid":false,"reason":"..."}; นิพจน์ที่ไม่ถูกต้องถือเป็นผลลัพธ์ปกติ ไม่ใช่ข้อผิดพลาดของเครื่องมือ
describe_alert_chart
อ่านอย่างเดียว แสดงรายการสัญญาณที่ตั้งการแจ้งเตือนได้ (key, unit, eval_query, query_kind) บนแผนภูมิ Discover ที่รองรับ ระบบปฏิเสธโทเค็นบทบาท Viewer
surface(string, required):discover-serviceหรือdiscover-exceptions; ระบบปฏิเสธพื้นผิวอื่นทั้งหมด รวมถึงแดชบอร์ดที่กำหนดเอง ก่อนเรียก API (ใช้create_alertกับ KPI แทน)chart_key(string, required): เช่นapdex,error_rate,response_time,exception_countservice_name(string, required)env(string, optional)attributes(object, optional): มิติข้อมูลระบุตัวตนเพิ่มเติม โดยใช้ชื่อคีย์ที่เครื่องมือนี้รายงาน
create_alert
สร้างกฎในกลุ่มการแจ้งเตือนที่มีอยู่ โดยปิดใช้งานไว้เสมอ (เป็นฉบับร่าง แม้จะส่ง is_disabled=false มาก็ตาม) เรียก recommend_alert_config ก่อน จากนั้นเลื่อนสถานะด้วย patch_alert is_disabled=false หลังจากผู้ใช้ยืนยันเท่านั้น สร้างเพียงครั้งเดียวและเก็บ ID กฎที่ส่งคืนไว้ หาก rule_name ที่กลุ่มการแจ้งเตือนใช้อยู่แล้ว (ไม่แยกตัวพิมพ์เล็ก-ใหญ่) ระบบจะปฏิเสธโดยไม่สร้างสิ่งใด และระบุ id ของกฎที่มีอยู่
entity_id(string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตีalert_rule(object, required): เนื้อหากฎแบบระบุชนิดข้อมูลครบถ้วน รวมถึงprimary_indicatorและexpression_argsที่ผูกกับ KPI จริงของเอนทิตี คีย์expression_argsแต่ละรายการต้องเป็นชื่อที่ตรงกันทุกประการของ KPI ที่ผูกไว้ (ไม่ใช่ตัวยึดตำแหน่ง เช่นx) และprimary_indicatorกับexpressionต้องใช้ชื่อเหล่านั้น กฎแบบคงที่ต้องมีcondition,alert_conditionและeval_window(0–60 นาที) กฎแบบปรับตามข้อมูลใช้expression=adaptive_std_cmp(<primary_indicator>, sensitivity, window); จากนั้นทั้งสามฟิลด์จะเป็นตัวเลือก (ค่าเริ่มต้นคือexpr > 0,count_true(result) >= 1,1) ไม่สามารถตั้งค่าalgorithmได้ ข้อมูลบริบทสำหรับผู้รับผิดชอบให้ใส่ในproperties(คำอธิบาย, runbook, คำอธิบายประกอบ,query_mode)
การกำหนดเส้นทางการแจ้งเตือนตั้งค่าไว้ที่กลุ่มการแจ้งเตือน ไม่ใช่ที่กฎ
create_alert_from_chart
สร้างกฎเกณฑ์แบบคงที่จากแผนภูมิที่อธิบายโดย describe_alert_chart เช่นเดียวกับ create_alert กฎจะถูกสร้างเป็นฉบับร่างที่ปิดใช้งานและไม่ทำงาน ให้เลื่อนสถานะด้วย patch_alert is_disabled=false หลังจากผู้ใช้ยืนยันเท่านั้น API ของแผนภูมิจะสร้างกฎโดยเปิดใช้งานไว้ ดังนั้นเครื่องมือนี้จึงปิดใช้งานกฎทันทีหลังสร้าง หากทำไม่สำเร็จ ผลลัพธ์จะเป็นข้อผิดพลาดที่ระบุ id ของกฎ ซึ่งอาจกำลังทำงานอยู่
surface/chart_key/service_name/signal_key/name(string, required)env(string, optional)attributes(object, optional)threshold(number, optional): หน่วยของสัญญาณ ต้องเป็น 0 ขึ้นไป สัญญาณที่ใช้หน่วยคะแนน เช่น apdex ต้องระบุค่าอย่างชัดเจนthreshold_operator(string, optional):>(ค่าเริ่มต้น),<,>=,<=,==,!=eval_window(integer, optional): นาที, 1–60 ค่าเริ่มต้น: 5bad_minutes(integer, optional): 1–eval_windowค่าเริ่มต้น: 3severity(string, optional):breachหรือthreatdescription(string, optional)group_id(string, optional): โดยปกติไม่ต้องระบุ
update_alert
แทนที่การกำหนดค่าการประเมินกฎทั้งหมด ดึงข้อมูลกฎก่อนด้วย get_alert_config หรือ get_entity_alert_rules ระบบจะปฏิเสธโดยไม่เปลี่ยนแปลงสิ่งใด หากไม่มีกฎดังกล่าวหรือกฎนั้นอยู่ในกลุ่มการแจ้งเตือนอื่น การดำเนินการนี้อาจลบกฎแบบ soft delete แล้วสร้างใหม่ ดังนั้นให้ใช้ ID ที่ส่งคืนมาแทน
entity_id(string, required)id(string, required): UUID ของกฎการแจ้งเตือนalert_rule(object, required): การกำหนดค่าครบถ้วน มีรูปแบบเดียวกับcreate_alert
patch_alert
เปลี่ยนแปลงบางส่วนโดยคง ID ของกฎไว้ ต้องระบุการเปลี่ยนแปลงอย่างน้อยหนึ่งรายการ ระบบจะปฏิเสธโดยไม่เปลี่ยนแปลงสิ่งใด หากไม่มีกฎดังกล่าวหรือกฎนั้นอยู่ในกลุ่มการแจ้งเตือนอื่น
entity_id(string, required)id(string, required): UUID ของกฎการแจ้งเตือนis_disabled(boolean, optional):falseใช้เลื่อนสถานะ/เปิดใช้งาน ส่วนtrueใช้หยุดชั่วคราวmute_until(integer, optional): กำหนดเวลา Unix epoch;0ยกเลิกการปิดเสียงproperties(object, optional):description,runbook,annotations,query_modeฟิลด์ที่ส่งแต่ละรายการจะแทนที่ค่าที่จัดเก็บไว้ ส่วนฟิลด์ที่ไม่ส่งหรือเว้นว่างจะคงค่าเดิมไว้annotationsจะแทนที่ทั้งแผนที่ ดังนั้นให้ส่งทุกคีย์ที่ต้องการเก็บไว้;{}จะล้างข้อมูลrecurring_mute_schedule(object, optional): แทนที่กำหนดการรายสัปดาห์:enabled(ค่าเริ่มต้น false),timezone(ชื่อ IANA, จำเป็น) และwindows(1–20 รายการของweekdaysในรูปแบบsun..sat,start_time/end_timeในรูปแบบเวลา 24 ชั่วโมงHH:MM) หากเวลาสิ้นสุดตรงกับหรือก่อนเวลาเริ่มต้น จะถือว่าสิ้นสุดในวันถัดไป ส่งทุกช่วงเวลาที่ต้องการเก็บไว้clear_recurring_mute_schedule(boolean, optional): ลบกำหนดการทั้งหมด; ใช้ร่วมกับrecurring_mute_scheduleไม่ได้ ต่างจากenabled=falseซึ่งจะเก็บช่วงเวลาไว้
ผู้ใช้บทบาท Viewer เปลี่ยนได้เฉพาะ mute_until เท่านั้น ระบบปฏิเสธการเปลี่ยนการปิดเสียงระดับกฎขณะที่กลุ่มหรือเอนทิตีถูกปิดเสียง อ่านการเปลี่ยนแปลงกลับด้วย get_entity_alert_rules ซึ่งแสดง mute_until, recurring_mute_schedule และ properties
delete_alert
ลบกฎอย่างถาวร ตรวจสอบด้วย get_alert_config และขอการยืนยันอย่างชัดเจนจากผู้ใช้ก่อน ระบบจะปฏิเสธโดยไม่ลบสิ่งใด หากไม่มีกฎดังกล่าวหรือกฎนั้นอยู่ในกลุ่มการแจ้งเตือนอื่น
entity_id(string, required)id(string, required): UUID ของกฎการแจ้งเตือน
mute_alert_group
ปิดเสียงกฎทั้งหมดในกลุ่ม ทั้งกฎปัจจุบันและกฎที่จะสร้างในอนาคต หากต้องการปิดเสียงกฎเดียว ให้ใช้ patch_alert กับ mute_until ต้องมีสิทธิ์ editor
entity_id(string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตีuntil(integer, required): วินาที Unix epoch ที่การปิดเสียงสิ้นสุด0ยกเลิกการปิดเสียง; ค่าติดลบ เช่น-1จะปิดเสียงอย่างไม่มีกำหนด
acknowledge_alert
รับผิดชอบการแจ้งเตือนที่กำลังทำงานอยู่ หรือยกเลิกการรับผิดชอบ การดำเนินการนี้ไม่แก้ไขหรือปิดเสียงการแจ้งเตือน การรับผิดชอบการแจ้งเตือนที่คุณเป็นเจ้าของอยู่แล้วจะไม่มีผลและปลอดภัย ack จะปฏิเสธโดยไม่บันทึกสิ่งใด เว้นแต่ get_alerts จะแสดงการแจ้งเตือนนั้นอย่างตรงกันทุกประการ (ทั้งสาม id) ภายในชั่วโมงที่ผ่านมา
alert_group_id/rule_id/rule_type(string, required): คัดลอกจากการแจ้งเตือนในget_alertsaction(string, optional):ack(ค่าเริ่มต้น) หรือunackเฉพาะเจ้าของหรือผู้ดูแลระบบขององค์กรเท่านั้นที่ยกเลิกการรับทราบได้mute_until(integer, optional): ใช้กับackเท่านั้น บันทึกการปิดเสียงที่คุณดำเนินการไปแล้วด้วยmute_alert_groupหรือpatch_alert; ไม่ได้ปิดเสียงสิ่งใด
reassign_alert
มอบหมายการแจ้งเตือนที่มีเจ้าของอยู่แล้วให้ผู้ใช้อื่น หากยังไม่มีเจ้าของ ให้รับผิดชอบก่อน หากไม่มีการมอบหมายเนื่องจากการแจ้งเตือนไม่มีเจ้าของ ระบบจะแจ้งว่า get_alerts แสดงการแจ้งเตือนนั้นในชั่วโมงที่ผ่านมาหรือไม่ Last9 จะไม่แจ้งเตือนเจ้าของคนใหม่
alert_group_id/rule_id/rule_type(string, required): คัดลอกจากการแจ้งเตือนในget_alertsowner_email(string, optional): แนะนำให้ใช้; จับคู่กับผู้ใช้ที่ใช้งานอยู่ในองค์กรโดยไม่แยกตัวพิมพ์เล็ก-ใหญ่owner_user_id(string, optional): ระบุowner_emailหรือowner_user_idเพียงรายการเดียวเท่านั้น
create_notification_channel
สร้างช่องทาง แต่จะยังไม่กำหนดเส้นทางใดจนกว่าจะผูกด้วย attach_notification_channel สร้างเพียงครั้งเดียวและเก็บ id ไว้ ไม่มีเครื่องมือสำหรับอัปเดต ส่งคืนเฉพาะ id, name, type และ send_resolved
name(string, required): ต้องไม่ซ้ำกันในแต่ละประเภท; ห้ามมีเครื่องหมายโคลอนtype(string, required):slack,pagerduty,opsgenie,emailหรือgeneric_webhookdestination(string, required): URL ของ Slack Incoming Webhook (หรือ ID ช่องทางเมื่อใช้slack_app_mode), routing key ของ PagerDuty, API key ของ Opsgenie, อีเมลที่ทำงานคั่นด้วยจุลภาคจากโดเมนใดก็ได้ ไม่จำกัดเฉพาะโดเมนขององค์กร (API ปฏิเสธที่อยู่อีเมลจากผู้ให้บริการส่วนบุคคล เช่น Gmail และองค์กรที่ใช้บัญชีเข้าสู่ระบบส่วนบุคคลจะยอมรับเฉพาะที่อยู่ของผู้ดูแลระบบเท่านั้น) หรือ URL ของ HTTPS webhookslack_app_mode(boolean, optional): ใช้กับ Slack เท่านั้น ค่าเริ่มต้น: falsemention_handles(string, optional): คั่นด้วยจุลภาค เช่นuser|U123ABC|name,special|here,special|channelwebhook_headers(object, optional): ใช้กับgeneric_webhookเท่านั้นwebhook_ca_certificate(string, optional): ใช้กับgeneric_webhookเท่านั้น; ใบรับรอง CA แบบ PEM หนึ่งใบ ขนาดไม่เกิน 64 KiBsend_resolved(boolean, optional): ค่าเริ่มต้น: true
attach_notification_channel
กำหนดเส้นทางจากช่องทางที่มีอยู่ไปยังกลุ่มการแจ้งเตือนหนึ่งกลุ่ม ทำซ้ำได้โดยไม่เกิดผลซ้ำ การผูกจะคัดลอกการตั้งค่าการส่งของช่องทาง (ส่วนหัว ใบรับรอง การกล่าวถึง) ณ เวลาที่ผูก หากการตั้งค่าของช่องทางเปลี่ยนภายหลัง ให้ผูกใหม่
channel_id(integer, required): ID ช่องทาง (get_notification_channelsกับscope=channels) ไม่ใช่ ID การผูกalert_group_id(string, required): จากget_alert_groupsseverity(string, required):breach,threatหรือbothbothจะสร้างการผูกสองรายการ; หากรายการที่สองล้มเหลว รายการแรกจะยังคงผูกอยู่ และข้อผิดพลาดจะระบุระดับความรุนแรงที่ต้องลองใหม่
detach_notification_channel
นำการผูกหนึ่งรายการออก ต้องใช้โทเค็นที่มีขอบเขตการลบ; โทเค็นที่มีขอบเขตการเขียนไม่สามารถยกเลิกการผูกได้
attachment_id(integer, required):idจากget_notification_channelsกับscope=attachedระบบปฏิเสธ ID ช่องทางalert_group_id(string, optional): ระบบปฏิเสธหากการผูกนั้นเป็นของกลุ่มอื่น
delete_notification_channel
ลบช่องทางที่ไม่มีการผูกอยู่อย่างถาวร; ให้ยกเลิกการผูกทั้งหมดก่อน ต้องใช้โทเค็นที่มีขอบเขตการลบ ยืนยันการลบโดยแสดงรายการช่องทางอีกครั้ง
channel_id(integer, required):idจากget_notification_channelsกับscope=channelsระบบปฏิเสธ ID การผูก
did_you_mean
query(string, required): ชื่อที่ต้องการค้นหา — อาจเป็นบางส่วน สะกดผิด หรือย่อtype(string, optional): จำกัดตามประเภทเอนทิตี:service,environment,host,database,k8s_deployment,k8s_namespace,job
ส่งคืนรายการที่ตรงกันใกล้เคียงที่สุดไม่เกิน 3 รายการ พร้อมคะแนนความคล้ายคลึง ใช้เครื่องมือนี้ก่อนเรียกเครื่องมือใด ๆ เมื่อไม่แน่ใจเกี่ยวกับชื่อเอนทิตี หากการเรียกครั้งก่อนส่งคืนผลลัพธ์ว่าง ให้ลองใช้เครื่องมือนี้ก่อนเรียกซ้ำ
get_service_profile
service_name(string, required): บริการที่จะใช้สร้างโปรไฟล์ telemetrydatasource(string, optional): ชื่อ datasource ไม่ต้องระบุหากต้องการใช้ค่าเริ่มต้น; ชื่อโดยประมาณจะได้รับการแก้ไขเช่นเดียวกับเครื่องมือ Prometheus ส่งคืนสรุปการตรวจสอบฉบับย่อ ตามด้วยโปรไฟล์ฉบับเต็มในรูปแบบ JSON ดิบ: การมีสัญญาณ (logs/traces/metricsเป็นpresent,absentหรือunknown), ภาษาและ runtime, สภาพแวดล้อมการ deploy, logsignal_shape(log_format,severity_set,level_field,trace_context_in_logs) และวิธีแก้ไข ingest ที่แนะนำเมื่อเกี่ยวข้อง เมื่อ backend รายงานfreshnessสรุปจะเพิ่มบรรทัดlast seenพร้อมfreshness.logs.last_seenและfreshness.traces.last_seen(RFC3339 หรือnoneเมื่อเป็น null) และคำเตือนtraces staleเมื่อfreshness.traces_staleเป็นtrue: spans หยุดทำงานขณะที่ logs ยังทำงานต่อ ให้ตรวจสอบ regression ที่เกี่ยวข้องกับfreshness.traces.last_seenไม่ใช่การตั้งค่าที่ขาดหายไป ข้อมูลนี้ได้มาจาก upstream และแคชไว้โดยมี TTL ประมาณ 15 นาที
เรียกใช้ก่อนการตรวจสอบใดๆ ที่เจาะจงบริการ เพื่อให้เลือกเครื่องมือได้ตรงกับ telemetry จริงของบริการ — ข้ามเครื่องมือ trace เมื่อ traces เป็น absent และเมื่อ severity_set เป็น none หรือ partial ให้แยกวิเคราะห์ severity จาก level_field ในเนื้อหา log แทนการใช้ severity_filters metrics เป็น unknown เสมอ และ dependencies จะไม่มีการเติมค่าใน v1 เมื่อ logs และ traces เป็น absent ทั้งคู่ ให้ยืนยันชื่อด้วย did_you_mean ก่อนสรุปว่าบริการไม่ได้รับการตรวจติดตาม
list_dashboards
name(string, optional): ข้อความย่อยในชื่อแดชบอร์ด โดยไม่คำนึงถึงตัวพิมพ์เล็กหรือใหญ่ ใช้กรองรายการให้แคบลงและtotallimit(integer, optional): จำนวนแดชบอร์ดต่อหน้า 1–200 ค่าเริ่มต้น: 100cursor(string, optional):next_cursorจากหน้าก่อนหน้า ให้ส่งnameเดิมไปพร้อมกัน
ส่งคืน {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"} โดยเรียงจากรายการที่อัปเดตล่าสุดก่อน created_by จะไม่ปรากฏเมื่อไม่มีข้อมูล และ locked จะไม่ปรากฏเมื่อ API ไม่รายงาน readonly updated_at คือวินาทีของ Unix epoch ในรูปแบบสตริง ระบบอาจจบหน้าเร็วกว่ากำหนดเพื่อให้ข้อมูลมีขนาดไม่เกิน 32 KB; next_cursor จะไม่มีในหน้าสุดท้าย
get_dashboard
id(string, required): UUID ของแดชบอร์ดregion(string, optional): Region สำหรับเติมข้อมูลการ query ของ panel ค่าเริ่มต้นคือ region ของ datasource ที่กำหนดค่าไว้
ผลลัพธ์จะเพิ่ม locked ระดับบนสุด (false เมื่อ API ไม่ส่งค่ามา) และ created_by (user id ของผู้เขียน)
หากต้องการตั้ง alert บน panel โปรดดู last9://reference/alerting
validate_dashboard
อ่านอย่างเดียว ไม่สร้างหรืออัปเดตแดชบอร์ด ต้องระบุ dashboard_id หรือ dashboard_definition เพียงรายการเดียวเท่านั้น
dashboard_id(string, optional): UUID ของแดชบอร์ดที่บันทึกไว้ซึ่งต้องการตรวจสอบdashboard_definition(object, optional): เนื้อหาแดชบอร์ดแบบ inline ที่ยังไม่ได้บันทึก (dry run จริง) หากเป็น envelope สำหรับสร้าง{dashboard, metadata}ระบบจะแกะออกเป็นออบเจ็กต์dashboardstart_time_iso/end_time_iso(string, optional): ช่วงเวลาสำหรับตรวจสอบ (RFC3339) ต้องไม่เกิน 24hregion(string, optional): Region สำหรับการรัน query ของ panel
ส่งคืน dashboard_validation/v1: การจัดประเภท lint + execute แยกตาม panel (data / no_data / invalid / error) ผลลัพธ์ว่างใน Day-1 จะถูกจัดประเภทเป็น valid_no_data โดยไม่มีการ probe เพื่อวินิจฉัย แดชบอร์ดที่ไม่มี panel จะส่งคืน success: false พร้อม error: "no_panels" ฟิลด์ของ panel จากรูปแบบอื่น (Grafana gridPos, title, type และ targets สำหรับ panel ที่ต้องใช้ query) รวมถึงฟิลด์ที่ระบุชนิดไม่ถูกต้อง จะแสดงแยกตาม panel ใน shape_problems นับรวมใน summary.panels_invalid_shape และทำให้ overall เป็น fail
preview_dashboard
พรีวิวฝั่งไคลเอนต์แบบอ่านอย่างเดียว ส่ง dashboard (ออบเจ็กต์แดชบอร์ดที่ยังไม่ได้บันทึกจากคำขอ create) หรือ id พร้อม ops (operations ที่เรียงลำดับเหมือนกับ patch_dashboard) ต้องระบุ start_time_iso และ end_time_iso ซึ่งเป็น timestamp แบบ RFC3339 และครอบคลุมเวลาไม่เกิน 24 ชั่วโมง variables เป็นตัวเลือกและใช้ระบุค่า override แบบ scalar; หากไม่ระบุ จะใช้ค่าของแดชบอร์ดและค่าเริ่มต้นที่มีมาให้
{
"id": "dashboard-id",
"ops": [{"op": "update_panel", "panel_id": "panel-id", "fields": {"name": "Request latency"}}],
"start_time_iso": "2026-10-01T08:00:00Z",
"end_time_iso": "2026-10-01T09:00:00Z"
}
ส่งคืน saved: false สรุป validation ของ definition/query (รวมถึง definition_error เมื่อ schema สำหรับ create ไม่ตรงกัน) และ panels พร้อมสถานะ ok / empty / error, query ที่ resolve แล้ว และการวินิจฉัย target ระบบจะรัน PromQL และ LogJSON; query type ที่ไม่รองรับและตัวแปรที่ resolve ไม่ได้จะทำให้ panel เป็น error panel ที่ไม่ใช่ query และถูกต้องจะเป็น ok; definition ของ panel ที่ไม่ถูกต้องจะเป็น error Patch diff ประกอบด้วย panels_added สุทธิ, panels_changed (รวมการย้ายตำแหน่ง) และ panels_removed พร้อมการเปลี่ยนแปลงของ operation ตามลำดับ ID และดัชนีเริ่มจากศูนย์ใช้ระบุ panel; ดัชนีที่ถูกลบอ้างอิงถึงแดชบอร์ดต้นฉบับ panel ที่บันทึกไว้ต้องมี ID ที่ไม่ว่างและไม่ซ้ำกัน
ขีดจำกัด: 50 panel, 100 query, 100 operation, JSON ขนาด 65536 ไบต์ต่อรายการสำหรับแดชบอร์ดอินพุตและแดชบอร์ด candidate และกำหนดเวลารัน 60 วินาที Query ที่ resolve แล้วซึ่งมีขนาดเกิน 65536 ไบต์ในรูปแบบ JSON จะถูกปฏิเสธก่อนรัน หลักฐานจะเก็บตัวอย่างได้ไม่เกินสามรายการและ 1024 ไบต์ในรูปแบบ JSON ต่อ target โดยมี truncated: true เมื่อไม่มีการใส่ตัวอย่าง รายงาน JSON ที่มีขนาดเกิน 262144 ไบต์จะล้มเหลว พร้อมคำแนะนำให้ลดขนาดอินพุต
ไม่มีการสร้างหรืออัปเดตแดชบอร์ด การตรวจสอบนี้เทียบ candidate กับ schema สำหรับ create และ query โดยใช้ validator ที่มีอยู่ แต่ไม่ได้รับประกันว่า backend จะยอมรับหรือแสดงผลได้ ID ที่ backend กำหนด ค่าเริ่มต้น ฟิลด์ที่ถูกทิ้ง หรือการแก้ไขที่เกิดขึ้นพร้อมกัน อาจทำให้ผลลัพธ์ที่บันทึกไว้เปลี่ยนแปลง พรีวิวใช้ patch operations ในเครื่องและค่าเริ่มต้นของ panel-version แบบเดียวกับการเขียนข้อมูล
create_dashboard
สร้างใหม่เท่านั้น หลังจากการเรียกนี้ส่งคืน dashboard.id แล้ว ให้แก้ไข panel ด้วย patch_dashboard (หรือปรับโครงสร้างด้วย update_dashboard) — อย่าเรียกสร้างอีกครั้งเพื่อเพิ่ม ตัดออก หรือแก้ไข panel
dashboard(object, required): นิยามแดชบอร์ดที่มีnameและpanels[]แต่ละ panel ต้องมีname,version,layout(x,y,w,h),visualization.typeและqueries[]metadata(object, optional): metadata ของแดชบอร์ด — ฟิลด์_categoryและ_type(เช่น{"_category":"custom","_type":"metrics"})
update_dashboard
ใช้เพื่อปรับโครงสร้างแดชบอร์ดส่วนใหญ่เท่านั้น หากต้องการเพิ่ม แก้ไข ลบ หรือย้าย panel แต่ละรายการ ให้ใช้ patch_dashboard การแทนที่ทั้งหมดด้วย id (เนื้อหาเดียวกับ create): ต้องส่ง panel ทุกตัวมาใหม่ทั้งหมด
id(string, required): UUID ของแดชบอร์ดที่ต้องการอัปเดตdashboard(object, required): เนื้อหาแดชบอร์ดสำหรับแทนที่ทั้งหมด (รูปแบบเดียวกับ create)metadata(object, optional): metadata สำหรับแทนที่ แดชบอร์ดระบบแบบอ่านอย่างเดียวจะส่งคืนข้อผิดพลาดของเครื่องมือที่กู้คืนได้
patch_dashboard
ควรใช้แทน update_dashboard สำหรับการปรับแก้เล็กน้อย: panel ที่ไม่เปลี่ยนแปลงจะไม่ถูกส่งซ้ำ ระบบจะอ่านแดชบอร์ด ใช้ ops ตามลำดับ แล้วเขียนกลับ ดังนั้นการแก้ไขที่ทำจากที่อื่นระหว่างการอ่านกับการเขียนจะถูกเขียนทับ ส่งคืน {dashboard_id, changes[]}; ops ที่แดชบอร์ดมีอยู่แล้วจะถูกละไว้ และหากไม่มีรายการใดเปลี่ยนแปลง ระบบจะไม่เขียนข้อมูล ระบบจะตรวจสอบ diff กับข้อมูลที่อ่านใหม่หลังการเขียน: fields ของ panel แสดงค่าที่บันทึกไว้, not_stored แสดง keys ที่ API ตัดออก และ not_removed แสดง keys ที่ API เก็บไว้แม้จะมี null ค่าใน diff ที่ยาวเกิน 200 ตัวอักษรจะถูกย่อในตำแหน่งเดิม โดยคงชนิด JSON ไว้
id(string, required): UUID ของแดชบอร์ดที่ต้องการ patchops(array, required): Ops ที่ใช้ตามลำดับ หากรายการใดไม่ถูกต้อง จะไม่มีการเขียนข้อมูล และข้อผิดพลาดจะระบุรายการนั้นเป็นops[i]add_panel:panel(ออบเจ็กต์ panel ทั้งหมด;versionมีค่าเริ่มต้นเป็น 1),indexเป็นตัวเลือก (ตำแหน่งแทรกเริ่มจากศูนย์ ค่าเริ่มต้นคือเพิ่มต่อท้าย)update_panel:panel_id,fields(keys ระดับบนสุดของ panel ที่ต้องการแทนที่;nullใช้ลบ key; เปลี่ยนidไม่ได้)remove_panel:panel_idmove_panel:panel_id,index(ตำแหน่งหลังย้าย เริ่มจากศูนย์)set_title:title(ชื่อแดชบอร์ด)set_variable:variable; แทนที่ตัวแปรที่มีtargetเดียวกัน มิฉะนั้นจะเพิ่มต่อท้าย
delete_dashboard
id(string, required): UUID ของแดชบอร์ดที่ต้องการลบ ไม่สามารถลบแดชบอร์ดระบบแบบอ่านอย่างเดียวได้
set_dashboard_lock
id(string, required): UUID ของแดชบอร์ดlocked(boolean, required):trueใช้ล็อกแดชบอร์ด ส่วนfalseใช้ปลดล็อก
เครื่องมือเขียนข้อมูล ให้เรียกใช้เฉพาะเมื่อผู้ใช้ร้องขออย่างชัดเจนเท่านั้น เฉพาะผู้เขียนแดชบอร์ดหรือผู้ดูแลระบบขององค์กรเท่านั้นที่ล็อกหรือปลดล็อกได้ และแดชบอร์ดในตัวจะเป็นแบบอ่านอย่างเดียวเสมอ ส่งคืน {"id", "locked"} พร้อมสถานะผลลัพธ์ ขณะล็อกอยู่ update_dashboard, patch_dashboard และ delete_dashboard จะไม่ส่งคำขอเขียนข้อมูล และจะส่งคืนข้อผิดพลาดของเครื่องมือที่กู้คืนได้ซึ่งขึ้นต้นด้วย dashboard is locked โดยระบุชื่อผู้เขียนและแนะนำให้ปลดล็อกหรือคัดลอกแดชบอร์ดด้วย create_dashboard
list_dashboard_snapshots
dashboard_id(string, required): UUID ของแดชบอร์ดที่ต้องการแสดงรายการ snapshot
ส่งคืนเฉพาะ metadata (id, name, expires_at เป็นต้น) ใช้ get_dashboard_snapshot เพื่อดูข้อมูล panel ที่ถูกตรึงไว้
get_dashboard_snapshot
id(string, required): UUID ของ snapshot
ส่งคืน snapshot ที่ถูกตรึงไว้ฉบับเต็ม รวมถึง dashboard_definition, panel_data, time_range และ variables
delete_dashboard_snapshot
id(string, required): UUID ของ snapshot ที่ต้องการลบ
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(optional): ช่วงเวลา; ควรใช้ lookback หรือขอบเขต ISO ที่ระบุชัดเจน (ค่าเริ่มต้น 60m)region(string, optional): การกำหนด region ใหม่
ส่งคืนบริการที่มีข้อมูล profiling ในช่วงเวลานั้น เรียกใช้ก่อน get_flamegraph / get_top_functions / get_profile_summary
get_flamegraph
service(string, required): ชื่อบริการจากget_profile_servicesprofile_type(string, optional):cpu(ค่าเริ่มต้น),allocหรือwallระบุประเภทให้ชัดเจนเมื่อเปรียบเทียบช่วงเวลาenv/cluster/namespace/runtime(string, optional): ตัวกรองขอบเขตlimit(number, optional): จำนวนแถว stack ที่รวมแล้วสูงสุด (ค่าเริ่มต้น 1000, สูงสุด 10000)lookback_minutes/start_time_iso/end_time_iso/region(optional)
ส่งคืนต้นไม้ flamegraph แบบซ้อนกัน (name / value / self / children) truncated: true หมายความว่าถึงขีดจำกัดจำนวนแถวของ API แล้ว
get_top_functions
ใช้ตัวกรองเดียวกับ get_flamegraph ส่งคืนการจัดอันดับฟังก์ชันที่ร้อนแรงที่สุดตาม self-sample ผลลัพธ์อาจถูกตัดทอน ให้ตรวจสอบ truncated
get_profile_summary
ใช้ตัวกรองเดียวกับ get_flamegraph ส่งคืนการคัดกรองปัญหาของโปรไฟล์สำหรับบริการในรูปแบบภาษาธรรมชาติแบบสั้น
grafana_search_dashboards
query(string, optional): ข้อความย่อยในชื่อเรื่อง หากเว้นว่างจะแสดงรายการในวงกว้าง (ภายใต้ขีดจำกัด 5,000 แถว)
ส่งคืน {"dashboards":[…], "truncated":bool} พร้อม uid, title, uri, url, type, tags ใช้ uid พร้อม grafana_get_dashboard
grafana_get_dashboard
uid(string, required): uid ของแดชบอร์ด Grafanafull_json(boolean, optional): เมื่อเป็น true ให้ส่งคืน JSON ดิบของ Grafana แทนสรุปที่ผ่านการกรอง
สรุปเริ่มต้น: version, tags, ตัวแปร templating และ type/datasource/gridPos/targets ของแต่ละ panel Unknown plugin panel types จะแสดงใน unsupportedPanelTypes
grafana_list_folders
ไม่มีพารามิเตอร์ ส่งคืนโครงสร้างต้นไม้ของโฟลเดอร์
grafana_list_folder_dashboards
folder_uid(string, required): UID ของโฟลเดอร์ Grafana
ส่งคืน {"dashboards":[…], "truncated":bool} สำหรับแดชบอร์ดในโฟลเดอร์นั้น (แบ่งหน้าได้สูงสุด 5,000 รายการ)
grafana_list_datasources
ไม่มีพารามิเตอร์ ส่งคืนข้อมูลแหล่งข้อมูลในรูปแบบที่ปลอดภัย (ไม่มีฟิลด์ข้อมูลรับรอง)
การทดสอบ
เรียกใช้ตัววิเคราะห์ goroutine ของการทดสอบโดยไม่เรียกใช้การทดสอบแอปพลิเคชัน:
make lint-test
คำสั่งนี้จะเรียกใช้ตัววิเคราะห์ testinggoroutine ของ Go กับทุกแพ็กเกจ รวมถึงไฟล์
*_test.go และตรวจสอบกับฟิกซ์เจอร์ที่ไม่ปลอดภัยและปลอดภัย เวิร์กโฟลว์การทดสอบ CI ทั้งสองรายการเรียกใช้
go vet -testinggoroutine ./... เป็นขั้นตอนแยกต่างหาก ดังนั้นผลการทดสอบแพ็กเกจที่แคชไว้จึงไม่สามารถข้ามการบังคับใช้ lint ได้
แพ็กเกจรากยังเรียกใช้ตัววิเคราะห์เป็นการทดสอบด้วย ใช้ go test -count=1 ./...
สำหรับชุดทดสอบทั้งหมดโดยไม่ใช้แคชกับการตรวจสอบนี้: แคชการทดสอบของ Go ไม่ได้ติดตามไฟล์ซอร์สภายในแพ็กเกจที่อ่านโดยโปรเซสย่อยของตัววิเคราะห์ คำสั่ง
go test ./... แบบปกติอาจนำผลการทดสอบที่ผ่านของแพ็กเกจรากกลับมาใช้ได้ แม้ไฟล์เหล่านั้นจะเปลี่ยนแปลงแล้วก็ตาม
Fatal, Fatalf และ FailNow บน testing.T หรือ testing.B ต้องทำงานใน goroutine ของการทดสอบหลัก Worker ควรส่งข้อผิดพลาดกลับมาเพื่อให้ goroutine หลักตรวจสอบ:
errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
t.Fatal(err)
}
ตัววิเคราะห์ตรวจจับการเรียกโดยตรงใน closure ของ go func; ไม่ใช่การตรวจสอบระหว่างโพรซีเยอร์ทั่วไปสำหรับการตรวจสอบที่ซ่อนอยู่หลังการเรียก helper โดยพลการ การทดสอบการผสานรวมจะข้ามไป เว้นแต่จะตั้งค่า TEST_REFRESH_TOKEN
