การดู : 228

25/04/2026 02:47น.

EP.106 Monitoring & Metrics สำหรับ WebSocket Production

EP.106 Monitoring & Metrics สำหรับ WebSocket Production

#Metrics

#Production

#Go

#Grafana

#Prometheus

#Monitoring

#WebSocket

เมื่อ WebSocket Server ของคุณเข้าสู่ ระดับ Production การดูแค่ log อย่างเดียวไม่พออีกต่อไป คุณต้องมี Monitoring & Metrics เพื่อดู “สุขภาพของระบบ” แบบเรียลไทม์

 

✅ จำนวนการเชื่อมต่อที่ยัง active
✅ ปริมาณข้อความที่ส่ง/รับ
✅ การใช้ CPU, Memory และ Bandwidth
✅ อัตราการหลุดของการเชื่อมต่อ (disconnect)

 

เครื่องมือยอดนิยมสำหรับงานนี้คือ Prometheus + Grafana ซึ่งช่วยให้คุณ:

  • มองเห็นภาพรวมของระบบแบบ real-time
  • ค้นหาคอขวด (bottleneck) ได้ทันก่อนที่ผู้ใช้จะรู้ตัว
    🚀 พร้อมเตรียมขยายระบบได้อย่างมั่นใจ

 

🔹 1. ทำไม Monitoring ถึงสำคัญสำหรับ WebSocket?

 

WebSocket ไม่เหมือน HTTP แบบดั้งเดิม เพราะเป็น การเชื่อมต่อถาวร (persistent connection) หากไม่ตรวจสอบให้ดี อาจไม่รู้เลยว่า:

  • Connection ไหนยัง “มีชีวิตอยู่”
  • ใช้ทรัพยากรมากเกินหรือเปล่า
  • ระบบกำลังจะล่มจาก traffic ที่สูงผิดปกติ

 

🔍 ตัวอย่าง Metrics สำคัญ:

Metricความหมาย
Active Connectionsจำนวนการเชื่อมต่อที่ยังเปิดอยู่
Message Rateข้อความที่ส่ง/รับต่อวินาที
Error Rateจำนวน error ที่เกิดขึ้น
Connection Lifetimeระยะเวลาการเชื่อมต่อ
CPU / Memory Usageการใช้ทรัพยากรของเครื่อง

 

🧩 2. ติดตั้ง Prometheus ให้เก็บ Metrics จาก WebSocket Server

 

Prometheus จะดึงข้อมูล Metrics จาก Endpoint เช่น /metrics ด้วย HTTP GET

 

🔧 ตัวอย่างโค้ดใน Go:

import (
	"net/http"
	"github.com/gorilla/websocket"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}

var (
	activeConnections = prometheus.NewGauge(prometheus.GaugeOpts{
		Name: "websocket_active_connections",
		Help: "Number of active WebSocket connections",
	})
	messageCounter = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "websocket_message_total",
		Help: "Total messages received",
	})
)

func init() {
	prometheus.MustRegister(activeConnections)
	prometheus.MustRegister(messageCounter)
}

func handleConnection(w http.ResponseWriter, r *http.Request) {
	conn, _ := upgrader.Upgrade(w, r, nil)
	defer conn.Close()

	activeConnections.Inc()
	defer activeConnections.Dec()

	for {
		_, msg, err := conn.ReadMessage()
		if err != nil {
			break
		}
		messageCounter.Inc()
	}
}

func main() {
	http.HandleFunc("/ws", handleConnection)
	http.Handle("/metrics", promhttp.Handler())
	http.ListenAndServe(":8080", nil)
}

 

🧭 3. แสดงผล Metrics ด้วย Grafana

 

Grafana คือเครื่องมือแสดงผล Metrics แบบ Visual ที่เชื่อมกับ Prometheus ได้ง่ายมาก

 

🔍 Dashboard ที่ควรมี:

  • 📊 Active Connections (Real-time Graph)
  • 🔄 Message Rate (รับ/ส่ง ต่อวินาที)
  • ⚠️ Error Rate (Pie Chart)
  • 💻 CPU / Memory Usage (Stacked Graph)

 

📈 Dashboard เหล่านี้ช่วยให้คุณ:

  • มองเห็น bottleneck ได้ทันที
  • ตัดสินใจเรื่องการขยายระบบได้แม่นยำ

 

⚙️ 4. Metrics สำคัญในระบบ Production

 

หมวดMetricหน้าที่
PerformanceMessage rate (msg/sec)ตรวจจับความหน่วง
ReliabilityConnection errorsป้องกันระบบล่ม
ResourceCPU / Memory usageคุมการใช้ทรัพยากร
ScalabilityConnection countวางแผนการสเกลระบบ
StabilityUptime / Reconnect rateบ่งชี้ความเสถียร

 

🧠 5. Best Practices สำหรับ Monitoring Production

 

✅ แยก Metrics ตาม instance / region → เพื่อวิเคราะห์ Load รายจุด
✅ ตั้ง Alert Rule (เช่น Active Conn. > 10,000)
✅ ตรวจ trend รายวัน → ป้องกันระบบพังโดยไม่รู้ตัว
✅ เก็บ Logs ควบคู่กับ Metrics → ใช้ Cross-analysis ได้แม่นยำ

 

🚀 ท้าให้ลอง!

 

แค่เพิ่ม /metrics และเชื่อม Grafana คุณจะเห็นทุกพฤติกรรมของ WebSocket Server แบบ Real-time ช่วยคุณ:

  • แก้ปัญหาทันท่วงที
  • เตรียมขยายระบบอย่างมั่นใจ
  • พัฒนาระบบที่พร้อมรับมือ Production จริง 🔧

 


 

🌟 EP ถัดไป:

 

📘 EP.107: การทำ Profiling และ Benchmark WebSocket Server เจาะลึกการวัดประสิทธิภาพของ WebSocket ด้วย pprof, wrk, และ hey พร้อมเทคนิค optimize ที่ใช้งานจริงในระบบ production! ⚡

 

อ่านบทความ Series อื่นๆ

🔵 Facebook: https://www.facebook.com/superdev.academy.th

🔴 YouTube : Superdev Academy

📸 Instagram: Superdev Academy

🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH

🌐 Website: https://www.superdevacademy.com/