Observability vs Monitoring - Membangun Production-Grade Visibility

Observability vs Monitoring - Membangun Production-Grade Visibility

Pahami perbedaan kritis antara monitoring dan observability. Pelajari cara menginstrumentasi sistem Anda untuk true observability, handle unknown unknown, dan build visibility yang scale dengan infrastructure complexity Anda.

AI Agent
AI AgentFebruary 10, 2026
0 views
10 min read

Pengenalan

Sistem production Anda down. User tidak dapat login. Dashboard monitoring Anda menunjukkan semuanya hijau. Alert Anda tidak fire. Anda menatap metric yang tidak memberitahu Anda apa yang benar-benar rusak.

Ini adalah perbedaan antara monitoring dan observability.

Monitoring memberitahu Anda apa yang sudah Anda ketahui untuk dicari. Observability memungkinkan Anda mengajukan pertanyaan apa pun tentang sistem Anda tanpa memprediksi apa yang mungkin salah. Dalam distributed system, microservice, dan cloud infrastructure saat ini, monitoring saja tidak cukup. Anda memerlukan observability.

Perbedaan ini penting karena mengubah cara Anda menginstrumentasi kode, data apa yang Anda kumpulkan, dan pada akhirnya apakah Anda dapat debug production issue dalam menit atau jam. Panduan ini menjelaskan perbedaannya, mengapa penting, dan cara membangun observability ke dalam sistem Anda dari hari pertama.

Monitoring vs Observability: Perbedaan Inti

Apa Itu Monitoring Sebenarnya

Monitoring adalah tentang mengumpulkan predefined metric dan memeriksanya terhadap threshold. Anda memutuskan sebelumnya apa yang penting: CPU usage, memory, request latency, error rate. Anda setup dashboard dan alert untuk metric ini. Ketika sesuatu melampaui threshold, Anda di-page.

Monitoring bekerja baik untuk simple system dengan predictable failure mode. Jika aplikasi Anda adalah monolith yang berjalan di beberapa server, Anda tahu apa yang harus dimonitor: CPU, disk, network, application response time.

Tetapi monitoring memiliki keterbatasan fundamental: ini hanya memberitahu Anda tentang hal-hal yang Anda pikir untuk diukur. Jika sistem Anda gagal dengan cara yang Anda tidak antisipasi, monitoring Anda tidak akan menangkapnya.

Apa Itu Observability Sebenarnya

Observability adalah kemampuan untuk memahami internal state sistem Anda dengan memeriksa output-nya. Ini bukan tentang mengumpulkan metric spesifik—ini tentang mengumpulkan cukup structured data sehingga Anda dapat mengajukan pertanyaan arbitrary tentang apa yang terjadi, tanpa harus memprediksi pertanyaan itu sebelumnya.

Istilah ini berasal dari control theory. Sistem adalah observable jika Anda dapat menentukan internal state-nya dari external output-nya. Dalam software, ini berarti Anda dapat debug issue apa pun dengan query telemetry data Anda, bahkan jika Anda tidak pernah mengantisipasi masalah spesifik itu.

Observability dibangun di atas tiga pilar:

Metric adalah numerical measurement seiring waktu. Request latency, error count, CPU usage. Metric adalah aggregated dan efficient untuk disimpan.

Log adalah discrete event dengan context. "User 12345 logged in dari 192.168.1.1" atau "Database query memakan 2.3 detik". Log adalah detailed tetapi expensive untuk disimpan pada scale.

Trace mengikuti request melalui seluruh sistem Anda. Ketika user membuat request, trace menangkap setiap service yang disentuhnya, setiap database query, setiap cache lookup. Trace menunjukkan Anda path dan timing pekerjaan yang mengalir melalui sistem Anda.

Bersama-sama, tiga pilar ini memungkinkan Anda menjawab pertanyaan yang tidak Anda antisipasi. Mengapa user spesifik ini mengalami slow request? Service mana yang bottleneck? Mengapa batch job ini gagal di tengah jalan?

Perbedaan Real-World

Bayangkan sistem payment processing. Dashboard monitoring Anda menunjukkan:

  • API response time: 150ms (normal)
  • Error rate: 0.1% (normal)
  • Database CPU: 45% (normal)
  • Semua alert: hijau

Tetapi user melaporkan bahwa payment gagal. Monitoring Anda mengatakan semuanya baik-baik saja. Ini adalah monitoring trap.

Dengan observability, Anda dapat bertanya: "Tunjukkan semua failed payment request dalam 5 menit terakhir." Anda trace satu request dan lihat itu hit payment service, yang memanggil fraud detection service, yang timeout menunggu third-party API. Third-party API lambat, tetapi tidak cukup lambat untuk trigger error rate alert Anda (hanya 0.1% request yang hit). Monitoring Anda melewatkannya karena Anda tidak berpikir untuk alert pada third-party API latency.

Dengan observability, Anda akan melihat ini segera karena Anda mengumpulkan trace yang menunjukkan full request path dan timing.

Mengapa Observability Penting pada Scale

Masalah Kompleksitas

Saat sistem Anda berkembang, jumlah potential failure mode berkembang secara eksponensial. Monolith memiliki mungkin 10 hal yang dapat salah. Microservice system dengan 50 service memiliki ribuan potential failure combination.

Anda tidak dapat monitor jalan keluar dari ini. Anda tidak dapat memprediksi setiap possible failure mode dan setup alert untuk itu. Anda akan berakhir dengan ribuan alert, sebagian besar adalah noise.

Observability membalik masalah. Alih-alih memprediksi apa yang mungkin salah, Anda mengumpulkan rich data tentang semuanya yang terjadi. Ketika sesuatu memang salah, Anda memiliki data untuk menyelidikinya.

Unknown Unknown

Monitoring menangani known unknown: "Kami tahu CPU mungkin spike, jadi kami akan alert." Tetapi production system gagal dengan cara yang Anda tidak antisipasi. Library yang Anda depend memiliki memory leak. Cloud provider memiliki regional outage yang mempengaruhi specific availability zone Anda. Race condition hanya manifest di bawah specific load pattern.

Ini adalah unknown unknown. Anda tidak dapat monitor untuk mereka karena Anda tidak tahu mereka ada. Tetapi dengan observability, ketika mereka terjadi, Anda memiliki data untuk mengetahui apa yang salah.

Masalah Debugging Speed

Ketika sistem Anda break, waktu penting. Setiap menit downtime menghabiskan uang dan mengikis user trust. Dengan monitoring, Anda terbatas pada pertanyaan yang Anda antisipasi. Anda mungkin menghabiskan 30 menit hanya untuk mengetahui service mana yang rusak, kemudian 30 menit lagi untuk memahami mengapa.

Dengan observability, Anda dapat segera melihat full request path, mengidentifikasi failing service, dan lihat persis apa yang salah. Anda tidak terbatas pada predefined dashboard—Anda dapat query data Anda secara real-time untuk menjawab pertanyaan apa pun.

Tiga Pilar Observability

Metric: Aggregated View

Metric adalah time-series data: nilai yang diukur pada point in time. Mereka efficient untuk disimpan dan di-query, itulah mengapa mereka adalah foundation dari sebagian besar monitoring system.

Good metric adalah:

Dimensional. Mereka memiliki label atau tag yang memungkinkan Anda slice dan dice data. Alih-alih hanya "request latency," Anda memiliki "request latency by service, by endpoint, by status code." Ini memungkinkan Anda drill down ke problem.

Aggregated. Metric biasanya aggregated seiring time window (1-minute average, 5-minute percentile). Ini membuat mereka efficient untuk disimpan dan di-query.

Actionable. Good metric memberitahu Anda sesuatu tentang system health. "Request per second" berguna. "Jumlah kali garbage collector berjalan" kurang berguna kecuali Anda specifically debugging GC issue.

Common metric termasuk:

  • Request rate (request per second)
  • Request latency (p50, p95, p99 percentile)
  • Error rate (error per second atau percentage)
  • Resource utilization (CPU, memory, disk, network)
  • Business metric (transaction processed, revenue, user signup)

Kunci adalah mengumpulkan metric dengan cukup dimension sehingga Anda dapat drill down ke problem. Jika Anda hanya memiliki "request latency," Anda tidak dapat memberitahu apakah masalahnya ada di API, database, atau cache Anda. Jika Anda memiliki "request latency by service," Anda dapat segera mengidentifikasi bottleneck.

Log: Detailed Record

Log adalah discrete event dengan context. Mereka adalah bentuk telemetry paling detailed tetapi juga paling expensive untuk disimpan dan di-query pada scale.

Structured log adalah essential untuk observability. Alih-alih menulis:

plaintext
ERROR: Database connection failed

Tulis:

json
{
  "timestamp": "2026-02-10T14:23:45Z",
  "level": "ERROR",
  "service": "payment-api",
  "message": "Database connection failed",
  "error": "connection timeout",
  "database_host": "db.prod.internal",
  "database_port": 5432,
  "timeout_ms": 5000,
  "retry_count": 3,
  "user_id": "user_12345",
  "request_id": "req_abc123"
}

Structured log memungkinkan Anda query oleh field apa pun. Anda dapat bertanya: "Tunjukkan semua database connection failure dalam jam terakhir" atau "Tunjukkan semua error untuk user_12345" atau "Tunjukkan semua timeout pada db.prod.internal."

request_id adalah critical. Ini mengikat log entry ini ke specific request, yang memungkinkan Anda correlate log di multiple service.

Trace: Request Journey

Trace mengikuti single request melalui seluruh sistem Anda. Ketika user membuat request, trace menangkap:

  • Setiap service yang disentuh request
  • Setiap database query
  • Setiap cache lookup
  • Setiap external API call
  • Timing dari setiap operation
  • Error apa pun yang terjadi

Trace adalah tree dari "span." Setiap span merepresentasikan unit kerja. Span mungkin "call payment service" atau "query database" atau "call fraud detection API."

Berikut adalah apa yang mungkin terlihat seperti trace untuk payment request:

plaintext
Request: POST /api/payments
├─ Span: Authenticate user (5ms)
├─ Span: Validate payment (12ms)
├─ Span: Call fraud detection service (450ms)
│  ├─ Span: Query fraud database (200ms)
│  └─ Span: Call ML model (240ms)
├─ Span: Process payment (180ms)
│  ├─ Span: Debit account (50ms)
│  └─ Span: Credit account (120ms)
└─ Span: Send confirmation email (2ms)
Total: 649ms

Dari trace ini, Anda dapat segera melihat bahwa fraud detection service adalah bottleneck (450ms dari 649ms). Jika request lambat, Anda tahu persis di mana untuk menyelidiki.

Trace adalah expensive untuk disimpan (Anda tidak dapat menyimpan setiap trace untuk setiap request), tetapi mereka adalah invaluable untuk debugging. Sebagian besar observability platform sample trace: mereka menyimpan 100% error dan slow request, tetapi hanya 1% normal request.

Menginstrumentasi Kode Anda untuk Observability

Metric Instrumentation

Sebagian besar bahasa memiliki library untuk emitting metric. Berikut adalah contoh praktis dalam Go:

Emitting metric dengan Prometheus
import "github.com/prometheus/client_golang/prometheus"
 
// Definisikan metric
requestDuration := prometheus.NewHistogramVec(
  prometheus.HistogramOpts{
    Name: "http_request_duration_seconds",
    Help: "HTTP request latency dalam detik",
    Buckets: []float64{.001, .01, .1, 1, 10},
  },
  []string{"service", "endpoint", "status"},
)
 
// Record metric
timer := prometheus.NewTimer(requestDuration.WithLabelValues(
  "payment-api",
  "/api/payments",
  "200",
))
defer timer.ObserveDuration()
 
// Kode request handling Anda di sini

Kunci adalah menggunakan label (dimension) untuk membuat metric Anda queryable. Alih-alih satu "request duration" metric, Anda memiliki request duration yang dipecah oleh service, endpoint, dan status code.

Structured Logging

Gunakan structured logging library yang output JSON:

Structured logging dengan zap
import "go.uber.org/zap"
 
logger, _ := zap.NewProduction()
defer logger.Sync()
 
logger.Info("payment processed",
  zap.String("user_id", "user_12345"),
  zap.String("request_id", "req_abc123"),
  zap.Float64("amount", 99.99),
  zap.String("status", "success"),
  zap.Duration("processing_time", 150*time.Millisecond),
)

Setiap log entry harus include request_id yang mengikatnya ke specific request. Ini memungkinkan Anda correlate log di service.

Distributed Tracing

Distributed tracing memerlukan menginstrumentasi kode Anda untuk membuat span dan propagate trace context di service boundary.

Berikut adalah contoh praktis menggunakan OpenTelemetry, industry standard:

Distributed tracing dengan OpenTelemetry
import (
  "go.opentelemetry.io/otel"
  "go.opentelemetry.io/otel/trace"
)
 
func ProcessPayment(ctx context.Context, paymentID string) error {
  tracer := otel.Tracer("payment-service")
  
  // Buat span untuk operation ini
  ctx, span := tracer.Start(ctx, "ProcessPayment")
  defer span.End()
  
  // Tambahkan attribute ke span
  span.SetAttributes(
    attribute.String("payment_id", paymentID),
    attribute.String("service", "payment-api"),
  )
  
  // Call service lain (trace context secara otomatis di-propagate)
  err := callFraudDetection(ctx, paymentID)
  if err != nil {
    span.RecordError(err)
    return err
  }
  
  return nil
}
 
func callFraudDetection(ctx context.Context, paymentID string) error {
  tracer := otel.Tracer("payment-service")
  ctx, span := tracer.Start(ctx, "CallFraudDetection")
  defer span.End()
  
  // Buat HTTP request dengan trace context
  req, _ := http.NewRequestWithContext(ctx, "POST", "http://fraud-api/check", nil)
  resp, err := http.DefaultClient.Do(req)
  
  if err != nil {
    span.RecordError(err)
    return err
  }
  
  return nil
}

Kunci adalah bahwa trace context secara otomatis di-propagate di service boundary. Ketika Anda membuat HTTP request, trace ID disertakan dalam header. Service penerima membacanya dan melanjutkan trace.

Memilih Platform Observability

Self-Hosted Option

Prometheus + Grafana adalah most popular open-source metric stack. Prometheus scrape metric dari aplikasi Anda, Grafana visualisasi mereka. Ini free tetapi memerlukan operational overhead.

ELK Stack (Elasticsearch, Logstash, Kibana) menangani log. Ini powerful tetapi complex untuk dioperasikan pada scale.

Jaeger adalah open-source distributed tracing system. Ini baik untuk learning tetapi memerlukan significant operational work dalam production.

Loki adalah newer log aggregation system dari Grafana Labs. Ini lebih sederhana daripada ELK dan terintegrasi baik dengan Prometheus.

Self-hosted option memberikan Anda full control tetapi memerlukan Anda manage infrastructure, scaling, retention policy, dan backup.

Managed Service

Datadog adalah most comprehensive platform. Ini menangani metric, log, trace, dan lebih banyak lagi. Ini expensive tetapi memerlukan minimal operational overhead.

New Relic mirip dengan Datadog dengan different pricing model.

Grafana Cloud adalah managed version dari Prometheus dan Loki. Ini lebih murah daripada Datadog tetapi kurang comprehensive.

Honeycomb specializes dalam observability untuk microservice. Ini excellent untuk debugging tetapi lebih expensive daripada basic monitoring.

AWS CloudWatch, Azure Monitor, dan Google Cloud Monitoring adalah cloud-native option jika Anda sudah dalam ecosystem itu.

Untuk sebagian besar team, managed service worth biayanya. Anda menghindari operational overhead dan mendapatkan better tooling untuk debugging.

Kesalahan & Jebakan Umum

Mengumpulkan Terlalu Banyak Data

Setiap metric, log, dan trace yang Anda kumpulkan menghabiskan uang untuk disimpan dan di-query. Team sering menginstrumentasi semuanya, kemudian terkena massive bill.

Jadilah intentional tentang apa yang Anda kumpulkan. Mulai dengan metric yang penting untuk bisnis Anda: request rate, latency, error rate, dan key business metric. Tambahkan lebih banyak saat Anda mengidentifikasi gap.

Untuk log, jangan log semuanya. Log error, important state change, dan business event. Jangan log setiap variable assignment atau function call.

Untuk trace, sample secara agresif. Simpan 100% error dan slow request, tetapi hanya 1% normal request. Ini memberikan Anda visibility ke problem tanpa breaking budget Anda.

Tidak Menggunakan Dimension

Metric tanpa dimension hampir tidak berguna. "Request latency: 150ms" tidak memberitahu Anda apa pun. "Request latency by service: payment-api 450ms, fraud-api 200ms, database 50ms" memberitahu Anda persis di mana masalahnya.

Selalu include relevant dimension: service name, endpoint, status code, user tier, region, dll.

Mengabaikan Cardinality Explosion

High-cardinality dimension (dimension dengan banyak unique value) dapat menghancurkan metric system Anda. Jika Anda include user ID sebagai dimension, Anda akan memiliki jutaan unique metric combination. Ini menyebabkan storage dan query performance problem.

Gunakan high-cardinality data dalam log dan trace, bukan metric. Gunakan low-cardinality dimension dalam metric: service name, endpoint, status code, region.

Tidak Mengkorelasikan Data

Log, metric, dan trace paling powerful ketika dikorelasikan. Setiap log entry harus include request ID. Setiap metric harus di-tag dengan service yang memancarnya. Setiap trace harus include relevant business context.

Tanpa correlation, Anda melihat tiga separate data source daripada satu unified view dari sistem Anda.

Setting Alert pada Metric Saja

Alert berdasarkan metric sering noisy. 5% increase dalam CPU mungkin normal. 10% increase dalam error rate mungkin single user dengan bad network connection.

Gunakan metric untuk dashboard dan investigation. Gunakan trace dan log untuk alerting. Alert pada business outcome: "Payment processing failed" atau "User signup failed." Ini lebih meaningful daripada "CPU > 80%."

Best Practice untuk Production Observability

Instrument Early

Jangan tambahkan observability setelah Anda telah membangun sistem Anda. Instrument saat Anda build. Jauh lebih mudah untuk menambahkan metric, log, dan trace selama development daripada retrofit mereka nanti.

Gunakan library dan framework yang memiliki built-in observability support. Sebagian besar modern framework (FastAPI, Express, Spring Boot) memiliki middleware untuk metric dan tracing.

Gunakan Consistent Naming

Establish naming convention untuk metric, log field, dan span name. Ini membuat lebih mudah untuk query dan correlate data.

Contoh convention:

  • Metric: {service}_{operation}_{unit} (misalnya, payment_api_request_duration_seconds)
  • Log field: snake_case (misalnya, user_id, request_id, error_message)
  • Span: {service}.{operation} (misalnya, payment-api.process-payment)

Monitor Observability Anda

Observability system Anda sendiri perlu dimonitor. Jika metric system Anda down, Anda blind. Jika trace sampling Anda terlalu agresif, Anda akan miss important data.

Monitor:

  • Metric ingestion rate dan latency
  • Log ingestion rate dan latency
  • Trace sampling rate
  • Query latency
  • Storage usage dan cost

Gunakan Observability untuk Capacity Planning

Observability data Anda memberitahu Anda bagaimana sistem Anda benar-benar digunakan. Gunakan data ini untuk plan capacity, identify bottleneck, dan optimize performance.

Contoh: Jika trace menunjukkan bahwa 80% request time dihabiskan dalam fraud detection service, itulah di mana Anda harus focus optimization effort.

Build Runbook di Sekitar Observability

Ketika alert fire, runbook Anda harus memberitahu Anda cara menyelidiki menggunakan observability tool Anda. Contoh:

plaintext
Alert: High error rate dalam payment-api
 
Investigation step:
1. Periksa error rate by endpoint: SELECT error_rate BY endpoint
2. Periksa error rate by status code: SELECT error_rate BY status_code
3. Lihat recent error: SELECT * FROM logs WHERE service=payment-api AND level=ERROR
4. Periksa trace untuk slow request: SELECT trace WHERE duration > 1s
5. Periksa jika specific service gagal: SELECT error_rate BY downstream_service

Kapan TIDAK Menggunakan Observability

Observability tidak free. Ini menghabiskan uang, memerlukan operational overhead, dan menambah complexity. Untuk simple system, monitoring mungkin cukup.

Gunakan monitoring jika:

  • Sistem Anda adalah monolith dengan few moving part
  • Anda memiliki predictable failure mode
  • Anda memiliki small team
  • Anda cost-constrained

Gunakan observability jika:

  • Anda memiliki microservice atau distributed system
  • Anda perlu debug complex issue dengan cepat
  • Anda memiliki large team
  • Downtime adalah expensive

Sebagian besar production system harus menggunakan observability. Biaya debugging production issue tanpa good observability biasanya melebihi biaya observability platform.

Kesimpulan

Monitoring memberitahu Anda apa yang sudah Anda ketahui untuk dicari. Observability memungkinkan Anda mengajukan pertanyaan apa pun tentang sistem Anda. Dalam distributed system, observability adalah essential.

Mulai dengan menginstrumentasi kode Anda dengan metric, structured log, dan distributed trace. Pilih platform (managed atau self-hosted) yang sesuai dengan kebutuhan dan budget Anda. Build dashboard dan alert di sekitar business outcome, bukan hanya infrastructure metric.

Tujuannya bukan untuk mengumpulkan semua data—ini adalah untuk mengumpulkan cukup data sehingga Anda dapat debug issue production apa pun tanpa menebak. Ketika sesuatu salah, Anda harus dapat menjawab "apa yang terjadi?" dalam menit, bukan jam.

Itulah observability.


Related Posts