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?
- Investigasi insiden produksi — Minta asisten Anda mengambil log, trace, metrik, pengecualian, dan peringatan yang aktif untuk suatu layanan agar dapat mendiagnosis penyebab kerusakan.
- Korelasikan perubahan dengan dampak — Periksa deployment dan perubahan konfigurasi, lalu bandingkan suatu layanan dan pemanggilnya sebelum dan sesudah perubahan untuk mengetahui apakah perubahan tersebut menyebabkan regresi.
- Kueri metrik Prometheus — Jalankan kueri rentang atau instan PromQL dan tampilkan nilai label untuk menjelajahi metrik apa pun di sumber data Anda.
- Periksa performa database — Temukan database, cari eksekusi kueri yang lambat, dan tinjau pola kueri serta metrik sisi server dari span OTel.
- Analisis trace dan profil — Ambil waterfall trace berdasarkan ID, urutkan deviasi atribut antar kohort, atau ambil flamegraph dan fungsi teratas untuk suatu layanan.
- Kelola peringatan dan dasbor — Tinjau cakupan dan kebersihan peringatan, buat atau ubah aturan peringatan, serta tampilkan, validasi, atau edit dasbor kustom.
Dokumentasi
Last9 MCP Server

Agen AI Anda tidak tahu apa yang rusak di lingkungan produksi. Ini memperbaikinya.
Last9 MCP Server menghubungkan Claude, Cursor, Windsurf, dan asisten AI lain yang mendukung MCP langsung ke data observabilitas produksi Anda — log, metrik, trace, pengecualian, kueri database, peringatan, dan deployment. Agen berhenti menebak dan mulai membaca sinyal yang sebenarnya.
Mulai dalam 30 detik (Hosted)
Tidak perlu memasang biner. Tidak perlu mengelola token. Satu URL, OAuth di browser, selesai.
Temukan slug org 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, lalu autentikasi. Selesai.
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Klik Connect, lalu selesaikan OAuth.
VS Code
Memerlukan v1.99+. Buka Command Palette → MCP: Add Server, tempel URL, lalu 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 gear (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, lalu autentikasi.
Memerlukan akses admin ke organisasi Claude Anda.
Self-Hosted (STDIO)
Gunakan opsi ini jika klien MCP Anda tidak mendukung transport HTTP, atau jika Anda perlu menjalankan server secara lokal.
Instalasi
Homebrew:
brew install last9/tap/last9-mcp
NPM:
Memerlukan Node.js 22.23.4+, 24.22.1+ atau 26.12.1+: rilis yang lebih lama menerima sertifikat TLS dari perantara eMudhra yang telah disusupi saat penginstal mengunduh biner.
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
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>"
}
}
}
}
Tempat 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 gear (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>"
}
}
}
}
Opsi 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 | org default | Nama datasource/cluster — berguna jika Anda memiliki beberapa cluster Levitate |
LAST9_FAKE_NOW_ISO | (tidak disetel) | Hanya untuk eval/replay; jangan pernah disetel di lingkungan produksi. Waktu RFC3339 (misalnya 2026-01-02T15:04:05Z) yang menggantikan waktu saat ini ketika menyelesaikan rentang relatif seperti lookback_minutes, sehingga proses dapat direproduksi. Nilai yang tidak valid menyebabkan kesalahan saat startup. Timeout, cache, dan kedaluwarsa token tetap menggunakan waktu nyata |
LAST9_API_HOST | app.last9.io | Ganti host API |
LAST9_TOOLSETS | semua tool | Toolset yang dipisahkan koma untuk ditampilkan (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias: LAST9_MCP_TOOLSETS |
LAST9_MCP_READ_ONLY | false | Setel true agar hanya menyajikan tool baca-saja; lihat Mode baca-saja. Nilai yang bukan boolean menyebabkan kesalahan saat startup. Alias: LAST9_READ_ONLY |
LAST9_MCP_ALLOW_WRITE_TOOLS | — | Tool tulis yang dipisahkan koma dan tetap disajikan dalam mode baca-saja. Alias: LAST9_ALLOW_WRITE_TOOLS |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Jumlah maksimum entri untuk permintaan get_logs yang dipecah menjadi beberapa bagian |
LAST9_USE_LOG_SEARCH_API | false | Setel true agar menjawab get_logs dan get_service_logs dengan satu panggilan pencarian di sisi server, bukan pemecahan menjadi beberapa bagian di sisi klien. Setiap panggilan mendapat waktu 90 detik, lalu memberikan saran untuk mempersempit rentang; respons 502 atau 503 dicoba ulang sekali dalam batas waktu tersebut |
LAST9_DEBUG_CHUNKING | false | Setel true untuk mencatat detail perencanaan pemecahan menjadi beberapa bagian untuk get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Setel false untuk mengaktifkan tracing OTel internal |
OTEL_SDK_DISABLED | — | Variabel lingkungan OTel standar. Mengganti LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | Endpoint kolektor OTLP (hanya saat telemetri diaktifkan) |
OTEL_EXPORTER_OTLP_HEADERS | — | Header autentikasi OTLP (hanya saat telemetri diaktifkan) |
Pengukuran waktu fase tool
Dengan telemetri internal diaktifkan, span tool menyertakan last9.phase.<phase>.duration_ms
(milidetik waktu nyata yang berlalu) dan last9.phase.<phase>.failed (apakah fase tersebut
mengembalikan kesalahan). Kolom yang sama juga dicatat sebagai log debug tool phase completed,
dengan tool dan phase, jika logger yang dikonfigurasi menerima rekaman debug.
Input, teks kueri, kredensial, dan isi kesalahan tidak ditambahkan melalui pengukuran waktu ini.
| Tool | Fase |
|---|---|
get_log_patterns | sample: mengambil dan mendekode sampel; mine: penambangan pola; deep_link: menyelesaikan indeks opsional dan membuat tautan |
get_logs | fetch: mengambil, mendekode, dan menggabungkan hasil, termasuk percobaan ulang dan pemeriksaan kewajaran jumlah opsional; count_sanity: pemeriksaan opsional bertingkat; post_process: panduan, ringkasan, dan pemformatan JSON; deep_link: penyelesaian indeks dan pembuatan tautan |
get_service_profile | request: menyiapkan dan mengirim permintaan melalui klien API bersama, lalu membaca seluruh respons sebelum pemformatan singkat |
Hanya fase yang dijalankan yang dicatat, termasuk pengambilan data yang gagal. Helper opsional
yang menekan kesalahan tetap mempertahankan perilaku tersebut; failed: false tidak menjamin bahwa
tautan opsional atau pemeriksaan jumlah tersedia. Durasi count_sanity yang bertingkat
sudah termasuk dalam fetch; jangan menjumlahkannya dua kali. Waktu pengambilan data mencakup pekerjaan klien,
jadi bukan pengukuran eksekusi backend saja. Bandingkan fase-fase ini pada rentang dan jalur pencarian
yang setara sebelum menyesuaikan sampling atau caching.
Untuk menyelidiki latensi, jalankan ulang layanan, datasource, indeks, rentang,
dan batas yang sama pada build baseline dan kandidat. Catat SHA build, total tool,
durasi fase, last9.logs.search_path, atribut percobaan ulang jika ada, dan
flag cakupan. Bandingkan panggilan yang lambat maupun yang umum. Pengambilan data atau
permintaan profil yang lambat menunjukkan fase jaringan/API yang perlu diselidiki; eksekusi backend
memerlukan bukti terkaitnya sendiri sebelum latensi ekor dikaitkan dengan backend.
Diagnostik ini saja tidak membuktikan adanya peningkatan latensi.
Mode baca-saja
--read-only (atau LAST9_MCP_READ_ONLY=true) hanya menyajikan tool beranotasi readOnlyHint: true, sehingga tidak ada tool yang dapat membuat, mengubah, atau menghapus aturan peringatan, kanal notifikasi, dasbor, atau aturan drop, mengakui atau menetapkan ulang peringatan, maupun membisukan grup. Tool tanpa anotasi dianggap sebagai tool tulis dan disembunyikan.
Untuk mempertahankan beberapa tool tulis, cantumkan dengan --allow-write-tools (atau LAST9_MCP_ALLOW_WRITE_TOOLS):
last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
- Server menolak untuk memulai jika nama yang diizinkan bukan tool tulis (salah ketik atau nama tool baca); kesalahan akan mencantumkan tool tulis yang valid.
--allow-write-toolstanpa--read-onlymenyebabkan kesalahan saat startup, karena semua tool tulis sudah disajikan.- Mode baca-saja dapat digabungkan dengan
--toolsets: tool hanya disajikan jika memenuhi keduanya.--toolsets=alerts --read-only --allow-write-tools=mute_alert_groupmenyajikan tool baca peringatan ditambahmute_alert_group; tool tulis yang diizinkan tetapi berada di luar toolset yang dipilih tetap disembunyikan. - Mode
--httpdandump-toolsmematuhi flag dan variabel lingkungan yang sama:go run . dump-tools --read-onlymencetak permukaan baca-saja, beserta instruksi server yang disajikannya diinstructions. - Deskripsi, skema, dan hasil tool baca, serta instruksi server, tidak pernah menyebut tool tulis yang disembunyikan. Tool tulis yang diizinkan tetap dapat menyebut saudara tersembunyinya (
create_alertmembuat aturan nonaktif yang diaktifkan olehpatch_alert), jadi izinkan pasangan seperti itu secara bersamaan.
Yang Dapat Dilakukan
Orientasi
get_workspace_overview— Panggilan pertama yang disarankan saat permintaan tidak menyebut layanan atau tool (permintaan yang menyebutkannya langsung menuju tool terkait): lingkungan, sinyal yang terlihat (log, trace, metrik) dalam satu jam terakhir, jumlah layanan dan grup peringatan, peringatan yang sedang aktif, serta waktu saat ini dalam satu panggilan ringan. Sinyal yang tidak terlihat dalam satu jam tersebut mungkin masih memiliki data lama, sehingga tetap dapat dikueri. Subpanggilan yang gagal membuat kolomnya bernilainulldan menambahkan entrierrors[]. Disajikan di setiap toolsetget_current_time— Waktu saat ini, beserta batas absolut untuklast 2h,yesterdayatausince yesterday 9am IST, dalam zona IANA atau singkatan umum apa pun. Disajikan di setiap toolset
Kesehatan Layanan
get_service_summary— Baris(service, env)armada yang diurutkan: request_count interval, throughput_rpm, jumlah HTTP 4xx/5xx, dan jumlah kesalahan gRPCget_service_environments— Lingkungan yang tersedia untuk layanan Anda. Jalankan ini terlebih dahulu — tool APM lainnya memerlukanenvdari siniget_service_performance_details— Rincian lengkap: throughput, tingkat kesalahan, p50/p90/p95/rata-rata/maksimum, apdex, ketersediaan (diringkas secara default; seri lengkap denganinclude_series)get_service_operations_summary— Operasi yang dikelompokkan berdasarkan endpoint HTTP, panggilan DB, messaging, klien HTTPget_service_dependency_graph— Peta dependensi dengan throughput, latensi, dan tingkat kesalahan untuk upstream/downstream/infraget_apm_service_deviations— Bandingkan rentang saat ini dengan baseline berdurasi sama: regresi/peningkatan, rekonsiliasi Apdex, dan hasil akhir (armada atau satu layanan)get_exceptions— Pengecualian sisi server dengan filter layanan dan span
Observabilitas Database
Empat tool yang langsung memeriksa performa database Anda, yang diturunkan dari span trace OpenTelemetry dan, jika trace tidak tersedia, metrik infrastruktur seperti CloudWatch. Tidak perlu instrumentasi tambahan jika Anda sudah menggunakan OTel.
get_databases— Temukan semua database di seluruh infrastruktur Anda: jenis DB, host, throughput (kueri/menit), latensi p95, tingkat kesalahan, jumlah layanan yang bergantung padanya. Juga menemukan database dari metrik infrastruktur seperti CloudWatch, tanpa memerlukan instrumentasi trace — baris tersebut menampilkan nilai aktivitas, bukan 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: frekuensi kueri dijalankan, durasi rata-rata/p95, tingkat kesalahanget_database_server_metrics— Metrik sisi server dari host DB itu sendiri (CPU, koneksi, rasio buffer hit — bergantung pada sistem DB Anda)
Mendukung PostgreSQL, MySQL, MongoDB, Redis, Aerospike, dan apa pun yang memiliki atribut db_system pada trace OTel — serta database yang ditemukan dari metrik infrastruktur seperti CloudWatch, yang barisnya menampilkan nilai aktivitas, bukan metrik trace.
Prometheus / PromQL
prometheus_range_query— Kueri rentang PromQL untuk metrik apa punprometheus_instant_query— Kueri instan; gunakan fungsi rollup sepertiavg_over_time,sum_over_timeprometheus_label_values— Nilai label untuk seri tertentuprometheus_labels— Semua label yang tersedia untuk suatu seri
Arahkan ini ke datasource/cluster yang berbeda dari default dengan mengatur LAST9_DATASOURCE, atau per panggilan dengan datasource. Jika datasource tidak disertakan, default akan digunakan; kecocokan hampir unik yang dianggap aman oleh matcher (seperti variasi huruf besar-kecil) akan menggunakan kecocokan terdekatnya. Nama yang memiliki huruf hilang, tambahan, atau tertukar tidak dijamin dapat diselesaikan secara otomatis: bahkan satu kandidat pun mungkin memerlukan konfirmasi jika perubahan tersebut dapat memengaruhi kode wilayah atau lingkungan. Kecocokan yang lebih longgar atau ambigu akan mengembalikan kandidat dan tidak menjalankan kueri (bukan kesalahan); nama yang tidak dikenal akan menghasilkan kesalahan. Blok konten tambahan menyebutkan datasource yang digunakan jika Anda tidak menyebutkan namanya secara persis. get_metric_status, get_service_profile, dan get_apm_service_deviations menyelesaikan datasource dengan cara yang sama.
Log
get_logs— Kueri log pipeline JSON lengkap (agregasi, filter, ekstraksi field)get_service_logs— Baris log untuk suatu layanan, dapat difilter berdasarkan tingkat keparahan dan konten isi; diringkas menjadi 20 baris kecuali jikaresponse_modeadalahrawget_log_patterns— Baris log layanan dalam rentang waktu yang dikelompokkan ke dalam templat pesan, dengan jumlah, waktu pertama/terakhir terlihat, campuran tingkat keparahan, dan sampelget_emerging_log_patterns— Templat log yang baru, meningkat, menurun, atau menghilang dibandingkan dengan jendela baseline, beserta jumlah dari keduanyaget_log_attributes— Katalog global atribut dalam skema log untuk rentang waktu tertentuget_log_attributes_for_pipeline— Field log yang benar-benar ada untuk pipeline yang sedang berjalan (penemuan dengan cakupan terbatas), masing-masing denganfilter_fieldpersisnyaget_drop_rules— Aturan pembuangan log dari Last9 Control Planeadd_drop_rule— Buat aturan pembuangan baru untuk mengurangi volume log di sumbernyaget_remapping_rules— Aturan pemetaan ulang (logs_extract,logs_map,traces_map) dari Last9 Control Planeadd_remapping_rule— Buat aturan pemetaan ulang yang mengekstrak atau memetakan atribut log dan trace saat ingest
Trace
get_traces— Kueri trace pipeline JSON untuk pencarian dan agregasi yang luasget_service_traces— Trace berdasarkan ID trace atau nama layanan yang persis. Gunakan ini jika 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 dengan cakupan terbatas), masing-masing denganfilter_fieldpersisnyaget_trace_attribute_values— Nilai unik untuk atribut trace, secara opsional dibatasi ke pipeline tertentuget_trace_attribute_deviations— Mengurutkan nilai atribut yang berbeda di antara dua kohor span berbatas (lambat vs cepat, error vs tanpa error, atau dua jendela waktu). Korelasi, bukan sebab-akibatget_trace_waterfall— Satu trace persis sebagai waterfall induk/anak dengan waktu mandiri gabungan interval, span paling lambat, dan peringatan grafik
Peristiwa Perubahan & Peringatan
get_change_events— Deployment, perubahan konfigurasi, rollback. Korelasikan insiden dengan perubahan yang terjadianalyze_change_impact— Apakah suatu perubahan menyebabkan masalah? Membandingkan layanan dan pemanggil langsungnya sebelum dan sesudah perubahan: sinyal utama, penyimpangan APM dan atribut trace, peringatan baru yang aktif, serta keputusan (regression likely/no significant change/insufficient data)get_alert_groups— Grup peringatan Compass yang dikonfigurasi dengan label metadata, tim, tier, dan jumlah aturan — termasuk grup tanpa aturan dan grup yang tidak sedang aktifget_alert_operations_summary— Kesehatan on-call selama suatu rentang waktu: peringatan yang dibuat vs diakui, backlog, pengiriman, dan denganinclude_rules, aturan paling berisik, flapping, dan tidak dirutekan. Setiap jumlah menyertakanstatus-nya (available/partial/unavailable)get_alert_coverage— Hal-hal yang tidak Anda pantau dengan peringatan: sinyal utama yang tidak tercakup, grup peringatan yang sepenuhnya dinonaktifkan atau tidak dirutekan, dan aturan yang dibisukan terlalu lama, masing-masing dengan alat perbaikan yang disarankan. Hanya baca.get_alert_config— Konfigurasi aturan peringatan — dapat dicari berdasarkan nama, tingkat keparahan, jenis, tagget_entity_kpis— Setiap KPI (id, nama, PromQL, unit) pada satu grup peringatan, termasuk KPI yang belum digunakan oleh aturan mana pun — id tersebut diperlukan olehcreate_alertdanvalidate_alert_expressioncreate_kpi— Buat KPI (PromQL + unit) pada grup peringatan jika tidak ada KPI yang sudah ada yang sesuai. Buat sekali dan simpan id yang dikembalikanget_alerts— Peringatan yang sedang aktif dalam rentang waktu tertentuget_alert_rule_state— Status aktif historis (1/0) per aturan peringatan selama rentang waktu, dikelompokkan berdasarkanrule_id. Dapat difilter berdasarkan grup peringatan, nama aturan, filter label, dan status.get_alert_hygiene— Aturan peringatan yang berisik, flapping, usang, dan tidak dirutekan selama 7 atau 30 hari, diurutkan, masing-masing dengan angka yang mendasari keputusan dan perbaikan yang disarankan. Hanya baca.get_notification_channels— Kanal notifikasi yang dikonfigurasi (Slack, PagerDuty, email, dll.).scope=channelsmencantumkan kanal itu sendiri (id untuk dilampirkan); defaultattachedmencantumkan lampiran per grup peringatanrecommend_alert_config— Panduan desain hanya-baca (siklus hidup, gerbang validasi, konteks penanggap) sebelum membuat aturan peringatanvalidate_alert_expression— Jalankan ekspresi peringatan dalam mode uji terhadap KPI grup peringatan tanpa menyimpan apa pundescribe_alert_chart— Hanya baca: sinyal yang dapat diberi peringatan (key, unit) pada bagan Discover (discover-service,discover-exceptions)create_alert— Buat aturan peringatan (statis, atau adaptif melaluiadaptive_std_cmp) dalam grup peringatan yang sudah ada; selalu dibuat dalam keadaan nonaktif sebagai draf. Buat sekali; sempurnakan denganupdate_alert/patch_alertcreate_alert_from_chart— Buat aturan peringatan ambang statis dari bagan Discover dalam satu panggilan. Seperticreate_alert, aturan dibuat dalam keadaan nonaktif sebagai drafupdate_alert— Penggantian penuh konfigurasi evaluasi aturan (dapat mengembalikan ID aturan pengganti)patch_alert— Perubahan sebagian pada aturan: aktifkan/jeda,mute_until, penanggapproperties, mingguanrecurring_mute_schedule(atauclear_recurring_mute_schedule)delete_alert— Hapus aturan peringatan secara permanenmute_alert_group— Bisukan (atau aktifkan kembali) setiap aturan dalam grup peringatan hingga tenggat waktuacknowledge_alert— Ambil alih peringatan yang sedang aktif, atau lepaskanreassign_alert— Serahkan peringatan yang sudah diakui kepada pengguna laincreate_notification_channel— Buat kanal Slack, PagerDuty, Opsgenie, email, atau webhook generikattach_notification_channel— Rutekan kanal yang sudah ada ke grup peringatan untukbreach,threat, atau keduanyadetach_notification_channel— Hapus satu lampiran kanal-ke-grup-peringatandelete_notification_channel— Hapus secara permanen kanal yang tidak memiliki lampiran
Alat penulisan peringatan (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) memerlukan token dengan cakupan write; delete_alert, detach_notification_channel dan delete_notification_channel memerlukan cakupan delete. Alat-alat tersebut hanya tersedia dalam toolset alerts.
Aturan, kanal, dan lampiran yang dibuat oleh alat-alat ini ditandai sebagai created_via: last9-mcp bersama nama dan versi klien MCP (pada aturan, anotasi _l9_created_via_ dan _l9_created_via_client_, yang dipertahankan oleh patch_alert dan update_alert dan tidak dapat diatur oleh pemanggil). get_entity_alert_rules dan get_notification_channels menampilkan penanda tersebut, dan delete_alert, detach_notification_channel serta delete_notification_channel memberi tahu agen agar hanya membersihkan sumber daya yang ditandai, kecuali jika pengguna menyebutkan sumber daya tertentu.
Dasbor Kustom
list_dashboards— Dasbor kustom yang difilter berdasarkan nama dan dipaginasi hingga di bawah 32 KB: ID, nama, waktu pembaruan terakhir, pembuat, dan status kunciget_dashboard— Definisi dasbor lengkap berdasarkan ID, termasuk panel dan kueripreview_dashboard— Pratinjau hanya-baca untuk dasbor atau patch yang belum disimpan: kueri yang telah diselesaikan, hasil terbatas per panel, dan perbedaan panel bersih; tidak pernah menyimpanvalidate_dashboard— Lint + eksekusi + klasifikasi hanya-baca untuk id dasbor tersimpan ataudashboard_definitioninline dalam jendela ≤24 jam. Tidak pernah membuat atau memperbarui dasborcreate_dashboard— Buat dasbor kustom baru sekali (panel, kueri, metadata). Setelah id dikembalikan, edit panel denganpatch_dashboard.update_dashboard— Susun ulang sebagian besar dasbor yang sudah ada berdasarkan ID (penggantian penuh; dasbor sistem hanya-baca akan menghasilkan kesalahan). Untuk mengedit panel satu per satu, gunakanpatch_dashboardpatch_dashboard— Edit dasbor yang sudah ada secara terarah berdasarkan ID (tambah/perbarui/hapus/pindahkan panel, atur judul, atur variabel); mengembalikan perbedaan ringkas, bukan dasbor lengkapdelete_dashboard— Hapus dasbor kustom berdasarkan IDset_dashboard_lock— Kunci atau buka kunci dasbor kustom berdasarkan ID (hanya pembuat atau admin organisasi); dasbor yang terkunci menolak pembaruan, patch, dan penghapusanlist_dashboard_snapshots— Snapshot titik waktu yang dibekukan untuk 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
Pembuatan dasbor tersedia melalui MCP prompts/list dan prompts/get, tanpa perlu memasang skill. Ketiga prompt tidak memerlukan argumen:
create_dashboard_guide— Penemuan, tata letak, dan pemilihan panel; validasi seluruh kandidat dan jalankan kueri setiap panel sebelum persetujuan, buat sekali, terapkan patch untuk edit terarah, lalu baca kembali.dashboard_examples— Contoh lengkap yang mencakup RED layanan, latensi endpoint, kelas status, kesehatan host, jumlah log, dan panel trace, dengan variabel dependen.query_guide— Semantik counter/gauge/histogram dan metrik trace turunan, instan vs rentang, jendela rate, batas persentase, serta aturan logjson/tracejson.
Konten yang sama dapat dibaca di last9://reference/create_dashboard_guide, last9://reference/dashboard_examples, dan last9://reference/query_guide. Prompt dan resource tetap dapat ditemukan di setiap toolset; untuk menjalankan alur kerja diperlukan alat yang relevan (untuk pembuatan konten dengan sinyal campuran, gunakan --toolsets=dashboards,investigate, yang juga berfungsi sebagai list_datasources). Sesi hanya-baca dapat menyiapkan dan memvalidasi, tetapi tidak dapat menyimpan. Periksa ketersediaan alat sebelum mengikuti langkah-langkahnya.
Pemeriksaan panel saat ini menggunakan prometheus_range_query, prometheus_instant_query, get_logs dan get_traces bersama validate_dashboard. Jenis kueri yang tidak didukung validator dan default yang disederhanakan tidak menjamin kesetaraan rendering. Langkah pemeriksaan kueri terpisah akan beralih ke query_panel setelah #475 dirilis.
Profiling Berkelanjutan
Memerlukan profiling berkelanjutan yang diaktifkan untuk organisasi. Temukan layanan terlebih dahulu dengan get_profile_services, lalu ambil flamegraph atau fungsi yang diurutkan.
get_profile_services— Layanan yang memiliki data profiling dalam rentang waktu tersebut (indeks sebelum kueri)get_flamegraph— Pohon flamegraph bertingkat untuk satu layanan (cpudefault; jugaalloc,wall)get_top_functions— Peringkat sampel mandiri fungsi terpanas untuk satu layananget_profile_summary— Triage singkat dalam bahasa alami untuk profil satu layanan
Dasbor Grafana
Alat hanya-baca untuk instance Grafana organisasi (melalui proksi Grafana Last9). Kolom kredensial tidak pernah dikembalikan ke model. Aktifkan dengan LAST9_TOOLSETS=grafana (atau biarkan toolset tidak disetel untuk semua alat).
grafana_search_dashboards— Cari dasbor berdasarkan substring judul (berhalaman;truncated: truesaat batas tercapai)grafana_get_dashboard— Ringkasan dasbor berdasarkan uid (panel, variabel, target PromQL);full_json=trueuntuk JSON Grafana mentahgrafana_list_folders— Pohon foldergrafana_list_folder_dashboards— Dasbor dalam satu folder (berhalaman)grafana_list_datasources— Inventaris sumber data tanpa kredensial
Resolusi Nama Fuzzy
did_you_mean— Saat agen tidak yakin dengan nama entitas, alat ini mengembalikan kecocokan terdekat dari katalog Anda (layanan, lingkungan, host, basis data, deployment/namespace K8s, job). Hingga 3 saran dengan skor kemiripan. Server memanggil alat ini secara otomatis sebelum sebagian besar alat ketika pencarian nama tidak menghasilkan apa pun.
Profil Layanan
get_service_profile— Gambaran telemetri layanan yang sebenarnya sebelum Anda membuat kueri: sinyal yang tersedia, bahasa dan runtime, lingkungan deployment, bentuk log, serta perbaikan ingest yang disarankan jika berlaku. Memungkinkan agen melewati alat trace saat layanan tidak memiliki trace, dan mengurai tingkat keparahan dari isi log ketikaSeverityTextkosong, alih-alih memfilternya dan tidak menemukan apa pun.
Cara Kerjanya
Tautan langsung di setiap respons. Setiap alat mengembalikan kolom deep_link — URL langsung ke dasbor Last9 untuk kueri dan rentang waktu tersebut. Agen dapat memberikan tautannya kepada Anda; Anda mengekliknya; lalu Anda langsung berada di sana.
Toolset. Secara default, server menyediakan semua alat. Host otomatisasi yang hanya memerlukan investigasi (log/trace/metrik/profil) dapat menyetel LAST9_TOOLSETS=investigate (atau meneruskan --toolsets=investigate) agar tools/list tetap ringkas tanpa perlu menonaktifkan banyak alat di sisi klien. Paket bernama: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Nama yang tidak dikenal akan langsung menyebabkan kegagalan. get_current_time dan get_workspace_overview tersedia di setiap toolset. Dalam mode HTTP, permintaan dapat mempersempitnya lebih lanjut dengan header X-Last9-Toolsets (lihat Toolset per permintaan). Paket alerts juga menyediakan prometheus_range_query dan get_dashboard yang hanya-baca, yang dipanggil oleh prompt author-alert. Paket metrics saja tidak mencakup list_datasources atau did_you_mean — gunakan investigate (atau gabungkan toolset) jika Anda memerlukan alat bantu penemuan tersebut.
Sumber referensi alat. Panduan 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, last9://reference/alerting), bukan teks deskripsi alat yang selalu disertakan. Panduan pemberitahuan mencakup tata bahasa ekspresi pemberitahuan, kolom statis vs adaptif, satuan, hal yang diperiksa oleh validate_alert_expression, serta templat aturan latensi / tingkat kesalahan / saturasi. Aturan kueri penting tetap ada dalam deskripsi alat agar agen yang tidak pernah memanggil resources/read tetap mendapatkan panduan penyusunan kueri yang benar. Temukan kolom khusus organisasi dengan get_log_attributes / get_log_attributes_for_pipeline (dan padanannya untuk trace)—kolom tersebut tidak disisipkan ke dalam deskripsi.
Hasil besar yang dipecah menjadi beberapa bagian. get_logs dan get_traces menangani kumpulan hasil besar dengan membaginya menjadi beberapa bagian, bukan memotongnya. Batas default adalah 5000 entri untuk log; dapat dikonfigurasi melalui LAST9_MAX_GET_LOGS_ENTRIES.
Pengembangan
Mode HTTP, pengujian curl, membangun dari sumber
Jalankan 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.
Uji dengan curl
Handler Streamable HTTP berjalan dalam mode stateless, sehingga setiap permintaan dilayani secara terpisah. Handshake initialize dan header Mcp-Session-Id bersifat opsional — klien yang mengirimkannya tetap berfungsi (header diterima dan diabaikan), dan klien juga dapat langsung menjalankan tools/list / tools/call. Setiap alat merupakan kueri permintaan/respons yang independen; server tidak mengirim 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
}
}
}'
Toolset per permintaan
Dalam mode HTTP, permintaan dapat mempersempit cakupan alatnya dengan header X-Last9-Toolsets, atau parameter kueri toolsets untuk klien yang tidak dapat menyetel header (/mcp?toolsets=logs,traces). Jika keduanya dikirim, header yang tidak kosong akan diutamakan. Nilainya menggunakan nama yang sama, dipisahkan koma, seperti --toolsets. Permintaan hanya mendapatkan irisan dengan --toolsets saat startup: cakupannya dapat dipersempit, tetapi tidak diperluas, dan all atau nilai kosong akan mempertahankan set startup. Nama yang tidak dikenal akan menghasilkan 400 yang menyebutkan nama tersebut. tools/list, tools/call, dan instruksi initialize semuanya mengikuti set efektif; get_current_time dan get_workspace_overview tetap tersedia di setiap set.
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": {}}'
Setiap set efektif yang berbeda dilayani oleh servernya sendiri, yang dibuat pada permintaan pertamanya (puluhan milidetik) dan dipertahankan hingga shutdown; permintaan yang menyatakan ulang set startup akan menggunakan kembali server startup. Tidak ada penghapusan dari cache: hanya toolset bernama yang diterima, sehingga cache menampung paling banyak satu server untuk setiap kombinasi toolset tersebut (saat ini 135, sekitar 75 MB heap aktif secara keseluruhan; cache penuh stabil di sekitar 230 MB memori residen dalam pengujian).
Bangun 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 ditujukan untuk pengembangan lokal. Untuk penggunaan sebenarnya, endpoint HTTP ter-host 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 rentang relatif: gunakan
lookback_minutes. - Untuk rentang absolut: gunakan RFC3339/ISO8601 —
2026-02-09T15:04:05Z. YYYY-MM-DD HH:MM:SSlama diterima hanya untuk kompatibilitas.- Ubah frasa seperti
since yesterday 9am ISTmenjadi batas RFC3339 denganget_current_time.
get_workspace_overview
Tanpa parameter. Memeriksa 60 menit terakhir secara bersamaan, setiap subpanggilan dengan batas waktu singkat, dan mengembalikan current_time, lookback_minutes, environments, telemetry (boolean logs/traces/metrics), service_count (peringkat get_service_summary layanan unik, setiap lingkungan), alert_group_count, firing_alert_count, dan errors ([{field, error}]). Kolom yang subpanggilannya gagal bernilai null (tidak diketahui), bukan 0 atau false. Pemeriksaan ini tidak dipersempit oleh --toolsets: toolset memfilter alat yang disediakan, sedangkan token API menentukan data yang dapat dibaca server.
get_current_time
range(string, opsional):last 2h,past 30 minutes,last 7d(s, m, h, d = 24h, w = 7d; maksimum 366d);today;yesterday;since <point>;<point> to <point>. Titik waktu menggunakan RFC3339, atautoday/yesterday/ hari dalam seminggu (monday,mon: kemunculan terbarunya, termasuk hari ini) /YYYY-MM-DDdengan9am,9:30pm, atau14:30opsional. Zona di akhir menggantikantimezoneuntuk kedua batas; zona di tempat lain akan menyebabkan kesalahan. Kosongkan untuk hanya mendapatkannow.timezone(string, opsional): Nama atau singkatan IANA (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). Default UTC. Zona yang tidak dikenal akan menyebabkan kesalahan, begitu pulaCSTyang ambigu (gunakanAmerica/ChicagoatauAsia/Shanghai).
Mengembalikan now (serta start/end dengan range) sebagai {iso, epoch_seconds, local}; local hanya muncul untuk zona non-UTC.
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-nya.*. Kecocokan persis memerlukan jangkar (misalnya^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 berperingkat. Kosongkan atau isi 0 untuk menggunakan 10; nilai di atas 100 dibatasi menjadi 100.
get_service_environments
start_time_iso/end_time_iso(string, opsional)
Semua alat APM lainnya memerlukan nilai
env. Gunakan""jika hasil ini kosong.
get_service_performance_details
Secara default, mengembalikan ringkasan per seri: points, missing_points (bucket ketersediaan tanpa trafik, dikecualikan dari statistik), min, p50, p90, p99 (peringkat terdekat), max, mean, last, baseline_mean (rata-rata dari separuh pertama titik valid, bukan dari rentang waktu), delta_pct (separuh kedua titik valid dibandingkan dengan baseline; tidak ada jika baseline 0), dan hingga 3 change_points (timestamp, before_mean, after_mean), untuk maksimal 4 seri per metrik dan setiap kuantil waktu respons (rata-rata tertinggi lebih dahulu; series_omitted menghitung sisanya). Seri dengan points: 0 tidak memiliki statistik, dan baseline_mean/delta_pct memerlukan setidaknya 6 titik (3 per separuh). full_series menandakan bahwa titik mentah tersedia melalui include_series.
service_name(string, wajib)lookback_minutes(integer, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)env(string, opsional): Default-nyaprod.top_n(integer, opsional): Jumlah maksimum entri per daftar operasi teratas/kesalahan teratas. Default: 5, atau 10 denganinclude_series=true. Maksimum 100.include_series(boolean, opsional): Kembalikan setiap titik dari setiap seri, bukan ringkasannya. Default: false.
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-nyaprod.
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-nyaprod.
get_apm_service_deviations
service_name(string, opsional): Kosongkan untuk cakupan seluruh fleet; isi 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 ditentukan secara eksplisit.baseline_start_time_iso/baseline_end_time_iso(string, opsional): Baseline yang ditentukan secara eksplisit. Default-nya adalah jendela berdurasi sama yang tepat mendahului jendela saat ini.datasource(string, opsional): Kosongkan untuk menggunakan default; nama perkiraan dicocokkan seperti pada alat Prometheus. Respons menyebutkan default atau kecocokan terdekat yang digunakan; nama ambigu mengembalikan kandidat tanpa melakukan kueri.env(string, opsional): Default-nya adalahprod.max_services/max_operations(integer, opsional): Default 10, maksimum 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): misalnyapostgresql,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): misalnyapostgresql,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-nya adalah 60 menit terakhir.lookback_minutes(float, opsional): Default: 60.
prometheus_instant_query
query(string, wajib)time_iso(string, opsional): Default-nya adalah sekarang.lookback_minutes(float, opsional)
prometheus_label_values
match_query(string, opsional): Filter PromQL.label(string, wajib): Nama label.lookback_minutes(float, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)
Jika tidak ada jendela yang diberikan dan match_query menyebutkan satu metrik (metric{...} atau {__name__="metric"}), hasil kosong selama 60 menit akan dicoba ulang sekali untuk rentang 4 hari; blok teks kedua menyebutkan rentang waktu yang dicakup hasil tersebut.
prometheus_labels
match_query(string, opsional): Filter PromQL.lookback_minutes(float, opsional): Default: 60.start_time_iso/end_time_iso(string, opsional)
Mencoba ulang pencarian satu metrik yang kosong untuk rentang 4 hari, seperti prometheus_label_values.
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>.response_mode(string, opsional):summary(default; juga untuknull) atauraw. Hasil baris mentah yang melebihi 20 baris dikembalikan sebagaisummary:lines_summarized,severity_counts(enam label teratas, sisanya diother_severities),first_timestamp/last_timestamp,histogramdengan 10 bucket sepanjang jendela kueri (berdasarkan baris yang dikembalikan, dengantruncated: truejika batas memotong hasil), danpatternsteratas (template,count, hingga duasamples) dengan sisanya dijumlahkan dalamother, maksimal 4000 karakter; metadata tingkat teratas yang tetap tidak muat akan dihilangkan dan disebutkan dalamdropped_fields.rawmengembalikan baris. Hasil agregat tidak pernah diringkas.
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 jika tersedia, dan name sebagai nama indeks fisik. Jika name="default", hilangkan index; untuk indeks fisik non-default yang dipilih pengguna, teruskan index: "physical_index:<name>". Jika backend menolak pemfilteran indeks fisik secara eksplisit, coba lagi tanpa index dan laporkan bahwa pemfilteran indeks fisik secara eksplisit tidak tersedia untuk backend tersebut.
get_service_logs
service_name(string, wajib)lookback_minutes(integer, opsional): Default: 60.limit(integer, opsional): Default: 100, atau 20 denganresponse_mode: "raw".env(string, opsional)severity_filters(array, opsional): misalnya["error", "warn"]. Logika OR.body_filters(array, opsional): misalnya["timeout", "failed"]. Logika OR.start_time_iso/end_time_iso(string, opsional)index(string, opsional)response_mode(string, opsional):summary(default; juga untuknull) atauraw. Jika lebih dari 20 baris,logsdiganti dengansummaryyang sama seperti padaget_logs, sementara kolom lainnya tetap dipertahankan;rawmengembalikan entri.
Beberapa jenis filter digabungkan dengan AND. Setiap array menggunakan OR secara internal.
Gunakan get_logs terlebih dahulu untuk jumlah agregat yang luas; gunakan get_service_logs hanya setelah mempersempit ke layanan/lingkungan/indeks dan sekumpulan kecil sampel.
get_log_patterns
service_name(string, wajib)env(string, opsional)start_time_iso/end_time_iso(string, opsional)lookback_minutes(integer, opsional): Default: 60.severity_filters/body_filters(array, opsional): Logika OR, seperti padaget_service_logs. Aturseverity_filtershanya jikaget_service_profilemelaporkanseverity_setall; dengannoneataupartial, parameter ini menghilangkan baris yang tingkat keparahannya tercantum di dalam body.index(string, opsional)sample_size(integer, opsional): Baris yang diambil sampelnya dari jendela, dimulai dari yang terbaru. Default: 1000, maksimum: 5000.top_n(integer, opsional): Templat yang dikembalikan berdasarkan jumlah. Default: 20, maksimum: 100. Sisanya dijumlahkan dalamother.
Pengelompokan dijalankan di server MCP atas baris sampel, sehingga jumlah, first_seen, dan last_seen berlaku dalam sampel; window.sample_limit_reached menunjukkan kapan sampel mungkin tidak mencakup baris yang cocok (sampel berisi sample_size baris dan API tidak melaporkan total_matching_lines yang persis sama dengan jumlah tersebut, atau pencarian dilakukan dengan logs_truncated), sehingga sampel hanya berisi baris terbaru dalam jendela. Setiap template dan sample dipotong hingga 500 karakter dan diakhiri dengan …, sehingga body yang tidak dapat dikelompokkan (seperti JSON tanpa kolom message) tidak dapat memenuhi respons. Pencarian dengan chunk yang gagal akan menghasilkan kesalahan alat; pencarian yang terpotong atau dibatasi tetap mengembalikan pola, dengan penanda sample_limit_reached. Daftar patterns yang kosong berarti tidak ada yang cocok hanya jika sample_limit_reached bernilai false; jika bernilai true, pencarian berhenti lebih awal dan mungkin melewatkan baris yang cocok.
get_emerging_log_patterns
Menerima semua parameter get_log_patterns (rentang waktu adalah jendela saat ini), ditambah:
baseline_start_time_iso/baseline_end_time_iso(string, opsional): Isi keduanya atau kosongkan keduanya. Default-nya adalah jendela berdurasi sama yang tepat mendahului jendela saat ini.min_count(integer, opsional): Jumlah baris yang harus dimiliki pola yang berubah pada jendela tempat jumlahnya lebih besar: saat ini untuknew/increased, baseline untukdecreased/disappeared. Default: 3 (atausample_sizejika lebih kecil), maksimum:sample_size.change_factor(number, opsional): Rasio frekuensi, lebih besar dari 1, yang harus dicapai pola yang muncul di kedua jendela (increased) atau diturunkan hingga kebalikannya (decreased). Default: 2.
Kedua ambang harus terpenuhi, sehingga templat bervolume tinggi yang frekuensinya tidak berubah sebesar change_factor tidak akan pernah dilaporkan. Hanya templat yang berubah yang dikembalikan (new, increased, decreased, disappeared) beserta jumlah current dan baseline; unchanged_patterns menghitung templat yang muncul di kedua jendela dan berubah kurang dari change_factor, sedangkan below_min_count_patterns menghitung perubahan yang dihilangkan karena jumlah barisnya kurang dari min_count. Frekuensi dibandingkan per menit saat kedua sampel memuat semua baris yang cocok, per menit yang diperkirakan dari total_matching_lines sampel yang dibatasi, dan jika tidak, sebagai proporsi sampel; increased/decreased menggambarkan komposisi, bukan laju (comparison_basis). Daftar patterns yang kosong berarti tidak ada perubahan yang melampaui kedua ambang, bukan berarti log tidak berubah: perubahan yang lebih jarang dihitung dalam below_min_count_patterns, dan jendela dengan sample_limit_reached membandingkan sampel, bukan keseluruhan jendela.
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 membatasi 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)index(string, opsional)
get_drop_rules
Tanpa 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_remapping_rules
rule_type(string, wajib):logs_extract,logs_mapatautraces_map.region(string, opsional): Default: region datasource yang dikonfigurasi.- Mencantumkan aturan melalui
GET /otel_settings/remapping/{rule_type}?region=....
add_remapping_rule
Membuat satu aturan per pemanggilan; aturan pemetaan memerlukan satu pemanggilan untuk setiap target_attribute.
rule_type(string, wajib):logs_extract,logs_mapatautraces_map.name(string, wajib)remap_keys(array, wajib): Kolom sumber.logs_extractdenganjson: nama kolom body; denganpattern: tepat satu regex dengan grup tangkapan bernama. Aturan pemetaan: jalur atribut, nilai pertama yang tidak kosong akan digunakan.target_attribute(string, wajib):logs_extract:log_attributesatauresource_attributes.logs_map:service,severityatauresource_deployment.environment.traces_map:service.extract_type(string, hanyalogs_extract, wajib di sana):jsonataupattern.action(string, hanyalogs_extract):upsert(default) atauinsert.prefix(string, hanyalogs_extract)preconditions(array, hanyalogs_extract): Maksimal satu{key, value, operator};operatoradalahequals(default),not_equalsataulike(regex).region(string, opsional): Default: region datasource yang dikonfigurasi.- Membuat aturan melalui
POST /otel_settings/remapping/{rule_type}?region=.... Tidak pernah dicoba ulang; setelah timeout, periksa denganget_remapping_rules.
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 salah satu dari trace_id atau service_name wajib diisi.
trace_id(string, opsional): Rentang waktu default: 72 jam.service_name(string, opsional): Rentang waktu 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 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 nilai; hilangkan untuk nilai global.lookback_minutes(integer, opsional): Default: 15.start_time_iso/end_time_iso(string, opsional): Batas historis RFC3339; diprioritaskan 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; hilangkan untuk penemuan terbatas.latency_threshold_ms(number, opsional): Wajib untuk modelatency; ditolak untuk mode lain.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 saling 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 agar 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 hanya untuk span tersebut.max_spans(integer, opsional): Default: 500. Maksimum: 1000; kebijakan redaksi organisasi dapat menetapkan batas yang lebih rendah.
Mengembalikan envelope investigation-evidence/v1 dari layanan trace tanpa perubahan; waterfall berada di bawah data. Layanan membangun waterfall dan menyamarkan nilai berdasarkan kebijakan per organisasi (kredensial, literal kueri, URL, email, IP, pengenal pengguna) sebelum data meninggalkan backend: sanitizer menyebutkan kebijakan yang dijalankan dan evidence.sanitization menghitung data yang disamarkan atau dipotong. Jika ada data yang diperlukan tetapi disamarkan, minta admin organisasi menyesuaikan kebijakan, bukan mencari cara untuk mengakalinya. Tool menolak respons yang tidak memiliki blok sanitizer, memiliki sanitizer.version selain trace-evidence-sanitizer/v1, body yang mengulang kunci JSON, atau body berukuran lebih dari 512 KiB (batas max_spans lebih rendah). Memerlukan kapabilitas backend pendamping agar diaktifkan.
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.
analyze_change_impact
Berikan tepat salah satu dari change_event atau service + timestamp.
change_event(object, opsional): Satu elemen dariget_change_eventschange_events[], tanpa perubahan. Menggunakanmetric.service,metric.deployment_environmentdanvalues[].timestampyang paling awal.service(string, opsional): Wajib bersamatimestampjikachange_eventtidak diberikan.timestamp(string, opsional): RFC3339 atau detik unix, dibulatkan ke bawah ke menit.env(string, opsional): Lingkungan yang tepat. Default: lingkungan peristiwa, jika tidak ada maka semua.baseline_minutes(integer, opsional): Default: 60. Dibatasi ke 30..120.after_minutes(integer, opsional): Default:baseline_minutes. Dibatasi ke 30..120 dan tidak melebihi waktu saat ini.
regression likely jika salah satu kondisi berikut terpenuhi: tingkat kesalahan naik setidaknya 1 poin persentase, p95 naik setidaknya 40%, atau throughput (rpm) turun setidaknya 50% untuk layanan atau salah satu dari 10 pemanggil teratasnya, yang diurutkan berdasarkan throughput gabungan pada kedua jendela (hanya jika ada setidaknya 100 permintaan sebelum perubahan dan, untuk throughput, setelahnya; p95 hanya menghitung permintaan latency_env); sebuah alert mulai aktif setelah perubahan dan masih aktif pada akhir jendela setelah perubahan (dicocokkan tanpa membedakan huruf besar-kecil berdasarkan nama grup alert atau label service, service_name atau service.name, jika tidak ada maka berdasarkan anotasi (tidak pernah teks bebas seperti ringkasan); dengan env, alert berlabel lingkungan lain, tanpa membedakan huruf besar-kecil, diabaikan dan alert tanpa label ditandai env_match: unlabelled); regresi dari get_apm_service_deviations. insufficient data jika jendela setelah perubahan kurang dari 5 menit (termasuk perubahan di masa mendatang), layanan memiliki terlalu sedikit permintaan, atau sinyal utama, pencarian pemanggil langsung, alert, atau get_apm_service_deviations gagal, seluruhnya atau pada kueri mana pun yang tercantum di deviations.apm.unavailable: bukti yang hilang tidak pernah menghasilkan no significant change, dan regresi yang tetap ditemukan akan menyebutkan apa yang gagal. no significant change adalah jawaban yang valid, bukan kegagalan. Deviasi atribut trace hanya dijalankan jika env ditetapkan, selama maksimal 15 menit di setiap sisi; deviasi tersebut menjelaskan hasil, tetapi tidak pernah menentukannya, sehingga melewatkan atau gagal mengambilnya tidak mengubah hasil. Setiap daftar memuat 10 item dan melaporkan jumlah item yang dihilangkan; panggilan upstream yang gagal hanya menyisakan error pada bagiannya. Latensi sinyal utama berasal dari satu lingkungan pada kedua jendela, yang disebutkan di latency_env: jika tidak ada env, gunakan lingkungan tersibuk. Tingkat kesalahan sinyal utama menghitung kesalahan 5xx dan gRPC; deviations.apm juga menghitung span berstatus kesalahan dan 429. Sinyal pemanggil berasal dari span servernya sendiri, sehingga pemanggil yang hanya memiliki span klien menunjukkan 0 rpm.
regressions mencantumkan satu entri untuk setiap pemicu di balik regression likely, sesuai urutan reason, dan bernilai [] untuk hasil lainnya. Setiap entri memiliki service, role (changed atau dependent), env, metric (tepat satu dari error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) dan baseline/after dalam satuan metriknya (%, ms, rpm, atau nilai sinyal APM itu sendiri; null untuk alert). Entri alert menambahkan rule_id dan state, yaitu status instans pada irisan pemantauan alert terbaru di jendela setelah perubahan yang mencantumkannya, selalu firing: alert yang mulai aktif setelah perubahan tetapi sudah pulih pada akhir jendela setelah perubahan bukan regresi, sehingga tidak membuat tiket; alert tersebut tetap berada di alerts.started dengan state-nya, dan reason menghitungnya. env adalah lingkungan tempat metrik diukur: env yang diminta, jika tidak, tingkat kesalahan dan throughput menjumlahkan semua lingkungan (env: "") sementara p95 menggunakan lingkungan tersibuk, latency_env; alert menggunakan label lingkungannya sendiri dan deviasi APM menggunakan lingkungannya sendiri. Setiap regresi berlaku untuk seluruh layanan, jadi tidak ada yang menyebutkan endpoint.
get_alert_groups
Inventaris grup alert Compass yang dikonfigurasi untuk audit changeboard / cakupan label. Mencakup grup tanpa aturan dan grup yang tidak sedang aktif. Tidak mengembalikan PromQL.
alert_group_name/alert_group_type/data_source_name(string, opsional): Pencocokan substring tanpa membedakan huruf besar-kecil.team/tier(string, opsional): Pencocokan tepat tanpa membedakan huruf besar-kecil pada metadata yang dikonfigurasi.label_key+label_value(string, opsional): Harus ditetapkan bersama. Pencocokan tepat tanpa membedakan huruf besar-kecil pada satu pasanganmetadata.labels— baik kunci maupun nilainya.
Mengembalikan {"count":N,"groups":[...]} JSON ringkas dengan id, name, type, entity_class, team, tier, metadata.labels, dan jumlah aturan. team / labels yang kosong berarti tidak ditetapkan.
get_alert_operations_summary
start_time_iso/end_time_iso(string, wajib): Jendela RFC3339, maksimal 31 hari.timezone(string, opsional): Nama IANA untuk batas hari. Default:UTC.severities/services(array, opsional): Mempersempit ringkasan.include_rules(boolean, opsional): Sertakan juga kebersihan per aturan (20 teratas berdasarkanfire_count, aturan yang sering berubah status dan tidak dirutekan, dengantruncatedjika API membatasi daftar aturannya). Default:false.
Mengembalikan JSON dengan alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention dan coverage. Setiap metrik adalah {status, count?, reason?}; jumlah partial hanya mencakup sebagian jendela dan bukan batas bawah.
get_alert_coverage
Menjawab "apa yang belum saya beri alert?" untuk layanan, lingkungan, satu grup alert, atau seluruh organisasi jika tidak ada cakupan yang diberikan. Hanya-baca: tool ini tidak pernah membuat, mengubah, atau mengaktifkan kembali apa pun. Juga tersedia di toolset investigate.
service(string, opsional): Nama layanan.environment(string, opsional): Lingkungan deployment (misalnyaprod).entity_id(string, opsional): UUID grup alert (entitas), seperti yang dikembalikan olehget_alert_groups.muted_days(integer, opsional): Jumlah hari penuh, 1 hingga 3650. Default: 7; 0 berarti default. Aturan yang dibisukan lebih lama dari ini merupakan celahmuted_too_long. Nilai dipangkas; string kosong diabaikan. Jenis kesenjangan: uncovered_signal (tidak ada aturan aktif untuk latency, error_rate, throughput, atau saturation; menyebutkan aturan nonaktif yang akan mencakupnya), all_rules_disabled (grup alert yang semua aturannya dinonaktifkan), no_notification_channel (aturan yang tingkat keparahannya tidak memiliki kanal yang dirutekan oleh grup alert-nya), muted_too_long (dibisukan tanpa batas waktu atau lebih darimuted_days;muted_sinceadalah pembaruan terakhir aturan danmute_untildihilangkan untuk pembisuan tanpa batas waktu).
Mengembalikan JSON ringkas {scope, generated_at, complete, summary, counts, groups}. groups memuat satu entri {kind, count, gaps, omitted} untuk setiap jenis yang ada, dengan mencantumkan paling banyak 10 kesenjangan per jenis (omitted menghitung sisanya; persempit cakupan untuk melihatnya); setiap kesenjangan memuat suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel, atau patch_alert) dan suggested_args, yang hanya memuat input yang diterima alat tersebut (patch_alert: entity_id, id dan is_disabled=false atau mute_until=0; attach_notification_channel: alert_group_id dan breach/threat severity; create_alert: entity_id; create_alert_from_chart: service_name); entity_id, rule_id, dan signal milik kesenjangan itu sendiri dicantumkan di sampingnya. Panggil alat yang disarankan hanya jika tersedia dalam sesi dan pengguna mengonfirmasi. complete bernilai true hanya jika API tidak mencantumkan kesenjangan, setiap hitungan bernilai 0, dan setidaknya satu grup alert cocok dengan cakupan (label service_name / env yang persis, diperiksa terhadap daftar get_alert_groups); cakupan yang tidak cocok dengan apa pun, pencarian yang gagal, atau hitungan tanpa kesenjangan yang tercantum tidak dianggap lengkap, dan summary menjelaskan alasannya.
get_alert_config
search_term(string, opsional): Pencarian teks bebas pada 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): Semuanya harus cocok (logika AND).
Setiap aturan mencantumkan Recent Evaluations: 5 sampel satu menit, terbaru lebih dahulu, masing-masing diberi label berdasarkan menit UTC saat sampel berakhir; sampel terbaru berakhir 1–2 menit sebelum pemanggilan, karena monitor mengisi menit terbaru terlambat. firing; ok = monitor melaporkan bahwa aturan tidak sedang menyala (status normal, resolved, pending, atau kosong, sebagaimana is_firing=0 dalam get_alert_rule_state); unknown = tidak ada baris monitor untuk aturan tersebut (belum dievaluasi, atau pencarian pada menit itu gagal dan dicatat di bagian atas respons), atau ada baris dengan status selain firing, normal, resolved, pending, atau kosong (misalnya no_data, silenced). Aturan yang dinonaktifkan menampilkan none. Jika lebih dari 25 aturan aktif cocok, riwayat tidak disertakan untuk semuanya dan respons menyatakannya.
get_entity_kpis
Hanya-baca; tersedia di toolset alerts dan investigate. Mencantumkan setiap KPI pada satu grup alert, termasuk KPI yang belum digunakan oleh aturan alert mana pun. Gunakan ID yang dikembalikan di expression_args / indicators_used; jangan pernah mengarangnya.
entity_id(string, wajib): UUID grup alert/entitas, dariget_alert_groupsatauget_alert_config.
Mengembalikan JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]}, diurutkan berdasarkan nama. unit adalah label tampilan: ambang batas dibandingkan dengan nilai kueri mentah. Jika tidak ada KPI yang sesuai, buat satu dengan create_kpi. Hasil grup kosong hanya menyebutkan create_kpi jika sesi menyediakannya; dengan --read-only (kecuali --allow-write-tools=create_kpi) atau toolset investigate, hasil menyatakan bahwa pembuatan KPI memerlukan sesi alerts yang dapat ditulisi.
create_kpi
Membuat KPI pada grup alert yang sudah ada; hanya toolset alerts. Gunakan hanya jika get_entity_kpis tidak memiliki KPI dengan kueri yang diperlukan. Periksa terlebih dahulu apakah kueri mengembalikan data dengan prometheus_range_query: API hanya menolak kueri yang tidak dapat diurai, dan menyimpan kueri valid untuk metrik yang tidak ada.
entity_id(string, wajib): UUID grup alert/entitas.name(string, wajib): Unik dalam grup alert; pembuatan kedua dengan nama yang sama ditolak sebagai konflik.query(string, wajib): PromQL. Untuk membuat alert pada panel dasbor, ambil PromQL panel dariget_dashboard.unit(string, wajib): Satuan nilai mentah kueri, misalnyaseconds,ms,percent,ratio,count,req/s. Ini hanya label dan tidak mengonversi apa pun, jadi ambang batas dibandingkan dengan nilai mentah.description(string, opsional)data_source_id(string, opsional): Default-nya adalah sumber data grup alert.
Tidak ada alat MCP yang menghapus atau mengedit KPI (gunakan UI Last9), jadi konfirmasikan nama, kueri, dan satuan sebelum membuatnya. Buat sekali dan simpan ID yang dikembalikan untuk expression_args / indicators_used; jika terjadi konflik nama, gunakan kembali ID KPI yang sudah ada dari get_entity_kpis. Jika terjadi timeout atau kesalahan koneksi, pembuatan mungkin sudah diterapkan atau belum: periksa berdasarkan nama dengan get_entity_kpis sebelum mencoba lagi. Mengembalikan {"id","name","query","unit"}.
get_alerts
time_iso(string, opsional): Waktu evaluasi dalam RFC3339.window(integer, opsional): Rentang waktu lihat ke belakang dalam detik. Default: 900. Rentang: 60–86400.lookback_minutes(integer, opsional): Rentang: 1–1440.
get_alert_rule_state
start_time(integer atau string, wajib): Awal rentang (inklusif): detik Unix epoch (1718000000) atau RFC3339 (2024-06-10T06:13:20Z). Milidetik, mikrodetik, dan nanodetik epoch dikonversi menjadi detik; nilai sebelum 2000-01-01 ditolak.end_time(integer atau string, wajib): Akhir rentang (inklusif), dalam format yang sama.step(integer, wajib): Resolusi dalam detik antar sampel. Jumlah sampel((end_time - start_time) / step + 1)dibatasi hingga 100. Setiap sampel adalah satu panggilan upstream yang mencakupmin(step, 3600)detik hingga waktu sampelnya; sampel diambil 5 sekaligus, dan alat mengembalikan kesalahan dengan panduan untuk mencoba lagi jika prosesnya memakan waktu lebih dari 60s.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 rule_id -> [{timestamp, is_firing}]. Timestamp saat aturan tidak ada dalam respons upstream dilaporkan sebagai is_firing=0 — artinya "tidak teramati sedang menyala", bukan status normal yang terkonfirmasi.
get_alert_hygiene
Audit hanya-baca atas aturan alert yang aktif. Audit ini tidak pernah mengubah apa pun: setiap perbaikan yang disarankan adalah proposal, dan hanya diterapkan setelah pengguna mengonfirmasinya secara eksplisit, melalui update_alert (penyetelan), patch_alert (is_disabled), delete_alert atau attach_notification_channel jika tersedia.
window(string, opsional):7datau30d. Default:7d.limit(integer, opsional): Jumlah maksimum aturan yang ditandai untuk dikembalikan, dimulai dari yang terburuk. Default: 20. Rentang: 1–100.
Jendela berakhir sekarang. Kategori (satu aturan dapat memiliki beberapa kategori): noisy (≥ 5 kali menyala/hari dengan < 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 flapping/hari), stale (terakhir kali menyala sebelum jendela tanpa waktu menyala di dalamnya, atau aturan terkonfigurasi yang aktif tanpa episode dalam jendela sementara siklus hidup coverage selesai dan daftar API tidak terpotong), unrouted (tidak ada penyalaan dalam jendela yang mencapai kanal dan saat ini tidak ada kanal yang terpasang pada grup alert; jika lampiran tidak dapat dibaca, aturan dihitung dalam unavailable.routed). Setiap statistik bernilai {status, count|value, reason} atau null: nilai yang tidak tersedia tidak pernah dianggap nol dan hanya melewati pemeriksaan yang memerlukannya, dan unavailable menghitung aturan aktif untuk setiap nilai yang hilang (fire_count, flap_count, ack_rate, routed, rule_config untuk aturan yang tidak ada dalam daftar aturan alert, yang perbaikannya tidak menyertakan nilai saat ini, dan activity untuk aturan terkonfigurasi tanpa episode yang keheningannya tidak dapat dibuktikan oleh riwayat, yang tidak dinilai). coverage menyatakan seberapa banyak riwayat alert yang tercakup dalam jendela; laju menggunakan rentang yang tercakup, minimal satu hari. upstream_truncated bernilai true jika API hanya mengembalikan 200 aturan paling bising, sehingga aturan yang lebih tenang tidak dievaluasi. Perbaikan dibuat berdasarkan konfigurasi setiap aturan dalam daftar aturan alert: naikkan bad_minutes (N dalam count_true(result) >= N) atau perpanjang eval_window (maksimal 60 menit); untuk ambang statis yang bising, geser ambang di condition (expr > 100) atau ubah ekspresinya menjadi adaptive_std_cmp(metric, sensitivity, window); pasang kanal notifikasi; nonaktifkan atau hapus aturan usang.
Mengembalikan JSON ringkas {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules}, dengan target ukuran 32 KB: truncated bernilai true jika jumlah aturan yang ditandai melebihi limit atau target tersebut, dan omitted_for_size menghitung aturan dalam limit yang dipangkas demi ukuran (aturan terburuk selalu dipertahankan, jadi satu aturan yang lebih besar dari 32 KB dikembalikan sendiri dan melampaui target); setiap aturan memiliki findings (category, reason, suggested_fix, opsional alternative_fix) dan stats mentah.
get_notification_channels
scope(string, opsional):attached(default) mengembalikan satu baris per lampiran grup alert;idadalah ID lampiran, seperti yang digunakan olehdetach_notification_channel.channelsmengembalikan kanal organisasi (id,name,type,send_resolved,created_via);idadalah ID kanal, seperti yang digunakan olehattach_notification_channel. Tujuan, header, dan sertifikat tidak pernah dikembalikan.
Mengembalikan kanal notifikasi yang dikonfigurasi (Slack, PagerDuty, email, webhook, dll.) sebagai tabel TSV. Baris lampiran (service_fqid terisi) menampilkan global false dan services -; services hanya mencantumkan binding layanan lama. Pada baris lampiran, send_resolved adalah nilai default yang tersimpan pada baris, bukan nilai yang digunakan untuk pengiriman; notifikasi penyelesaian mengikuti send_resolved milik kanal itu sendiri (scope=channels). Kedua cakupan menyertakan created_via (last9-mcp untuk baris yang dibuat oleh agen MCP, selain itu -).
recommend_alert_config
Hanya-baca. Mengembalikan panduan siklus hidup, gerbang validasi, dan persyaratan konteks bagi penanggap; hasilnya bukan bukti dengan sendirinya, jadi dasarkan ambang batas pada alat telemetri.
signal(string, wajib): Metrik atau sinyal dampak pengguna, termasuk satuan dan dimensi.objective(string, wajib): Gejala atau dampak pengguna yang perlu dideteksi.rule_type(string, opsional):static(default) atauanomaly.severity(string, opsional):breach(default) atauthreat.environment(string, opsional): Lingkungan dan profil trafik.
validate_alert_expression
Menjalankan uji coba ekspresi tanpa menyimpannya. Gunakan sebelum create_alert / update_alert.
entity_id(string, wajib): UUID grup alert/entitas.expression(string, wajib): Operasi aritmetika atas indikator yang disebut dengan nama KPI persisnya, misalnyaerrors / requests. Maksimal 3 indikator. Tulis nama yang mengandung spasi, titik, atau tanda hubung apa adanya (Test Alert / errors), persis seperti yang disimpan olehcreate_alert.indicators_used(object, wajib, tidak kosong): Nama indikator ke UUID KPI milikentity_id; cantumkan ID dan nama KPI grup denganget_entity_kpis. Gunakan nama persis setiap KPI: uji coba ini menerima nama apa pun, tetapicreate_alertdanupdate_alertmenolak kunciexpression_argsyang bukan nama KPI yang terikat. Hanya ekspresi aritmetika yang diperiksa (berikan ekspresi metrik bagian dalam, bukan pembungkusadaptive_std_cmp(...));condition/alert_conditiontidak diperiksa. Pemeriksaan minimal satu timeseries hanya dijalankan jika lebih dari satu indikator digunakan.
Mengembalikan {"valid":true} atau {"valid":false,"reason":"..."}; ekspresi yang tidak valid adalah hasil normal, bukan kesalahan tool.
describe_alert_chart
Hanya-baca. Mencantumkan sinyal yang dapat diberi peringatan (key, unit, eval_query, query_kind) pada chart Discover yang didukung. Token dengan peran viewer ditolak.
surface(string, wajib):discover-serviceataudiscover-exceptions; surface lain apa pun, termasuk dasbor kustom, ditolak sebelum API dipanggil (gunakancreate_alertdengan KPI).chart_key(string, wajib): misalnyaapdex,error_rate,response_time,exception_count.service_name(string, wajib)env(string, opsional)attributes(object, opsional): Dimensi identitas tambahan, menggunakan nama kunci yang dilaporkan tool ini.
create_alert
Membuat aturan dalam grup peringatan yang sudah ada, selalu dalam keadaan nonaktif (draf, meskipun is_disabled=false diberikan). Panggil recommend_alert_config terlebih dahulu, lalu promosikan dengan patch_alert is_disabled=false hanya setelah pengguna mengonfirmasi. Buat sekali dan simpan ID aturan yang dikembalikan. rule_name yang sudah digunakan grup peringatan (tanpa membedakan huruf besar-kecil) akan ditolak tanpa membuat apa pun, dengan menyebutkan id aturan yang sudah ada.
entity_id(string, wajib): UUID grup peringatan/entitas.alert_rule(object, wajib): Isi aturan bertipe lengkap, termasukprimary_indicatordanexpression_argsyang terikat ke KPI entitas yang sebenarnya. Setiap kunciexpression_argsharus berupa nama persis KPI yang diikatnya (bukan placeholder sepertix), danprimary_indicatorsertaexpressionmenggunakan nama tersebut. Aturan statis memerlukancondition,alert_condition, daneval_window(0–60 menit). Aturan adaptif menggunakanexpression=adaptive_std_cmp(<primary_indicator>, sensitivity, window); ketiga kolom tersebut bersifat opsional (nilai defaultexpr > 0,count_true(result) >= 1,1).algorithmtidak dapat diatur. Konteks responder ditempatkan diproperties(deskripsi, runbook, anotasi,query_mode).
Perutean notifikasi dikonfigurasi pada grup peringatan, bukan pada aturan.
create_alert_from_chart
Membuat aturan ambang statis dari chart yang dijelaskan oleh describe_alert_chart. Seperti create_alert, aturan dibuat dalam keadaan nonaktif sebagai draf dan tidak akan terpicu; promosikan dengan patch_alert is_disabled=false hanya setelah pengguna mengonfirmasi. API chart membuat aturan dalam keadaan aktif, jadi tool ini menonaktifkan aturan segera setelah dibuat; jika gagal, hasilnya adalah kesalahan yang menyebutkan id aturan, yang mungkin sedang aktif.
surface/chart_key/service_name/signal_key/name(string, wajib)env(string, opsional)attributes(object, opsional)threshold(number, opsional): Dalam satuan sinyal; harus 0 atau lebih. Sinyal dengan satuan skor seperti apdex memerlukan nilai eksplisit.threshold_operator(string, opsional):>(default),<,>=,<=,==,!=.eval_window(integer, opsional): Menit, 1–60. Default: 5.bad_minutes(integer, opsional): 1–eval_window. Default: 3.severity(string, opsional):breachatauthreat.description(string, opsional)group_id(string, opsional): Biasanya tidak perlu disertakan.
update_alert
Mengganti seluruh konfigurasi evaluasi aturan. Ambil aturan terlebih dahulu dengan get_alert_config atau get_entity_alert_rules. Menolak tanpa mengubah apa pun jika aturan tidak ada atau milik grup peringatan lain. Aturan mungkin dihapus secara lunak lalu dibuat ulang, jadi gunakan ID pengganti yang dikembalikan setelahnya.
entity_id(string, wajib)id(string, wajib): UUID aturan peringatan.alert_rule(object, wajib): Konfigurasi lengkap; bentuknya sama dengancreate_alert.
patch_alert
Perubahan parsial yang mempertahankan ID aturan. Setidaknya satu perubahan diperlukan. Menolak tanpa mengubah apa pun jika aturan tidak ada atau milik grup peringatan lain.
entity_id(string, wajib)id(string, wajib): UUID aturan peringatan.is_disabled(boolean, opsional):falsemempromosikan/mengaktifkan,truemenjeda.mute_until(integer, opsional): Batas waktu Unix epoch;0membatalkan pembisuan.properties(object, opsional):description,runbook,annotations,query_mode. Setiap kolom yang dikirim menggantikan nilai tersimpan; kolom yang tidak disertakan atau kosong mempertahankan nilai tersimpannya.annotationsmenggantikan seluruh peta, jadi kirim semua kunci yang ingin dipertahankan;{}menghapusnya.recurring_mute_schedule(object, opsional): Mengganti jadwal mingguan:enabled(default false),timezone(nama IANA, wajib), danwindows(1–20 dariweekdayssebagaisun..sat,start_time/end_timesebagaiHH:MM24 jam). Waktu akhir yang sama dengan atau lebih awal daripada waktu mulai akan berakhir pada hari berikutnya. Kirim semua jendela waktu yang ingin dipertahankan.clear_recurring_mute_schedule(boolean, opsional): Menghapus seluruh jadwal; tidak dapat digabungkan denganrecurring_mute_schedule. Berbeda denganenabled=false, yang mempertahankan jendela waktu tersimpan.
Pengguna dengan peran viewer hanya dapat mengubah mute_until. Perubahan pembisuan tingkat aturan ditolak saat grup atau entitas sedang dibisukan. Baca kembali perubahan dengan get_entity_alert_rules, yang menampilkan mute_until, recurring_mute_schedule dan properties.
delete_alert
Menghapus aturan secara permanen. Verifikasi dengan get_alert_config dan dapatkan konfirmasi eksplisit dari pengguna terlebih dahulu. Menolak tanpa menghapus apa pun jika aturan tidak ada atau milik grup peringatan lain.
entity_id(string, wajib)id(string, wajib): UUID aturan peringatan.
mute_alert_group
Membisukan semua aturan saat ini dan mendatang dalam suatu grup; untuk membisukan satu aturan, gunakan patch_alert dengan mute_until. Memerlukan akses editor.
entity_id(string, wajib): UUID grup peringatan/entitas.until(integer, wajib): Detik Unix epoch saat pembisuan berakhir.0membatalkan pembisuan; nilai negatif seperti-1membisukan tanpa batas waktu.
acknowledge_alert
Mengambil alih alert yang sedang aktif, atau melepaskan kepemilikannya. Tidak menyelesaikan atau membisukan alert. Mengakui alert yang sudah Anda miliki adalah operasi aman tanpa perubahan. ack menolak tanpa mencatat apa pun kecuali get_alerts mencantumkan alert yang persis sama (ketiga id) dalam satu jam terakhir.
alert_group_id/rule_id/rule_type(string, wajib): Salin dari alert diget_alerts.action(string, opsional):ack(default) atauunack. Hanya pemilik atau admin org yang dapat membatalkan pengakuan.mute_until(integer, opsional): Hanyaack. Mencatat pembisuan yang sudah Anda terapkan denganmute_alert_groupataupatch_alert; tidak membisukan apa pun.
reassign_alert
Mengalihkan alert yang sudah memiliki pemilik ke pengguna lain; akui alert terlebih dahulu jika belum memiliki pemilik. Jika tidak ada yang dialihkan karena alert tidak memiliki pemilik, tool ini menyatakan apakah get_alerts mencantumkan alert tersebut dalam satu jam terakhir. Last9 tidak memberi tahu pemilik baru.
alert_group_id/rule_id/rule_type(string, wajib): Salin dari alert diget_alerts.owner_email(string, opsional): Diutamakan; dicocokkan tanpa membedakan huruf besar-kecil dengan pengguna org yang aktif.owner_user_id(string, opsional): Berikan tepat satu dariowner_emailatauowner_user_id.
create_notification_channel
Membuat channel; channel tidak merutekan apa pun sampai dilampirkan dengan attach_notification_channel. Buat sekali dan simpan id-nya; tidak ada tool untuk memperbarui. Hanya mengembalikan id, name, type, dan send_resolved.
name(string, wajib): Harus unik untuk setiap jenis; tanpa titik dua.type(string, wajib):slack,pagerduty,opsgenie,email, ataugeneric_webhook.destination(string, wajib): URL Slack Incoming Webhook (atau ID channel denganslack_app_mode), routing key PagerDuty, API key Opsgenie, alamat email kerja yang dipisahkan koma dari domain apa pun, bukan hanya domain org (API menolak alamat penyedia email pribadi seperti Gmail, dan org yang menggunakan login pribadi hanya menerima alamat adminnya), atau URL webhook HTTPS.slack_app_mode(boolean, opsional): Hanya Slack. Default: false.mention_handles(string, opsional): Dipisahkan koma, misalnyauser|U123ABC|name,special|here,special|channel.webhook_headers(object, opsional): Hanyageneric_webhook.webhook_ca_certificate(string, opsional): Hanyageneric_webhook; satu sertifikat CA PEM hingga 64 KiB.send_resolved(boolean, opsional): Default: true.
attach_notification_channel
Merutekan channel yang sudah ada ke satu grup peringatan. Idempoten. Lampiran menyalin pengaturan pengiriman channel (header, sertifikat, mention) saat dilampirkan; jika pengaturan channel berubah kemudian, lampirkan ulang.
channel_id(integer, wajib): ID channel (get_notification_channelsdenganscope=channels), bukan ID lampiran.alert_group_id(string, wajib): Dariget_alert_groups.severity(string, wajib):breach,threat, atauboth.bothmembuat dua lampiran; jika lampiran kedua gagal, lampiran pertama tetap terpasang dan kesalahan menyebutkan tingkat keparahan yang perlu dicoba ulang.
detach_notification_channel
Menghapus satu lampiran. Memerlukan token dengan cakupan delete; token dengan cakupan write tidak dapat melepas lampiran.
attachment_id(integer, wajib):iddariget_notification_channelsdenganscope=attached. ID channel ditolak.alert_group_id(string, opsional): Menolak jika lampiran tersebut milik grup lain.
delete_notification_channel
Menghapus channel secara permanen jika tidak memiliki lampiran; lepaskan lampirannya terlebih dahulu. Memerlukan token dengan cakupan delete. Mengonfirmasi penghapusan dengan mencantumkan ulang channel.
channel_id(integer, wajib):iddariget_notification_channelsdenganscope=channels. ID lampiran ditolak.
did_you_mean
query(string, wajib): Nama yang akan dicari — sebagian, salah eja, atau disingkat.type(string, opsional): Batasi berdasarkan jenis entitas:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Mengembalikan hingga 3 kecocokan terdekat beserta skor kemiripan. Gunakan ini sebelum pemanggilan tool apa pun saat nama entitas belum pasti. Jika pemanggilan sebelumnya mengembalikan hasil kosong, coba ini sebelum mengulangi pemanggilan.
get_service_profile
service_name(string, wajib): Layanan yang akan digunakan untuk menyusun profil telemetri.datasource(string, opsional): Nama datasource. Abaikan untuk menggunakan default; nama perkiraan akan diresolusikan seperti pada tool Prometheus. Mengembalikan ringkasan investigasi singkat, diikuti profil lengkap dalam format JSON mentah: keberadaan sinyal (logs/traces/metricssebagaipresent,absent, atauunknown), bahasa dan runtime, lingkungan deployment, logsignal_shape(log_format,severity_set,level_field,trace_context_in_logs), serta perbaikan ingest yang disarankan jika berlaku. Saat backend melaporkanfreshness, ringkasan menambahkan barislast seendenganfreshness.logs.last_seendanfreshness.traces.last_seen(RFC3339, ataunonejika null), serta peringatantraces stalesaatfreshness.traces_staleadalahtrue: span berhenti sementara log berlanjut, jadi selidiki regresi di sekitarfreshness.traces.last_seen, bukan konfigurasi yang hilang. Diturunkan dari upstream dan di-cache dengan TTL sekitar 15 menit.
Panggil ini sebelum investigasi apa pun yang mencakup layanan agar pemilihan alat sesuai dengan telemetri aktual layanan — lewati alat trace saat traces adalah absent, dan saat severity_set adalah none atau partial, uraikan severity dari level_field di isi log, bukan menggunakan severity_filters. metrics selalu unknown dan dependencies tidak terisi di v1. Saat logs dan traces sama-sama absent, pastikan namanya dengan did_you_mean sebelum menyimpulkan bahwa layanan tidak dipantau.
list_dashboards
name(string, opsional): Substring nama dashboard yang tidak peka huruf besar-kecil. Mempersempit daftar dantotal.limit(integer, opsional): Jumlah dashboard per halaman, 1–200. Default: 100.cursor(string, opsional):next_cursordari halaman sebelumnya; teruskannameyang sama bersamanya.
Mengembalikan {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"}, diurutkan dari yang paling baru diperbarui. created_by tidak disertakan jika kosong; locked tidak disertakan jika API tidak melaporkan readonly. updated_at adalah detik epoch Unix dalam bentuk string. Halaman dapat berakhir lebih awal agar ukurannya tetap di bawah 32 KB; next_cursor tidak ada di halaman terakhir.
get_dashboard
id(string, wajib): UUID dashboard.region(string, opsional): Region untuk pengisian kueri panel. Default-nya adalah region datasource yang dikonfigurasi.
Hasilnya menambahkan locked tingkat teratas (false jika API tidak menyediakannya) dan created_by (ID pengguna pembuat).
Untuk membuat alert pada panel, lihat last9://reference/alerting.
validate_dashboard
Hanya baca. Tidak pernah membuat atau memperbarui dashboard. Terima tepat satu dari dashboard_id atau dashboard_definition.
dashboard_id(string, opsional): UUID dashboard tersimpan yang akan divalidasi.dashboard_definition(object, opsional): Isi dashboard inline yang belum disimpan (dry run sungguhan). Envelope pembuatan{dashboard, metadata}dibuka untuk mengambil objekdashboard.start_time_iso/end_time_iso(string, opsional): Rentang waktu validasi (RFC3339). Harus ≤ 24 jam.region(string, opsional): Region untuk eksekusi kueri panel.
Mengembalikan dashboard_validation/v1: klasifikasi lint + eksekusi per panel (data / no_data / invalid / error). Hasil kosong pada hari pertama diklasifikasikan sebagai valid_no_data tanpa probe diagnose. Dashboard tanpa panel mengembalikan success: false dengan error: "no_panels". Field panel dari format lain (Grafana gridPos, title, type, dan targets pada panel yang memerlukan kueri) serta field dengan tipe yang salah dicantumkan per panel di shape_problems, dihitung dalam summary.panels_invalid_shape, dan membuat overall menjadi fail.
preview_dashboard
Pratinjau sisi klien, hanya baca. Teruskan dashboard (objek dashboard yang belum disimpan dari permintaan pembuatan) atau id beserta ops (operasi berurutan yang sama seperti patch_dashboard). start_time_iso dan end_time_iso wajib diisi dengan stempel waktu RFC3339 yang mencakup paling lama 24 jam. variables bersifat opsional dan berisi penggantian nilai skalar; jika tidak ada, nilai dashboard dan default bawaan akan digunakan.
{
"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"
}
Mengembalikan saved: false, ringkasan definisi/kueri validation (termasuk definition_error untuk ketidakcocokan skema pembuatan), dan panels dengan status ok / empty / error, kueri yang telah diresolusikan, serta diagnostik target. PromQL dan LogJSON dieksekusi; jenis kueri yang tidak didukung dan variabel yang tidak dapat diresolusikan membuat panel berstatus error. Panel valid yang bukan kueri berstatus ok; definisi panel yang tidak valid berstatus error. Patch diff mencakup panels_added bersih, panels_changed (termasuk pemindahan) dan panels_removed, serta perubahan operasi yang berurutan. ID dan indeks berbasis nol mengidentifikasi panel; indeks yang dihapus merujuk pada dashboard asli. Panel tersimpan harus memiliki ID yang berbeda dan tidak kosong.
Batas: 50 panel, 100 kueri, 100 operasi, 65536 byte JSON untuk masing-masing dashboard input dan kandidat, serta batas waktu eksekusi 60 detik. Kueri yang telah diresolusikan dengan ukuran lebih dari 65536 byte JSON ditolak sebelum eksekusi. Bukti menyimpan paling banyak tiga sampel dan 1024 byte JSON per target, dengan truncated: true jika sampel tidak disertakan. Laporan JSON yang lebih dari 262144 byte gagal dan menyarankan untuk mengurangi input.
Dashboard tidak dibuat atau diperbarui. Ini memeriksa kandidat terhadap skema pembuatan dan menjalankan kueri menggunakan validator yang ada; ini tidak menjamin penerimaan atau perenderan oleh backend. ID, default, atau field yang dibuang oleh backend, maupun pengeditan serentak, dapat mengubah hasil yang tersimpan. Pratinjau menggunakan operasi patch lokal dan default versi panel yang sama seperti operasi tulis.
create_dashboard
Hanya untuk dashboard baru. Setelah panggilan ini mengembalikan dashboard.id, edit panel dengan patch_dashboard (atau susun ulang dengan update_dashboard) — jangan membuat dashboard lagi untuk menambahkan, 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 — field_categorydan_type(misalnya{"_category":"custom","_type":"metrics"}).
update_dashboard
Gunakan hanya untuk menyusun ulang sebagian besar dashboard; untuk menambahkan, mengedit, menghapus, atau memindahkan panel satu per satu, gunakan patch_dashboard. Penggantian penuh berdasarkan ID (isi yang sama seperti create): setiap panel harus dikirim ulang secara persis.
id(string, wajib): UUID dashboard yang akan diperbarui.dashboard(object, wajib): Isi dashboard pengganti penuh (bentuk yang sama seperti create).metadata(object, opsional): Metadata pengganti. Dashboard sistem hanya-baca menghasilkan error alat yang dapat dipulihkan.
patch_dashboard
Utamakan ini daripada update_dashboard untuk penyempurnaan kecil: panel yang tidak berubah tidak pernah dikirim ulang. Membaca dashboard, menerapkan ops secara berurutan, lalu menulisnya kembali, sehingga perubahan yang dibuat di tempat lain antara pembacaan dan penulisan akan tertimpa. Mengembalikan {dashboard_id, changes[]}; operasi yang sudah dipenuhi oleh dashboard tidak disertakan, dan jika tidak ada yang berubah, tidak ada yang ditulis. Diff diperiksa terhadap pembacaan ulang setelah penulisan: fields panel menampilkan nilai tersimpan, not_stored mencantumkan kunci yang dibuang API, dan not_removed mencantumkan kunci yang dipertahankan API meskipun ada null. Nilai diff yang lebih dari 200 karakter dipersingkat di tempat, dengan tipe JSON-nya tetap dipertahankan.
id(string, wajib): UUID dashboard yang akan di-patch.ops(array, wajib): Operasi yang diterapkan secara berurutan; jika ada yang tidak valid, tidak ada yang ditulis dan error menyebutnya sebagaiops[i].add_panel:panel(objek panel lengkap;versiondefault-nya 1),indexopsional (posisi penyisipan berbasis nol, default-nya di akhir).update_panel:panel_id,fields(kunci panel tingkat teratas yang akan diganti;nullmenghapus kunci;idtidak dapat diubah).remove_panel:panel_id.move_panel:panel_id,index(posisi berbasis nol setelah pemindahan).set_title:title(nama dashboard).set_variable:variable; mengganti variabel dengantargetyang sama, jika tidak, menambahkannya.
delete_dashboard
id(string, wajib): UUID dashboard yang akan dihapus. Dashboard sistem hanya-baca tidak dapat dihapus.
set_dashboard_lock
id(string, wajib): UUID dashboard.locked(boolean, wajib):truemengunci dashboard,falsemembuka kuncinya.
Alat tulis; panggil hanya jika pengguna memintanya secara eksplisit. Hanya pembuat dashboard atau admin organisasi yang dapat mengunci atau membuka kuncinya, dan dashboard bawaan selalu hanya-baca. Mengembalikan {"id", "locked"} beserta status hasilnya. Saat terkunci, update_dashboard, patch_dashboard dan delete_dashboard tidak melakukan penulisan dan mengembalikan error alat yang dapat dipulihkan, diawali dashboard is locked, yang menyebut pembuat dan menyarankan untuk membuka kunci atau menyalin dashboard dengan create_dashboard.
list_dashboard_snapshots
dashboard_id(string, wajib): UUID dashboard yang snapshot-nya akan dicantumkan.
Mengembalikan metadata saja (id, name, expires_at, dan sebagainya). 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 yang akan dihapus.
get_profile_services
lookback_minutes/start_time_iso/end_time_iso(opsional): Rentang waktu; utamakan lookback atau batas ISO eksplisit (default 60m).region(string, opsional): Penggantian region.
Mengembalikan layanan yang memiliki data profiling dalam rentang waktu 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. Tetapkan jenis saat membandingkan rentang waktu.env/cluster/namespace/runtime(string, opsional): Filter cakupan.limit(number, opsional): Jumlah maksimum baris stack agregat (default 1000, maksimum 10000).lookback_minutes/start_time_iso/end_time_iso/region(opsional).
Mengembalikan pohon flamegraph bertingkat (name / value / self / children). truncated: true berarti batas baris API tercapai.
get_top_functions
Filter sama seperti get_flamegraph. Mengembalikan peringkat fungsi terpanas berdasarkan sampel mandiri. Hasilnya mungkin terpotong; periksa truncated.
get_profile_summary
Filter sama seperti get_flamegraph. Mengembalikan triase profil layanan dalam bahasa alami secara singkat.
grafana_search_dashboards
query(string, opsional): Substring judul. Jika kosong, pencarian mencakup banyak hasil (tunduk pada 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): Jika true, kembalikan JSON Grafana mentah, bukan ringkasan yang difilter.
Ringkasan default: versi, tag, variabel templating, dan tipe/datasource/gridPos/target promQL setiap panel. Jenis panel plugin yang tidak dikenal muncul di unsupportedPanelTypes.
grafana_list_folders
Tanpa parameter. Mengembalikan hierarki 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 sumber data yang aman (tanpa kolom kredensial).
Pengujian
Jalankan penganalisis goroutine pengujian tanpa menjalankan pengujian aplikasi:
make lint-test
Ini menjalankan penganalisis Go testinggoroutine pada semua paket, termasuk
file *_test.go, dan memeriksanya terhadap fixture yang tidak aman dan aman. Kedua alur kerja pengujian CI menjalankan go vet -testinggoroutine ./... sebagai langkah terpisah, sehingga hasil pengujian paket yang tersimpan dalam cache tidak dapat melewati penegakan lint.
Paket root juga menjalankan penganalisis sebagai pengujian. Gunakan go test -count=1 ./...
untuk seluruh rangkaian pengujian dengan pemeriksaan tersebut tanpa cache: cache pengujian Go tidak melacak file sumber paket internal yang dibaca oleh subprocess penganalisis. Perintah go test ./... biasa dapat menggunakan kembali hasil pengujian root yang berhasil setelah file-file tersebut berubah.
Fatal, Fatalf, dan FailNow pada testing.T atau testing.B harus dijalankan di goroutine pengujian induk. Worker harus mengirimkan error kembali agar dapat diperiksa oleh induk:
errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
t.Fatal(err)
}
Penganalisis mendeteksi pemanggilan langsung dalam closure go func; penganalisis ini bukan pemeriksaan interprosedural umum untuk assertion yang tersembunyi di balik pemanggilan helper sembarang.
Pengujian integrasi dilewati kecuali TEST_REFRESH_TOKEN ditetapkan.
