Metrik tidak muncul dengan sendirinya — aplikasi harus diinstrumentasi. Episode ini membahas library instrumentation Prometheus dan OpenTelemetry SDK, pembuatan counter, gauge, dan histogram, auto-instrumentation, serta cara mengekspos metrik lewat endpoint metrics dan OTLP.

Di episode 6 kalian mengenal Mimir dan di episode 7 kalian belajar membaca metrik dengan PromQL. Namun pertanyaan mendasar belum dijawab: dari mana metrik itu berasal? Jawabannya adalah instrumentation — proses menambahkan kode ke aplikasi agar menghasilkan pengukuran.
Episode ini membahas dua jalur instrumentasi: memakai Prometheus client library langsung dan memakai OpenTelemetry SDK for metrics. Kalian akan belajar membuat counter, gauge, dan histogram secara manual, memanfaatkan auto-instrumentation, lalu mengekspos hasilnya agar bisa di-scrape atau diekspor lewat OTLP ke Mimir.
Ada dua pendekatan yang saling melengkapi:
Pilihan bahasa tergantung tim kalian. Library resmi tersedia untuk Go, Java, Python, dan Node.js, misalnya prometheus_client untuk Python dan prometheus-client untuk Go.
pip install prometheus-clientPerintah pip install prometheus-client memasang library yang akan dipakai pada contoh di episode ini.
Gunakan Prometheus client bila stack kalian sederhana dan Mimir menjadi satu-satunya tujuan metrik. Gunakan OpenTelemetry SDK bila kalian sudah mengadopsi OTel untuk trace dan log — satu SDK menangani semua sinyal secara konsisten.
Contoh paling sederhana dengan prometheus_client:
from prometheus_client import Counter, Gauge, Histogram, start_http_server
REQUESTS = Counter("http_requests_total", "Total HTTP requests", ["method"])
IN_FLIGHT = Gauge("http_requests_in_flight", "Requests sedang diproses")
LATENCY = Histogram("http_request_duration_seconds", "Latency request")
def handle(method):
IN_FLIGHT.inc()
with LATENCY.time():
REQUESTS.labels(method=method).inc()
IN_FLIGHT.dec()
start_http_server(8000)Perhatikan pola start_http_server(8000) — ini menyalakan server HTTP kecil yang mengekspos metrik di port 8000.
_total untuk counter dan _seconds untuk durasi.method, status, service. Jangan pernah memakai user_id atau trace_id sebagai label.Menulis instrumentasi manual untuk setiap framework tidak realistis. Di sinilah auto-instrumentation membantu: library otomatis menginstrumentasi HTTP server, database client, dan message queue.
Dengan OpenTelemetry SDK, metrik runtime dan HTTP bisa diaktifkan lewat beberapa baris:
from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from opentelemetry.instrumentation.system_metrics import SystemMetricsInstrumentor
reader = PeriodicExportingMetricReader(OTLPMetricExporter(endpoint="http://localhost:4317"))
metrics.set_meter_provider(MeterProvider(metric_readers=[reader]))
SystemMetricsInstrumentor().instrument()Setelah menjalankan SystemMetricsInstrumentor().instrument(), metrik CPU dan memori sistem mulai diekspor setiap periode ke Collector.
Konsep yang sama berlaku di bahasa lain: opentelemetry-instrumentation-express untuk Node.js, opentelemetry-instrumentation-jdbc untuk Java, dan opentelemetry-instrumentation-net-http untuk Go. Setiap paket menambah span dan metrik untuk framework target tanpa mengubah logika bisnis.
Prometheus dan Mimir menarik metrik dengan cara pull: secara berkala menghubungi endpoint /metrics milik aplikasi.
curl -s http://localhost:8000/metricsOutput dari curl -s http://localhost:8000/metrics berbentuk Prometheus exposition format — baris teks dengan nama metrik, label, dan nilai.
Jalur kedua adalah push: aplikasi atau agent mengirim data secara periodik ke endpoint remote write Mimir. Ini dipakai saat aplikasi berjalan di belakang network yang tidak bisa diakses scraper, atau saat memakai collector seperti Alloy.
url: http://mimir:9009/api/v1/push
send_interval: 15sMekanisme remote write lebih detail dibahas di episode 11 saat kalian memakai Grafana Alloy sebagai collector.
Saat jumlah service banyak, endpoint tidak mungkin dicatat manual. Prometheus dan Mimir memakai service discovery — misalnya label Kubernetes — untuk menemukan target scrape secara otomatis. Pendekatan ini dibahas mendalam di episode 27.
Warning
Jangan mencampur label dinamis bernilai tinggi ke metrik, apa pun jalur instrumentasi yang dipakai. Satu label user_id saja bisa melipatgandakan biaya storage Mimir kalian.
Di episode 8 ini kalian memahami dua jalur instrumentasi metrik: Prometheus client library dan OpenTelemetry SDK, membuat counter, gauge, dan histogram secara manual, memanfaatkan auto-instrumentation untuk runtime dan HTTP metrics, serta menyajikan metrik lewat pull maupun remote write.
Inti yang harus dibawa pulang:
Di episode 9 selanjutnya kita akan membahas logs dengan Loki — arsitektur distributor, ingester, querier, dan compactor, perbedaan pendekatan index-free dengan Elasticsearch, serta format log dan strategi parsing. Metrik sudah berjalan, kini giliran log untuk melengkapi pillar kedua.