Part 14 · Observability & Production Debugging
14.1 / Prometheus

Prometheus: từ instrumentation đến PromQL

Prometheus thu thập và lưu time series; Grafana thường query Prometheus để hiển thị. Metrics hiệu quả vì aggregate bounded dimensions; unbounded labels biến monitoring thành memory/cost incident.

1. Kiến trúc và data flow

Java/Spring Actuator /metrics
          ↓ HTTP scrape
Prometheus + service discovery
          ↓ TSDB + PromQL + rules
Grafana dashboard     Alertmanager notifications

Prometheus chủ động pull metrics từ targets theo scrape interval. Service discovery tìm targets; relabeling chỉnh target labels trước khi ingest. Pushgateway chỉ phù hợp một số batch job ngắn hạn, không phải cách mặc định biến Prometheus thành push system.

Phân vai: application export measurements; Prometheus scrape/store/query/evaluate rules; Alertmanager group, route, inhibit và gửi notification; Grafana visualize nhiều data sources và cũng có alerting engine riêng.

2. Time-series data model

Một series được xác định bởi metric name và toàn bộ label set. Thay một label value là tạo series khác.

Dùng base units như seconds/bytes. Không lấy rate() trên gauge; không alert trực tiếp từ raw counter tích lũy.

3. RED, USE và business signals

RED: Rate, Errors, Duration cho request services. USE: Utilization, Saturation, Errors cho resources. Thêm JVM GC/allocation/threads, DB/HTTP pool active/wait/timeout, queue age/lag, cache hit/eviction và business outcomes—nhưng chỉ với dimensions bounded.

4. PromQL mental model

Luôn xác định metric, time window, labels cần group và denominator có cùng scope không.

# Request rate theo service
sum by (service) (rate(http_server_requests_seconds_count[5m]))

# Error ratio
sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m]))
/
sum(rate(http_server_requests_seconds_count[5m]))

# P95 từ histogram
histogram_quantile(
  0.95,
  sum by (le, service) (rate(http_server_requests_seconds_bucket[5m]))
)

5. Histogram và SLO

Nếu SLO là 95% requests dưới 300 ms, cần bucket le="0.3":

sum(rate(http_server_requests_seconds_bucket{le="0.3"}[5m]))
/
sum(rate(http_server_requests_seconds_count[5m]))

histogram_quantile nội suy nên là estimate. Average che tail. Native histograms đã stable từ Prometheus v3.8; vẫn cần kiểm tra compatibility, storage/query behavior và bật scrape/remote-write settings phù hợp với phiên bản triển khai.

6. Cardinality budget

Số series xấp xỉ tích các label combinations. Không dùng user/order/trace ID, raw URL, email, exception message hay timestamp làm label. Chuẩn hóa route/error code; chi tiết sang logs/traces hoặc exemplars.

Dấu hiệu sự cố: active series/churn, scrape samples, memory, WAL/disk, remote-write queue và query latency tăng sau deploy instrumentation. Xóa panel Grafana không xóa series đã ingest.

7. Rules và Alertmanager

Recording rule precompute PromQL đắt hoặc dùng lặp lại. Alert rule đánh giá condition, dùng for tránh transient noise và gắn labels/annotations. Alertmanager group, route, silence và inhibit notifications; nó không tự tạo condition từ raw metrics.

groups:
- name: service-sli
  rules:
  - record: service:http_requests:error_ratio_rate5m
    expr: |
      sum by (service) (rate(http_server_requests_seconds_count{status=~"5.."}[5m]))
      /
      sum by (service) (rate(http_server_requests_seconds_count[5m]))

Alert production nên dựa user impact/SLO burn rate, có owner, runbook, severity và test.

8. Remote write và HA

9. Debug checklist

  1. Target có trong discovery và scrape status là gì?
  2. Endpoint metrics trả đúng content, timeout và sample volume không?
  3. Labels có bị relabel/drop hoặc đổi sau deploy không?
  4. PromQL selector có match series và đúng time range không?
  5. Rule evaluation có error/query timeout/missing data không?
  6. Alert firing nhưng routing/silence/inhibition chặn ở đâu?
Overview · Data Model · PromQL · Histograms · Alertmanager
← SLOGrafana →