25/04/2026 02:47น.

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 | หน้าที่ |
|---|---|---|
| Performance | Message rate (msg/sec) | ตรวจจับความหน่วง |
| Reliability | Connection errors | ป้องกันระบบล่ม |
| Resource | CPU / Memory usage | คุมการใช้ทรัพยากร |
| Scalability | Connection count | วางแผนการสเกลระบบ |
| Stability | Uptime / 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/