Observability 2026: Bangun Stack OpenTelemetry + Grafana + Prometheus untuk Production

Observability 2026: panduan lengkap bangun stack OpenTelemetry + Grafana LGTM (Loki, Grafana, Tempo, Mimir/Prometheus) untuk production Indonesia. Termasuk kode instrumentasi Go, konfigurasi Grafana Alloy, strategi SLO-based alerting, dan perbandingan biaya real-world vs Datadog.

Share
Observability 2026: Bangun Stack OpenTelemetry + Grafana + Prometheus untuk Production

Era monitoring tradisional sudah berakhir. Tahun 2026 menandai titik balik di mana observability bukan lagi opsional — melainkan standar wajib untuk tim engineering yang mengelola sistem terdistribusi skala besar. Perbedaan fundamentalnya sederhana: monitoring memberitahu apa yang rusak, observability menjawab mengapa rusak. Dengan adopsi OpenTelemetry sebagai standar industri, ekosistem Grafana (LGTM stack: Loki, Grafana, Tempo, Mimir/Prometheus) mencapai kematangan penuh, dan biaya observability self-hosted turun drastis berkat tier gratis Grafana Cloud 10k metrik Prometheus, 50GB logs, 50GB traces — tim Indonesia kini bisa membangun visibility production-grade tanpa budget enterprise.

Mengapa 2026 Jadi Tahun Observability Matang

Tiga faktor konvergen mendorong transisi ini. Pertama, OpenTelemetry (OTel) v1.0 stabil sejak 2024 telah menghilangkan fragmentasi instrumentasi — satu SDK, satu protokol (OTLP), mendukung 11+ bahasa pemrograman. Kedua, Grafana 11 memperkenalkan Grafana Alloy, pipeline telemetri terpadu yang menggantikan Promtail, Prometheus Agent, dan OpenTelemetry Collector menjadi satu binary ringan. Ketiga, tekanan biaya cloud mendorong migrasi ke stack open-source self-hosted di Kubernetes. Survei CNCF 2025 menunjukkan 78% organisasi sudah adopt OTel di production, naik dari 45% tahun 2023.

Arsitektur LGTM Stack Modern

Stack standar 2026 terdiri dari empat komponen inti yang saling terintegrasi via OTLP:

  • Loki 3.x — log aggregation dengan indexing label-based, biaya storage 10x lebih murah vs Elasticsearch
  • Grafana 11 — visualisasi terpadu untuk metrics, logs, traces, profiles (Pyroscope), dengan dashboard-as-code via Jsonnet/Grafonnet
  • Tempo 2.x — distributed tracing object-storage native (S3/GCS), tidak perlu Cassandra/Elasticsearch
  • Mimir/Prometheus — metrics long-term storage dengan horizontal scaling, kompatibel PromQL penuh

Grafana Alloy menjadi single pane of glass collection layer: menerima OTLP, Prometheus remote write, syslog, journalD, lalu forward ke keempat backend di atas. Konfigurasi declarative via file .alloy memungkinkan GitOps penuh.

Highlight: Grafana Cloud Free Tier 2026 menyediakan 10.000 series Prometheus, 50GB logs Loki, 50GB traces Tempo, dan 500 VUh k6 testing — cukup untuk tim 5-10 engineer tanpa biaya bulanan. Upgrade ke Pro hanya saat butuh retention >30 hari atau SLO/alerting advanced.

Implementasi Praktis: Instrumentasi Go Service dengan OTel

Berikut minimal setup untuk service Go production-ready:

// main.go
package main

import (
	"context"
	"net/http"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
	"go.opentelemetry.io/otel/propagation"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
)

func initTracer(ctx context.Context) (*sdktrace.TracerProvider, error) {
	exporter, err := otlptracegrpc.New(ctx,
		otlptracegrpc.WithEndpoint("alloy:4317"),
		otlptracegrpc.WithInsecure(),
	)
	if err != nil {
		return nil, err
	}
	res, _ := resource.Merge(
		resource.Default(),
		resource.NewWithAttributes(semconv.SchemaURL,
			semconv.ServiceNameKey.String("checkout-service"),
			semconv.ServiceVersionKey.String("v2.3.1"),
			semconv.DeploymentEnvironmentKey.String("production"),
	),
	)
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
		sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(0.1))),
	)
	otel.SetTracerProvider(ttp)
	otel.SetTextMapPropagator(propagation.TraceContext{})
	return tp, nil
}

func main() {
	ctx := context.Background()
	tp, _ := initTracer(ctx)
	defer tp.Shutdown(ctx)

	http.HandleFunc("/checkout", func(w http.ResponseWriter, r *http.Request) {
		ctx, span := otel.Tracer("checkout").Start(r.Context(), "process-payment")
		defer span.End()
		// business logic
		w.Write([]byte("OK"))
	})
	http.ListenAndServe(":8080", nil)
}

Konfigurasi Alloy config.alloy untuk menerima trace dan forward ke Tempo:

// config.alloy
otelcol.receiver.otlp "default" {
	grpc {
		endpoint = "0.0.0.0:4317"
	}
	http {
		endpoint = "0.0.0.0:4318"
	}
}

otelcol.exporter.otlp "tempo" {
	client {
		endpoint = "tempo:4317"
		insecure = true
	}
}

otelcol.processor.batch "default" {
	timeout = "5s"
	send_batch_size = 1024
}

otelcol.service "default" {
	receivers  = [otelcol.receiver.otlp.default]
	processors = [otelcol.processor.batch.default]
	exporters  = [otelcol.exporter.otlp.tempo]
}

Strategi Alerting & SLO Berbasis Error Budget

Monitoring 2026 bergeser dari threshold-based alert (CPU > 80%) ke SLO-based alerting menggunakan error budget burn rate. Contoh SLO untuk latency checkout:

  • SLI: p99 latency < 500ms
  • SLO: 99.9% requests memenuhi SLI per 30 hari
  • Error budget: 0.1% × 2.59M req/bulan = ~2.590 request gagal/bulan
  • Alert: burn rate > 2x (error budget habis dalam 15 hari) → page; > 10x → page critical

Grafana 11 mendukung SLO dashboard native dengan grafana-slo plugin. Recording rules Prometheus untuk burn rate:

# recording-rules.yml
groups:
- name: slo-checkout
  interval: 30s
  rules:
  - expr: |
      sum(rate(http_request_duration_seconds_bucket{service="checkout",le="0.5"}[5m]))
      /
      sum(rate(http_request_duration_seconds_count{service="checkout"}[5m]))
    record: slo:checkout:latency_p99_5m
  - expr: |
      (1 - slo:checkout:latency_p99_5m) / (1 - 0.999)
    record: slo:checkout:burn_rate_5m
  - expr: |
      slo:checkout:burn_rate_5m > 2
    record: slo:checkout:alert_burn_rate_2x

Biaya & Skalabilitas Real-world

Benchmark tim Gojek/Tokopedia (2025) untuk cluster 500 node, 50k req/s:

  • Self-hosted LGTM di EKS: ~$2,200/bln (compute + S3 storage 2TB)
  • Grafana Cloud Pro: ~$3,800/bln (managed, retention 13 bulan)
  • Datadog equivalent: ~$18,000/bln

Kunci penghematan: gunakan Loki structured metadata (label minimization), Tempo block storage S3 Intelligent-Tiering, Mimir compaction window 2h. Hindari high-cardinality label (user_id, request_id) di metrics — simpan di traces/logs saja.

Checklist Production Readiness 2026

  1. Instrumentation coverage > 90% service critical path (OTel auto-instrumentation Java/Node.js/Python/Go)
  2. Correlation IDs propagate via W3C TraceContext header end-to-end
  3. Sampling strategy head-based 10% + tail-based error/latency sampling di collector
  4. Dashboard as code semua dashboard di Git, deploy via GitOps (ArgoCD/Flux)
  5. Runbook terintegrasi link runbook di setiap alert rule (annotation runbook_url)
  6. Game day quarterly inject failure (Latency, Error, Saturation) validasi observability

Observability 2026 bukan soal tool — soal budaya "you build it, you observe it". Stack LGTM + OpenTelemetry memberi fondasi teknis; disiplin engineering menentukan apakah investasi ini menghasilkan MTTR menit atau jam. Mulai instrumentasi hari ini, iterasi minggu depan, production-ready bulan depan.