Last9

ทางการ

นำบริบทการผลิตแบบเรียลไทม์—ล็อก เมตริก และเทรซ—มาสู่สภาพแวดล้อมในเครื่องของคุณได้อย่างราบรื่น เพื่อแก้ไขโค้ดอัตโนมัติได้เร็วขึ้น

คุณทำอะไรได้บ้างด้วย Last9 MCP?

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

เอกสาร

Last9 MCP Server

last9 mcp demo

เอเจนต์ 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

เฉพาะ ผู้ดูแลระบบ เท่านั้นที่สร้างโทเค็นได้

  1. ไปที่ API Access
  2. คลิก Generate Token โดยกำหนดสิทธิ์ Write
  3. คัดลอกโทเค็น

การกำหนดค่า 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/DesktopSettings > Developer > Edit Config (claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > Cascade > MCP Marketplace > ไอคอนรูปเฟือง (mcp_config.json)
VS Codeครอบด้วย { "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_DATASOURCEorg defaultชื่อ datasource/cluster — มีประโยชน์เมื่อคุณมี Levitate clusters หลายรายการ
LAST9_FAKE_NOW_ISO(ไม่ได้กำหนด)ใช้สำหรับ evals/replays เท่านั้น ห้ามกำหนดใน production RFC3339 instant (เช่น 2026-01-02T15:04:05Z) ที่ใช้แทนเวลาปัจจุบันเมื่อคำนวณช่วงเวลาแบบสัมพัทธ์ เช่น lookback_minutes เพื่อให้รันซ้ำได้ผลเหมือนเดิม หากค่าไม่ถูกต้องจะเกิดข้อผิดพลาดตอนเริ่มต้น การหมดเวลา แคช และการหมดอายุของโทเค็นยังคงใช้เวลาจริง
LAST9_API_HOSTapp.last9.ioกำหนด API host เอง
LAST9_TOOLSETSเครื่องมือทั้งหมดtoolsets ที่ต้องการเปิดให้ใช้งาน คั่นด้วยจุลภาค (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all) ชื่อเรียก: LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalseกำหนด true เพื่อให้บริการเฉพาะเครื่องมือแบบอ่านอย่างเดียว ดู โหมดอ่านอย่างเดียว หากค่าไม่ใช่ boolean จะเกิดข้อผิดพลาดตอนเริ่มต้น ชื่อเรียก: LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—เครื่องมือเขียนที่คั่นด้วยจุลภาคซึ่งยังให้บริการในโหมดอ่านอย่างเดียว ชื่อเรียก: LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000จำนวนรายการสูงสุดสำหรับคำขอ get_logs แบบแบ่งส่วน
LAST9_USE_LOG_SEARCH_APIfalseกำหนด true เพื่อให้ตอบ get_logs และ get_service_logs ด้วยการค้นหาฝั่งเซิร์ฟเวอร์เพียงครั้งเดียว แทนการแบ่งส่วนฝั่ง client แต่ละครั้งใช้เวลาได้ 90 วินาที จากนั้นจะแนะนำให้จำกัดช่วงเวลาให้แคบลง หากได้ 502 หรือ 503 จะลองใหม่หนึ่งครั้งภายในเวลานั้น
LAST9_DEBUG_CHUNKINGfalseกำหนด true เพื่อบันทึกรายละเอียดการวางแผนแบ่งส่วนสำหรับ get_logs, get_service_logs, get_traces
LAST9_DISABLE_TELEMETRYtrueกำหนด false เพื่อเปิดใช้การติดตาม OTel ภายใน
OTEL_SDK_DISABLED—ตัวแปรสภาพแวดล้อม OTel มาตรฐาน ใช้แทนค่า LAST9_DISABLE_TELEMETRY
OTEL_EXPORTER_OTLP_ENDPOINT—OTLP 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_patternssample: ดึงและถอดรหัสตัวอย่าง; mine: วิเคราะห์หารูปแบบ; deep_link: ระบุ index ที่ไม่บังคับและสร้างลิงก์
get_logsfetch: ดึง ถอดรหัส และรวมผลลัพธ์ รวมถึงการลองใหม่และการตรวจสอบจำนวนที่ไม่บังคับ; count_sanity: การตรวจสอบแบบซ้อนที่ไม่บังคับ; post_process: คำแนะนำ สรุป และจัดรูปแบบ JSON; deep_link: ระบุ index และสร้างลิงก์
get_service_profilerequest: เตรียมและส่งคำขอผ่าน 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[] ให้บริการในทุก toolset
  • get_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 และจำนวนข้อผิดพลาด gRPC
  • get_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 clients
  • get_service_dependency_graph — แผนผัง dependencies พร้อม throughput, latency และ error rates สำหรับ upstream/downstream/infra
  • get_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 — แถวเหล่านั้นจะแสดงค่ากิจกรรมแทนเมตริก trace
  • get_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_time
  • prometheus_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 จะเป็น raw
  • get_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 Plane
  • add_drop_rule — สร้างกฎใหม่เพื่อทิ้ง log และลดปริมาณข้อมูลตั้งแต่ต้นทาง
  • get_remapping_rules — กฎการแมปใหม่ (logs_extract, logs_map, traces_map) จาก Last9 Control Plane
  • add_remapping_rule — สร้างกฎการแมปใหม่เพื่อดึงหรือแมปแอตทริบิวต์ของ log และ trace ขณะรับข้อมูลเข้า

Traces

  • get_traces — คิวรี trace แบบ JSON pipeline สำหรับการค้นหาและการรวมข้อมูลในวงกว้าง
  • get_service_traces — Traces ตาม trace ID หรือชื่อบริการที่ตรงกันทุกประการ ใช้เมื่อมี trace ID เพราะทำงานได้เร็วกว่า
  • get_trace_attributes — แค็ตตาล็อกส่วนกลางของแอตทริบิวต์ในสคีมา trace
  • get_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 ที่ยังไม่มีกฎใช้งาน — ต้องใช้ id create_alert และ validate_alert_expression
  • create_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_alert
  • create_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 webhook
  • attach_notification_channel — กำหนดเส้นทางช่องทางที่มีอยู่ไปยังกลุ่มการแจ้งเตือนสำหรับ breach, threat หรือทั้งสองอย่าง
  • detach_notification_channel — นำการแนบช่องทางกับกลุ่มการแจ้งเตือนรายการหนึ่งออก
  • delete_notification_channel — ลบช่องทางที่ไม่มีการแนบอยู่อย่างถาวร

เครื่องมือเขียนการแจ้งเตือน (create_kpi, create_alert, update_alert, patch_alert, delete_alert, create_alert_from_chart, mute_alert_group, acknowledge_alert, reassign_alert, create_notification_channel, attach_notification_channel, detach_notification_channel, delete_notification_channel) ต้องใช้ 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 และ queries
  • preview_dashboard — ดูตัวอย่างแบบอ่านอย่างเดียวของแดชบอร์ดหรือแพตช์ที่ยังไม่บันทึก: คิวรีที่แก้ไขแล้ว ผลลัพธ์ต่อ panel ที่มีขอบเขต และความแตกต่างสุทธิของ panel โดยไม่บันทึก
  • validate_dashboard — ตรวจ lint + ดำเนินการ + จัดประเภทแบบอ่านอย่างเดียว สำหรับ dashboard id ที่บันทึกไว้หรือ dashboard_definition แบบ inline ในช่วงเวลา ≤24h โดยไม่สร้างหรืออัปเดตแดชบอร์ด
  • create_dashboard — สร้างแดชบอร์ดแบบกำหนดเองใหม่ทั้งหมดเพียงครั้งเดียว (panels, queries, metadata) หลังได้รับ id แล้ว ให้แก้ไข panels ด้วย patch_dashboard
  • update_dashboard — ปรับโครงสร้างแดชบอร์ดที่มีอยู่เป็นส่วนใหญ่ตาม ID (แทนที่ทั้งหมด; system dashboards แบบอ่านอย่างเดียวจะแสดงข้อผิดพลาด) หากต้องการแก้ไข panel รายการเดียว ให้ใช้ patch_dashboard
  • patch_dashboard — แก้ไขแดชบอร์ดที่มีอยู่ตาม ID แบบเจาะจง (เพิ่ม/อัปเดต/นำออก/ย้าย panel, ตั้งชื่อเรื่อง, ตั้งค่า variable) โดยส่งคืน diff แบบย่อ ไม่ใช่แดชบอร์ดฉบับเต็ม
  • delete_dashboard — ลบแดชบอร์ดแบบกำหนดเองตาม ID
  • set_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 ดิบจาก Grafana
  • grafana_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 สำหรับขอบเขตทั้งสองค่า ส่วนเขตเวลาที่อยู่ตำแหน่งอื่นจะทำให้เกิดข้อผิดพลาด ไม่ต้องระบุหากต้องการเพียง now
  • timezone (สตริง ไม่บังคับ): ชื่อ 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 (จำนวนเต็ม ไม่บังคับ): จำนวนข้อยกเว้นสูงสุด ค่าเริ่มต้น: 20
  • lookback_minutes (จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (สตริง ไม่บังคับ): ช่วงเวลาแบบสัมบูรณ์
  • service_name (สตริง ไม่บังคับ): กรองตามบริการ
  • span_name (สตริง ไม่บังคับ): กรองตามชื่อ span
  • env (สตริง ไม่บังคับ): กรองตามสภาพแวดล้อม

get_service_summary

  • start_time_iso / end_time_iso (สตริง ไม่บังคับ)
  • env (สตริง ไม่บังคับ): regex ของ PromQL ค่าเริ่มต้นคือ .* การจับคู่แบบตรงตัวต้องใช้ anchor (เช่น ^prod$)
  • sort_by (สตริง ไม่บังคับ): request_count (ค่าเริ่มต้น), throughput_rpm, http_4xx_count, http_5xx_count หรือ grpc_error_count
  • limit (จำนวนเต็ม ไม่บังคับ): จำนวนแถวที่จัดอันดับสูงสุด ไม่ระบุหรือใส่ 0 หมายถึง 10; ค่าที่มากกว่า 100 จะถูกจำกัดไว้ที่ 100

get_service_environments

  • start_time_iso / end_time_iso (สตริง ไม่บังคับ)

เครื่องมือ APM อื่นทั้งหมดต้องใช้ค่า env หากค่านี้ว่าง ให้ใช้ ""

get_service_performance_details

โดยค่าเริ่มต้นจะส่งคืนสรุปแยกตามซีรีส์: points, missing_points (ช่วงเวลาที่ไม่มีทราฟฟิกซึ่งถูกตัดออกจากสถิติ), min, p50, p90, p99 (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 (จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (สตริง ไม่บังคับ)
  • env (สตริง ไม่บังคับ): ค่าเริ่มต้นคือ prod
  • top_n (จำนวนเต็ม ไม่บังคับ): จำนวนรายการสูงสุดในแต่ละรายการ top-operations/top-errors ค่าเริ่มต้น: 5 หรือ 10 เมื่อใช้ include_series=true สูงสุด 100
  • include_series (บูลีน ไม่บังคับ): ส่งคืนทุกจุดข้อมูลของทุกซีรีส์แทนสรุป ค่าเริ่มต้น: false

get_service_operations_summary

  • service_name (สตริง จำเป็น)
  • lookback_minutes (จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (สตริง ไม่บังคับ)
  • env (สตริง ไม่บังคับ): ค่าเริ่มต้นคือ prod

get_service_dependency_graph

  • service_name (สตริง ไม่บังคับ)
  • lookback_minutes (จำนวนเต็ม ไม่บังคับ): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (สตริง ไม่บังคับ)
  • env (สตริง ไม่บังคับ): ค่าเริ่มต้นคือ prod

get_apm_service_deviations

  • service_name (string, optional): เว้นว่างไว้สำหรับขอบเขตทั้ง fleet; ระบุสำหรับบริการหนึ่งรายการและความสัมพันธ์ของการดำเนินการ
  • lookback_minutes (integer, optional): ช่วงเวลาปัจจุบัน ค่าเริ่มต้น: 60
  • start_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): ค่าเริ่มต้นคือ prod
  • max_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, redis
  • host (string, optional): โฮสต์ฐานข้อมูล (net_peer_name)
  • service_name (string, optional): ชื่อบริการที่เรียกใช้
  • env (string, optional)
  • min_duration_ms (float, optional): ระยะเวลาคิวรีขั้นต่ำเป็น ms
  • lookback_minutes (integer, optional): ค่าเริ่มต้น: 60
  • start_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): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): ค่าเริ่มต้น: 20

get_database_server_metrics

  • db_system (string, required): เช่น postgresql, mysql, mongodb, redis, aerospike
  • host (string, optional)
  • lookback_minutes (integer, optional): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (string, optional)

prometheus_range_query

  • query (string, required): คิวรี PromQL
  • start_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): ตัวกรอง PromQL
  • label (string, required): ชื่อ label
  • lookback_minutes (float, optional): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (string, optional)

เมื่อไม่ได้ระบุช่วงเวลาและ match_query ระบุเมตริกหนึ่งรายการ (metric{...} หรือ {__name__="metric"}) ระบบจะลองค้นหาอีกครั้งหนึ่งในช่วง 4 วัน หากผลลัพธ์ในช่วง 60 นาทีว่างเปล่า; บล็อกข้อความที่สองจะระบุว่าผลลัพธ์ครอบคลุมช่วงเวลาใด

prometheus_labels

  • match_query (string, optional): ตัวกรอง PromQL
  • lookback_minutes (float, optional): ค่าเริ่มต้น: 60
  • start_time_iso / end_time_iso (string, optional)

ลองค้นหาเมตริกรายการเดียวที่ไม่พบผลลัพธ์อีกครั้งในช่วง 4 วัน เช่นเดียวกับ prometheus_label_values

get_logs

  • logjson_query (array, required): คิวรี pipeline แบบ JSON
  • lookback_minutes (integer, optional): ค่าเริ่มต้น: 5
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): ค่าเริ่มต้นของเซิร์ฟเวอร์: 5000
  • index (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_fields raw จะส่งคืนบรรทัด ผลลัพธ์แบบ 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): ค่าเริ่มต้น: 60
  • limit (integer, optional): ค่าเริ่มต้น: 100 หรือ 20 เมื่อใช้ response_mode: "raw"
  • env (string, optional)
  • severity_filters (array, optional): เช่น ["error", "warn"] ใช้ตรรกะ OR
  • body_filters (array, optional): เช่น ["timeout", "failed"] ใช้ตรรกะ OR
  • start_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): ค่าเริ่มต้น: 60
  • severity_filters / body_filters (array, optional): ใช้ตรรกะ OR เช่นเดียวกับ get_service_logs ตั้งค่า severity_filters เฉพาะเมื่อ get_service_profile รายงาน severity_set all; เมื่อใช้ none หรือ partial ระบบจะตัดบรรทัดที่ severity อยู่ใน body ออก
  • index (string, optional)
  • sample_size (integer, optional): จำนวนบรรทัดที่สุ่มจากช่วงเวลา โดยเรียงจากใหม่ไปเก่า ค่าเริ่มต้น: 1000, สูงสุด: 5000
  • top_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_size
  • change_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): ค่าเริ่มต้น: 15
  • start_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): ค่าเริ่มต้น: 15
  • start_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_map
  • region (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_attributes logs_map: service, severity หรือ resource_deployment.environment traces_map: service.
  • extract_type (string, logs_extract only, required there): json หรือ pattern.
  • action (string, logs_extract only): upsert (ค่าเริ่มต้น) หรือ insert.
  • prefix (string, logs_extract only)
  • preconditions (array, logs_extract only): มี {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 ของ trace
  • candidate_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_events change_events[] โดยไม่เปลี่ยนแปลง ใช้ metric.service, metric.deployment_environment และ values[].timestamp ที่เก่าที่สุด
  • service (string, optional): จำเป็นต้องใช้ร่วมกับ timestamp เมื่อไม่ได้ระบุ change_event
  • timestamp (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 หรือ anomaly
  • alert_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_dashboard
  • unit (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): เวลาประเมินในรูปแบบ RFC3339
  • window (integer, optional): ช่วงเวลาย้อนหลังเป็นวินาที ค่าเริ่มต้น: 900 ช่วงที่ใช้ได้: 60–86400
  • lookback_minutes (integer, optional): ช่วงที่ใช้ได้: 1–1440

get_alert_rule_state

  • start_time (integer or string, required): จุดเริ่มต้นของช่วง (รวม): วินาที Unix epoch (1718000000) หรือ RFC3339 (2024-06-10T06:13:20Z) ค่า epoch แบบมิลลิวินาที ไมโครวินาที และนาโนวินาทีจะถูกแปลงเป็นวินาที; ปฏิเสธค่าก่อน 2000-01-01
  • end_time (integer or string, required): จุดสิ้นสุดของช่วง (รวม) ในรูปแบบเดียวกัน
  • step (integer, required): ความละเอียดเป็นวินาทีระหว่างตัวอย่าง จำนวนตัวอย่าง ((end_time - start_time) / step + 1) จำกัดไว้ที่ 100 แต่ละตัวอย่างเป็นการเรียก upstream หนึ่งครั้ง ครอบคลุมช่วง min(step, 3600) วินาทีที่สิ้นสุด ณ เวลาประทับของตัวอย่าง ระบบดึงตัวอย่างครั้งละ 5 รายการ และเครื่องมือจะแสดงข้อผิดพลาดพร้อมคำแนะนำให้ลองใหม่หากใช้เวลานานกว่า 60 วินาที
  • alert_group_id (string, optional): กรองตาม ID กลุ่มการแจ้งเตือน
  • rule_name (string, optional): กรองชื่อ rule ด้วย regex
  • alert_group_name (string, optional): กรองชื่อกลุ่มการแจ้งเตือนด้วย regex
  • label_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 ค่าเริ่มต้น: 7d
  • limit (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_channel channels ส่งคืน 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 (ค่าเริ่มต้น) หรือ anomaly
  • severity (string, optional): breach (ค่าเริ่มต้น) หรือ threat
  • environment (string, optional): สภาพแวดล้อมและรูปแบบทราฟฟิก

validate_alert_expression

ทดลองประเมินนิพจน์โดยไม่บันทึก ใช้ก่อน create_alert / update_alert

  • entity_id (string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตี
  • expression (string, required): นิพจน์เลขคณิตที่ใช้ตัวบ่งชี้ซึ่งระบุด้วยชื่อ KPI ที่ตรงกันทุกประการ เช่น errors / requests หากชื่อมีช่องว่าง จุด หรือขีด ให้เขียนตามเดิม (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_count
  • service_name (string, required)
  • env (string, optional)
  • attributes (object, optional): มิติข้อมูลระบุตัวตนเพิ่มเติม โดยใช้ชื่อคีย์ที่เครื่องมือนี้รายงาน

create_alert

สร้างกฎในกลุ่มการแจ้งเตือนที่มีอยู่ โดยปิดใช้งานไว้เสมอ (เป็นฉบับร่าง แม้จะส่ง is_disabled=false มาก็ตาม) เรียก recommend_alert_config ก่อน จากนั้นเลื่อนสถานะด้วย patch_alert is_disabled=false หลังจากผู้ใช้ยืนยันเท่านั้น สร้างเพียงครั้งเดียวและเก็บ ID กฎที่ส่งคืนไว้ หาก rule_name ที่กลุ่มการแจ้งเตือนใช้อยู่แล้ว (ไม่แยกตัวพิมพ์เล็ก-ใหญ่) ระบบจะปฏิเสธโดยไม่สร้างสิ่งใด และระบุ id ของกฎที่มีอยู่

  • entity_id (string, required): UUID ของกลุ่มการแจ้งเตือน/เอนทิตี
  • alert_rule (object, required): เนื้อหากฎแบบระบุชนิดข้อมูลครบถ้วน รวมถึง primary_indicator และ expression_args ที่ผูกกับ KPI จริงของเอนทิตี คีย์ expression_args แต่ละรายการต้องเป็นชื่อที่ตรงกันทุกประการของ KPI ที่ผูกไว้ (ไม่ใช่ตัวยึดตำแหน่ง เช่น x) และ primary_indicator กับ expression ต้องใช้ชื่อเหล่านั้น กฎแบบคงที่ต้องมี condition, alert_condition และ eval_window (0–60 นาที) กฎแบบปรับตามข้อมูลใช้ expression = adaptive_std_cmp(<primary_indicator>, sensitivity, window); จากนั้นทั้งสามฟิลด์จะเป็นตัวเลือก (ค่าเริ่มต้นคือ expr > 0, count_true(result) >= 1, 1) ไม่สามารถตั้งค่า algorithm ได้ ข้อมูลบริบทสำหรับผู้รับผิดชอบให้ใส่ใน properties (คำอธิบาย, runbook, คำอธิบายประกอบ, query_mode)

การกำหนดเส้นทางการแจ้งเตือนตั้งค่าไว้ที่กลุ่มการแจ้งเตือน ไม่ใช่ที่กฎ

create_alert_from_chart

สร้างกฎเกณฑ์แบบคงที่จากแผนภูมิที่อธิบายโดย describe_alert_chart เช่นเดียวกับ create_alert กฎจะถูกสร้างเป็นฉบับร่างที่ปิดใช้งานและไม่ทำงาน ให้เลื่อนสถานะด้วย patch_alert is_disabled=false หลังจากผู้ใช้ยืนยันเท่านั้น API ของแผนภูมิจะสร้างกฎโดยเปิดใช้งานไว้ ดังนั้นเครื่องมือนี้จึงปิดใช้งานกฎทันทีหลังสร้าง หากทำไม่สำเร็จ ผลลัพธ์จะเป็นข้อผิดพลาดที่ระบุ id ของกฎ ซึ่งอาจกำลังทำงานอยู่

  • surface / chart_key / service_name / signal_key / name (string, required)
  • env (string, optional)
  • attributes (object, optional)
  • threshold (number, optional): หน่วยของสัญญาณ ต้องเป็น 0 ขึ้นไป สัญญาณที่ใช้หน่วยคะแนน เช่น apdex ต้องระบุค่าอย่างชัดเจน
  • threshold_operator (string, optional): > (ค่าเริ่มต้น), <, >=, <=, ==, !=
  • eval_window (integer, optional): นาที, 1–60 ค่าเริ่มต้น: 5
  • bad_minutes (integer, optional): 1–eval_window ค่าเริ่มต้น: 3
  • severity (string, optional): breach หรือ threat
  • description (string, optional)
  • group_id (string, optional): โดยปกติไม่ต้องระบุ

update_alert

แทนที่การกำหนดค่าการประเมินกฎทั้งหมด ดึงข้อมูลกฎก่อนด้วย get_alert_config หรือ get_entity_alert_rules ระบบจะปฏิเสธโดยไม่เปลี่ยนแปลงสิ่งใด หากไม่มีกฎดังกล่าวหรือกฎนั้นอยู่ในกลุ่มการแจ้งเตือนอื่น การดำเนินการนี้อาจลบกฎแบบ 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_alerts
  • action (string, optional): ack (ค่าเริ่มต้น) หรือ unack เฉพาะเจ้าของหรือผู้ดูแลระบบขององค์กรเท่านั้นที่ยกเลิกการรับทราบได้
  • mute_until (integer, optional): ใช้กับ ack เท่านั้น บันทึกการปิดเสียงที่คุณดำเนินการไปแล้วด้วย mute_alert_group หรือ patch_alert; ไม่ได้ปิดเสียงสิ่งใด

reassign_alert

มอบหมายการแจ้งเตือนที่มีเจ้าของอยู่แล้วให้ผู้ใช้อื่น หากยังไม่มีเจ้าของ ให้รับผิดชอบก่อน หากไม่มีการมอบหมายเนื่องจากการแจ้งเตือนไม่มีเจ้าของ ระบบจะแจ้งว่า get_alerts แสดงการแจ้งเตือนนั้นในชั่วโมงที่ผ่านมาหรือไม่ Last9 จะไม่แจ้งเตือนเจ้าของคนใหม่

  • alert_group_id / rule_id / rule_type (string, required): คัดลอกจากการแจ้งเตือนใน get_alerts
  • owner_email (string, optional): แนะนำให้ใช้; จับคู่กับผู้ใช้ที่ใช้งานอยู่ในองค์กรโดยไม่แยกตัวพิมพ์เล็ก-ใหญ่
  • owner_user_id (string, optional): ระบุ owner_email หรือ owner_user_id เพียงรายการเดียวเท่านั้น

create_notification_channel

สร้างช่องทาง แต่จะยังไม่กำหนดเส้นทางใดจนกว่าจะผูกด้วย attach_notification_channel สร้างเพียงครั้งเดียวและเก็บ id ไว้ ไม่มีเครื่องมือสำหรับอัปเดต ส่งคืนเฉพาะ id, name, type และ send_resolved

  • name (string, required): ต้องไม่ซ้ำกันในแต่ละประเภท; ห้ามมีเครื่องหมายโคลอน
  • type (string, required): slack, pagerduty, opsgenie, email หรือ generic_webhook
  • destination (string, required): URL ของ Slack Incoming Webhook (หรือ ID ช่องทางเมื่อใช้ slack_app_mode), routing key ของ PagerDuty, API key ของ Opsgenie, อีเมลที่ทำงานคั่นด้วยจุลภาคจากโดเมนใดก็ได้ ไม่จำกัดเฉพาะโดเมนขององค์กร (API ปฏิเสธที่อยู่อีเมลจากผู้ให้บริการส่วนบุคคล เช่น Gmail และองค์กรที่ใช้บัญชีเข้าสู่ระบบส่วนบุคคลจะยอมรับเฉพาะที่อยู่ของผู้ดูแลระบบเท่านั้น) หรือ URL ของ HTTPS webhook
  • slack_app_mode (boolean, optional): ใช้กับ Slack เท่านั้น ค่าเริ่มต้น: false
  • mention_handles (string, optional): คั่นด้วยจุลภาค เช่น user|U123ABC|name, special|here, special|channel
  • webhook_headers (object, optional): ใช้กับ generic_webhook เท่านั้น
  • webhook_ca_certificate (string, optional): ใช้กับ generic_webhook เท่านั้น; ใบรับรอง CA แบบ PEM หนึ่งใบ ขนาดไม่เกิน 64 KiB
  • send_resolved (boolean, optional): ค่าเริ่มต้น: true

attach_notification_channel

กำหนดเส้นทางจากช่องทางที่มีอยู่ไปยังกลุ่มการแจ้งเตือนหนึ่งกลุ่ม ทำซ้ำได้โดยไม่เกิดผลซ้ำ การผูกจะคัดลอกการตั้งค่าการส่งของช่องทาง (ส่วนหัว ใบรับรอง การกล่าวถึง) ณ เวลาที่ผูก หากการตั้งค่าของช่องทางเปลี่ยนภายหลัง ให้ผูกใหม่

  • channel_id (integer, required): ID ช่องทาง (get_notification_channels กับ scope=channels) ไม่ใช่ ID การผูก
  • alert_group_id (string, required): จาก get_alert_groups
  • severity (string, required): breach, threat หรือ both both จะสร้างการผูกสองรายการ; หากรายการที่สองล้มเหลว รายการแรกจะยังคงผูกอยู่ และข้อผิดพลาดจะระบุระดับความรุนแรงที่ต้องลองใหม่

detach_notification_channel

นำการผูกหนึ่งรายการออก ต้องใช้โทเค็นที่มีขอบเขตการลบ; โทเค็นที่มีขอบเขตการเขียนไม่สามารถยกเลิกการผูกได้

  • 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): บริการที่จะใช้สร้างโปรไฟล์ telemetry
  • datasource (string, optional): ชื่อ datasource ไม่ต้องระบุหากต้องการใช้ค่าเริ่มต้น; ชื่อโดยประมาณจะได้รับการแก้ไขเช่นเดียวกับเครื่องมือ Prometheus ส่งคืนสรุปการตรวจสอบฉบับย่อ ตามด้วยโปรไฟล์ฉบับเต็มในรูปแบบ JSON ดิบ: การมีสัญญาณ (logs/traces/metrics เป็น present, absent หรือ unknown), ภาษาและ runtime, สภาพแวดล้อมการ deploy, log signal_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): ข้อความย่อยในชื่อแดชบอร์ด โดยไม่คำนึงถึงตัวพิมพ์เล็กหรือใหญ่ ใช้กรองรายการให้แคบลงและ total
  • limit (integer, optional): จำนวนแดชบอร์ดต่อหน้า 1–200 ค่าเริ่มต้น: 100
  • cursor (string, optional): next_cursor จากหน้าก่อนหน้า ให้ส่ง name เดิมไปพร้อมกัน

ส่งคืน {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"} โดยเรียงจากรายการที่อัปเดตล่าสุดก่อน created_by จะไม่ปรากฏเมื่อไม่มีข้อมูล และ 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} ระบบจะแกะออกเป็นออบเจ็กต์ dashboard
  • start_time_iso / end_time_iso (string, optional): ช่วงเวลาสำหรับตรวจสอบ (RFC3339) ต้องไม่เกิน 24h
  • region (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 ของแดชบอร์ดที่ต้องการ patch
  • ops (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_id
    • move_panel: panel_id, index (ตำแหน่งหลังย้าย เริ่มจากศูนย์)
    • set_title: title (ชื่อแดชบอร์ด)
    • set_variable: variable; แทนที่ตัวแปรที่มี target เดียวกัน มิฉะนั้นจะเพิ่มต่อท้าย

delete_dashboard

  • id (string, required): UUID ของแดชบอร์ดที่ต้องการลบ ไม่สามารถลบแดชบอร์ดระบบแบบอ่านอย่างเดียวได้

set_dashboard_lock

  • id (string, required): UUID ของแดชบอร์ด
  • locked (boolean, required): true ใช้ล็อกแดชบอร์ด ส่วน false ใช้ปลดล็อก

เครื่องมือเขียนข้อมูล ให้เรียกใช้เฉพาะเมื่อผู้ใช้ร้องขออย่างชัดเจนเท่านั้น เฉพาะผู้เขียนแดชบอร์ดหรือผู้ดูแลระบบขององค์กรเท่านั้นที่ล็อกหรือปลดล็อกได้ และแดชบอร์ดในตัวจะเป็นแบบอ่านอย่างเดียวเสมอ ส่งคืน {"id", "locked"} พร้อมสถานะผลลัพธ์ ขณะล็อกอยู่ update_dashboard, patch_dashboard และ delete_dashboard จะไม่ส่งคำขอเขียนข้อมูล และจะส่งคืนข้อผิดพลาดของเครื่องมือที่กู้คืนได้ซึ่งขึ้นต้นด้วย dashboard is locked โดยระบุชื่อผู้เขียนและแนะนำให้ปลดล็อกหรือคัดลอกแดชบอร์ดด้วย create_dashboard

list_dashboard_snapshots

  • dashboard_id (string, required): UUID ของแดชบอร์ดที่ต้องการแสดงรายการ 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_services
  • profile_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 ของแดชบอร์ด Grafana
  • full_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


MseeP.ai Security Assessment Badge