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

ทำไม​ต้อง Observability & แบบ​จำลอง​ความคิด

หก​คอร์ส​ที่​ผ่าน​มา (#5–#10 และ​โดย​เฉพาะ #8) คุณ​สร้าง platform Order ของ​จริง​ขึ้น​มา​ทั้ง​ระบบ — 4 bounded context ที่​คุย​กัน​ข้าม RabbitMQ ผ่าน transactional outbox: Ordering (core), Kitchen กับ Delivery (supporting, และ Delivery ถูก​แยก​ออก​ไป​เป็น service เดี่ยว), Payment (generic ที่​คุย​กับ gateway ภายนอก​ผ่าน ACL) code ทำงาน​ถูกต้อง ออเดอร์​ไหล​จาก confirm ไป kitchen ticket ไป delivery assignment ครบ​ทุก​ขั้น

แต่​ลอง​นึก​ภาพ​ตอน​ตี​สาม​ที่​คุณ​เป็น​คน on-call แล้ว​มี​คน​บอกว่า “ออเดอร์ #4821 ค้าง” คุณ​เปิด log ของ Kitchen เจอ ticket ที่​ไม่​เคย​ถูก​ปิด เปิด log ของ Payment เจอ​บรรทัด​เดียว​ที่​บอกว่า charge สำเร็จ — แต่​สอง​อย่าง​นี้​เป็น​ความ​ลึกลับ​สอง​ก้อน​ที่​ไม่​โยง​กัน คุณ​ไม่มี​ทาง​รู้​เลย​ว่า​มัน​เป็น​ออเดอร์​เดียวกัน​ไหม, ออเดอร์​นั้น​เดิน​ทางผ่าน RabbitMQ ไป​ถึง​ไหน​แล้ว, หรือ​มัน​หยุด​ตรง​ไหน นี่​คือ​ประเด็น​ของ​ทั้ง​คอร์ส: คุณ​สร้าง Order platform 4 context ที่​คุย​กัน​ข้าม RabbitMQ มา 6 คอร์ส — แต่​ตอน​นี้​คุณ “มอง​ไม่​เห็น” ว่า​ออเดอร์​เดิน​ทางผ่าน​มัน​ยังไง นี่​คือ​ระบบ​กระจาย​ที่​มืด​สนิท คอร์ส #19 คือ​ชั้น OPERATE ที่​จะ​เปิด​ไฟ​ให้​มัน

📦 code ตัวอย่าง

คอร์ส​นี้ instrument platform Order ตัว​เดิม​ที่ #8 สร้าง​ไว้ (Ordering/Kitchen/Delivery/Payment บน WolverineFx outbox + RabbitMQ) — repo kaen-food-ordering (กำลัง​จัด​ทำ) #19 ไม่​เพิ่ม bounded context หรือ business logic ใหม่ แต่​ห่อ ชั้น​สังเกตการณ์ คร่อม​มัน บท​นี้​เป็น​บท​วาง​กรอบ​ความคิด — ยัง ไม่มี code รัน​ได้ code instrument ของ​จริง​เริ่ม​ที่​บท2 (ตั้ง stack แล้ว​ได้ trace แรก) บท​นี้​ตั้ง precedent ของ honesty spine กับ 🔗 callout อ้างอิง​ต้นทาง​ไว้​ให้​ทุก​บท​หลัง​จาก​นี้​เดิน​ตาม

ObservabilityObservabilityความ​สามารถ​เข้าใจ​สถานะ​ภายใน​ของ​ระบบ​จาก​สัญญาณ​ที่​มัน​ปล่อย​ออก​มา (telemetry) โดย​ไม่​ต้อง​รู้​โครงสร้าง​ภายใน​ล่วงหน้า และ​ตอบ 'unknown unknowns' ได้Process คือ​ความ​สามารถ​เข้าใจ​สถานะ​ภายใน​ของ​ระบบ​จาก​สัญญาณ​ที่​มัน​ปล่อย​ออก​มา (TelemetryTelemetryข้อมูล​สัญญาณ (traces/metrics/logs) ที่ app ปล่อย​ออก​มา​เพื่อ​ให้​สังเกต​พฤติกรรม​ของ​ระบบ​ได้Process) โดย ไม่​ต้อง รู้​โครงสร้าง​ภายใน​ล่วงหน้า จุด​ที่​คน​สับสน​กัน​มาก​ที่สุด​คือ​คิด​ว่า​มัน​เท่ากับ monitoring — มัน​ไม่ใช่

Monitoring ตอบ​คำถาม​ที่​คุณ รู้​ล่วงหน้า​ว่า​จะ​ถาม — “known unknowns” คุณ​สร้าง dashboard ไว้​ก่อน​ล่วงหน้า​เพราะ​รู้​อยู่​แล้ว​ว่า​อยาก​ดู CPU, จำนวน request ต่อ​วินาที, error rate เมื่อ graph แดง คุณ​ก็​รู้ พวก​นี้​คือ​คำถาม​ที่​คุณ​คาด​ไว้​แล้ว

Observability ตอบ​คำถาม​ที่​คุณ ไม่รู้​ว่า​ต้อง​ถาม — “unknown unknowns” ตำรา​ของ OpenTelemetry นิยามไว้ตรงๆ ว่า​ระบบ​จะ observable ได้​เมื่อ​คุณ (S2):

“ask questions about that system without knowing its inner workings.”

ตอน​ตี​สาม​กับ​ออเดอร์ #4821 คุณ​ไม่มี dashboard ที่​ชื่อ “ทำไม​ออเดอร์​นี้​ค้าง” ไว้​ก่อน — เพราะ​ไม่มี​ใคร​คาด​เหตุ​นี้​ได้ observability คือ​ความ​สามารถ ตั้ง​คำถาม​ใหม่ กับ​ข้อมูล​ที่​ระบบ​ปล่อย​ไว้​แล้ว โดย​ไม่​ต้อง​ไป deploy code ใหม่​ก่อน นี่​คือ​เส้น​ความ​ซื่อสัตย์​เส้น​แรก​ของ​คอร์ส: อย่า​ขาย dashboard ว่า​มัน​คือ observability — dashboard คือ monitoring ที่​ดี แต่​มัน​ตอบ​ได้​แค่​คำถาม​ที่​คุณ​เดา​ไว้​ล่วงหน้า​เท่านั้น

telemetry ที่​เรา​กำลัง​พูด​ถึง​มี​สาม​ชนิด และ OpenTelemetryOpenTelemetryมาตรฐาน​เปิด​ที่​เป็นกลาง​ต่อ vendor สำหรับ​สร้าง​และ​ส่ง telemetry; ตัว​มัน​เอง​ไม่ใช่ backend — storage/UI ปล่อย​ให้​เครื่องมือ​อื่นArchitecture (OTel) เรียก​มัน​ว่า สาม​สัญญาณ (signals):

  • Traces — เส้นทาง​ของ หนึ่ง request ผ่าน​ทั้ง​ระบบ (ออเดอร์ #4821 เดิน​ผ่าน context ไหน​บ้าง เรียง​ตาม​เวลา)
  • Metrics — ตัวเลข​สรุป​รวม (ออเดอร์​ต่อ​วินาที, p95 ของ checkout latency, ความ​ลึก​ของ​คิว)
  • Logs — บันทึก​เหตุการณ์​เป็น​ข้อความ ณ จุด​เวลา​หนึ่ง (มี​โครงสร้าง​หรือ​ไม่​ก็ได้)

จุด​ที่​คน​เข้าใจ​ผิด​บ่อย​ที่สุด​คือ​คิด​ว่า OpenTelemetry เป็น “เครื่องมือ observability” ที่​เก็บ​และ​แสดง​ข้อมูล​ให้ มัน​ไม่ใช่ เอกสาร​ทางการ​ของ OTel พูด​ชัด​ว่า​มัน​ไม่ใช่ backend — มัน​หยุด​ที่​การ สร้าง​และ​ส่ง telemetry เท่านั้น (S1):

“The backend (storage) and the frontend (visualization) of telemetry data are intentionally left to other tools.”

นี่​คือ​เส้น​ความ​ซื่อสัตย์​เส้น​ที่​สอง และ​เป็น mental model ที่​ต้อง​ปัก​ตั้งแต่​บท​แรก​เพราะ​ทุก​บท​ลงมือ​จะ​หมุน​รอบ​มัน:

“สิ่ง​ที่​คุณ instrument คือ OpenTelemetry — มาตรฐาน​เปิด​ที่​เป็นกลาง​ต่อ vendor. ClickStack เป็น​แค่ ‘ปลายทาง’ (sink) ที่​เรา​เลือก​ใช้​ให้​จับ​ต้อง​ได้ ไม่ใช่​ตัว​คอร์ส.”

พูด​ให้​จำ​ง่าย: OTel คือ สาย​ไฟ (portable) — ClickStackClickStackstack observability โอเพน​ซอร์ส​ของ ClickHouse: HyperDX (UI) + ClickHouse (columnar store) + OTel Collector distro; เป็น 'ปลายทาง' ที่​สลับ​ได้Architecture คือ ปลั๊ก (สลับ​ได้) code C# ที่​คุณ​เขียน​จะ​ปล่อย OTLP ออก​มา ส่วน​ปลายทาง​เป็น​แค่ env var หนึ่ง​ตัว — วัน​ไหน​อยาก​สลับ ClickStack ไป​เป็น Jaeger, Grafana, Datadog หรือ Honeycomb code instrument ใน app ของ​คุณ ไม่​ต้อง​แก้​แม้แต่​บรรทัด​เดียว เรา​เลือก ClickStack (ClickHouse + HyperDX) เพราะ​มัน​เป็น OSS all-in-one รัน​บน Docker ได้ ทำให้​ตัวอย่าง​จับ​ต้อง​ได้ — แต่​คอร์ส​นี้​สอน OpenTelemetry ไม่​ได้​สอน ClickStack

จาก ‘สาม​เสา’ สู่ Observability 2.0 — ดีเบต​ที่​ยัง​ไม่​จบ (และ​เรา​จะ​ไม่​ตัดสิน​ให้)

หัวข้อ​ที่​มีชื่อ​ว่า “จาก ‘สาม​เสา’ สู่ Observability 2.0 — ดีเบต​ที่​ยัง​ไม่​จบ (และ​เรา​จะ​ไม่​ตัดสิน​ให้)”

คุณ​จะ​เจอ​คำ​ว่า Three PillarsThree Pillarsกรอบ​เดิม (Obs 1.0) ที่​มอง metrics/logs/traces เป็น​สาม​คลัง​แยก​กัน — ถูก​วิจารณ์​ว่า​ทำให้​ต้อง​เก็บ​ข้อมูล​ซ้ำ​หลาย​ที่Process (สาม​เสา) ทุก​ที่​ใน​วงการ observability — กรอบ​ที่​มอง metrics, logs, traces เป็น สาม​คลัง​แยก​กัน สาม​ผลิตภัณฑ์ สาม​ที่​เก็บ นี่​คือ​คำ​ศัพท์​มาตรฐาน​ของ​อุตสาหกรรม (บาง​คน​เรียก​ยุค​นี้​ว่า Obs 1.0) และ​คุณ​ควร​รู้จัก​มัน​เพราะ​ทุก​คน​พูด​ถึง​มัน

แต่​มี​เสียง​วิจารณ์​ที่​ดัง​และ​ตรง​ประเด็น — นำ​โดย Charity Majors (Honeycomb) ที่​ต้อง​ฟัง​อย่าง​ซื่อสัตย์:

  • Majors เถียง​ว่า​กรอบ​สาม​เสา​ฝัง​ราก​ลึก​ส่วน​หนึ่ง​เพราะ​เหตุผล​เชิง​ธุรกิจ ไม่ใช่​เชิง​เทคนิค — “vendors had metrics products, logging products, and tracing products to sell” (S45/S46)
  • และ​มัน​ทำให้​คุณ​ต้อง​จ่าย​เงิน​เพื่อ “store telemetry five different ways, in five different places, for every single request” — ข้อมูล​ชุด​เดียว​ถูก​เก็บ​ซ้ำ​ห้า​ที่ (S47)

ทางออก​ที่​ฝ่าย​นี้​เสนอ​คือ Observability 2.0Observability 2.0แนวคิด 'แหล่ง​ความ​จริง​เดียว' เก็บ​เป็น wide structured event แล้ว​อนุมาน metrics/logs/traces ตอน​อ่าน (frame ที่ vendor คิด อยู่​ใน​ดีเบต​ที่​ยัง​ไม่​จบ)Process: แหล่ง​ความ​จริง​เดียว — เก็บ​ทุก​อย่าง​เป็น Wide EventWide Eventเหตุการณ์ structured ที่​มี attribute จำนวน​มาก (คือส​แปน​นั่นเอง) เป็น​หน่วย​ข้อมูล​หลัก​ของ Obs 2.0Architecture (structured event ที่​มี attribute กว้างมากๆ คือ span นั่นเอง) แล้ว อนุมาน metrics/logs/traces ออก​มา​ตอน อ่าน ไม่ใช่​เก็บ​แยก​ไว้​ก่อน (S46)

แล้ว ClickStack อยู่​ตรง​ไหน? พูด​ตาม​ตรง​โดย​ไม่​โม้: ClickStack เก็บ​ทุก​สัญญาณ​เป็น​แถว columnar กว้างๆ ใน ClickHouse แล้ว​ให้​คุณ pivot จาก log ไป trace ไป metric เหนือ store เดียวกัน​ได้ — เชิง​สถาปัตยกรรม​มัน​จึง​อยู่​ใน​ค่าย wide-event/single-store แต่ ระวัง​การ​โม้: “Obs 2.0” เป็น frame ที่ vendor (Honeycomb) เป็น​คน​ตั้ง​ชื่อ อยู่​ใน​ดีเบต​ที่​ยัง ไม่​จบ; ClickStack ก็​ไม่​ได้​ถูก​สร้าง​มา​ตาม spec ของ Majors เป๊ะๆ; และ​ตัว OTel เอง​ก็​ยัง​จัด​ระเบียบ​รอบ สาม​สัญญาณ บน​สาย ดังนั้น​เส้น​ของ​คอร์ส​นี้​คือ:

OTel ให้ สาม​สัญญาณ วิ่ง​อยู่​บน​สาย; ClickStack ให้​คุณ เก็บ + query มัน​เป็น dataset เดียว​ที่​กว้าง​และ สัมพันธ์​กัน (correlated) ดีเบตนี้​เป็น​ของ​จริง และ​การ correlate คือ​ผล​ตอบแทน​ที่​จับ​ต้อง​ได้ — แต่​เรา​จะ ไม่​บอก​คุณ​ว่า​ฝ่าย​ไหน​ชนะ

เส้นเลือด​ความ​ซื่อสัตย์​สี่​เส้น​ของ​คอร์ส​นี้

หัวข้อ​ที่​มีชื่อ​ว่า “เส้นเลือด​ความ​ซื่อสัตย์​สี่​เส้น​ของ​คอร์ส​นี้”

ก่อน​ลง code สัก​บรรทัด ปัก​ความ​จริง​สี่​ข้อ​นี้​ไว้ — ทุก​บท​ลงมือ​จะ​ย้ำ​ข้อ​ที่​เกี่ยวข้อง​ซ้ำ เหมือน​ที่​บท​นี้​ตั้ง precedent ไว้:

  • (A) OTel เป็นกลาง​ต่อ vendor; ClickStack เป็น​แค่ sink หนึ่ง​ที่​สลับ​ได้ — สาย​ไฟ vs ปลั๊ก code ไม่​ผูก​กับ​ปลายทาง
  • (B) Observability ≠ monitoring — monitoring ตอบ known-unknowns (dashboard ที่​สร้าง​ไว้​ก่อน), observability ตอบ unknown-unknowns
  • (C) instrumentation มี​ต้นทุน​จริง; filter/dashboard ลด MTTR แต่ ไม่​กำจัด เหตุ — cardinality ที่​ระเบิด​คิด​เงิน​แบบ​ทวีคูณ, storage โต​ตาม​ปริมาณ, และ sampling เป็น “เครื่องมือ​หยาบ” ที่​ซ่อน​ข้อมูล wide-event store ลด ต้นทุน​นี้​ได้ แต่ ไม่​ลบ มัน​ทิ้ง
  • (D) คุณ debug สิ่ง​ที่​คุณ​ไม่​ได้ instrument ไม่​ได้ — app ต้อง​ปล่อย​สัญญาณ​ออก​มา​ก่อน คุณ​ถึง​จะ​ตั้ง​คำถาม​กับ​มัน​ได้ auto-instrumentation (HTTP/DB span ที่​ได้​ฟรี​จาก framework) เป็น​แค่ พื้น ไม่ใช่ เพดาน — span/attribute ที่​มี​ความหมาย​เชิง domain (order.id, ผลลัพธ์​การ​จ่าย​เงิน) ต้อง​เขียน​เอง
ขอบเขต: 3 สัญญาณ​ฝั่ง backend — session replay อยู่​นอก​คอร์ส (พูด​ครั้ง​เดียว​ที่​นี่)

คอร์ส​นี้​จับ สาม​สัญญาณ​ฝั่ง backend เท่านั้น: traces, metrics, logs ของ platform .NET จริงๆ แล้ว ClickStack มี​สัญญาณ​ที่​สี่​คือ session replay — แต่​มัน​เป็น​สัญญาณ ฝั่ง browser (เก็บ​ผ่าน SDK ใน​เว็บ​หน้า​บ้าน) platform Order ของ​เรา​เป็น backend service ล้วน จึง ไม่​แตะ session replay เลย (S50) พูด​ไว้​ตรง​นี้ชัดๆ เพื่อ​ไม่​ให้​ใคร​อนุมาน​ว่า​คอร์ส​ครอบคลุม​มัน

คอร์ส​นี้ ‘สังเกต’ platform ที่ #8 สร้าง — ไม่​ได้​สร้าง​ใหม่ (anti-overlap)

หัวข้อ​ที่​มีชื่อ​ว่า “คอร์ส​นี้ ‘สังเกต’ platform ที่ #8 สร้าง — ไม่​ได้​สร้าง​ใหม่ (anti-overlap)”

ขีด​เส้น​ให้​ชัด​ว่า​คอร์ส​นี้ ไม่ใช่ บท​ไหน​ที่​คุณ​เคย​เรียน: #19 สังเกต platform ที่ #8 สร้าง​ไว้ — มัน​ไม่​เคย​สอน Wolverine/RabbitMQ/outbox mechanics ซ้ำ (นั่น​คือ​ของ #8 เรา​แค่ instrument มัน) และ​ไม่​เคย​สอน resilience/retry/idempotency ซ้ำ (นั่น​คือ​ของ #17 ซึ่ง​เป็น resilience ไม่ใช่ observability) เรา​จะ reuse idempotent guard ของ #17 เป็น บริบท ของ trace เท่านั้น ไม่ derive มัน​ใหม่ และ​เมื่อ​พูด​ถึง RED/SLO/error budget ใน​บท​หลัง เรา​จะ frame มัน​เป็น operations observability ไม่ใช่ resilience

แผนภาพ: จาก​ระบบ​มืด​สนิท สู่​ระบบ​ที่​ติดไฟ​ด้วย telemetry

หัวข้อ​ที่​มีชื่อ​ว่า “แผนภาพ: จาก​ระบบ​มืด​สนิท สู่​ระบบ​ที่​ติดไฟ​ด้วย telemetry”
flowchart LR
  subgraph DARK["ตอนนี้: ระบบกระจายที่มืดสนิท"]
    O1["Ordering<br/>log บอก 'confirmed' แล้วเงียบ"]
    K1["Kitchen<br/>ticket ค้าง — ทำไม?"]
    D1["Delivery (service เดี่ยว)<br/>ออเดอร์มาถึงไหม?"]
    P1["Payment<br/>log บรรทัดเดียว ไม่โยงกับใคร"]
    O1 -. "RabbitMQ<br/>มองไม่เห็นการเดินทาง" .-> K1
    O1 -. "?" .-> D1
    O1 -. "?" .-> P1
  end

  subgraph LIT["หลัง instrument: telemetry ที่สัมพันธ์กัน (correlated)"]
    O2["Ordering<br/>span: place-order"]
    K2["Kitchen<br/>span: open-ticket"]
    D2["Delivery<br/>span: assign"]
    P2["Payment<br/>span: charge (HttpClient)"]
    O2 -->|"traceparent ข้าม RabbitMQ<br/>trace เดียวกัน"| K2
    O2 -->|"trace เดียวกัน"| D2
    O2 -->|"trace เดียวกัน"| P2
  end

  DARK ==>|"instrument ด้วย OpenTelemetry"| LIT

  classDef dark fill:#1e293b,stroke:#0f172a,color:#94a3b8;
  classDef lit fill:#0e7490,stroke:#155e75,color:#f0fdff;
  class O1,K1,D1,P1 dark;
  class O2,K2,D2,P2 lit;

คำ​บรรยาย​ภาพ: ก่อน instrument (ซ้าย) แต่ละ context ปล่อย log ของ​ตัวเอง​แยก​กัน — ออเดอร์​เดียว​กลาย​เป็น​ความ​ลึกลับ​สี่​ก้อน​ที่​ไม่​โยง​กัน และ​การ​เดิน​ทางข้าม RabbitMQ มอง​ไม่​เห็น​เลย หลัง instrument ด้วย OpenTelemetry (ขวา) ทุก context ปล่อย span ที่ share trace เดียวกัน โดย trace context ถูก​ส่ง​ต่อ​ผ่าน RabbitMQ — ออเดอร์​หนึ่ง​ใบ​จึง​กลาย​เป็น เส้นทาง​เดียว ที่​ไล่​ดู​ได้​ตั้งแต่​ต้น​จน​จบ

หก​คอร์ส​ก่อนหน้า​ให้​คุณ สร้าง platform Order ที่​ทำงาน​ถูกต้อง — แต่​ตอน​รัน​จริง​มัน​มืด​สนิท บท​นี้​วาง​แบบ​จำลอง​ความคิด​ทั้งหมด​ไว้​ก่อน​ลง code: observability ตอบ unknown-unknowns ต่าง​จาก monitoring ที่​ตอบ​แค่​คำถาม​ที่​เดา​ไว้; OpenTelemetry คือ สาย​ไฟ ที่​เป็นกลาง​ต่อ vendor และ ไม่ใช่ backend ส่วน ClickStack คือ ปลั๊ก ที่​สลับ​ได้; ดีเบต three-pillars vs Observability 2.0 เป็น​ของ​จริง​และ​เรา​จะ​ไม่​ตัดสิน​ให้​ฝ่าย​ใด​ชนะ; และ​เส้น​ความ​ซื่อสัตย์​สี่​เส้น (A–D) — โดย​เฉพาะ​ข้อ (D) ที่​ว่า คุณ debug สิ่ง​ที่​ไม่​ได้ instrument ไม่​ได้ — จะ​กำกับ​ทุก​บท​ที่​เหลือ คอร์ส​นี้​จับ​สาม​สัญญาณ​ฝั่ง backend เท่านั้น session replay อยู่​นอก​ขอบเขต

บท​หน้า​เลิก​พูด​ทฤษฎี — เรา​จะ​รัน ClickStack บน Docker, wire app Ordering เข้า OTel, แล้ว​ได้ trace แรก end-to-end เข้า HyperDX รวม​ถึง DB span จาก EF Core มา​เปิด​ไฟ​ให้​ระบบ​มืด​ก้อน​นี้​กัน


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

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

  • OpenTelemetry — What is OpenTelemetry? (เอกสาร​ทางการ, เข้าถึง 2026-07-22) — OTel เป็นกลาง​ต่อ vendor และ ไม่ใช่ backend: “The backend (storage) and the frontend (visualization) of telemetry data are intentionally left to other tools”
  • OpenTelemetry — Observability Primer (เอกสาร​ทางการ, เข้าถึง 2026-07-22) — observability = ตั้ง​คำถาม​กับ​ระบบ​ได้ “without knowing its inner workings” (unknown-unknowns) และ app ต้อง​ปล่อย​สัญญาณ​ก่อน
  • Charity Majors — “The pillar is a lie” (2025-10-30) — คำ​วิจารณ์​กรอบ​สาม​เสา: pillar = การ​ตลาด, signal = เทคนิค; เก็บ​ครั้ง​เดียว
  • Honeycomb — “Time to version observability? Signs point to yes” (2024-12-02) — Obs 1.0 vs 2.0, wide events, อนุมาน metrics/logs/traces ตอน​อ่าน; “vendors had metrics products, logging products, and tracing products to sell”
  • Honeycomb — “The cost crisis in observability tooling” (2024-12-18) — ต้นทุน​ของ​การ​เก็บ​ซ้ำ​ห้า​ที่: “store telemetry five different ways, in five different places, for every single request”; sampling เป็น​เครื่องมือ​หยาบ
  • ClickStack — Session replay (เข้าถึง 2026-07-22) — สัญญาณ​ที่​สี่ ฝั่ง browser (SDK @hyperdx/browser) — อยู่​นอก​ขอบเขต ของ​คอร์ส backend นี้

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

ข้อ 1 / 3

ความต่างที่เป็นหัวใจระหว่าง monitoring กับ observability คืออะไร?