ข้าม​ไป​ยัง​เนื้อหา

Alert, SLI/SLO & error budget — รู้​ว่า​พัง​จริง​เมื่อไหร่

บท​ที่​แล้ว​คุณ สำรวจ HyperDX ด้วย​มือ — ตั้ง​คำถาม​ใหม่​กับ trace/log/metric ที่​ระบบ​ปล่อย​ไว้ ตอบ unknown-unknowns ได้​เอง แต่​การ​สำรวจ​ด้วย​มือ​มี​เงื่อนไขข้อ​เดียว​ที่​โหดร้าย: คุณ​ต้อง​อยู่​หน้า​จอ​ตอน​มัน​พัง ตอน​ตี​สาม​คุณ​ไม่​ได้​อยู่ — สิ่ง​ที่​ต้อง​ปลุก​คุณ​คือ alert และ​บท​นี้​ตอบ​คำถาม​ที่​ยาก​กว่า​การ​ตั้ง alert ให้​ทำงาน: จะ​ปลุก​คุณ เมื่อไหร่? ปลุก​บ่อย​ไป​คุณ​จะ​เลิก​สนใจ​มัน ปลุก​ช้า​ไป​ลูกค้า​เจอ​ปัญหา​ก่อน​คุณ เส้น​แบ่ง​ระหว่าง​สอง​อย่าง​นี้​คือ SLO กับ error budget

📦 code ตัวอย่าง

บท​นี้​ตั้ง alert บน platform Order ตัว​เดิม (Ordering/Kitchen/Delivery/Payment) — repo kaen-food-ordering (กำลัง​จัด​ทำ) ตัวเลข SLI/burn rate ทั้งหมด​วัด​จาก signal ที่​เรา instrument มา​ตั้งแต่ บท2–บท5 และ query ผ่าน schema เดียว​กับ บท6 (otel_traces, Duration เป็น​นาโน​วินาที) alert ที่​เขียน​ใน​บท​นี้​เป็น ClickHouse SQL / Lucene ของ HyperDX จริง — เป็น​บท​เดียว​คู่​กับ บท6 ที่​ผูก​กับ HyperDX โดย​ตั้งใจ ที่​เหลือ portable

version ดิบ: alert บน “สาเหตุ” — และ​ทำไม​มัน​ปลุก​คุณ​จน​คุณ​เลิก​ฟัง

หัวข้อ​ที่​มีชื่อ​ว่า “version ดิบ: alert บน “สาเหตุ” — และ​ทำไม​มัน​ปลุก​คุณ​จน​คุณ​เลิก​ฟัง”

version ดิบ ของ​การ alert คือ​การ​ตั้ง alert บน สาเหตุ (cause-based): CPU เกิน 90%, memory เกิน 80%, มี log Error หนึ่ง​บรรทัด, queue ลึก​เกิน 100 มัน​ดู​สม​เหตุ​สม​ผล​เพราะ​พวก​นี้ “ดู​ไม่​ดี” — แต่​ปัญหา​คือ สาเหตุ​ที่​ดู​ไม่​ดี​ส่วน​ใหญ่​ไม่​ทำให้​ลูกค้า​เจ็บ CPU 92% ตอน batch รัน​กลางคืน​แต่​ทุกออเดอร์​ยัง​ผ่าน​ฉลุย, retry หนึ่ง​ครั้ง​ที่​สำเร็จ​ใน​รอบ​สอง​ก็​โยน Error หนึ่ง​บรรทัด​ออก​มา ทุก alert เหล่า​นี้​ปลุก​คุณ​ตอน​ตี​สาม​เพื่อ​บอกว่า “มี​บาง​อย่าง​แปลก” ทั้ง​ที่​ลูกค้า​ไม่รู้สึก​อะไร​เลย

ผลลัพธ์​คือ alert fatigue: เมื่อ 95% ของ alert เป็น false alarm สมอง​คุณ​จะ​เรียนรู้​ที่​จะ เพิกเฉย มัน​ทั้งหมด — รวม​ถึง 5% ที่​เป็น​ของ​จริง นี่​คือ​ความ​ล้มเหลว​ที่​แพง​ที่สุด​ของ observability: ไม่ใช่​การ​ไม่มี alert แต่​คือ​การ​มี alert เยอะ​จน​ไม่มี​ใคร​เชื่อ​มัน​อีก​ต่อ​ไป

ทาง​แก้​ของ Google SRE ตรง​ข้าม​กัน​สุด​ขั้ว: alert บน อาการ (symptom-based) ที่​ผู้​ใช้​เห็น​จริง​เท่านั้น — ออเดอร์​วาง​ไม่​สำเร็จ, checkout ช้า​เกิน​รับ​ได้, ticket ค้าง​จน​อาหาร​ไม่​ถึง​ครัว ไม่ใช่ alert เพราะ CPU สูง แต่ alert เพราะ ผล​ของ CPU สูง​ไป​โดน​ลูกค้า​แล้ว เพื่อ​ทำ​แบบ​นั้น​ได้ เรา​ต้อง​นิยาม “ดีพอ” ให้​เป็น​ตัวเลข​ก่อน — นั่น​คือ SLI, SLO และ error budget

Google SRE นิยาม​สาม​คำ​นี้ไว้ตรงๆ และ​ความ​ต่าง​ของ​มัน​สำคัญ​มาก​พอที่​จะ​ยก​มา​คำ​ต่อ​คำ (S37):

SLISLIService Level Indicator — ตัว​ชี้​วัด​เชิง​ปริมาณ​ที่​นิยาม​ชัด​ของ​บาง​แง่​มุม​ของ​ระดับ​บริการProcess (Service Level Indicator) คือ ตัว​ชี้​วัด — ตัวเลข​ที่​วัด​จริง:

“a carefully defined quantitative measure of some aspect of the level of service”

สำหรับ Ordering intake ของ​เรา SLI ที่​เลือก​คือ สัดส่วน​คำขอ​วางออเดอร์​ที่​สำเร็จ (availability) และ สัดส่วน checkout ที่​เสร็จ​ภายใน X ms (latency) — วัด​ได้​จาก otel_traces ที่​เรา instrument มา​แล้ว

SLOSLOService Level Objective — ค่า​เป้าหมาย/ช่วง​ค่า​ของ SLI ใน​หน้าต่าง​เวลา​หนึ่ง (คอร์ส​ยึด 30 วัน)Process (Service Level Objective) คือ เป้าหมาย ที่​ตั้ง​ทับ SLI นั้น:

“a target value or range of values for a service level that is measured by an SLI”

เช่น “99.9% ของ​คำขอ​วางออเดอร์​ต้อง​สำเร็จ ใน​หน้าต่าง 30 วัน” — SLI คือ​ตัวเลข​ที่​วิ่ง, SLO คือ​เส้น​ที่​มัน​ต้อง​อยู่​เหนือ

SLA (Service Level Agreement) = SLO บวก​ผล​ตาม​มา (consequences) — สัญญา​เชิง​พาณิชย์​ที่​บอกว่า ถ้า​พลาด SLO นี้ เรา​คืน​เงิน/ชดเชย​เท่า​นี้ กฎ​แยก​ง่ายๆ: ถ้า​การ​พลาด​เป้า​ไม่มี​ผล​ตาม​มา​ที่​เขียน​ไว้​ชัด มัน​คือ SLO ไม่ใช่ SLA ทีม​วิศวกรรม​ส่วน​ใหญ่​ทำงาน​กับ SLO (เป้า​ภายใน) ไม่ใช่ SLA — บท​นี้​จึง​พูด​เรื่อง SLO เป็น​หลัก

ยึด​หน้าต่าง 30 วัน (rolling) ทั้ง​คอร์ส

ตัวเลข​ทุก​ตัว​หลัง​จาก​นี้ — 43.2 นาที, 3,000 คำขอ​ที่​พัง​ได้, และ​ตาราง burn rate 2%/5%/10% — คำนวณ​บน หน้าต่าง rolling 30 วัน เป๊ะๆ ถ้า​ทีม​คุณ​เปลี่ยน​ไป​ใช้​หน้าต่าง 28 วัน​หรือ​ราย​ไตรมาส ต้อง​คำนวณ budget-minute และ​เลข burn rate ทุก​ตัว​ใหม่​ทั้งหมด อย่า​เอา​ตาราง​ไป​ใช้​ข้าม​หน้าต่าง​โดย​ไม่​คิด​เลข

จุด​ที่​ปฏิวัติ​ความคิด​คือ SRE บอกว่า เป้า 100% เป็น​เป้า​ที่ ผิด (S38) ระบบ​ที่​ไม่​เคย​พัง​เลย​แปล​ว่า​คุณ ลงทุน​กับ​ความ​น่า​เชื่อถือ​มาก​เกิน​ไป — deploy ช้า​ลง, กล้า​ทดลอง​น้อย​ลง, จ่าย infra แพง​ขึ้น เพื่อ​ความ​ต่าง​ที่​ผู้​ใช้​แทบ​ไม่รู้สึก (ผู้​ใช้บน​มือถือ 3G แยก​ไม่​ออก​ระหว่าง 99.9% กับ 99.999% เพราะ​เน็ต​ตัวเอง​พัง​บ่อย​กว่า) ดังนั้น​เรา​ตั้ง​เป้า​ให้ ต่ำ​กว่า 100% อย่าง​จงใจ แล้ว​ช่องว่าง​นั้น​มีชื่อ

Error BudgetError Budget100% ลบ SLO — ปริมาณ​ความ​ไม่​น่า​เชื่อถือ​ที่​ยอม​ให้​ได้​ใน​งวด​นั้น (99.9% ≈ 43.2 นาที/30 วัน)Process คือ​ช่องว่าง​นั้น — ปริมาณ​ความ​ไม่​น่า​เชื่อถือ​ที่ ยอม​ให้​เกิด​ได้ ใน​งวด​หนึ่ง (S41):

error budget = 100% − SLO

ถ้า SLO = 99.9% แปล​ว่า error budget = 0.1% ของ​ทั้ง​งวด และ​นี่​ไม่ใช่​แค่​เปอร์เซ็นต์​นามธรรม — มัน​แปลง​เป็น เวลา และ จำนวน​คำขอ ที่​จับ​ต้อง​ได้:

คิด​เลข​จริง​กับ Ordering intake (SLO 99.9%, หน้าต่าง 30 วัน):

  • หน้าต่าง 30 วัน = 30 × 24 × 60 = 43,200 นาที
  • error budget เป็น​เวลา = 0.1% × 43,200 = 43.2 นาที ต่อ 30 วัน
  • ถ้า​รับคำ​ขอ ~3,000,000 ครั้ง​ใน 30 วัน → error budget เป็น​จำนวน = 0.1% × 3,000,000 = 3,000 คำขอ​ที่​พัง​ได้
SLObudget ต่อ 30 วัน (เวลา)ความหมาย​กับ Order
99%432 นาที (7.2 ชม.)หละหลวม​ไป — ลูกค้า​เจอออเดอร์​พัง​บ่อย
99.9%43.2 นาทีจุด​ตั้งต้น​ที่​สม​เหตุ​สม​ผล​ของ intake
99.95%21.6 นาทีเข้ม​ขึ้น ต้อง​ลงทุน​ความ​น่า​เชื่อถือ​มาก​ขึ้น
99.99%4.32 นาทีเข้ม​มาก — เหมาะ​กับ path จ่าย​เงิน​เท่านั้น

พลัง​ของ error budget อยู่​ตรง​นี้: มัน​เปลี่ยน​การ​เถียง​กัน​ว่า “ปลอดภัย​พอ​หรือ​ยัง” (อัตวิสัย) ให้​เป็น​ตัวเลข​เดียว​ที่​ทั้ง​ทีม​มอง​ร่วม​กัน — budget เหลือ 40 นาที = deploy feature ใหม่​ได้​สบาย; budget เหลือ 2 นาที = หยุด ship แล้วไป​ซ่อม​ความ​น่า​เชื่อถือ​ก่อน 3,000 คำขอ​ที่​พัง​ได้​นั้น​คือ งบ ที่​คุณ​จ่าย​เพื่อ​ความเร็ว​ใน​การ​พัฒนา ไม่ใช่​ความ​ล้มเหลว​ที่​ต้อง​กำจัด​ให้​เป็น​ศูนย์

รู้​ว่า​มี budget 43.2 นาที​แล้ว​ยัง​ไม่​พอ — คำถาม​ที่​ทำให้​ปลุก​คน​ได้​ถูก​เวลา​คือ ตอน​นี้​เรา​กำลัง​เผา​มัน​เร็ว​แค่​ไหน? นั่น​คือ Burn RateBurn Rateอัตรา​การ​เผา error budget เทียบ​กับ SLO; 1 = เผา​หมด​พอดี​ใน​หน้าต่าง SLO; ใช้​ทำ multi-window multi-burn-rate alertProcess (S42):

burn_rate = observed_error_ratio / (1 − SLO)

  • burn rate = 1 แปล​ว่า​เผา budget พอ​ดีๆ ให้​หมด​เป๊ะ​เมื่อ​สิ้น​หน้าต่าง SLO (30 วัน) — นี่​คือ อัตรา​ปกติ​ที่​ยอมรับ​ได้
  • burn rate = 2 เผา​เร็ว​เป็น​สอง​เท่า → budget หมด​ใน 15 วัน
  • burn rate = 14.4 เผา​เร็ว​มาก → budget 30 วัน​หมด​ใน ~2 วัน

เวลา​ที่ budget จะหมดคำนวณตรงๆ: time_to_exhaust = SLO_window / burn_rate (30 วัน ÷ 14.4 ≈ 2 วัน)

แปลง​กลับ​เป็น error ratio ที่​ต้อง​เห็น​เพื่อ​ให้ burn rate ถึง​เกณฑ์: สำหรับ SLO 99.9% (1 − SLO = 0.001) burn rate 14.4 = observed error ratio 1.44%, burn rate 6 = 0.6%, burn rate 1 = 0.1% ตัวเลข​เหล่า​นี้​คือ​สิ่ง​ที่ query ของ HyperDX จะ​วัด​จริง

ปัญหา​ของ alert แบบ​หน้าต่าง​เดียว: หน้าต่าง​สั้น (5 นาที) ไว แต่ เสียง​ดัง — spike ชั่ว​ครู่​ก็​ปลุก​คุณ; หน้าต่าง​ยาว (6 ชม.) เงียบ แต่ ช้า — กว่า​จะ​รู้​ก็​สาย​ไป SRE Workbook แก้​ด้วย multi-window multi-burn-rate: fire ต่อ​เมื่อ ทั้ง​สอง​หน้าต่าง (ยาว + สั้น) เกิน​เกณฑ์​พร้อม​กัน หน้าต่าง​ยาว​กัน​ของ​ปลอม หน้าต่าง​สั้น​ยืนยัน​ว่า​ยัง burn อยู่ ตอน​นี้ (ไม่ใช่​จบ​ไป​แล้ว) กฎ: หน้าต่าง​สั้น = 1/12 ของ​หน้าต่าง​ยาว

ตาราง​มาตรฐาน​สำหรับ SLO 99.9%, หน้าต่าง 30 วัน (คัด​ลอก​ทั้ง​แถว เปลี่ยน​แค่​ค่า SLO ถ้า SLO ต่าง) (S42):

Burn rateหน้าต่าง​ยาว + สั้นbudget ที่​ถูก​เผาการ​แจ้ง​เตือน
14.41 ชม. + 5 นาที2%Page (ปลุก​คน)
66 ชม. + 30 นาที5%Page (ปลุก​คน)
13 วัน + 6 ชม.10%Ticket (เปิด ticket)

ตรวจ​เลข​ให้​เห็น​ว่า​ไม่​ได้​เสก: budget ที่​ถูก​เผา = burn_rate × (window / 30วัน) → แถว​แรก 14.4 × (1ชม. / 720ชม.) = 2% ✓ · แถว​สอง 6 × (6 / 720) = 5% ✓ · แถว​สาม 1 × (72 / 720) = 10% ✓ ยิ่ง​เผา​ไว (14.4) ยิ่ง​กิน​สัดส่วน budget น้อย​แต่​อันตราย​เฉียบพลัน → ปลุก​คน​ทันที; เผา​ช้า (1) แต่​กิน​ไป​แล้ว 10% → ไม่​ต้อง​ปลุก แต่​ต้อง​มี​คน​ดู​ใน ชม.ทำการ (ticket)

flowchart TD
  SLI["SLI: สัดส่วนคำขอวางออเดอร์สำเร็จ<br/>(วัดจาก otel_traces)"] --> SLO["SLO: 99.9% ใน 30 วัน"]
  SLO --> EB["Error Budget = 100% − SLO<br/>= 43.2 นาที / ~3,000 คำขอ"]
  EB --> BR{"Burn rate ตอนนี้?<br/>= error_ratio / 0.001"}
  BR -->|"14.4 · 1ชม.+5น. · เผา 2%"| PAGE["PAGE — ปลุก on-call"]
  BR -->|"6 · 6ชม.+30น. · เผา 5%"| PAGE
  BR -->|"1 · 3วัน+6ชม. · เผา 10%"| TICKET["TICKET — ดูใน ชม.ทำการ"]
  BR -->|"< 1 · เผาช้ากว่าปกติ"| OK["ไม่ต้องแจ้ง — budget ยังพอ"]

  CAUSE["version ดิบ: CPU 92%, error 1 บรรทัด"] -.->|"ไม่โดนลูกค้า → เสียงรบกวน"| NOISE["ห้าม page<br/>(alert fatigue)"]

  classDef good fill:#0e7490,stroke:#155e75,color:#f0fdff;
  classDef warn fill:#b45309,stroke:#92400e,color:#fffbeb;
  classDef bad fill:#1e293b,stroke:#0f172a,color:#94a3b8;
  class SLI,SLO,EB,OK good;
  class PAGE,TICKET warn;
  class CAUSE,NOISE bad;

คำ​บรรยาย​ภาพ: เส้นทาง​จาก SLI ที่​วัด​ได้​จริง สู่ SLO สู่ error budget สู่​การ​ตัดสิน​ใจ page/ticket ตาม burn rate — 3 branch บน​คือ symptom-based ที่ fire ตาม​ความเร็ว​การ​เผา budget ส่วน branch เส้น​ประ​ด้าน​ล่าง​คือ cause-based (CPU สูง, error หนึ่ง​บรรทัด) ที่​ไม่​โดน​ลูกค้า​จึง​ต้อง​ถูกกัน​ออก​จาก​การ page เพื่อ​ไม่​ให้​เกิด alert fatigue

HyperDX มี alert สอง​แบบ (S28):

  • Search alert — นับ​จำนวน event ที่ match คำ​ค้น (Lucene) ใน​หน้าต่าง​เวลา แล้ว fire เมื่อ จำนวน ข้าม threshold; ใส่ group-by ได้ เหมาะ​กับ “นับ dead-letter ที่​โผล่​มา”
  • Chart / SQL alert — รัน ClickHouse SQL แบบ aggregate เต็ม​รูป แล้ว fire เมื่อ ค่าที่ query คืน ข้าม threshold; ตรรกะ anomaly ทั้งหมด​อยู่​ใน query เอง เหมาะ​กับ “คำนวณ burn rate สอง​หน้าต่าง”

threshold รองรับ >=, >, <=, <, =, !=; interval ตั้ง​ได้​ตั้งแต่ 1 นาที ถึง 1 วัน การ​แจ้ง​เตือน​ใน OSS ส่ง​ผ่าน generic webhook (native Slack/PagerDuty เป็น​ของ ClickHouse Cloud เท่านั้น) — ต่อ webhook เข้า PagerDuty/Opsgenie/Slack ของ​คุณ​เอา​เอง

ตาราง burn rate ต้นฉบับ​เป็น PromQL — HyperDX ไม่ใช่ PromQL

ตาราง multi-window multi-burn-rate ต้นฉบับ​ใน SRE Workbook เขียน​เป็น PromQL (rate(...)[1h]) HyperDX/ClickStack ไม่​ใช้ PromQL — มัน​เป็น ClickHouse SQL เรา​จึง​ต้อง​แปล​ตรรกะ “burn rate สอง​หน้าต่าง​ต้อง​เกิน​พร้อม​กัน” เป็น SQL เอง โครงสร้าง SQL ด้าน​ล่าง​คำนวณ burn rate ทั้ง​หน้าต่าง​ยาว​และ​สั้น​ใน​คิว​รี​เดียว​แล้ว​คืน least(...) เพื่อ​บังคับ​เงื่อนไข “ทั้ง​สอง​ต้อง​เกิน” — แต่ รูปแบบ​การ​ดึง​ค่า​ออก​มา​เทียบ threshold ของ HyperDX SQL alert ควร​ยืนยัน​กับ UI จริง​อีก​ครั้ง (version alert engine อาจ​ต่าง​ใน​รายละเอียด) ใช้​เป็น​โครง​ตั้งต้น ไม่ใช่​คำ​ตอบ​ตายตัว

Alert #1 — checkout p99 / availability burn rate (Chart / SQL alert, threshold >= 14.4): คำนวณ burn rate หน้าต่าง 1 ชม. และ 5 นาที​ใน​คิว​รี​เดียว แล้ว​คืน least เพื่อ​ให้ fire ต่อ​เมื่อ ทั้ง​สอง หน้าต่าง​เกิน

-- burn rate หน้ายาว(1ชม.) + สั้น(5น.) ของ Ordering intake; SLO 99.9% => (1 - SLO) = 0.001
-- fire เมื่อค่าที่คืน >= 14.4 (เกณฑ์ page แถวแรกของตาราง)
SELECT least(
-- หน้าต่างยาว 1 ชม.
countIf(StatusCode = 'Error') / nullIf(count(), 0) / 0.001,
-- หน้าต่างสั้น 5 นาที
countIf(StatusCode = 'Error' AND Timestamp >= now() - INTERVAL 5 MINUTE)
/ nullIf(countIf(Timestamp >= now() - INTERVAL 5 MINUTE), 0) / 0.001
) AS burn_rate
FROM otel_traces
WHERE ServiceName = 'ordering-service'
AND SpanAttributes['http.route'] = '/orders'
AND SpanKind = 'Server'
AND Timestamp >= now() - INTERVAL 1 HOUR;

เปลี่ยน​แค่ threshold ใน​หน้า​ตั้ง alert เป็น >= 6 (คู่​กับ​หน้าต่าง 6 ชม./30 น.) หรือ >= 1 (คู่​กับ 3 วัน/6 ชม. แล้ว​ส่ง​เป็น ticket แทน page) ก็ได้​อีก​สอง​แถว​ของ​ตาราง​ครบ

Alert #2 — Kitchen dead-letter queue โต (Search alert, count >= 1 ใน 5 นาที → Page): ออเดอร์​ที่ integration-event handler ของ Kitchen ประมวล​ไม่​ได้​จะ​ตก​ไป dead-letter — เป็น​อาการ​ที่​ผู้​ใช้​เห็น (อาหาร​ไม่​เข้า​ครัว) จึง​ควร page

# Search alert (Lucene) — นับ dead-letter event ของ Kitchen ในหน้าต่าง 5 นาที
ServiceName:kitchen-service SpanName:*dead-letter*
# threshold: count >= 1 interval: 5m → webhook: PagerDuty

DLQ depth เป็น metric (wolverine-dead-letter-queue จาก บท4) ก็​ใช้ Chart/SQL alert บน otel_metrics_* เทียบ threshold ได้​เช่น​กัน — เลือก​แบบ​ที่​ตรง​กับ​สิ่ง​ที่​คุณ instrument ไว้​จริง 2 alert นี้​ตรง​กับ Order hook พอดี: checkout burn rate (intake พัง​เร็ว) และ Kitchen DLQ โต (handler ค้าง)

alert ลด MTTR — มัน​ไม่​ลบ incident (honesty spine C)

อย่า​ขาย alert เกิน​จริง: SLO/burn-rate alert ที่​ตั้ง​ดีๆ ทำให้​คุณ รู้​เร็ว​ขึ้น จึง ลด MTTR (mean time to recovery) — แต่​มัน ไม่​ป้องกัน incident จาก​การ​เกิด และ​ไม่​ซ่อม​อะไร​ให้​เอง เส้น​เดียว​กับ​ที่​ย้ำ​ทั้ง​คอร์ส: alert (เหมือน dashboard, เหมือน filter) เป็น​เครื่องมือ ลด ต้นทุน​ของ​เหตุ ไม่ใช่ กำจัด เหตุ คุณค่า​ที่แท้​จริง​อยู่​ที่​การ​เลือก alert บน อาการ​ที่​ผู้​ใช้​เห็น ไม่ใช่​จำนวน alert ที่​ตั้ง — alert 100 ตัว​บน​สาเหตุ แย่​กว่า alert 3 ตัว​บน SLO เพราะ 100 ตัว​สอน​ให้​คุณ​เลิก​ฟัง

การ alert ที่​ดี​ไม่ใช่​การ​จับ​ทุก​อย่าง​ที่ “ดู​แปลก” — มัน​คือ​การ​ปลุก​คน​เฉพาะ​ตอน​ที่ ผู้​ใช้​เจ็บ​จริง SLI คือ​ตัวเลข​ที่​วัด, SLO คือ​เป้า​ที่​ตั้ง​ทับ (99.9% ใน 30 วัน), SLA เพิ่ม​ผล​ตาม​มา​เชิง​พาณิชย์ (ไม่มี​ผล = เป็น SLO); error budget = 100% − SLO แปลง​เป็น 43.2 นาที หรือ ~3,000 คำขอ​ที่​พัง​ได้​ต่อ 30 วัน และ 100% เป็น​เป้า​ที่​ผิด; burn rate = observed_error_ratio / (1 − SLO) บอกว่า​เผา budget เร็ว​แค่​ไหน; ตาราง multi-window 14.4/6/1 fire ต่อ​เมื่อ​ทั้ง​หน้าต่าง​ยาว​และ​สั้น​เกิน​พร้อม​กัน — page สอง​แถว​บน, ticket แถว​ล่าง; และ​ใน HyperDX เรา​เขียน​มัน​เป็น ClickHouse SQL (ไม่ใช่ PromQL) ส่ง​ผ่าน webhook เหนือ​สิ่ง​อื่น​ใด: alert ลด MTTR แต่ ไม่​ลบ incident — เลือก alert บน​อาการ ไม่ใช่​สาเหตุ

บท​หน้า​เป็น capstone: เรา​จะ ฉีด ความ​พัง​จริง​เข้าไป​ใน​ระบบ (Delivery ช้า / outbox ค้าง​หลัง​แยก service) แล้ว​ให้ alert ของ​บท​นี้ fire → ไล่​จาก metric → trace → log จนถึง​ต้นเหตุ พร้อม​เรื่อง sampling กับ​ต้นทุน​ที่​ยั่งยืน​ตอน scale — เอา​สาม​สัญญาณ​ที่ instrument มา​ทั้ง​คอร์สมา​ขับ incident จริง​หนึ่ง​รอบ​ให้​จบ


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​อิง​ต้นทาง​ที่​ลง​วัน​ที่​กำกับ อ่าน​ต่อ​ได้​โดยตรง:

เช็กความเข้าใจ — บทที่ 7

ข้อ 1 / 3

ทีมตั้งเป้าว่า '99.9% ของคำขอวางออเดอร์ต้องสำเร็จใน 30 วัน' แต่ไม่มีสัญญาคืนเงิน/ชดเชยเขียนไว้ถ้าพลาด — ตามนิยาม SRE นี่คืออะไร?