📊 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
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
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
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"