Episode ini menjadikan aplikasi bisa diamati: metrik Prometheus, tracing terdistribusi dengan OpenTelemetry, structured logs dengan slog, health check endpoint, serta integrasi dashboard dan alerting untuk latensi, error rate, dan throughput.

Aplikasi yang berjalan di production adalah aplikasi yang harus diamati. Observability menyatukan tiga pilar: metrik untuk angka, log untuk detail, dan trace untuk alur. Episode ini menghubungkan ketiganya ke Echo dengan tooling standar industri.
Episode 18 ini membahas metrik Prometheus, tracing dengan OpenTelemetry, structured logs dengan slog, health check endpoint, serta integrasi dashboard dan alerting.
Prometheus mengumpulkan metrik dengan menarik endpoint HTTP. Echo memudahkan ini lewat echo-contrib:
go get github.com/labstack/echo-contrib/prometheusimport "github.com/labstack/echo-contrib/prometheus"
p := prometheus.NewPrometheus("echo", nil)
p.Use(e)
e.GET("/metrics", prometheus.Handler())Metrik seperti jumlah request, latensi, dan status code kini tersedia di /metrics. Panggilan p.Use(e) memasang middleware metrik, sedangkan prometheus.Handler() melayani endpoint scrape — Prometheus tinggal dikonfigurasi untuk menariknya setiap interval.
scrape_configs:
- job_name: belajar-echo
static_configs:
- targets: ["api:8080"]OpenTelemetry memberi kalian trace terdistribusi — perjalanan satu request melewati banyak service. Instrumentasi Echo tersedia via kontribusi OTel:
import "go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho"
tp, err := initTracer(ctx)
e.Use(otelecho.Middleware("belajar-echo"))Setiap request kini menghasilkan span yang membawa context propagasi. Span bisa dihubungkan ke database dan HTTP call di dalamnya:
_, span := otel.Tracer("service").Start(c.Request().Context(), "processOrder")
defer span.End()Trace dikirim ke backend seperti Jaeger atau Tempo, lalu dihubungkan dengan log lewat trace_id yang sama — jembatan penting untuk debugging end-to-end.
Di episode 11 kalian mulai mencatat request_id. Integrasikan dengan trace_id dari OTel agar log dan trace bisa dihubungkan:
slog.Info("order diproses",
"order_id", order.ID,
"trace_id", span.SpanContext().TraceID().String(),
)Satu trace_id menghubungkan log, metrik, dan trace untuk satu request — kunci debugging cepat.
Infrastructure seperti Kubernetes melakukan health check secara berkala. Sediakan endpoint khusus:
e.GET("/health/live", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"status": "alive"})
})
e.GET("/health/ready", func(c echo.Context) error {
if err := db.Ping(c.Request().Context()); err != nil {
return echo.NewHTTPError(http.StatusServiceUnavailable, "db tidak siap")
}
return c.JSON(http.StatusOK, map[string]string{"status": "ready"})
})/health/live menandakan proses hidup; /health/ready menandakan dependency siap. Pisahkan keduanya agar restart dan routing traffic tidak salah sasaran.
Data dari Prometheus divisualisasikan di Grafana. Metrik yang selalu dipantau:
Alerting memicu tindakan saat ambang terlampaui:
groups:
- name: api
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{code=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
for: 10m
labels:
severity: critical
annotations:
summary: "Error rate di atas 5 persen selama 10 menit"Aturan ini membunyikan alarm ketika lebih dari 5 persen request gagal selama 10 menit.
Episode 18 membuat aplikasi kalian benar-benar bisa diamati: metrik Prometheus di /metrics, tracing terdistribusi dengan OpenTelemetry dan otecho, structured logs yang menyatu dengan trace_id, health check yang terpisah antara live dan ready, serta dashboard dan alerting untuk latensi, error rate, dan throughput.
Inti yang harus dibawa pulang:
echo-contrib/prometheus menyediakan metrik siap scrape.trace_id di log, metrik, dan trace./health/live dan /health/ready yang terpisah.Di episode 19 selanjutnya kita akan membahas performance & troubleshooting — mengurangi alokasi dan reuse, connection pooling, caching Redis, tuning HTTP server, serta troubleshooting route conflict, error binding, deadlock, kebocoran goroutine, dan migrasi v4 ke v5.