Workflow Monitoring: Grafana + Loki + Tempo
Stack LGTM (Loki + Grafana + Tempo + Mimir) saya jalankan 24 bulan di fintech series-B Jakarta. Cost Rp 9-12 juta/bulan untuk 18 service. Ingest 1,8 TB log/bulan + 380 GB trace. Verdict Recommended untuk SMB-enterprise yang butuh ownership data.
TL;DR
- Grafana untuk visualization + alerting hub.
- Loki untuk log aggregation (label-based, cost-efficient).
- Tempo untuk distributed tracing (OTel native).
- Mimir untuk metric (Prometheus-compatible, multi-tenant).
- Total cost untuk 18 service fintech: Rp 9-12 juta/bulan all-in.
- Verdict: Recommended untuk SMB-enterprise Indonesia yang butuh observability self-host dengan ownership data.
Konteks
Saya jalankan stack ini 24 bulan di fintech series-B Jakarta (Juni 2024 - Mei 2026). Skala observability:
- 18 microservice (mixed Java, Go, Node, Python)
- 6 frontend channel
- ~85 deploy/minggu
- Ingest log: 1,8 TB/bulan rata-rata, peak 3,2 TB/bulan saat campaign
- Ingest trace: 380 GB/bulan
- Ingest metric: 45 GB/bulan
- Active series Prometheus: 850k
Sebelumnya di BUMN 2022-2024 saya jalankan ELK (Elasticsearch + Logstash + Kibana) + Prometheus + Jaeger. Pengalaman ELK menjadi baseline pembanding untuk angka cost + ops.
Pricing (Juni 2026)
Grafana
- Open Source self-host: software gratis (AGPL)
- Saya pakai self-host di GKE, 2 replica e2-small: Rp 920 ribu/bulan
Loki
- Open Source: gratis
- Infra Loki cluster:
- 3 ingester pod e2-medium: Rp 2,1 juta/bulan
- 2 querier pod e2-small: Rp 920 ribu/bulan
- 1 distributor pod e2-small: Rp 460 ribu/bulan
- Storage chunk di Cloudflare R2 (compressed): Rp 1,8 juta/bulan untuk 30 hari hot + 90 hari warm
- Total Loki: Rp 5,3 juta/bulan
Tempo
- Open Source: gratis
- Infra Tempo cluster:
- 2 ingester pod e2-medium: Rp 1,4 juta/bulan
- 1 querier pod e2-small: Rp 460 ribu/bulan
- Storage trace di R2: Rp 1,2 juta/bulan untuk 7 hari trace + 30 hari sampled
- Total Tempo: Rp 3,1 juta/bulan
Mimir
- Open Source: gratis
- Infra Mimir cluster:
- 3 ingester pod e2-medium: Rp 2,1 juta/bulan
- 2 querier pod e2-small: Rp 920 ribu/bulan
- Storage block di R2: Rp 850 ribu/bulan untuk 13 bulan metric
- Total Mimir: Rp 3,9 juta/bulan
Total LGTM stack
| Komponen | Cost/bulan |
|---|---|
| Grafana | Rp 920 ribu |
| Loki + storage | Rp 5,3 juta |
| Tempo + storage | Rp 3,1 juta |
| Mimir + storage | Rp 3,9 juta |
| OTel Collector (DaemonSet) | Rp 1,2 juta |
| Promtail (DaemonSet) | Rp 600 ribu |
| Alertmanager HA | Rp 460 ribu |
| Total all-in | Rp 15,5 juta/bulan |
Saya negosiasi compute dengan committed use 1 tahun di GCP, dapat diskon ~25%. Real run-rate: Rp 11,6 juta/bulan.
Bandingkan Datadog equivalent
Untuk 18 service × ~3 host equivalent + ingest 1,8 TB log/bulan + 380 GB trace:
- Datadog Infrastructure: 54 host × USD 31 = USD 1.674/bulan
- Datadog APM: 18 host × USD 36 = USD 648/bulan
- Datadog Log Management: 1,8 TB × USD 1,06/GB ingest = USD 1.908/bulan
- Datadog Log Retention: USD 1,70/juta event × ~750 juta event = USD 1.275/bulan
- Datadog RUM: 18 service × USD 12 = USD 216/bulan
Total Datadog: USD 5.721/bulan = Rp 86 juta/bulan
Self-host LGTM 7,4x lebih murah dari Datadog di skala ini. Trade-off: ops overhead engineer 12-18 jam/bulan + learning curve LogQL/TraceQL/PromQL.
SLO + performance (24 bulan data)
| Metrik | Target SLO | Realisasi |
|---|---|---|
| Ingest availability log | > 99,9% | 99,94% |
| Ingest availability trace | > 99,9% | 99,92% |
| Ingest availability metric | > 99,95% | 99,97% |
| Query latency Loki p99 (24h range) | < 3 detik | 2,1 detik |
| Query latency Tempo p99 (trace by ID) | < 2 detik | 1,4 detik |
| Query latency Mimir p99 (1h range) | < 1 detik | 720ms |
| Alert latency event-to-notify p99 | < 60 detik | 38 detik |
| Retention log compliant | 7 tahun archive | passed (audit Q1 2026) |
Insiden major selama 24 bulan: 5 kali ingest disruption > 10 menit. Root cause: 2 kali Loki ingester OOM (memory tuning), 1 kali R2 outage area Asia, 1 kali deploy regression alertmanager rule, 1 kali Postgres metadata lock.
Architecture diagram
[Service Pods]
│
├── Promtail DaemonSet ─────→ Loki Distributor ─→ Ingester ─→ R2
│
├── OTel SDK (trace) ───────→ OTel Collector ──→ Tempo ────→ R2
│
└── Prometheus exporter ────→ OTel Collector ──→ Mimir ────→ R2
│
└─→ Alertmanager ──→ Slack / PagerDuty / Email
Grafana ←─ (query Loki, Tempo, Mimir)
│
└─→ Dashboard ←─ Engineer / SRE
Service correlation
Pattern critical: trace ID + log + metric correlate via traceId label.
- OTel SDK inject traceId di MDC (Java) / context (Go, Node)
- Promtail extract traceId dari log line, set sebagai label
- Grafana Loki panel auto-link ke Tempo trace via
derived fieldconfig - Dashboard payment service: 1 click dari log error → trace span → metric panel di waktu yang sama
Built once, reuse across all service. Reduce MTTI (Mean Time To Investigate) dari 8-12 menit ke 2-3 menit.
Throughput + scalability
| Beban | Loki ingest | Tempo ingest | Mimir ingest |
|---|---|---|---|
| Idle pagi | 15 MB/s log | 2 MB/s trace | 800 KB/s metric |
| Peak normal (jam 9-11) | 85 MB/s | 18 MB/s | 4,2 MB/s |
| Peak campaign (payday) | 280 MB/s | 65 MB/s | 12 MB/s |
| Max sustained | 380 MB/s (test) | 95 MB/s | 18 MB/s |
Threshold scaling:
- Loki ingester: scale horizontal di 80% memory utilization. Saya pakai HPA dengan custom metric.
- Tempo ingester: scale di 75% CPU.
- Mimir ingester: scale di 70% memory (memory bound karena WAL).
Untuk skala 5-10x dari sekarang (90 service): tinggal scale horizontal, tidak perlu redesign. Untuk skala 50x: butuh sharding multi-tenant dan kemungkinan switch ke ClickHouse untuk log analytical.
HA + DR
Region setup
- Primary: GKE asia-southeast2 (Jakarta)
- DR: GKE asia-southeast1 (Singapore), 30% capacity standby
- Storage: R2 multi-region replication (auto)
RPO/RTO target
| Komponen | RPO target | RTO target | Realisasi |
|---|---|---|---|
| Loki ingest | 30 detik | 5 menit | 18 detik / 3,2 menit |
| Tempo ingest | 30 detik | 5 menit | 22 detik / 3,8 menit |
| Mimir ingest | 30 detik | 5 menit | 15 detik / 2,9 menit |
| Grafana UI | N/A (stateless) | 30 detik | 18 detik |
| Alertmanager | 0 (HA gossip) | 5 detik | passed |
Failover test quarterly: chaos engineering drill kill primary region, verify auto-failover ke Singapore. RTO realisasi konsisten di bawah target.
Backup + archive
3-tier storage:
- Hot (Loki ingester chunk): 30 hari di R2 standard tier
- Warm (queried occasional): 60 hari di R2 infrequent access (cheaper)
- Archive (compliance OJK 7 tahun): export ke S3 Glacier Deep Archive
Job archive nightly: lakukan compaction Loki chunk lama, upload ke Glacier, delete dari hot tier. Cost archive 7 tahun all-in: Rp 18-25 juta sekali bayar (storage Glacier murah).
Trade-off vs alternative
vs Datadog managed
| Aspek | LGTM self-host | Datadog |
|---|---|---|
| Cost (skala saya) | Rp 11,6 juta/bulan | Rp 86 juta/bulan |
| Setup time | 4-6 minggu | 1-2 minggu |
| Ops time/bulan | 12-18 jam | 2-4 jam |
| Feature breadth | core + plugin | premium (RUM, Synthetic, APM AI) |
| Vendor lock-in | minim | tinggi |
| Data residency | controllable (R2 Jakarta) | tidak |
| SLA contract | DIY | 99,8% |
| Learning curve | sedang-tinggi | rendah |
Untuk BUMN dengan budget IT besar + butuh fitur premium: Datadog worth-nya. Untuk fintech series-B / SMB enterprise: LGTM self-host 7-8x lebih murah dengan trade-off ops manageable.
vs ELK Stack (Elasticsearch + Logstash + Kibana)
ELK pengalaman saya di BUMN 2022-2024:
- Cost equivalent: Rp 22-28 juta/bulan untuk scale similar
- Ops time: 30-45 jam/bulan (JVM tuning, shard management, snapshot)
- Strength: full-text search powerful, Kibana visualization mature
- Weakness: storage cost 4-6x dari Loki, JVM ops burden
Saya rekomendasi ELK only kalau Anda butuh full-text search + business analytical use case di log. Untuk operational log: LGTM unggul.
vs OpenTelemetry-native vendor (Honeycomb, Lightstep, Signoz)
Honeycomb / Lightstep cocok untuk APM-first usage dengan high-cardinality query. Pricing premium. Signoz open source + cocok all-in-one tapi maturity lebih rendah dari LGTM.
Untuk Indonesia, saya pilih LGTM karena: ekosistem terbesar, community Indonesia ada (Grafana meetup Jakarta aktif), hiring engineer berpengalaman lebih mudah.
Migration risk + path
Dari ELK ke LGTM
12 minggu rencana, realisasi 14 minggu di BUMN:
- Minggu 1-2: Setup LGTM cluster paralel ELK
- Minggu 3-4: Dual-ship log dari Promtail ke Loki + Filebeat ke ELK
- Minggu 5-8: Recreate dashboard Kibana → Grafana (per domain)
- Minggu 9-11: Cutover query primary ke Loki, ELK jadi read-only backup
- Minggu 12-14: Decommission ELK, archive existing index ke Glacier
Pain point: LogQL semantik beda dengan Elasticsearch DSL. Engineer butuh re-train 4-8 jam workshop. Saya bikin “ELK → LogQL cheatsheet” untuk transition.
Dari Jaeger ke Tempo
Smooth karena OTel-compatible. Re-point OTel collector exporter dari Jaeger ke Tempo, archive historical trace dari Jaeger, decommission Jaeger. 2-3 minggu kerja.
Common pitfall
- Loki label cardinality explosion. Label dengan unique value tinggi (user ID, request ID) bunuh Loki performance. Pakai label hanya untuk kategori kasar (service, env, level), simpan ID di body log + extract via parser di query time.
- Tempo trace tanpa sampling. 100% trace = cost storage massive. Saya pakai head-based sampling 10% untuk service biasa, 100% untuk service payment. Tail-based sampling (sample berdasarkan error / latency) di OTel Collector untuk smart sampling.
- Mimir cardinality runaway. Active series > 1 juta = memory + cost issue. Audit
prometheus_tsdb_head_seriesquarterly, drop label tidak terpakai. - Grafana dashboard sprawl. Setelah 12 bulan saya punya 240 dashboard, ~140 unused. Folder organization + tagging penting. Quarterly cleanup audit.
- Alertmanager spam. Alert dengan threshold terlalu sensitif bikin alert fatigue. Saya pakai SLO-based alerting (multi-window burn rate) bukan threshold statis. Reduce alert volume 70%.
Indonesia specific
Data residency
R2 Cloudflare punya region Jakarta (asia-southeast2). Saya bind Loki chunk + Tempo trace + Mimir block ke R2 Jakarta bucket. Tidak ada data observability keluar Indonesia. Audit OJK Q1 2026 passed dengan finding 0 terkait data residency observability.
Bandwidth
Saya pakai compression OTel + Promtail (snappy) sebelum ingest. Saves ~70% bandwidth dari pod ke ingester. Penting karena bandwidth egress di GCP Indonesia masih premium.
Hiring
Engineer berpengalaman LGTM stack di Indonesia masih relatif terbatas. Saya invest 2x quarterly workshop internal + sponsor 2 engineer ke Grafana Cloud certification. Hiring senior LGTM engineer butuh kompensasi premium (Rp 25-40 juta/bulan untuk senior SRE).
Yang surprising
Setelah 24 bulan: Loki cost storage actually lebih rendah dari ekspektasi saya. Kompresi snappy + label-based index bikin 1,8 TB log/bulan jadi ~250 GB compressed di R2. Cost storage R2 untuk 30 hari hot tier: Rp 850 ribu — kurang dari setengah estimate awal.
Surprise lain: query LogQL terasa lebih lambat dari Kibana di full-text use case (yang memang bukan strength Loki), tapi terasa lebih cepat di structured log query dengan label filter. Untuk 80% workload operational (debug specific service di window 1-4 jam), Loki feel lebih responsif.
Verdict
Recommended untuk SMB-enterprise Indonesia.
- Default fintech series-B / enterprise mid: LGTM self-host. Cost Rp 11-15 juta/bulan untuk 15-25 service. ROI vs Datadog jelas.
- BUMN besar dengan budget IT Rp 20+ miliar/tahun + butuh premium feature: Datadog atau New Relic worth dipertimbangkan untuk APM AI + RUM.
- SMB Indonesia < 5 service: Grafana Cloud free tier (50 GB log/bulan, 10k metric series) cukup. Self-host LGTM overkill di skala ini.
- Skip stack ini kalau tim engineer < 5 dan ops capacity tidak ada — pakai managed (Grafana Cloud Pro, Datadog) bahkan dengan cost premium.
Threshold konkret untuk adopt self-host LGTM: 8+ service + dedicated SRE (minimal 0,5 FTE) + budget Rp 10 juta/bulan untuk observability. Di bawah ini, managed lebih masuk akal walaupun mahal.
Ditulis oleh Asti Larasati