[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-websocket-monitoring-metrics-production-all--*":3,"academy-blog-translations-42pwzlod5lq9vxp":89},{"data":4,"page":77,"perPage":77,"totalItems":77,"totalPages":77},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":84,"keywords":85,"locale":59,"published_at":86,"scheduled_at":13,"school_blog":81,"short_description":87,"status":79,"title":6,"updated":88,"updated_by":13,"slug":82,"views":83},"EP.106 Monitoring & Metrics สำหรับ WebSocket Production","sclblg987654321","school_blog_translations","\u003Cp>เมื่อ WebSocket Server ของคุณเข้าสู่ ระดับ Production การดูแค่ log อย่างเดียวไม่พออีกต่อไป คุณต้องมี Monitoring &amp; Metrics เพื่อดู “สุขภาพของระบบ” แบบเรียลไทม์\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>✅ จำนวนการเชื่อมต่อที่ยัง active\u003Cbr>✅ ปริมาณข้อความที่ส่ง\u002Fรับ\u003Cbr>✅ การใช้ CPU, Memory และ Bandwidth\u003Cbr>✅ อัตราการหลุดของการเชื่อมต่อ (disconnect)\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>เครื่องมือยอดนิยมสำหรับงานนี้คือ Prometheus + Grafana ซึ่งช่วยให้คุณ:\u003C\u002Fp>\u003Cul>\u003Cli>มองเห็นภาพรวมของระบบแบบ real-time\u003C\u002Fli>\u003Cli>ค้นหาคอขวด (bottleneck) ได้ทันก่อนที่ผู้ใช้จะรู้ตัว\u003Cbr>🚀 พร้อมเตรียมขยายระบบได้อย่างมั่นใจ\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🔹 1. ทำไม Monitoring ถึงสำคัญสำหรับ WebSocket?\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>WebSocket ไม่เหมือน HTTP แบบดั้งเดิม เพราะเป็น การเชื่อมต่อถาวร (persistent connection) หากไม่ตรวจสอบให้ดี อาจไม่รู้เลยว่า:\u003C\u002Fp>\u003Cul>\u003Cli>Connection ไหนยัง “มีชีวิตอยู่”\u003C\u002Fli>\u003Cli>ใช้ทรัพยากรมากเกินหรือเปล่า\u003C\u002Fli>\u003Cli>ระบบกำลังจะล่มจาก traffic ที่สูงผิดปกติ\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔍 ตัวอย่าง Metrics สำคัญ:\u003C\u002Fh3>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Metric\u003C\u002Fth>\u003Cth>ความหมาย\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode inline=\"\">Active Connections\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>จำนวนการเชื่อมต่อที่ยังเปิดอยู่\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode inline=\"\">Message Rate\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>ข้อความที่ส่ง\u002Fรับต่อวินาที\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode inline=\"\">Error Rate\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>จำนวน error ที่เกิดขึ้น\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode inline=\"\">Connection Lifetime\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>ระยะเวลาการเชื่อมต่อ\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode inline=\"\">CPU \u002F Memory Usage\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>การใช้ทรัพยากรของเครื่อง\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🧩 2. ติดตั้ง Prometheus ให้เก็บ Metrics จาก WebSocket Server\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>Prometheus จะดึงข้อมูล Metrics จาก Endpoint เช่น \u003Ccode inline=\"\">\u002Fmetrics\u003C\u002Fcode> ด้วย HTTP GET\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔧 ตัวอย่างโค้ดใน Go:\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">import (\n\t\"net\u002Fhttp\"\n\t\"github.com\u002Fgorilla\u002Fwebsocket\"\n\t\"github.com\u002Fprometheus\u002Fclient_golang\u002Fprometheus\"\n\t\"github.com\u002Fprometheus\u002Fclient_golang\u002Fprometheus\u002Fpromhttp\"\n)\n\nvar upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}\n\nvar (\n\tactiveConnections = prometheus.NewGauge(prometheus.GaugeOpts{\n\t\tName: \"websocket_active_connections\",\n\t\tHelp: \"Number of active WebSocket connections\",\n\t})\n\tmessageCounter = prometheus.NewCounter(prometheus.CounterOpts{\n\t\tName: \"websocket_message_total\",\n\t\tHelp: \"Total messages received\",\n\t})\n)\n\nfunc init() {\n\tprometheus.MustRegister(activeConnections)\n\tprometheus.MustRegister(messageCounter)\n}\n\nfunc handleConnection(w http.ResponseWriter, r *http.Request) {\n\tconn, _ := upgrader.Upgrade(w, r, nil)\n\tdefer conn.Close()\n\n\tactiveConnections.Inc()\n\tdefer activeConnections.Dec()\n\n\tfor {\n\t\t_, msg, err := conn.ReadMessage()\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tmessageCounter.Inc()\n\t}\n}\n\nfunc main() {\n\thttp.HandleFunc(\"\u002Fws\", handleConnection)\n\thttp.Handle(\"\u002Fmetrics\", promhttp.Handler())\n\thttp.ListenAndServe(\":8080\", nil)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🧭 3. แสดงผล Metrics ด้วย Grafana\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>Grafana คือเครื่องมือแสดงผล Metrics แบบ Visual ที่เชื่อมกับ Prometheus ได้ง่ายมาก\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔍 Dashboard ที่ควรมี:\u003C\u002Fh3>\u003Cul>\u003Cli>📊 Active Connections (Real-time Graph)\u003C\u002Fli>\u003Cli>🔄 Message Rate (รับ\u002Fส่ง ต่อวินาที)\u003C\u002Fli>\u003Cli>⚠️ Error Rate (Pie Chart)\u003C\u002Fli>\u003Cli>💻 CPU \u002F Memory Usage (Stacked Graph)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>📈 Dashboard เหล่านี้ช่วยให้คุณ:\u003C\u002Fp>\u003Cul>\u003Cli>มองเห็น bottleneck ได้ทันที\u003C\u002Fli>\u003Cli>ตัดสินใจเรื่องการขยายระบบได้แม่นยำ\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>⚙️ 4. Metrics สำคัญในระบบ Production\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>หมวด\u003C\u002Fth>\u003Cth>Metric\u003C\u002Fth>\u003Cth>หน้าที่\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Performance\u003C\u002Ftd>\u003Ctd>Message rate (msg\u002Fsec)\u003C\u002Ftd>\u003Ctd>ตรวจจับความหน่วง\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Reliability\u003C\u002Ftd>\u003Ctd>Connection errors\u003C\u002Ftd>\u003Ctd>ป้องกันระบบล่ม\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Resource\u003C\u002Ftd>\u003Ctd>CPU \u002F Memory usage\u003C\u002Ftd>\u003Ctd>คุมการใช้ทรัพยากร\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Scalability\u003C\u002Ftd>\u003Ctd>Connection count\u003C\u002Ftd>\u003Ctd>วางแผนการสเกลระบบ\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Stability\u003C\u002Ftd>\u003Ctd>Uptime \u002F Reconnect rate\u003C\u002Ftd>\u003Ctd>บ่งชี้ความเสถียร\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🧠 5. Best Practices สำหรับ Monitoring Production\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>✅ แยก Metrics ตาม instance \u002F region → เพื่อวิเคราะห์ Load รายจุด\u003Cbr>✅ ตั้ง Alert Rule (เช่น Active Conn. &gt; 10,000)\u003Cbr>✅ ตรวจ trend รายวัน → ป้องกันระบบพังโดยไม่รู้ตัว\u003Cbr>✅ เก็บ Logs ควบคู่กับ Metrics → ใช้ Cross-analysis ได้แม่นยำ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🚀 ท้าให้ลอง!\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>แค่เพิ่ม \u003Ccode inline=\"\">\u002Fmetrics\u003C\u002Fcode> และเชื่อม Grafana คุณจะเห็นทุกพฤติกรรมของ WebSocket Server แบบ Real-time ช่วยคุณ:\u003C\u002Fp>\u003Cul>\u003Cli>แก้ปัญหาทันท่วงที\u003C\u002Fli>\u003Cli>เตรียมขยายระบบอย่างมั่นใจ\u003C\u002Fli>\u003Cli>พัฒนาระบบที่พร้อมรับมือ Production จริง 🔧\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🌟 EP ถัดไป:\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>📘 EP.107: การทำ Profiling และ Benchmark WebSocket Server เจาะลึกการวัดประสิทธิภาพของ WebSocket ด้วย \u003Ccode inline=\"\">pprof\u003C\u002Fcode>, \u003Ccode inline=\"\">wrk\u003C\u002Fcode>, และ \u003Ccode inline=\"\">hey\u003C\u002Fcode> พร้อมเทคนิค optimize ที่ใช้งานจริงในระบบ production! ⚡\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevschool\u002F\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>","183_11zon_t6oz4uy2n8.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fd3dzc93dkn7db6o\u002F183_11zon_t6oz4uy2n8.webp","2026-03-04 08:45:39.352Z","",{"keywords":15,"locale":53,"school_blog":63},[16,23,28,33,38,43,48],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:45:37.661Z","xjf08drjt5em75b","Metrics","2026-04-10 16:13:00.679Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:44:47.385Z","li4cs2v3atd0wds","Production","2026-04-10 16:12:49.890Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:45:37.995Z","1v2heky8yo3cwww","Grafana","2026-04-10 16:13:00.771Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:45:38.382Z","8uz7io97gj0jusq","Prometheus","2026-04-10 16:13:00.871Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:44:34.571Z","fiybaq65m7oymtd","Monitoring","2026-04-10 16:12:46.904Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:34:00.920Z","ecac9y661or1xka","WebSocket","2026-04-10 16:08:05.227Z",{"code":54,"collectionId":55,"collectionName":56,"created":57,"flag":58,"id":59,"is_default":60,"label":61,"updated":62},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":64,"collectionId":65,"collectionName":66,"created":13,"expand":67,"id":81,"slug":82,"updated":13,"views":83},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":68},{"blogIds":69,"collectionId":70,"collectionName":71,"created":72,"created_by":13,"id":64,"image":73,"image_alt":13,"image_path":74,"label":75,"name":76,"priority":77,"publish_at":78,"scheduled_at":13,"status":79,"updated":80,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":76,"th":76},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","42pwzlod5lq9vxp","websocket-monitoring-metrics-production",228,"d3dzc93dkn7db6o",[20,25,30,35,40,45,50],"2025-11-10 02:39:31.621Z","เมื่อ WebSocket Server เข้าสู่ Production แค่ log ไม่พอ! มาเรียนรู้การใช้ Prometheus และ Grafana เพื่อตรวจสอบสุขภาพระบบแบบ real-time พร้อมตัวอย่างโค้ดจริงในภาษา Go","2026-04-25 02:47:55.518Z",{"th":82,"en":82}]