Kodeloka
  1. Kodeloka
  2. Kelas Kong API Gateway
  3. Materi

6 · Operasi · Modul 11 dari 12

Observability: Metrik, Log & Tracing

Mengekspor metrik ke Prometheus, mengirim log terstruktur, dan menyambungkan trace dari gateway sampai ke layanan terdalam.

📊 Metrik Prometheus

plugins:
  - name: prometheus
    config:
      per_consumer: false        # hati-hati, lihat peringatan di bawah
      status_code_metrics: true
      latency_metrics: true
      bandwidth_metrics: true
      upstream_health_metrics: true
# Metrik tersedia di Admin API
curl -s http://localhost:8001/metrics

# Yang paling berguna:
kong_http_requests_total{service,route,code,consumer}
kong_request_latency_ms_bucket{service,route}        # latensi total
kong_kong_latency_ms_bucket{service,route}           # waktu di Kong sendiri
kong_upstream_latency_ms_bucket{service,route}       # waktu di layanan
kong_upstream_target_health{upstream,target,state}
kong_nginx_connections_total{state}
🚫 per_consumer: true bisa melumpuhkan Prometheus

Mengaktifkannya menambahkan label consumer ke setiap metrik. Bila Anda punya 10.000 konsumen dikali beberapa service, route, dan kode status, jumlah time series meledak menjadi jutaan dan Prometheus kehabisan memori.

Aktifkan hanya bila jumlah konsumen Anda memang kecil dan stabil — misalnya puluhan mitra B2B. Untuk API publik dengan banyak konsumen, biarkan mati dan pakai log atau trace untuk analisis per-konsumen.

🎯 Kueri yang Sering Dipakai

# Laju permintaan per layanan
sum by (service) (rate(kong_http_requests_total[5m]))

# Tingkat error 5xx
sum by (service) (rate(kong_http_requests_total{code=~"5.."}[5m]))
  / sum by (service) (rate(kong_http_requests_total[5m]))

# Latensi p99 total
histogram_quantile(0.99,
  sum by (service, le) (rate(kong_request_latency_ms_bucket[5m])))

# Berapa lama waktu dihabiskan DI KONG sendiri (deteksi plugin lambat)
histogram_quantile(0.99,
  sum by (service, le) (rate(kong_kong_latency_ms_bucket[5m])))

# Target yang tidak sehat
kong_upstream_target_health{state="unhealthy"} > 0
📌 Pisahkan latensi Kong dari latensi upstream

Ini kemampuan diagnosis paling berharga dari gateway. Bila kong_latency naik sementara upstream_latency stabil, masalahnya ada pada plugin Anda — mungkin rate limiting yang menunggu Redis lambat. Bila sebaliknya, layanan di belakangnya yang bermasalah. Tanpa pemisahan ini, tim sering saling menyalahkan tanpa bukti.

📝 Logging Terstruktur

plugins:
  - name: http-log
    config:
      http_endpoint: http://alloy:8080/kong
      method: POST
      timeout: 10000
      keepalive: 60000
      queue:
        max_batch_size: 100
        max_coalescing_delay: 5

  # Alternatif: tulis ke stdout agar dikumpulkan platform
  - name: file-log
    config:
      path: /dev/stdout
🚫 Log Kong bisa membocorkan rahasia

Bawaan log berisi URL lengkap beserta query string, dan sebagian konfigurasi mencatat header permintaan. Bila ada kunci API yang dikirim lewat query string, atau header Authorization yang ikut tercatat, kredensial produksi Anda kini tersimpan di sistem log yang aksesnya jauh lebih luas.

Saring di sisi pengumpul log, dan lebih baik lagi cegah dari hulu: setel key_in_query: false dan hide_credentials: true pada plugin autentikasi.

🔗 Distributed Tracing

plugins:
  - name: opentelemetry
    config:
      endpoint: http://otel-collector:4318/v1/traces
      resource_attributes:
        service.name: kong-gateway
        deployment.environment: produksi
      headers:
        X-Auth: "${OTEL_TOKEN}"
      batch_span_count: 200
      batch_flush_delay: 3
      sampling_rate: 0.05          # 5% dari trafik normal
💡 Gateway adalah titik awal trace yang ideal

Setiap permintaan masuk melewati Kong, sehingga di sinilah traceparent paling tepat dibuat dan keputusan sampling paling tepat diambil — sekali, di tepi. Layanan di belakangnya cukup menghormati keputusan itu lewat sampler berbasis induk, sehingga trace tidak berlubang-lubang.

Agar rantainya utuh, pastikan layanan Anda membaca dan meneruskan header traceparent yang dikirim Kong. Bila layanan memulai trace baru, hubungan sebab-akibatnya hilang.

🚨 Alert yang Layak Dibunyikan

- alert: TingkatErrorGatewayTinggi
  expr: |
    sum by (service) (rate(kong_http_requests_total{code=~"5.."}[5m]))
      / sum by (service) (rate(kong_http_requests_total[5m])) > 0.05
  for: 5m

- alert: TargetUpstreamTidakSehat
  expr: kong_upstream_target_health{state="unhealthy"} > 0
  for: 2m

- alert: LatensiKongMelonjak
  expr: |
    histogram_quantile(0.99,
      sum by (service, le) (rate(kong_kong_latency_ms_bucket[5m]))) > 100
  for: 10m
  annotations:
    summary: "Kong sendiri lambat — periksa plugin, bukan layanan"