SRE Prep
เมนูโมดูล

2. Observability: Monitoring / Logging / Tracing

ทำไมหัวข้อนี้สำคัญกับ interview

เกือบทุก interview จะเจาะว่า "ถ้าระบบช้า/พังตอนตี 3 คุณจะรู้ได้ยังไงและ debug ยังไง". คำตอบที่ดีต้องแยกให้ออกระหว่าง metrics / logs / traces, รู้จัก Four Golden Signals, และตอบ PromQL พื้นฐานได้. อย่าตอบแค่ "ดู CloudWatch" — ต้องอธิบายว่า ดู signal อะไร เพื่อตอบคำถามอะไร.

Monitoring = การเฝ้าดูสิ่งที่เรารู้อยู่แล้วว่าต้องดู (known-unknowns). Observability = ความสามารถในการ "ถามคำถามใหม่" กับระบบจากข้อมูลที่มี โดยไม่ต้อง deploy ใหม่ (unknown-unknowns). SRE ที่ดีออกแบบระบบให้ ตั้งคำถามได้ ไม่ใช่แค่มี dashboard.

Core Concepts

สามเสาหลัก: Metrics vs Logs vs Traces

มิติMetricsLogsTraces
คืออะไรตัวเลขรวมตามเวลา (time series)เหตุการณ์แบบข้อความ ณ จุดเวลาเส้นทางของ 1 request ข้ามหลาย service
ตอบคำถาม"ระบบสุขภาพเป็นไง?""เกิดอะไรขึ้นกับ request นี้?""เวลาหายไปที่ hop ไหน?"
ต้นทุน/cardinalityถูก แต่ระวัง cardinalityแพงถ้า log ทุกอย่างปานกลาง (มัก sample)
ตัวอย่างhttp_requests_total, CPU%payment gateway timeoutspan: gateway → auth → db

วิธีเล่าให้ผู้สัมภาษณ์ประทับใจ

เล่าเป็น workflow: metric บอกว่า "มีปัญหา" (error rate พุ่ง) → trace บอกว่า "ปัญหาอยู่ service ไหน" (db span ช้า) → log บอกว่า "ทำไม" (connection pool exhausted). สามอย่างเสริมกัน ไม่ใช่แทนกัน.

Four Golden Signals (จาก Google SRE)

Signalวัดอะไรตัวอย่าง metric
Latencyrequest ใช้เวลานานแค่ไหน (แยก success/error)p50/p95/p99 duration
Trafficโหลดที่เข้ามาเท่าไรrequests/sec, QPS
Errorsสัดส่วนที่ล้มเหลว5xx rate, failed tx
Saturationระบบเต็มแค่ไหน (คอขวด)CPU, memory, queue depth

กับดักเรื่อง latency

อย่าวัด latency ด้วย average — mean ซ่อน tail. ผู้ใช้ที่เจอ p99 ช้า 8 วิ คือคนที่ ด่าคุณ. ให้ดู percentile (p95/p99) และแยก latency ของ request ที่ error ออก เพราะ error มักตอบเร็ว (เช่น fail fast) จนไปกด average ให้ดูดีเกินจริง.

RED vs USE

  • RED (สำหรับ request-driven services): Rate, Errors, Duration.
  • USE (สำหรับ resource เช่น CPU/disk/queue): Utilization, Saturation, Errors.

จำง่าย ๆ: request ให้คิดแบบ RED, resource ให้คิดแบบ USE.

Prometheus + PromQL

Prometheus ใช้โมเดล pull: server ไป scrape endpoint /metrics ของแต่ละ target เป็นระยะ (ต่างจาก push แบบ CloudWatch agent). ข้อมูลเป็น time series ที่ระบุด้วย metric name + labels เช่น http_requests_total{method="GET", status="200"}.

PromQL
# error rate (%) ของ 5xx ในช่วง 5 นาที
sum(rate(http_requests_total{status=~"5.."}[5m]))
  /
sum(rate(http_requests_total[5m]))
PromQL
# p99 latency จาก histogram — ต้อง sum by (le) ก่อนเข้า histogram_quantile
histogram_quantile(
  0.99,
  sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)

rate() vs irate() — ข้อที่ชอบถามต่อ

rate() = ค่าเฉลี่ยต่อวินาทีตลอดช่วง window (เนียน เหมาะทำ alert/graph). irate() = ใช้แค่ 2 จุดล่าสุด (ไวต่อการเปลี่ยน เหมาะดู spike สั้น ๆ). ทั้งคู่ใช้กับ counter เท่านั้น และ rate() จัดการ counter reset (restart) ให้อัตโนมัติ.

Prometheus scrape config และ alert rule ตัวอย่าง:

YAML
scrape_configs:
  - job_name: "checkout-api"
    metrics_path: /metrics
    scrape_interval: 15s
    static_configs:
      - targets: ["checkout:8080"]
---
groups:
  - name: slo-alerts
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m]))
            / sum(rate(http_requests_total[5m])) > 0.02
        for: 10m               # ต้องเป็นจริงต่อเนื่อง 10 นาที กัน alert เด้งมั่ว
        labels:
          severity: page
        annotations:
          summary: "error rate เกิน 2% ที่ checkout-api"

Logging & Tracing tools

  • Structured logging (JSON/logfmt) ดีกว่า plain text เพราะ query/aggregate ได้. ใส่ trace_id เพื่อเชื่อม log ↔ trace:
JSON
{"ts":"2026-09-13T10:02:11Z","level":"error","service":"checkout","trace_id":"a1b2c3","msg":"payment gateway timeout","latency_ms":5123}
  • ELK / OpenSearch (Elasticsearch + Logstash/Beats + Kibana) = เก็บและ query log จำนวนมาก.
  • Jaeger / OpenTelemetry = distributed tracing; แต่ละ request มี trace_id และ ประกอบด้วยหลาย span ที่บอก latency ของแต่ละ hop → หา bottleneck ใน microservices ได้.
  • Grafana = ชั้น visualization/alert ที่ต่อได้ทั้ง Prometheus, Loki, OpenSearch.

เชื่อมกับ AWS / Cloud ที่คุณรู้อยู่แล้ว

แนวคิดบริการ AWS ที่ map ตรง ๆ
Metrics + alertingCloudWatch Metrics + Alarms (+ SNS ไป PagerDuty)
PromQL / PrometheusAmazon Managed Service for Prometheus (AMP)
Grafana dashboardsAmazon Managed Grafana (AMG)
Logs (ELK)CloudWatch Logs + Logs Insights, หรือ Amazon OpenSearch
Distributed tracingAWS X-Ray (หรือ OTel → AMP/X-Ray)
Container/infra signalsCloudWatch Container Insights / Node Exporter

จุดต่างที่ควรพูดถึง

CloudWatch เป็นโมเดล push และคิดเงินตาม custom metric + log ingestion — ต่างจาก Prometheus ที่ pull และ self-hosted. ถ้าถูกถาม "ทำไมทีมถึงเลือก Prometheus ทั้งที่อยู่บน AWS" ให้พูดถึง PromQL ที่ยืดหยุ่น, ecosystem exporter, และ cost control ของ metric cardinality.

Diagram — pipeline ของ observability

app ส่งสาม signal ไปคนละ backend แล้วมารวมที่ Grafana + alerting

คำถาม interview ที่เจอบ่อย + แนวคำตอบ

  1. "metrics, logs, traces ต่างกันยังไง เลือกใช้เมื่อไร?" → metrics = health รวม (ถูก, ทำ alert); logs = รายละเอียดเหตุการณ์ (หา "ทำไม"); traces = latency ข้าม service (หา "ตรงไหน"). ใช้ metric จับปัญหา → trace ระบุจุด → log หาสาเหตุ.

  2. "Four Golden Signals มีอะไรบ้าง?" → Latency, Traffic, Errors, Saturation. เสริมว่า latency ต้องดู percentile และแยก error ออก.

  3. "cardinality คืออะไร ทำไมอันตราย?" → จำนวน combination ของ label values. label ที่มีค่าไม่จำกัด (เช่น user_id, request_id) ทำให้ time series ระเบิด → Prometheus กิน memory จนล่ม. ให้ใส่เฉพาะ label ที่ cardinality ต่ำและมีความหมายต่อการ aggregate.

  4. "Prometheus pull หรือ push? ข้อดีคือ?" → pull เป็นหลัก. ข้อดี: Prometheus รู้ว่า target ไหน down (scrape fail = สัญญาณ), จัดการ target ผ่าน service discovery ง่าย, และควบคุมโหลดฝั่ง server ได้. งาน batch/short-lived ใช้ Pushgateway เสริม.

  5. "จะลด alert fatigue ยังไง?" → alert บน symptom (ที่ผู้ใช้เจอ เช่น error rate/latency) ไม่ใช่ทุก cause; ใช้ for: กัน flapping; ผูก alert กับ SLO burn rate; ทุก alert ต้อง actionable + มี runbook.

Pitfalls — จุดที่ผู้สมัครมักพลาด

ระวังกับดักเหล่านี้

  • High cardinality: ยัด user_id/request_id เป็น label ของ metric → time series ระเบิด.
  • Alert บน cause ไม่ใช่ symptom: ตั้ง alert "CPU 90%" ทั้งที่ผู้ใช้ยังปกติ → เสียงดังเปล่า.
  • Log ทุกอย่างที่ debug level ใน prod: ค่า storage บาน + หา signal ยาก.
  • วัด latency ด้วย average: ซ่อน tail latency ที่เป็นตัวจริงของปัญหา.
  • Dashboard สวยแต่ไม่ผูกกับ SLO: ดูเยอะแต่ไม่รู้ว่าเมื่อไรควร page คน.

Quiz ท้ายบท

Quiz ท้ายบท

ตอบแล้ว 0/7
  1. 1.ต้องการรู้ว่า 'เวลาของ request หายไปที่ service ไหน' ควรใช้ signal ใด?

  2. 2.ข้อใด 'ไม่ใช่' หนึ่งใน Four Golden Signals?

  3. 3.ทำไมการใส่ label เช่น request_id ให้กับ Prometheus metric จึงอันตราย?

  4. 4.ทำไมไม่ควรวัด latency ด้วยค่า average อย่างเดียว?

  5. 5.ข้อดีหลักของโมเดล pull ของ Prometheus คืออะไร?

  6. 6.แนวทางลด alert fatigue ที่ถูกต้องที่สุดคือข้อใด?

  7. 7.field ใดใน structured log ที่ช่วยเชื่อม log เข้ากับ distributed trace ได้ดีที่สุด?

Cheat Sheet — อ่านก่อนเข้าห้องสัมภาษณ์

สรุปเร็ว 30 วินาที

  • 3 pillars: metrics (มีปัญหาไหม) · traces (ตรงไหน) · logs (ทำไม)
  • Golden Signals: Latency · Traffic · Errors · Saturation — latency ดู p95/p99 ไม่ใช่ average
  • RED (request): Rate/Errors/Duration · USE (resource): Utilization/Saturation/Errors
  • Prometheus = pull, ใช้ rate() กับ counter, histogram_quantile() ทำ p99
  • ระวัง cardinality (อย่าใส่ user_id/request_id เป็น label)
  • Alert บน symptom + for: + ผูก SLO burn rate
  • AWS map: CloudWatch · AMP (Prometheus) · AMG (Grafana) · OpenSearch (ELK) · X-Ray (traces)
อ่านจบแล้ว? ทำเครื่องหมายไว้เพื่อติดตามความคืบหน้า