Skip to content

[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-OBSERVABILITY

  • Sumber 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: Pengangkut

  • Service / Repository: pengangkut-backend

  • PIC 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 blok try-catch serta inisiasi transaksi (BEGIN) prematur sebelum validasi payload selesai. Investigasi lebih lanjut mengungkap bahwa konfigurasi database PostgreSQL belum memiliki parameter connectionTimeoutMillis (fail-fast) dan idleTimeoutMillis, serta sistem menjalankan dua driver database paralel secara bersamaan (native pg.Pool dan 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 ​

#EnvironmentTanggal & WaktuPICStatusCatatan
1Development2026-09-22 17:49Hermansyah EfendiDEPLOYEDBranch: refactor/unify-db-pool-sequelize
2Staging (UAT)2026-09-26 12:44Hermansyah EfendiDEPLOYEDRelease 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]
3Production——PENDING—

Riwayat Update Log ​

TanggalEnvironmentPerubahanPIC
2026-09-26StagingPromosi ke STAGING (Release Candidate v1.18.4)Hermansyah Efendi
2026-09-23DevelopmentInitial log createdHermansyah Efendi

3. Analisis Teknis & Rincian Perubahan ​

  • Alur Logika & Bisnis:

    1. Pencegahan Connection Hang & Leak:
      • Pemanggilan koneksi database pada endpoint tagihan dipindahkan ke dalam blok try...finally dengan 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).
    2. 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 eror sorry, too many clients already.
      • Mengimplementasikan Adapter Pattern di app/connection.js berbasis QueryTypes.RAW serta menyediakan SequelizeTransactionClient untuk mempertahankan kompatibilitas transaksi SQL warisan.
    3. Engine Pemantau Connection Pool Non-Intrusif:
      • Background worker berjalan tiap 15 detik (unref timer) membaca metrik langsung dari memori instance sequelize-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.
    4. 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.
  • 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.example untuk mendukung konfigurasi terkelola dan observabilitas:

    NoVariabel LingkunganTipe / DefaultKategoriDeskripsi / Fungsi Teknis
    1SLOW_QUERY_KEYString (monitoring:slow_queries)Slow QueryKey Redis Hash untuk ring buffer penyimpanan agregasi query lambat.
    2SLOW_QUERY_THRESHOLD_MSNumber (1000)Slow QueryAmbang batas durasi eksekusi query (milidetik) untuk diklasifikasikan sebagai query lambat.
    3MAX_SLOW_QUERIESNumber (50)Slow QueryKapasitas maksimum pola query lambat unik yang disimpan di Redis ring buffer.
    4SLOW_QUERY_THROTTLE_MSNumber (5000)Slow QueryJeda waktu debounce/rate-limiting in-memory per fingerprint query sebelum update berikutnya ke Redis.
    5DB_POOL_MAXNumber (50)DB Pool MasterBatas maksimum koneksi fisik simultan yang dialokasikan ke instance PostgreSQL Master.
    6DB_POOL_MINNumber (2)DB Pool MasterJumlah koneksi fisik minimum standby yang selalu dijaga terbuka ke PostgreSQL Master.
    7DB_POOL_IDLE_MSNumber (30000)DB Pool MasterBatas waktu idle (milidetik) sebelum koneksi tidak terpakai dilepaskan kembali oleh pool.
    8DB_POOL_ACQUIRE_MSNumber (60000)DB Pool MasterBatas waktu tunggu peminjaman koneksi dari pool sebelum melempar error timeout.
    9DB_REPLICA_POOL_MAXNumber (20)DB Pool ReplicaBatas maksimum koneksi fisik simultan yang dialokasikan ke instance PostgreSQL Replica.
    10DB_REPLICA_POOL_MINNumber (1)DB Pool ReplicaJumlah koneksi fisik minimum standby yang dijaga terbuka ke PostgreSQL Replica.
    11DB_POOL_INCIDENTS_KEYString (monitoring:pool_incidents)Pool IncidentsKey Redis List untuk menyimpan riwayat insiden kontensi (starvation / utilisasi tinggi) pool.
    12DB_POOL_MAX_INCIDENTSNumber (100)Pool IncidentsKapasitas maksimum buffer riwayat insiden pool yang disimpan di Redis list.
    13DB_POOL_ALERT_COOLDOWN_MSNumber (60000)Pool IncidentsPeriode hening (cooldown milidetik) notifikasi insiden berulang untuk mencegah banjir alert.
    14DB_POOL_MONITOR_INTERVAL_MSNumber (15000)Pool MonitorFrekuensi periodik worker in-memory pool monitor mengevaluasi metrik koneksi (milidetik).
    15DB_POOL_UTILIZATION_THRESHOLD_PCTNumber (85)Pool MonitorAmbang batas persentase utilisasi pool (using / size * 100) pemicu status peringatan HIGH_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 ada
      • Query: 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 ada
      • Query: 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 IDBranchAuthorTanggal & JamRingkasan Perubahan
b11e28c7refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-21 11:15Remediasi kebocoran koneksi tagihan, penundaan transaksi, dan validasi sinkron
b333c3b7refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-21 13:20Penambahan connection timeout (fail-fast) dan idle timeout database
f99cc682refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-21 16:40Unifikasi total pool koneksi ke Sequelize dan eliminasi pg native
d85303f9refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 09:10Penyediaan router health check dan observabilitas connection pool
2a1660a6refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:00Penambahan tracking slow query berbasis agregasi fingerprint
dad00888refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:20Hardening keamanan health check, konfigurasi pool env, dan graceful shutdown
b2eaee5arefactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:45Optimasi slow query tracking via Redis Lua script dan in-memory throttling
39882144refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:55Eliminasi CPU bottleneck pada format query dan hardening sanitasi
891e8106refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:16Decoupling format query lambat ke background dan penyimpanan parameter tersanitasi
59c6c16drefactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 10:32Dukungan dynamic debug log level pada Sequelize logging function
afa0aa24refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 11:02Peningkatan algoritma hash fingerprint query dari SHA-1 ke SHA-256
674c232frefactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 16:07Dekopling pool-monitor.service.js dan penambahan endpoint insiden pool
69167b02refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 17:08Pembaruan dokumentasi changelog unreleased untuk pool monitor & incidents
479dbd07refactor/unify-db-pool-sequelizeHermansyah Efendi2026-09-22 17:49Penguatan pembangkitan incident ID menggunakan crypto.randomBytes (kondisi final)

Cuplikan Kode / Query Migration ​

javascript
// 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
text
 ✓ 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) dan Akses Public (tanpa token untuk probe infra)
  • Hasil Pengujian UAT: PENDING
  • Catatan QA: —
Skenario Pengujian QA (Test Scenarios) ​
  1. Skenario 1 — Verifikasi Liveness Probe (Public / Infra):

    • Pre-kondisi: Server aktif.
    • Trigger / Request: GET /health/liveness tanpa header token.
    • Ekspektasi Response: HTTP 200 OK, status: "UP", nilai uptime_seconds positif.
    • Verifikasi Database / Log: Tidak ada error log pada console server.
  2. 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).
  3. Skenario 3 — Verifikasi Metrik Pool Internal (Admin Only):

    • Pre-kondisi: Token admin valid tersedia.
    • Trigger / Request: GET /health dengan header Authorization: Bearer <admin_token>.
    • Ekspektasi Response: HTTP 200 OK, memuat objek dependencies.database_master.pool lengkap dengan data size, available, using, waiting, dan utilization_pct.
    • Verifikasi Database / Log: Endpoint menolak request dengan status 401 Unauthorized atau fallback summary jika tanpa token admin.
  4. 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 date berfungsi membatasi data harian dari Redis list.
  5. Skenario 5 — Reset Buffer Insiden (Admin Only):

    • Pre-kondisi: Buffer Redis monitoring:pool_incidents terisi data.
    • Trigger / Request: DELETE /health/pool-incidents dengan header Authorization: Bearer <admin_token>.
    • Ekspektasi Response: HTTP 200 OK, success: true, pesan Pool incidents buffer cleared successfully.
    • Verifikasi Database / Log: Key Redis monitoring:pool_incidents terhapus atau kosong.
Bukti Response Verifikasi Staging (Diisi saat UAT) ​
json
{
  "status": "PENDING",
  "note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA."
}

Single Source of Truth (SSOT) Arsitektur & Perubahan Teknis Backend