9.2 KiB
🗺️ Development Plan (Roadmap)
Project: GoPrint Service General (worker-satusehat)
Versi: 1.0
Tanggal: 2026-05-13
Peta jalan terurut berdasarkan dampak vs effort. Setiap fase punya keluaran yang bisa dirilis berdiri sendiri.
Phase 0 — Stabilisasi Production Saat Ini (1–2 minggu)
Tujuan: Service yang sekarang sudah jalan (REST + RBAC + KFA Puller) bebas bug kritikal.
Langkah Stabilisasi
-
Fix
satusehatClient = nil(main.go:235)- Inisialisasi:
satusehatClient := satusehat.NewClient(cfg)lalu pass keworker.NewManager. - Acceptance:
go runtidak panic ketikacfg.SatuSehat.Enabled = true.
- Inisialisasi:
-
Pindahkan kredensial worker login ke env
WORKER_AUTH_EMAIL,WORKER_AUTH_PASSWORDdi.env+ validation diconfig.Validate().- Hapus default hardcoded di worker/auth.go:25-28.
-
Audit & bersihkan kode mati
- Hapus
patient/migrator.gojika tidak akan dipakai, atau pindahkan ke folderarchive/+ buang default password. - Hilangkan
truncate()duplikat: pindah kepkg/loggerataupkg/utils.
- Hapus
-
Endpoint
/metricsPrometheus aktif- Tambahkan handler
promhttp.Handler()diroutes.go. - Definisikan counter dasar:
worker_documents_processed_total,worker_rate_limit_hits_total,satusehat_token_refresh_total.
- Tambahkan handler
-
gRPC handler
PermissionHandlerdi-uncomment- Tes via
grpcurlke:9090.
- Tes via
Output: Tag v0.9.0-stable.
Phase 1 — Aktivasi Worker Klinis (2–4 minggu)
Tujuan: Sinkronisasi data obat & radiologi ke SatuSehat jalan otomatis 24/7.
Langkah Aktivasi
-
Aktifkan worker secara bertahap di worker.go dengan urutan dependensi:
Encounter(prasyarat referensi)Medication(master kode obat lokal → KFA)MedicationRequestMedicationDispenseServiceRequest (Radiology)ImagingStudy
-
Validasi end-to-end per worker:
- Cek
sync_log(status SUCCESS/FAILED/RATE_LIMITED). - Pastikan FHIR ID kembali & tersimpan di mapping harian.
- Monitor log error rate ≤ 1% per jam selama 48 jam soak test.
- Cek
-
Rate-limit config dinamis — pindahkan konstanta
rateLimitSleepper worker keconfig.yaml:satu_sehat: worker: medication: { rate_limit_sleep: 60s, poll_interval: 2s } imagingstudy: { rate_limit_sleep: 60s, poll_interval: 2s } -
Sync Log Retention Policy
- Tabel
sync_logbisa membengkak — tambahkan TTL/archive job (retain 90 hari, archive ke S3/MinIO).
- Tabel
Output: Tag v1.0.0 — release bridging klinis pertama.
Phase 2 — Stateless Worker (Multi-Replica Ready) (2–3 minggu)
Tujuan: Mendukung deployment Kubernetes / multi-pod tanpa risiko race tracker.
Langkah Refactor State
-
Tabel
sync_trackerCREATE TABLE sync_tracker ( module_name VARCHAR(64) PRIMARY KEY, last_id BIGINT, last_timestamp TIMESTAMP, updated_at TIMESTAMP DEFAULT NOW() );- Implementasi via row-lock
SELECT ... FOR UPDATE SKIP LOCKED(Postgres) sehingga hanya satu replica per modul.
- Implementasi via row-lock
-
Refactor helper
readLastID()/writeTracker()- Bikin abstraksi
TrackerStoredipkg/tracker/(Interface:Get,Setper module name). - Implementasi backend
FileTracker(lama) &DBTracker(baru). Pilih via envTRACKER_BACKEND=db|file.
- Bikin abstraksi
-
Migrasi data tracker yang ada
- Script one-shot: baca semua
*.txtdiinternal/worker/satusehat/*/last_*&internal/master/kfa/kfa_tracker.txt→ seed kesync_tracker.
- Script one-shot: baca semua
-
Mapping FHIR ID → Redis hash atau tabel
mapperdata/YYYY-MM/YYYY-MM-DD.txttidak cocok multi-pod. Pindah ke tabelfhir_id_map(local_id, fhir_id, resource_type, created_at).
-
Leader election sederhana untuk worker eksklusif
- Gunakan Redis
SET key NX EX 60sebagai lease untuk worker singleton (KFA Puller, dst).
- Gunakan Redis
Output: Tag v1.1.0 — deployable di Kubernetes dengan ≥ 2 replica.
Phase 3 — Event-Driven Architecture (4–6 minggu)
Tujuan: Mengurangi polling DB → reactive berdasarkan trigger SIMRS.
Langkah Event-Driven
-
PostgreSQL LISTEN/NOTIFY
- Trigger pada tabel sumber (mis.
t_pesan_obatAFTER INSERT) →NOTIFY pesan_obat_new, NEW.id::text. - Worker
Medicationsubscribe viapq.NewListenerdaripada polling per 2 detik. - Fallback: tetap ada polling tiap N detik sebagai catch-up untuk event yang tertinggal.
- Trigger pada tabel sumber (mis.
-
Kafka Producer (opsional, untuk multi-microservice)
- Uncomment main.go:111-113.
- Publish event
fhir.resource.syncedsetelah pengiriman sukses untuk konsumsi service lain (audit, BI, dashboard). - Library:
segmentio/kafka-go(lightweight).
-
Dead Letter Queue
- Pesan yang gagal kirim 3× → masuk topik
fhir.dlquntuk inspeksi manual.
- Pesan yang gagal kirim 3× → masuk topik
-
Webhook callback dari
service-satusehat- Jika service downstream support webhook untuk async FHIR commit, langganan untuk update
sync_log.statuslebih cepat.
- Jika service downstream support webhook untuk async FHIR commit, langganan untuk update
Output: Tag v1.2.0.
Phase 4 — Worker Coverage Lengkap (rolling, 1 resource / sprint)
Tujuan: Mengisi 13 worker stub menjadi production-ready.
Urutan Prioritas Worker (berdasarkan kebutuhan pelaporan SatuSehat)
Condition(diagnosa)Observation(vital sign, lab)Procedure(tindakan medis)DiagnosticReport(laporan lab/radiologi)AllergyIntoleranceImmunizationSpecimen(lab)ClinicalImpressionEpisodeOfCareCarePlanCompositionMedicationStatementQuestionnaireResponse
Template per Worker
- Salin pola dari worker yang sudah lengkap (saran:
Medicationuntuk transactional,ServiceRequestuntuk time-based). - Komponen wajib: tracker, rate-limit handler, KFA/master fetch jika perlu, token refresh, sync log, mapping persistence.
Output: Tiap worker = sprint sendiri, release patch (v1.x.y).
Phase 5 — Observability & Operasional (2–3 minggu, paralel)
Langkah Observability
-
Grafana Dashboard
- Source: Prometheus
worker_*_total,worker_processing_duration_seconds,satusehat_response_status_total{code=...}. - Panel: throughput per worker, error rate, p95 latency, queue depth (lag dari tracker terhadap MAX(id) source).
- Source: Prometheus
-
Alerting
- Worker tidak progress > 10 menit.
- Rate-limit hits > 10/min selama 5 menit.
- Token refresh failed > 3 berturut-turut.
-
Distributed Tracing (opsional)
- Integrasi OpenTelemetry, trace span dari REST handler → service → repository → API gov't.
-
Health & Readiness Probe
/health/live: cek service hidup./health/ready: cek DB ping, Redis ping, MinIO ping, last token refresh sukses.
Output: Stack monitoring siap pakai (Prometheus + Grafana + Alertmanager).
Phase 6 — UI Dashboard (repository terpisah, ditangani tim frontend)
Tujuan: Operasional team & admin RS bisa monitor + intervensi tanpa SSH.
Fitur Inti Dashboard
-
Sync Monitor
- Tabel
sync_logrealtime, filter by status, worker, tanggal. - Re-queue dokumen gagal (button "Retry").
- Tabel
-
Tracker Cockpit
- Posisi setiap worker (last_id, last_timestamp) vs. MAX di tabel sumber → lag visual.
- Pause / Resume worker via toggle (butuh control-plane API baru:
PUT /api/v1/worker/{name}/state).
-
RBAC Management
- Hirarki halaman dengan checkbox CRUD level per role (konsumsi
GetRolePermissionTree). - Cache invalidation otomatis lewat REST API existing.
- Hirarki halaman dengan checkbox CRUD level per role (konsumsi
-
KFA Browser
- Search produk farmasi yang sudah masuk ke DB lokal.
- Trigger ulang puller dari halaman tertentu.
-
BPJS Console (opsional)
- Dropdown service VClaim/Antrol → form input → call SDK → tampilkan hasil dekripsi.
Phase 7 — Hardening & Compliance (jangka panjang)
- Audit Trail lengkap untuk RBAC: siapa, kapan, mengubah apa.
- Field-Level Encryption untuk data PII (NIK, alamat) yang tersimpan di sync log.
- SLA Report untuk Kemenkes: persentase data terkirim dalam 1×24 jam.
- Disaster Recovery runbook: replay dari sync log, re-sync dari ID tertentu.
Ringkasan Timeline Indikatif
| Phase | Durasi | Target Tag | Outcome |
|---|---|---|---|
| 0 — Stabilisasi | 1–2 minggu | v0.9.0 |
Bug kritikal fixed, metrics live |
| 1 — Aktivasi Klinis | 2–4 minggu | v1.0.0 |
Worker obat & radiologi production |
| 2 — Stateless Tracker | 2–3 minggu | v1.1.0 |
Multi-replica safe |
| 3 — Event-Driven | 4–6 minggu | v1.2.0 |
LISTEN/NOTIFY + Kafka |
| 4 — Worker Lengkap | rolling | v1.x.y |
13 resource FHIR aktif |
| 5 — Observability | 2–3 minggu | (paralel) | Grafana + alerting |
| 6 — UI Dashboard | terpisah | (FE repo) | Operator self-service |
| 7 — Hardening | berkelanjutan | — | Compliance & DR |
Quick Wins Bulan Ini
- Fix BUG-001 (satusehatClient nil) — 1 jam kerja, dampak besar.
- Wire
/metrics— 30 menit, langsung kelihatan progress di Prometheus. - Uncomment Worker
Medication+ soak test 24 jam staging. - Pindahkan password worker ke env — 1 jam, tutup security finding.
Disusun ulang: Tim Engineering GoPrint, 2026-05-13.