[TASK-UNIFY-DB-POOL-AND-HEALTH-OBSERVABILITY] Unifikasi Connection Pool ke Sequelize & Pembangunan Suite Observabilitas Health Check
Modul: Pengangkut | Tipe: Refactoring | Stage Saat Ini:
STAGING| Tanggal Dokumen: 2026-09-23
STAGING STAGE (UAT VERIFICATION)
Dokumen ini sedang berada dalam tahap STAGING. Logika backend dan perubahan sistem telah diterapkan di lingkungan Staging (UAT) untuk proses verifikasi QA.
1. Informasi Tugas & Referensi Bisnis
Task ID / Nomor Referensi:
TASK-UNIFY-DB-POOL-AND-HEALTH-OBSERVABILITYSumber Instruksi: Penanganan Insiden Connection Starvation, Eliminasi Pool Ganda, & Pembangunan Suite Observabilitas
Dokumen Referensi / Lampiran: Tidak ada
Task / Dependensi Terkait (Cross-Service): Tidak ada
Modul Terkait:
PengangkutService / Repository:
pengangkut-backendPIC Pengembang: Hermansyah Efendi
Latar Belakang & Ringkasan Kebutuhan: Ditemukan kerentanan fatal di mana pod aplikasi berpotensi hang pada endpoint /tagihan akibat akuisisi koneksi database (
await pool.connect()) yang dilakukan di luar bloktry-catchserta inisiasi transaksi (BEGIN) prematur sebelum validasi payload selesai. Investigasi lebih lanjut mengungkap bahwa konfigurasi database PostgreSQL belum memiliki parameterconnectionTimeoutMillis(fail-fast) danidleTimeoutMillis, serta sistem menjalankan dua driver database paralel secara bersamaan (nativepg.Pooldan Sequelize ORM) yang menggandakan alokasi koneksi fisik (pool x2) hingga memicu eror "sorry, too many clients already" saat autoscaling pod. Sebagai solusi menyeluruh dan permanen, seluruh koneksi database diunifikasi penuh ke Sequelize ORM dan dieliminasi instance pg native, yang kemudian dilengkapi dengan pembangunan suite observabilitas kesehatan aplikasi terpadu (app/routers/health-router.js) untuk memantau status liveness/readiness, metrik utilisasi pool secara real-time, insiden starvation, serta agregasi query lambat.Ruang Lingkup & Rincian Sub-Pekerjaan (Technical Scope & Milestones):
- [x] Fase 1 — Remediasi Connection Leak Endpoint Tagihan: Memindahkan alokasi koneksi ke dalam blok try-catch dengan jaminan client.release(), menunda inisiasi transaksi (BEGIN) setelah validasi payload, dan mengonversi validasi menjadi sinkron
- [x] Fase 2 — Hardening Timeout Database: Penambahan konfigurasi fail-fast connectionTimeoutMillis (5000ms) dan pembersihan koneksi idleTimeoutMillis (30000ms)
- [x] Fase 3 — Unifikasi Total Connection Pool ke Sequelize: Eliminasi new pg.Pool() pada app/db_conn.js dan app/db_conn_replica.js, implementasi Adapter Pattern di app/connection.js berbasis QueryTypes.RAW, serta penyediaan SequelizeTransactionClient untuk transaksi warisan
- [x] Fase 4 — Implementasi K8s Health Probes: Penyediaan rute /health/liveness (status container) dan /health/readiness (kesiapan Master DB, Replica DB, Redis dengan micro-cache 3000ms)
- [x] Fase 5 — Engine Background Pool Monitor: Pembangunan pool-monitor.service.js yang mengevaluasi metrik pool Sequelize secara in-memory tiap 15 detik, mendeteksi utilisasi >= 85% atau starvation (waiting > 0), serta persistensi insiden ke Redis buffer dengan alert cooldown 60 detik
- [x] Fase 6 — Tracking Slow Query Non-Blocking Teragregasi: Perekaman query lambat via setImmediate, normalisasi SQL, deduplikasi throttle in-memory (5000ms), hashing fingerprint SHA-256, dan sanitasi parameter berkedalaman aman
- [x] Fase 7 — Endpoint Diagnostik & Manajemen Buffer Admin: Penyediaan rute admin /health (detailed internal metrics), /health/pool-incidents (GET/DELETE), dan /health/slow-queries (GET/DELETE) diproteksi guard doIntrospection dan requireAdmin
- [x] Fase 8 — Lifecycle Management & Standarisasi Environment: Pemasangan startPoolMonitor saat server listening, penanganan graceful shutdown (SIGTERM/SIGINT) dengan penutupan pool teratur, serta registrasi 15 variabel lingkungan baru pada app/utils/env-validator.js dan .env.example
2. Deployment Lifecycle
| # | Environment | Tanggal & Waktu | PIC | Status | Catatan |
|---|---|---|---|---|---|
| 1 | Development | 2026-09-22 17:49 | Hermansyah Efendi | DEPLOYED | Branch: refactor/unify-db-pool-sequelize |
| 2 | Staging (UAT) | 2026-09-26 12:44 | Hermansyah Efendi | DEPLOYED | Release Candidate v1.18.4 via MR Staging. Co-deployed: [TASK-FIX-COMMENTED-BIND-PARAMS-V1.18.4, TASK-UNIFY-DB-POOL-AND-HEALTH-OBSERVABILITY, TASK-DRAGONFLYDB-MIGRATION, TASK-SPLIT-BILLING-202608, FEAT-MANUAL-BILLING-REQUEST, MAINT-SUPERSET-SUMMARY-SHIP-SYNC-SECURITY, REFACTOR-DEPRECATE-POST-STATUS-SERVICE-MIGRATION, TASK-PINO-LOGGER-REFACTOR, ND-304-LNSW.34-2026, ND-256-LNSW.34-2026, ND-183-LNSW.34-2026] |
| 3 | Production | — | — | PENDING | — |
Riwayat Update Log
| Tanggal | Environment | Perubahan | PIC |
|---|---|---|---|
| 2026-09-26 | Staging | Promosi ke STAGING (Release Candidate v1.18.4) | Hermansyah Efendi |
| 2026-09-23 | Development | Initial log created | Hermansyah Efendi |
3. Analisis Teknis & Rincian Perubahan
Alur Logika & Bisnis:
- Pencegahan Connection Hang & Leak:
- Pemanggilan koneksi database pada endpoint tagihan dipindahkan ke dalam blok
try...finallydengan pelepasan terjamin (client.release()). Validasi input diselesaikan secara sinkron sebelum menyentuh pool koneksi. - Pool database PostgreSQL dikonfigurasi dengan batas waktu akuisisi tegas (
connectionTimeoutMillis: 5000/acquire: 60000) dan pembersihan koneksi menganggur (idle: 30000).
- Pemanggilan koneksi database pada endpoint tagihan dipindahkan ke dalam blok
- Eliminasi Pool Ganda (Single Source of Truth Connection):
- Menghapus alokasi
new pg.Pool()di seluruh aplikasi (app/db_conn.js&app/db_conn_replica.js). Seluruh model dan service kini berbagi connection pool tunggal di bawah pengelolaan Sequelize connection manager, mencegah erorsorry, too many clients already. - Mengimplementasikan Adapter Pattern di
app/connection.jsberbasisQueryTypes.RAWserta menyediakanSequelizeTransactionClientuntuk mempertahankan kompatibilitas transaksi SQL warisan.
- Menghapus alokasi
- Engine Pemantau Connection Pool Non-Intrusif:
- Background worker berjalan tiap 15 detik (
unreftimer) membaca metrik langsung dari memori instancesequelize-pool(size,available,using,waiting). Sama sekali tidak mengeksekusi query SQL ke PostgreSQL, sehingga bebas beban database. - Jika utilisasi >= 85% atau terdapat antrean koneksi (
waiting > 0), sistem memicu log alert dan menyimpan data insiden ke Redis (monitoring:pool_incidents) dengan proteksi jeda (alert cooldown) 60 detik untuk mencegah banjir log.
- Background worker berjalan tiap 15 detik (
- Buffer Slow Query Non-Blocking:
- Pemrosesan query lambat dikeluarkan dari siklus respons pengguna via
setImmediate. - Pola query di-fingerprint dengan SHA-256 dan dilindungi in-memory debounce (5.000 ms per pola) serta parameter input disanitasi ketat sebelum disimpan ke Redis ring buffer berkapasitas 50 entri.
- Pemrosesan query lambat dikeluarkan dari siklus respons pengguna via
- Pencegahan Connection Hang & Leak:
Konfigurasi Variabel Lingkungan Baru (.env.example & ENV_SCHEMA):
Terdapat 15 variabel lingkungan baru yang didaftarkan ke
app/utils/env-validator.js(ENV_SCHEMA) dan template.env.exampleuntuk mendukung konfigurasi terkelola dan observabilitas:No Variabel Lingkungan Tipe / Default Kategori Deskripsi / Fungsi Teknis 1 SLOW_QUERY_KEYString(monitoring:slow_queries)Slow Query Key Redis Hash untuk ring buffer penyimpanan agregasi query lambat. 2 SLOW_QUERY_THRESHOLD_MSNumber(1000)Slow Query Ambang batas durasi eksekusi query (milidetik) untuk diklasifikasikan sebagai query lambat. 3 MAX_SLOW_QUERIESNumber(50)Slow Query Kapasitas maksimum pola query lambat unik yang disimpan di Redis ring buffer. 4 SLOW_QUERY_THROTTLE_MSNumber(5000)Slow Query Jeda waktu debounce/rate-limiting in-memory per fingerprint query sebelum update berikutnya ke Redis. 5 DB_POOL_MAXNumber(50)DB Pool Master Batas maksimum koneksi fisik simultan yang dialokasikan ke instance PostgreSQL Master. 6 DB_POOL_MINNumber(2)DB Pool Master Jumlah koneksi fisik minimum standby yang selalu dijaga terbuka ke PostgreSQL Master. 7 DB_POOL_IDLE_MSNumber(30000)DB Pool Master Batas waktu idle (milidetik) sebelum koneksi tidak terpakai dilepaskan kembali oleh pool. 8 DB_POOL_ACQUIRE_MSNumber(60000)DB Pool Master Batas waktu tunggu peminjaman koneksi dari pool sebelum melempar error timeout. 9 DB_REPLICA_POOL_MAXNumber(20)DB Pool Replica Batas maksimum koneksi fisik simultan yang dialokasikan ke instance PostgreSQL Replica. 10 DB_REPLICA_POOL_MINNumber(1)DB Pool Replica Jumlah koneksi fisik minimum standby yang dijaga terbuka ke PostgreSQL Replica. 11 DB_POOL_INCIDENTS_KEYString(monitoring:pool_incidents)Pool Incidents Key Redis List untuk menyimpan riwayat insiden kontensi (starvation / utilisasi tinggi) pool. 12 DB_POOL_MAX_INCIDENTSNumber(100)Pool Incidents Kapasitas maksimum buffer riwayat insiden pool yang disimpan di Redis list. 13 DB_POOL_ALERT_COOLDOWN_MSNumber(60000)Pool Incidents Periode hening (cooldown milidetik) notifikasi insiden berulang untuk mencegah banjir alert. 14 DB_POOL_MONITOR_INTERVAL_MSNumber(15000)Pool Monitor Frekuensi periodik worker in-memory pool monitor mengevaluasi metrik koneksi (milidetik). 15 DB_POOL_UTILIZATION_THRESHOLD_PCTNumber(85)Pool Monitor Ambang batas persentase utilisasi pool ( using / size * 100) pemicu status peringatanHIGH_UTILIZATION.Perubahan Database (DDL / DML):
sql-- Tidak ada migration file yang terdeteksi. -- Perubahan murni refaktorisasi arsitektur driver koneksi, eliminasi kebocoran koneksi, optimasi memori, dan penyediaan sistem observabilitas runtime.Kontrak API & Response Payload:
GET/health/liveness- Deskripsi: Probe liveness instan untuk orkestrator kontainer (Kubernetes) guna mendeteksi apakah proses aplikasi hidup.
- Autentikasi / Guard:
Public(Tanpa token) - Request Header / Query / Params:
Header: Tidak adaQuery: Tidak ada
- Request Body:text
None - Response Payload (
200 OK):json{ "status": "UP", "timestamp": "2026-09-22T17:49:00.000Z", "uptime_seconds": 1240 }
GET/health/readiness- Deskripsi: Probe kesiapan aplikasi melayani traffic berdasarkan konektivitas Master DB, Replica DB, dan Redis dengan proteksi micro-cache 3000ms.
- Autentikasi / Guard:
Public - Request Header / Query / Params:
Header: Tidak adaQuery:strict=true(opsional, jika true maka kegagalan replica/redis menghasilkan status DOWN)
- Request Body:text
None - Response Payload (
200 OK/503 Service Unavailable):json{ "status": "UP", "timestamp": "2026-09-22T17:49:00.000Z", "dependencies": { "database_master": "UP", "database_replica": "UP", "redis": "UP" } }
GET/health- Deskripsi: Menampilkan ringkasan status publik jika tanpa autentikasi, atau diagnostik mendalam (metrik koneksi pool Sequelize, event loop lag, dan memori V8) jika diakses oleh Administrator.
- Autentikasi / Guard:
optionalAdminAuth(Public summary / Admin detailed) - Request Header / Query / Params:
Header:Authorization: Bearer <admin_token>(opsional untuk diagnostik mendalam)Query: Tidak ada
- Request Body:text
None - Response Payload Admin (
200 OK):json{ "status": "UP", "timestamp": "2026-09-22T17:49:00.000Z", "uptime_seconds": 1240, "dependencies": { "database_master": { "status": "UP", "latency_ms": 2, "pool": { "size": 15, "available": 12, "using": 3, "waiting": 0, "max": 50, "min": 2, "utilization_pct": 6.0 } }, "database_replica": { "status": "UP", "latency_ms": 2, "pool": { "size": 5, "available": 5, "using": 0, "waiting": 0, "max": 20, "min": 1, "utilization_pct": 0.0 } }, "redis": { "status": "UP", "latency_ms": 1, "connection_state": "ready" } }, "pool_incidents": { "recent_count": 0, "latest": null }, "system": { "environment": "dev", "node_version": "v24.14.1", "event_loop_lag_ms": 1.25, "memory_usage": { "heap_used_mb": 78.4, "heap_total_mb": 112.5, "heap_limit_mb": 4144.0, "heap_utilization_pct": 1.89, "rss_mb": 142.1 } } }
GET/health/pool-incidents- Deskripsi: Pengambilan riwayat insiden kontensi pool (starvation/utilisasi tinggi) dari buffer Redis.
- Autentikasi / Guard:
Bearer Token(doIntrospection,requireAdmin) - Request Header / Query / Params:
Header:Authorization: Bearer <admin_token>Query:date=YYYY-MM-DD(opsional),limit=50(opsional)
- Request Body:text
None - Response Payload (
200 OK):json{ "status": "UP", "count": 1, "filter_date": "2026-09-22", "data": [ { "id": "inc_1790156059082_4d201e72", "database": "master", "timestamp": "2026-09-22T17:49:00+07:00", "severity": "CRITICAL", "reason": "CONNECTION_STARVATION", "metrics": { "size": 50, "available": 0, "using": 50, "waiting": 3, "max": 50, "min": 2, "utilization_pct": 100 } } ] }
DELETE/health/pool-incidents- Deskripsi: Pembersihan buffer riwayat insiden kontensi pool di Redis.
- Autentikasi / Guard:
Bearer Token(doIntrospection,requireAdmin) - Request Header / Query / Params:
Header:Authorization: Bearer <admin_token>
- Request Body:text
None - Response Payload (
200 OK):json{ "status": "UP", "success": true, "message": "Pool incidents buffer cleared successfully" }
GET/health/slow-queries- Deskripsi: Pengambilan pola query lambat yang teragregasi di Redis buffer.
- Autentikasi / Guard:
Bearer Token(doIntrospection,requireAdmin) - Request Header / Query / Params:
Header:Authorization: Bearer <admin_token>
- Request Body:text
None - Response Payload (
200 OK):json{ "status": "UP", "count": 1, "threshold_ms": 1000, "max_buffer": 50, "data": [ { "fingerprint": "a1b2c3d4e5f60718", "database": "master", "query": "SELECT * FROM pengangkut.tagihan_hdr WHERE id = $1", "count": 4, "last_timing_ms": 1420, "max_timing_ms": 2100, "last_seen": "2026-09-22T17:49:00.000Z", "worst_params": ["TRX-12345"], "recent_params": [["TRX-12345"], ["TRX-67890"]] } ] }
DELETE/health/slow-queries- Deskripsi: Pembersihan buffer riwayat slow query di Redis.
- Autentikasi / Guard:
Bearer Token(doIntrospection,requireAdmin) - Request Header / Query / Params:
Header:Authorization: Bearer <admin_token>
- Request Body:text
None - Response Payload (
200 OK):json{ "status": "UP", "success": true, "message": "Slow queries buffer cleared successfully" }
4. Bukti Teknis (Technical Proof & Audit Trail)
- Repository:
pengangkut-backend - Branch Utama:
refactor/unify-db-pool-sequelize - Merge Request / PR:
— (Feature unreleased — siap merge)
Daftar Commit Terkait (Multi-Commit Trail)
| Commit ID | Branch | Author | Tanggal & Jam | Ringkasan Perubahan |
|---|---|---|---|---|
b11e28c7 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-21 11:15 | Remediasi kebocoran koneksi tagihan, penundaan transaksi, dan validasi sinkron |
b333c3b7 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-21 13:20 | Penambahan connection timeout (fail-fast) dan idle timeout database |
f99cc682 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-21 16:40 | Unifikasi total pool koneksi ke Sequelize dan eliminasi pg native |
d85303f9 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 09:10 | Penyediaan router health check dan observabilitas connection pool |
2a1660a6 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:00 | Penambahan tracking slow query berbasis agregasi fingerprint |
dad00888 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:20 | Hardening keamanan health check, konfigurasi pool env, dan graceful shutdown |
b2eaee5a | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:45 | Optimasi slow query tracking via Redis Lua script dan in-memory throttling |
39882144 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:55 | Eliminasi CPU bottleneck pada format query dan hardening sanitasi |
891e8106 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:16 | Decoupling format query lambat ke background dan penyimpanan parameter tersanitasi |
59c6c16d | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 10:32 | Dukungan dynamic debug log level pada Sequelize logging function |
afa0aa24 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 11:02 | Peningkatan algoritma hash fingerprint query dari SHA-1 ke SHA-256 |
674c232f | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 16:07 | Dekopling pool-monitor.service.js dan penambahan endpoint insiden pool |
69167b02 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 17:08 | Pembaruan dokumentasi changelog unreleased untuk pool monitor & incidents |
479dbd07 | refactor/unify-db-pool-sequelize | Hermansyah Efendi | 2026-09-22 17:49 | Penguatan pembangkitan incident ID menggunakan crypto.randomBytes (kondisi final) |
Cuplikan Kode / Query Migration
// app/config/database/database.js - Konfigurasi Pool Sequelize Terpusat & Terproteksi
var db = new Sequelize(process.env.DATABASE_PG, process.env.DATABASE_PG_USERNAME, process.env.DATABASE_PG_PASSWORD, {
dialect: 'postgres',
host: process.env.DATABASE_PG_URL,
port: process.env.DATABASE_PG_PORT,
logging: createLoggingFunction('master'),
benchmark: true,
pool: {
max: Number(envConfig.DB_POOL_MAX || process.env.DB_POOL_MAX) || 50,
min: Number(envConfig.DB_POOL_MIN || process.env.DB_POOL_MIN) || 2,
idle: Number(envConfig.DB_POOL_IDLE_MS || process.env.DB_POOL_IDLE_MS) || 30000,
acquire: Number(envConfig.DB_POOL_ACQUIRE_MS || process.env.DB_POOL_ACQUIRE_MS) || 60000,
}
});
// app/services/pool-monitor.service.js - Non-Intrusive In-Memory Pool Inspector
export const inspectPoolThreshold = async (dbInstance, databaseName = 'master') => {
if (!dbInstance) return null;
const metrics = extractPoolMetrics(dbInstance);
if (!metrics) return null;
const isStarvation = (metrics.waiting || 0) > 0;
const isHighUtilization = (metrics.utilization_pct || 0) >= POOL_UTILIZATION_THRESHOLD_PCT;
if (!isStarvation && !isHighUtilization) return null;
const now = Date.now();
const lastAlert = lastPoolAlertTime[databaseName] || 0;
if (now - lastAlert < POOL_ALERT_COOLDOWN_MS) return null;
lastPoolAlertTime[databaseName] = now;
const reason = isStarvation ? 'CONNECTION_STARVATION' : 'HIGH_UTILIZATION';
return await recordPoolIncident({ database: databaseName, metrics, reason });
};5. Bukti Verifikasi Pengujian (QA / Unit Test / API Verification)
A. Verifikasi Unit Test (Development Stage)
- Test Suite File:
tests/services/pool-monitor.service.test.js,tests/services/slow-query.service.test.js,tests/controllers/health-controller.test.js,tests/services/health.service.test.js,tests/connection.test.js - Status Eksekusi CLI:
PASSED
✓ tests/services/slow-query.service.test.js (44 tests) 143ms
✓ tests/controllers/health-controller.test.js (21 tests) 42ms
✓ tests/services/pool-monitor.service.test.js (28 tests) 89ms
✓ tests/services/health.service.test.js (20 tests) 72ms
Test Files 4 passed (4)
Tests 113 passed (113)
Start at 16:34:18
Duration 838ms (transform 381ms, setup 0ms, import 1.11s, tests 219ms, environment 1ms)B. Panduan Pengujian QA & Verifikasi Staging (QA Playbook)
- Cakupan / Surface Pengujian:
API / Postman Only - Kebutuhan Akses / Role Akun:
Role Admin (Bearer Token klaim isAdmin: true)danAkses Public (tanpa token untuk probe infra) - Hasil Pengujian UAT:
PENDING - Catatan QA: —
Skenario Pengujian QA (Test Scenarios)
Skenario 1 — Verifikasi Liveness Probe (Public / Infra):
- Pre-kondisi: Server aktif.
- Trigger / Request:
GET/health/livenesstanpa header token. - Ekspektasi Response: HTTP
200 OK,status: "UP", nilaiuptime_secondspositif. - Verifikasi Database / Log: Tidak ada error log pada console server.
Skenario 2 — Verifikasi Readiness Probe Dependencies (Public / Infra):
- Pre-kondisi: Database Master, Replica, dan Redis dalam keadaan normal.
- Trigger / Request:
GET/health/readiness - Ekspektasi Response: HTTP
200 OK, menampilkan kesiapan ketiga dependensi (database_master: UP,database_replica: UP,redis: UP). - Verifikasi Database / Log: Log query Sequelize tidak terpicu secara berlebihan (micro-cache 3000ms aktif).
Skenario 3 — Verifikasi Metrik Pool Internal (Admin Only):
- Pre-kondisi: Token admin valid tersedia.
- Trigger / Request:
GET/healthdengan headerAuthorization: Bearer <admin_token>. - Ekspektasi Response: HTTP
200 OK, memuat objekdependencies.database_master.poollengkap dengan datasize,available,using,waiting, danutilization_pct. - Verifikasi Database / Log: Endpoint menolak request dengan status
401 Unauthorizedatau fallback summary jika tanpa token admin.
Skenario 4 — Pengawasan Insiden Kontensi Pool (Admin Only):
- Pre-kondisi: Token admin valid tersedia.
- Trigger / Request:
GET/health/pool-incidents - Ekspektasi Response: HTTP
200 OK, memuat riwayat insiden starvation/high utilization jika pernah terjadi kontensi. - Verifikasi Database / Log: Query filter
dateberfungsi membatasi data harian dari Redis list.
Skenario 5 — Reset Buffer Insiden (Admin Only):
- Pre-kondisi: Buffer Redis
monitoring:pool_incidentsterisi data. - Trigger / Request:
DELETE/health/pool-incidentsdengan headerAuthorization: Bearer <admin_token>. - Ekspektasi Response: HTTP
200 OK,success: true, pesanPool incidents buffer cleared successfully. - Verifikasi Database / Log: Key Redis
monitoring:pool_incidentsterhapus atau kosong.
- Pre-kondisi: Buffer Redis
Bukti Response Verifikasi Staging (Diisi saat UAT)
{
"status": "PENDING",
"note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA."
}