Last9
resmiBawa konteks produksi real-time—log, metrik, dan trace—secara mulus ke lingkungan lokal Anda untuk memperbaiki kode secara otomatis lebih cepat.
Apa yang bisa Anda lakukan dengan Last9 MCP?
-
Investigate service health — Minta ringkasan armada yang diperingkat berdasarkan jumlah permintaan, throughput, dan tingkat error melalui
get_service_summary. -
Pull raw service logs — Ambil baris log yang difilter berdasarkan tingkat keparahan atau konten isi untuk layanan tertentu menggunakan
get_service_logs. -
Trace database performance — Temukan database, kueri lambat, dan pola kueri dengan
get_databasesserta alat terkait. -
Run PromQL queries — Jalankan kueri rentang atau instan terhadap metrik apa pun menggunakan
prometheus_range_queryatauprometheus_instant_query. -
Correlate changes with incidents — Ambil peristiwa perubahan deployment dan konfigurasi untuk memahami apa yang mengubah perilaku produksi melalui
get_change_events. -
Manage custom dashboards — Daftarkan, buat, perbarui, atau validasi dasbor secara terprogram dengan
list_dashboardsdancreate_dashboard.
Dokumentasi
Server MCP Last9

Agen AI Anda tidak tahu apa yang rusak di produksi. Ini yang memperbaikinya.
Server MCP Last9 menghubungkan Claude, Cursor, Windsurf, dan asisten AI berkemampuan MCP lainnya langsung ke data observabilitas produksi Anda — log, metrik, trace, pengecualian, kueri basis data, peringatan, dan deployment. Agen berhenti menebak dan mulai membaca sinyal yang sebenarnya.
Mulai dalam 30 detik (Hosted)
Tidak ada biner yang perlu diinstal. Tidak ada token yang perlu dikelola. Satu URL, OAuth di browser Anda, selesai.
Temukan slug organisasi Anda di 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
Ketik /mcp, pilih last9, autentikasi. Itu saja.
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Klik Connect, selesaikan OAuth.
VS Code
Membutuhkan v1.99+. Buka Command Palette → MCP: Add Server, tempel URL, autentikasi.
Atau langsung di settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > ikon roda gigi (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. Beri nama last9, tempel URL, autentikasi.
Membutuhkan akses admin ke organisasi Claude Anda.
Self-Hosted (STDIO)
Gunakan ini saat klien MCP Anda tidak mendukung transport HTTP, atau saat Anda membutuhkan server berjalan secara lokal.
Instalasi
Homebrew:
brew install last9/tap/last9-mcp
NPM:
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Rilis biner (Windows / manual):
Unduh dari GitHub Releases:
| Platform | Arsip |
|---|---|
| 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 |
Dapatkan Refresh Token
Hanya admin yang dapat membuat token.
- Buka API Access
- Klik Generate Token dengan izin Write
- Salin token tersebut
Konfigurasi Klien
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>"
}
}
}
}
Di mana menempelkan ini:
| Klien | Lokasi |
|---|---|
| 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 > ikon roda gigi (mcp_config.json) |
| VS Code | Bungkus dalam { "mcp": { "servers": { ... } } } di settings.json — detail |
Konfigurasi STDIO VS Code
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
Untuk NPM: gunakan "command": "npx" dan tambahkan "args": ["-y", "@last9/mcp-server@latest"].
Windows
Setelah mengunduh dari GitHub Releases, ekstrak dan arahkan ke path lengkap:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Rute NPM lebih mudah di Windows — tidak perlu mengelola path.
Variabel Lingkungan
| Variabel | Default | Deskripsi |
|---|---|---|
LAST9_REFRESH_TOKEN | (wajib) | Refresh token dari API Access |
LAST9_DATASOURCE | default org | Nama datasource/cluster — berguna saat Anda memiliki beberapa cluster Levitate |
LAST9_API_HOST | app.last9.io | Menimpa host API |
LAST9_TOOLSETS | semua tools | Toolset yang dipisahkan koma untuk diekspos (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias: LAST9_MCP_TOOLSETS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Entri maksimum untuk permintaan get_logs yang di-chunk |
LAST9_USE_LOG_SEARCH_API | false | Setel true untuk menjawab get_logs dan get_service_logs dengan satu panggilan pencarian sisi server alih-alih chunking sisi klien |
LAST9_DEBUG_CHUNKING | false | Setel true untuk mencatat detail perencanaan chunk untuk get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Setel false untuk mengaktifkan tracing OTel internal |
OTEL_SDK_DISABLED | — | Variabel env OTel standar. Menimpa LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | Endpoint kolektor OTLP (hanya saat telemetri diaktifkan) |
OTEL_EXPORTER_OTLP_HEADERS | — | Header auth OTLP (hanya saat telemetri diaktifkan) |
Yang Dapat Dilakukan
Kesehatan Layanan
get_service_summary— Baris(service, env)armada yang diperingkat: interval request_count, throughput_rpm, jumlah HTTP 4xx/5xx, dan jumlah error gRPCget_service_environments— Lingkungan yang tersedia untuk layanan Anda. Jalankan ini terlebih dahulu — alat APM lain membutuhkanenvdari siniget_service_performance_details— Rincian lengkap: throughput, tingkat error, p50/p90/p95/avg/max, apdex, ketersediaanget_service_operations_summary— Operasi yang dikelompokkan berdasarkan endpoint HTTP, panggilan DB, perpesanan, klien HTTPget_service_dependency_graph— Peta dependensi dengan throughput, latensi, dan tingkat error untuk upstream/downstream/infraget_apm_service_deviations— Bandingkan jendela saat ini dengan baseline durasi yang sama: regresi/perbaikan, rekonsiliasi Apdex, dan hasil akhir (armada atau layanan tunggal)get_exceptions— Pengecualian sisi server dengan filter layanan dan span
Observabilitas Basis Data
Empat tools yang langsung menuju kinerja basis data Anda, diturunkan dari span trace OpenTelemetry dan, jika trace tidak ada, metrik infrastruktur seperti CloudWatch. Tidak perlu instrumentasi tambahan jika Anda sudah menggunakan OTel.
get_databases— Temukan semua basis data di seluruh infrastruktur Anda: tipe DB, host, throughput (kueri/menit), latensi p95, tingkat error, jumlah layanan dependen. Juga menemukan basis data dari metrik infrastruktur seperti CloudWatch, tanpa memerlukan instrumentasi trace — baris tersebut membawa nilai aktivitas alih-alih metrik traceget_database_slow_queries— Eksekusi kueri paling lambat yang sebenarnya, diurutkan berdasarkan durasi, dengan ID trace untuk menelusuri trace lengkapget_database_queries— Pola dan agregat kueri: seberapa sering kueri dijalankan, durasi rata-rata/p95, tingkat errorget_database_server_metrics— Metrik sisi server dari host DB itu sendiri (CPU, koneksi, tingkat hit buffer — tergantung pada sistem DB Anda)
Mendukung PostgreSQL, MySQL, MongoDB, Redis, Aerospike, dan apa pun yang dilacak OTel dengan atribut db_system — plus basis data yang ditemukan dari metrik infrastruktur seperti CloudWatch, yang barisnya membawa nilai aktivitas alih-alih metrik trace.
Prometheus / PromQL
prometheus_range_query— Kueri rentang PromQL atas metrik apa punprometheus_instant_query— Kueri instan; gunakan fungsi rollup sepertiavg_over_time,sum_over_timeprometheus_label_values— Nilai label untuk deret tertentuprometheus_labels— Semua label yang tersedia untuk sebuah deret
Arahkan ini ke datasource/cluster yang berbeda dari default dengan menyetel LAST9_DATASOURCE.
Log
get_logs— Kueri log pipeline JSON lengkap (agregasi, filter, ekstraksi kolom)get_service_logs— Baris log mentah untuk sebuah layanan, dapat difilter berdasarkan tingkat keparahan dan konten isiget_log_attributes— Katalog global atribut dalam skema log untuk jendela waktuget_log_attributes_for_pipeline— Kolom log yang benar-benar ada untuk pipeline yang sedang berjalan (penemuan terbatas), masing-masing denganfilter_fieldyang tepatget_drop_rules— Aturan drop log dari Last9 Control Planeadd_drop_rule— Buat aturan drop baru untuk mengurangi volume log di sumbernya
Trace
get_traces— Kueri trace pipeline JSON untuk pencarian luas dan agregasiget_service_traces— Trace berdasarkan ID trace atau nama layanan yang tepat. Gunakan ini saat Anda memiliki ID trace — lebih cepatget_trace_attributes— Katalog global atribut dalam skema traceget_trace_attributes_for_pipeline— Atribut yang benar-benar ada untuk pipeline yang sedang berjalan (penemuan terbatas), masing-masing denganfilter_fieldyang tepatget_trace_attribute_values— Nilai berbeda untuk atribut trace, opsional dibatasi ke pipelineget_trace_attribute_deviations— Memberi peringkat nilai atribut yang berbeda antara dua kohort span terbatas (lambat vs cepat, error vs non-error, atau dua jendela waktu). Korelasi, bukan sebabget_trace_waterfall— Satu trace yang tepat sebagai waterfall induk/anak dengan self-time gabungan interval, span paling lambat, dan peringatan grafik
Peristiwa Perubahan & Peringatan
get_change_events— Deployment, perubahan konfigurasi, rollback. Korelasikan insiden dengan apa yang berubahget_alert_groups— Grup peringatan Compass yang dikonfigurasi dengan label metadata, tim, tier, dan jumlah aturan — termasuk grup tanpa aturan dan grup yang tidak memicuget_alert_config— Konfigurasi aturan peringatan — dapat dicari berdasarkan nama, tingkat keparahan, tipe, tagget_alerts— Peringatan yang sedang memicu dalam jendela waktuget_alert_rule_state— Status pemicuan historis (1/0) per aturan peringatan selama rentang waktu, dikelompokkan berdasarkanrule_id. Dapat difilter berdasarkan grup peringatan, nama aturan, filter label, dan status.get_notification_channels— Saluran notifikasi yang dikonfigurasi (Slack, PagerDuty, email, dll.)
Dasbor Kustom
list_dashboards— Semua dasbor kustom di org Anda: ID, nama, dan metadataget_dashboard— Definisi dasbor lengkap berdasarkan ID, termasuk panel dan kuerivalidate_dashboard— Lint + eksekusi + klasifikasi hanya-baca untuk id dasbor tersimpan ataudashboard_definitioninline selama jendela ≤24 jam. Tidak pernah membuat atau memperbarui dasborcreate_dashboard— Buat dasbor kustom baru sekali (panel, kueri, metadata). Setelah id dikembalikan, sempurnakan denganupdate_dashboard.update_dashboard— Sempurnakan dasbor yang ada berdasarkan ID (penggantian penuh; dasbor sistem hanya-baca mengembalikan error)delete_dashboard— Hapus dasbor kustom berdasarkan IDlist_dashboard_snapshots— Snapshot beku titik-waktu untuk sebuah dasbor (hanya metadata)get_dashboard_snapshot— Snapshot beku lengkap termasuk data panel untuk RCA / tampilan yang dapat dibagikandelete_dashboard_snapshot— Hapus snapshot beku berdasarkan ID
Profiling Berkelanjutan
Membutuhkan profiling berkelanjutan yang diaktifkan untuk org. Temukan layanan terlebih dahulu dengan get_profile_services, lalu tarik flamegraph atau fungsi yang diperingkat.
get_profile_services— Layanan yang memiliki data profiling di jendela (indeks sebelum kueri)get_flamegraph— Pohon flamegraph bersarang untuk satu layanan (cpudefault; jugaalloc,wall)get_top_functions— Peringkat sampel mandiri fungsi terpanas untuk satu layananget_profile_summary— Triage bahasa alami singkat dari profil untuk satu layanan
Dasbor Grafana
Tools hanya-baca terhadap instance Grafana org (melalui proxy Grafana Last9). Kolom kredensial tidak pernah dikembalikan ke model. Aktifkan dengan LAST9_TOOLSETS=grafana (atau biarkan toolset tidak disetel untuk semua tools).
grafana_search_dashboards— Mencari dashboard berdasarkan substring judul (dengan paginasi;truncated: truesaat batas tercapai)grafana_get_dashboard— Ringkasan dashboard berdasarkan uid (panel, variabel, target PromQL);full_json=trueuntuk JSON Grafana mentahgrafana_list_folders— Pohon foldergrafana_list_folder_dashboards— Dashboard dalam satu folder (dengan paginasi)grafana_list_datasources— Inventaris sumber data tanpa kredensial
Resolusi Nama Fuzzy
did_you_mean— Saat agen tidak yakin tentang nama entitas, ini mengembalikan kecocokan terdekat dari katalog Anda (layanan, lingkungan, host, database, deployment/namespace K8s, job). Hingga 3 saran dengan skor kemiripan. Server memanggil ini secara otomatis sebelum sebagian besar alat saat pencarian nama mengembalikan kosong.
Profil Layanan
get_service_profile— Seperti apa telemetri layanan sebenarnya, sebelum Anda menanyakannya: sinyal apa yang ada, bahasa dan runtime, lingkungan deployment, bentuk lognya, dan perbaikan ingest yang direkomendasikan jika berlaku. Memungkinkan agen melewati alat trace saat layanan tidak memiliki trace, dan mengurai tingkat keparahan dari isi log saatSeverityTextkosong, alih-alih memfilter berdasarkan itu dan tidak menemukan apa pun.
Cara Kerjanya
Tautan dalam di setiap respons. Setiap alat mengembalikan kolom deep_link — URL langsung ke dashboard Last9 untuk kueri dan rentang waktu yang tepat tersebut. Agen dapat memberikan tautan itu kepada Anda; Anda mengkliknya; Anda langsung di sana.
Kumpulan alat. Secara default, server mengekspos semua alat. Host otomasi yang hanya membutuhkan investigasi (log/trace/metrik/profil) dapat mengatur LAST9_TOOLSETS=investigate (atau meneruskan --toolsets=investigate) sehingga tools/list tetap kecil tanpa penonaktifan massal di sisi klien. Paket bernama: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Nama yang tidak dikenal gagal dengan cepat. Paket metrics saja tidak menyertakan list_datasources atau did_you_mean — gunakan investigate (atau gabungkan kumpulan alat) saat Anda membutuhkan bantuan penemuan tersebut.
Sumber daya referensi alat. Manual panjang logjson/tracejson/service-logs/metrics adalah sumber daya MCP (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation), bukan teks deskripsi alat yang selalu aktif. Aturan kueri penting tetap ada di deskripsi alat sehingga agen yang tidak pernah memanggil resources/read tetap mendapatkan panduan konstruksi yang benar. Temukan kolom khusus organisasi dengan get_log_attributes / get_log_attributes_for_pipeline (dan padanan trace-nya)—kolom tersebut tidak disuntikkan ke dalam deskripsi.
Hasil besar yang dipecah. get_logs dan get_traces menangani kumpulan hasil besar melalui pemecahan, bukan pemotongan. Batas default adalah 5000 entri untuk log; dapat dikonfigurasi melalui LAST9_MAX_GET_LOGS_ENTRIES.
Pengembangan
Mode HTTP, pengujian curl, membangun dari sumber
Menjalankan dalam Mode HTTP
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
Server dimulai di http://localhost:8080/mcp.
Menguji dengan curl
Handler Streamable HTTP berjalan dalam mode tanpa status, sehingga permintaan apa pun dilayani secara independen. Jabat tangan initialize dan header Mcp-Session-Id bersifat opsional — klien yang mengirimnya tetap berfungsi (header diterima dan diabaikan), dan klien juga dapat langsung melompat ke tools/list / tools/call. Setiap alat adalah kueri permintaan/respons independen; server tidak mengeluarkan notifikasi server→klien, sehingga GET /mcp (aliran SSE) mengembalikan 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
}
}
}'
Membangun dari Sumber
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 untuk pengembangan lokal. Untuk penggunaan aktual, endpoint HTTP yang dihosting lebih mudah.
Referensi Alat
Semua parameter, standar input waktu, dan detail
Input Waktu
- Waktu absolut (
start_time_iso/end_time_iso, atautime_iso) lebih diutamakan daripadalookback_minutes. - Untuk jendela relatif: gunakan
lookback_minutes. - Untuk jendela absolut: gunakan RFC3339/ISO8601 —
2026-02-09T15:04:05Z. YYYY-MM-DD HH:MM:SSlama diterima hanya untuk kompatibilitas.
get_exceptions
limit(integer, opsional): Jumlah maksimum pengecualian. Default: 20.lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional): Rentang waktu absolut.service_name(string, opsional): Filter berdasarkan layanan.span_name(string, opsional): Filter berdasarkan nama span.env(string, opsional): Filter berdasarkan lingkungan.
get_service_summary
start_time_iso/end_time_iso(string, opsional)env(string, opsional): Regex PromQL. Default ke.*. Pencocokan tepat memerlukan jangkar (mis.^prod$).sort_by(string, opsional):request_count(default),throughput_rpm,http_4xx_count,http_5xx_count, ataugrpc_error_count.limit(integer, opsional): Jumlah maksimum baris yang diperingkat. Diabaikan atau 0 berarti 10; nilai di atas 100 dibatasi ke 100.
get_service_environments
start_time_iso/end_time_iso(string, opsional)
Semua alat APM lainnya memerlukan nilai
env. Gunakan""jika ini mengembalikan kosong.
get_service_performance_details
service_name(string, wajib)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)env(string, opsional): Default keprod.
get_service_operations_summary
service_name(string, wajib)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)env(string, opsional): Default keprod.
get_service_dependency_graph
service_name(string, opsional)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)env(string, opsional): Default keprod.
get_apm_service_deviations
service_name(string, opsional): Diabaikan untuk cakupan armada; berikan untuk satu layanan dan korelasi operasinya.lookback_minutes(integer, opsional): Jendela saat ini. Default: 60.start_time_iso/end_time_iso(string, opsional): Jendela saat ini yang eksplisit.baseline_start_time_iso/baseline_end_time_iso(string, opsional): Baseline eksplisit. Default ke jendela dengan durasi sama yang tepat sebelumnya.datasource(string, opsional): Batasi perbandingan ke satu sumber data.env(string, opsional): Default keprod.max_services/max_operations(integer, opsional): Default 10, maks 10 masing-masing.
get_databases
env(string, opsional): Filter berdasarkan lingkungan. Menerima ekspresi reguler. Default: semua.lookback_minutes(integer, opsional): Default: 60. Jendela tidak boleh melebihi 7 hari.start_time_iso/end_time_iso(string, opsional)
get_database_slow_queries
db_system(string, opsional): mis.postgresql,mysql,mongodb,redis.host(string, opsional): Host database (net_peer_name).service_name(string, opsional): Nama layanan pemanggil.env(string, opsional)min_duration_ms(float, opsional): Durasi kueri minimum dalam ms.lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)limit(integer, opsional): Default: 20.
get_database_queries
db_system(string, opsional)host(string, opsional)service_name(string, opsional)env(string, opsional)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)limit(integer, opsional): Default: 20.
get_database_server_metrics
db_system(string, wajib): mis.postgresql,mysql,mongodb,redis,aerospike.host(string, opsional)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)
prometheus_range_query
query(string, wajib): Kueri PromQL.start_time_iso/end_time_iso(string, opsional): Default ke 60 menit terakhir.lookback_minutes(float, opsional): Default: 60.
prometheus_instant_query
query(string, wajib)time_iso(string, opsional): Default ke sekarang.lookback_minutes(float, opsional)
prometheus_label_values
match_query(string, opsional): Filter PromQL.label(string, wajib): Nama label.start_time_iso/end_time_iso(string, opsional)
prometheus_labels
match_query(string, opsional): Filter PromQL.start_time_iso/end_time_iso(string, opsional)
get_logs
logjson_query(array, wajib): Kueri pipeline JSON.lookback_minutes(integer, opsional): Default: 5.start_time_iso/end_time_iso(string, opsional)limit(integer, opsional): Default server: 5000.index(string, opsional):physical_index:<name>ataurehydration_index:<block_name>.
Untuk inventaris layanan berbasis log, kueri physical_index_service_count terlebih dahulu:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
Gunakan service_name sebagai ServiceName, env sebagai lingkungan saat ada, dan name sebagai nama indeks fisik. Jika name="default", abaikan index; untuk indeks fisik non-default yang dipilih pengguna, teruskan index: "physical_index:<name>". Jika backend menolak pemfilteran indeks fisik eksplisit, coba lagi tanpa index dan laporkan bahwa pemfilteran indeks fisik eksplisit tidak tersedia untuk backend tersebut.
get_service_logs
service_name(string, wajib)lookback_minutes(integer, opsional): Default: 60.limit(integer, opsional): Default: 20.env(string, opsional)severity_filters(array, opsional): mis.["error", "warn"]. Logika OR.body_filters(array, opsional): mis.["timeout", "failed"]. Logika OR.start_time_iso/end_time_iso(string, opsional)index(string, opsional)
Beberapa jenis filter digabungkan dengan AND. Setiap array menggunakan OR secara internal.
Gunakan get_logs untuk hitungan agregat luas terlebih dahulu; gunakan get_service_logs hanya setelah mempersempit ke layanan/env/index dan kumpulan sampel kecil.
get_log_attributes
lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional)region(string, opsional)index(string, opsional)
get_log_attributes_for_pipeline
pipeline(array, wajib): Tahap filter sebelumnya untuk mempersempit penemuan, mis.[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional)region(string, opsional)index(string, opsional)
get_drop_rules
Tidak ada parameter. Mencantumkan aturan drop melalui GET /otel_settings/drop?region=....
add_drop_rule
name(string, wajib)filters(array, wajib): Setiap filter:key,value,operator(equals/not_equals),conjunction(and).- Kunci filter harus menggunakan
attributes["key_name"]atauresource.attributes["key_name"](diwajibkan oleh API Last9). - Membuat aturan melalui
POST /otel_settings/drop?region=...&cluster_id=....
get_traces
Gunakan untuk pencarian luas dan agregasi. Untuk pencarian ID trace yang tepat, gunakan get_service_traces.
tracejson_query(array, wajib)start_time_iso/end_time_iso(string, opsional)lookback_minutes(integer, opsional): Default: 60.limit(integer, opsional): Default: 5000.
get_service_traces
Tepat satu dari trace_id atau service_name wajib diisi.
trace_id(string, opsional): Lookback default: 72 jam.service_name(string, opsional): Lookback default: 60 menit.lookback_minutes(integer, opsional)start_time_iso/end_time_iso(string, opsional)limit(integer, opsional): Default: 10.env(string, opsional)
get_trace_attributes
lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional)region(string, opsional)
get_trace_attributes_for_pipeline
pipeline(array, wajib): Tahap filter sebelumnya untuk membatasi cakupan penemuan, misalnya[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional)region(string, opsional)
get_trace_attribute_values
tag_name(string, wajib): Nama atribut dariget_trace_attributes(misalnyaresource_departmentatauattributes['http.method']).pipeline(array, opsional): Tahap filter sebelumnya untuk membatasi cakupan nilai; abaikan untuk nilai global.lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional): Batas historis RFC3339; lebih diutamakan daripadalookback_minutes.region(string, opsional)
get_trace_attribute_deviations
comparison_mode(string, wajib):latency,errors, atautime.service_name(string, wajib)environment(string, wajib): Nilaideployment.environmentyang tepat.operation(string, opsional)filters(array, opsional): Kondisi filter JSON trace.candidate_attributes(array, opsional): Maksimal 8; abaikan untuk penemuan terbatas.latency_threshold_ms(number, opsional): Wajib untuk modelatency; ditolak untuk mode lainnya.start_time_iso/end_time_iso(string, opsional)lookback_minutes(integer, opsional): Default: 15. Maksimum: 15.baseline_start_time_iso/baseline_end_time_iso(string, opsional): Wajib untuk modetime; tidak tumpang tindih dan durasinya sama dengan jendela target.minimum_cohort_size(integer, opsional): Default: 100. Minimum: 20.minimum_value_support(integer, opsional): Default: 20. Minimum: 10.limit(integer, opsional): Default: 10. Maksimum: 10.
Memerlukan kapabilitas backend pendamping yang diaktifkan.
get_trace_waterfall
trace_id(string, wajib)environment(string, opsional)start_time_iso/end_time_iso(string, opsional)lookback_minutes(integer, opsional): Default: 4320 (72 jam).selected_span_id(string, opsional): Mengembalikan atribut, peristiwa, dan tautan untuk span tersebut saja.max_spans(integer, opsional): Default: 500. Maksimum: 1000.
Mengembalikan envelope investigation-evidence/v1; waterfall berada di bawah data.
get_change_events
start_time_iso/end_time_iso(string, opsional)lookback_minutes(integer, opsional): Default: 60.service_name(string, opsional)env(string, opsional)event_name(string, opsional): Panggil tanpa ini terlebih dahulu untuk mendapatkanavailable_event_names.
get_alert_groups
Inventaris grup alert Compass yang dikonfigurasi untuk audit changeboard / cakupan label. Termasuk grup dengan nol aturan dan grup yang tidak aktif. Tidak mengembalikan PromQL.
alert_group_name/alert_group_type/data_source_name(string, opsional): Pencocokan substring tidak peka huruf besar/kecil.team/tier(string, opsional): Pencocokan tepat tidak peka huruf besar/kecil pada metadata yang dikonfigurasi.label_key+label_value(string, opsional): Harus diatur bersamaan. Pencocokan tepat tidak peka huruf besar/kecil pada satu pasanganmetadata.labels— baik kunci maupun nilai.
Mengembalikan JSON ringkas {"count":N,"groups":[...]} dengan id, name, type, entity_class, team, tier, metadata.labels, dan jumlah aturan. team / labels kosong berarti tidak diatur.
get_alert_config
search_term(string, opsional): Pencarian teks bebas di seluruh nama, grup, sumber data, tag.rule_name(string, opsional)severity(string, opsional)rule_type(string, opsional):staticatauanomaly.alert_group_name/alert_group_type/data_source_name(string, opsional)tags(array, opsional): Semua harus cocok (logika AND).
get_alerts
time_iso(string, opsional): Waktu evaluasi dalam RFC3339.window(integer, opsional): Lookback dalam detik. Default: 900. Rentang: 60–86400.lookback_minutes(integer, opsional): Rentang: 1–1440.
get_alert_rule_state
start_time(integer, wajib): Awal rentang dalam epoch Unix (inklusif).end_time(integer, wajib): Akhir rentang dalam epoch Unix (inklusif).step(integer, wajib): Resolusi dalam detik antar sampel. Jumlah sampel((end_time - start_time) / step + 1)dibatasi maksimal 100.alert_group_id(string, opsional): Filter berdasarkan ID grup alert.rule_name(string, opsional): Filter regex pada nama aturan.alert_group_name(string, opsional): Filter regex pada nama grup alert.label_filters(string, opsional): Filter labelkey=valueyang dipisahkan koma.state(string, opsional): Filter berdasarkan status (misalnyafiring).
Mengembalikan peta JSON dari rule_id -> [{timestamp, is_firing}]. Stempel waktu saat aturan tidak ada dalam respons upstream dilaporkan sebagai is_firing=0 — ini berarti "tidak teramati aktif", bukan status normal yang terkonfirmasi.
get_notification_channels
Tanpa parameter. Mengembalikan semua saluran notifikasi yang dikonfigurasi (Slack, PagerDuty, email, webhook, dll.).
did_you_mean
query(string, wajib): Nama yang dicari — sebagian, salah eja, atau disingkat.type(string, opsional): Batasi ke jenis entitas:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Mengembalikan hingga 3 kecocokan terdekat dengan skor kemiripan. Gunakan ini sebelum panggilan alat apa pun saat nama entitas tidak pasti. Jika panggilan sebelumnya mengembalikan hasil kosong, coba ini sebelum mencoba ulang.
get_service_profile
service_name(string, wajib): Layanan untuk membuat profil telemetri.datasource(string, opsional): Nama sumber data. Abaikan untuk default.
Mengembalikan ringkasan investigasi singkat diikuti profil lengkap sebagai JSON mentah: keberadaan sinyal (logs/traces/metrics sebagai present, absent, atau unknown), bahasa dan runtime, lingkungan deployment, signal_shape log (log_format, severity_set, level_field), dan perbaikan ingest yang direkomendasikan jika ada. Diturunkan dari upstream dan di-cache dengan TTL sekitar 15 menit.
Panggil sebelum investigasi apa pun yang berfokus pada layanan agar pemilihan alat sesuai dengan telemetri aktual layanan — lewati alat trace saat traces adalah absent, dan saat severity_set adalah none atau partial parse tingkat keparahan dari level_field di badan log daripada menggunakan severity_filters. metrics selalu unknown dan dependencies tidak terisi di v1. Saat logs dan traces keduanya absent, konfirmasi nama dengan did_you_mean sebelum menyimpulkan layanan tidak dipantau.
list_dashboards
Tanpa parameter. Mengembalikan semua dashboard kustom di organisasi sebagai array JSON dengan id, name, dan metadata.
get_dashboard
id(string, wajib): UUID dashboard.region(string, opsional): Wilayah untuk pengisian kueri panel. Default ke wilayah sumber data yang dikonfigurasi.
validate_dashboard
Hanya baca. Tidak pernah membuat atau memperbarui dashboard. Menerima tepat satu dari dashboard_id atau dashboard_definition.
dashboard_id(string, opsional): UUID dashboard tersimpan untuk divalidasi.dashboard_definition(object, opsional): Badan dashboard inline yang belum disimpan (uji coba sungguhan).start_time_iso/end_time_iso(string, opsional): Jendela validasi (RFC3339). Harus ≤ 24 jam.region(string, opsional): Wilayah untuk eksekusi kueri panel.
Mengembalikan dashboard_validation/v1: klasifikasi lint + eksekusi per panel (data / no_data / invalid / error). Hasil kosong hari pertama diklasifikasikan sebagai valid_no_data tanpa probe diagnostik.
create_dashboard
Hanya baru. Setelah panggilan ini mengembalikan dashboard.id, sempurnakan dengan update_dashboard — jangan buat lagi untuk menambah, memangkas, atau memperbaiki panel.
dashboard(object, wajib): Definisi dashboard dengannamedanpanels[]. Setiap panel memerlukanname,version,layout(x,y,w,h),visualization.type, danqueries[].metadata(object, opsional): Metadata dashboard — bidang_categorydan_type(misalnya{"_category":"custom","_type":"metrics"}).
update_dashboard
Utamakan ini setelah create. Penggantian penuh berdasarkan id (badan yang sama dengan create).
id(string, wajib): UUID dashboard untuk diperbarui.dashboard(object, wajib): Badan dashboard pengganti penuh (bentuk yang sama dengan create).metadata(object, opsional): Metadata pengganti. Dashboard sistem hanya baca mengembalikan kesalahan 403.
delete_dashboard
id(string, wajib): UUID dashboard untuk dihapus. Dashboard sistem hanya baca tidak dapat dihapus.
list_dashboard_snapshots
dashboard_id(string, wajib): UUID dashboard yang snapshot-nya akan didaftar.
Mengembalikan metadata saja (id, name, expires_at, dll.). Gunakan get_dashboard_snapshot untuk data panel yang dibekukan.
get_dashboard_snapshot
id(string, wajib): UUID snapshot.
Mengembalikan snapshot beku lengkap termasuk dashboard_definition, panel_data, time_range, dan variables.
delete_dashboard_snapshot
id(string, wajib): UUID snapshot untuk dihapus.
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(opsional): Jendela; lebih suka lookback atau batas ISO eksplisit (default 60 menit).region(string, opsional): Penimpaan wilayah.
Mengembalikan layanan yang memiliki data profiling di jendela tersebut. Panggil ini sebelum get_flamegraph / get_top_functions / get_profile_summary.
get_flamegraph
service(string, wajib): Nama layanan dariget_profile_services.profile_type(string, opsional):cpu(default),alloc, atauwall. Sematkan jenis saat membandingkan jendela.env/cluster/namespace/runtime(string, opsional): Filter cakupan.limit(number, opsional): Baris tumpukan agregat maksimum (default 1000, maks 10000).lookback_minutes/start_time_iso/end_time_iso/region(opsional).
Mengembalikan pohon flamegraph bersarang (name / value / self / children). truncated: true berarti batas baris API tercapai.
get_top_functions
Filter yang sama dengan get_flamegraph. Mengembalikan peringkat sampel mandiri dari fungsi terpanas. Mungkin terpotong; periksa truncated.
get_profile_summary
Filter yang sama dengan get_flamegraph. Mengembalikan triase bahasa alami singkat dari profil untuk layanan tersebut.
grafana_search_dashboards
query(string, opsional): Substring judul. Kosong mencantumkan secara luas (tergantung batas 5.000 baris).
Mengembalikan {"dashboards":[…], "truncated":bool} dengan uid, title, uri, url, type, tags. Gunakan uid dengan grafana_get_dashboard.
grafana_get_dashboard
uid(string, wajib): uid dashboard Grafana.full_json(boolean, opsional): Saat true, kembalikan JSON Grafana mentah alih-alih ringkasan yang difilter. Ringkasan default: versi, tag, variabel templating, dan tipe/ datasource/ gridPos/ target promQL dari setiap panel. Tipe panel plugin yang tidak dikenal muncul diunsupportedPanelTypes.
grafana_list_folders
Tanpa parameter. Mengembalikan pohon folder.
grafana_list_folder_dashboards
folder_uid(string, wajib): uid folder Grafana.
Mengembalikan {"dashboards":[…], "truncated":bool} untuk dasbor di folder tersebut (dipaginasi hingga 5.000).
grafana_list_datasources
Tanpa parameter. Mengembalikan proyeksi aman dari datasource (tanpa kolom kredensial).
Pengujian
Lihat TESTING.md untuk pengaturan dan instruksi tes integrasi.
