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
| มิติ | Metrics | Logs | Traces |
|---|---|---|---|
| คืออะไร | ตัวเลขรวมตามเวลา (time series) | เหตุการณ์แบบข้อความ ณ จุดเวลา | เส้นทางของ 1 request ข้ามหลาย service |
| ตอบคำถาม | "ระบบสุขภาพเป็นไง?" | "เกิดอะไรขึ้นกับ request นี้?" | "เวลาหายไปที่ hop ไหน?" |
| ต้นทุน/cardinality | ถูก แต่ระวัง cardinality | แพงถ้า log ทุกอย่าง | ปานกลาง (มัก sample) |
| ตัวอย่าง | http_requests_total, CPU% | payment gateway timeout | span: gateway → auth → db |
วิธีเล่าให้ผู้สัมภาษณ์ประทับใจ
เล่าเป็น workflow: metric บอกว่า "มีปัญหา" (error rate พุ่ง) → trace บอกว่า "ปัญหาอยู่ service ไหน" (db span ช้า) → log บอกว่า "ทำไม" (connection pool exhausted). สามอย่างเสริมกัน ไม่ใช่แทนกัน.
Four Golden Signals (จาก Google SRE)
| Signal | วัดอะไร | ตัวอย่าง metric |
|---|---|---|
| Latency | request ใช้เวลานานแค่ไหน (แยก 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"}.
# error rate (%) ของ 5xx ในช่วง 5 นาที
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))# 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 ตัวอย่าง:
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:
{"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 + alerting | CloudWatch Metrics + Alarms (+ SNS ไป PagerDuty) |
| PromQL / Prometheus | Amazon Managed Service for Prometheus (AMP) |
| Grafana dashboards | Amazon Managed Grafana (AMG) |
| Logs (ELK) | CloudWatch Logs + Logs Insights, หรือ Amazon OpenSearch |
| Distributed tracing | AWS X-Ray (หรือ OTel → AMP/X-Ray) |
| Container/infra signals | CloudWatch 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
คำถาม interview ที่เจอบ่อย + แนวคำตอบ
-
"metrics, logs, traces ต่างกันยังไง เลือกใช้เมื่อไร?" → metrics = health รวม (ถูก, ทำ alert); logs = รายละเอียดเหตุการณ์ (หา "ทำไม"); traces = latency ข้าม service (หา "ตรงไหน"). ใช้ metric จับปัญหา → trace ระบุจุด → log หาสาเหตุ.
-
"Four Golden Signals มีอะไรบ้าง?" → Latency, Traffic, Errors, Saturation. เสริมว่า latency ต้องดู percentile และแยก error ออก.
-
"cardinality คืออะไร ทำไมอันตราย?" → จำนวน combination ของ label values. label ที่มีค่าไม่จำกัด (เช่น
user_id,request_id) ทำให้ time series ระเบิด → Prometheus กิน memory จนล่ม. ให้ใส่เฉพาะ label ที่ cardinality ต่ำและมีความหมายต่อการ aggregate. -
"Prometheus pull หรือ push? ข้อดีคือ?" → pull เป็นหลัก. ข้อดี: Prometheus รู้ว่า target ไหน down (scrape fail = สัญญาณ), จัดการ target ผ่าน service discovery ง่าย, และควบคุมโหลดฝั่ง server ได้. งาน batch/short-lived ใช้ Pushgateway เสริม.
-
"จะลด 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/71.ต้องการรู้ว่า 'เวลาของ request หายไปที่ service ไหน' ควรใช้ signal ใด?
2.ข้อใด 'ไม่ใช่' หนึ่งใน Four Golden Signals?
3.ทำไมการใส่ label เช่น request_id ให้กับ Prometheus metric จึงอันตราย?
4.ทำไมไม่ควรวัด latency ด้วยค่า average อย่างเดียว?
5.ข้อดีหลักของโมเดล pull ของ Prometheus คืออะไร?
6.แนวทางลด alert fatigue ที่ถูกต้องที่สุดคือข้อใด?
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)