Screen Shot 2557-06-04 at 12.56.57 AM

ในภาษา Go นั้น ถ้าคุณต้องการนับค่าหรือเก็บข้อมูลอะไรบางอย่างลงในตัวแปร
เช่น นับจำนวนการใช้งาน function ต่างๆ
และสามารถแสดงข้อมูลจากตัวแปรได้อย่างง่าย
ที่สำคัญสามารถดูข้อมูลผ่าน web ได้ด้วย
ข้อมูลที่แสดงอยู่ในรูปแบบ JSON
การทำงานแบบนี้ Go เตรียมไว้ให้แล้ว

ทาง Go ได้เตรียม expvar มาให้เราใช้งานกันเรียบร้อย
ดังนั้นมาดูกันว่าจะใช้งานกันอย่างไร

แนะนำให้ไปอ่าน code ของ expvar.go ก่อน
จะเข้าใจการทำงานของ expvar มากยิ่งขึ้น
ใน function init() พบว่าจะมีตัวแปรหลักสองตัวคือ
cmdline และ memstats นั่นคือ 2 ตัวแปรหลักที่สร้างไว้ให้ตั้งแต่เริ่มต้น

เพื่อให้เข้าใจ มาเริ่มต้นใช้งานกันดีกว่า

สิ่งที่ผมต้องการ คือ จะสร้าง counter สำหรับนับจำนวนการเข้าใช้งานหน้าแรกของ web
ทำได้ดังนี้

ผลการทำงาน
จะเพิ่มข้อมูลในตัวแปรชื่อว่า counter ไปเป็น 4
ในตัวอย่างสร้าง function PrintVars มาเพื่อแสดงข้อมูลตัวแปรทั้งหมด
จาก expvar นั่นเอง ซึ่งข้อมูลเก็บไว้ในรูปแบบ Map

ต่อมาถ้าต้องการให้สามารถแสดงข้อมูลใน expvar ผ่าน HTTP ล่ะ จะต้องทำอย่างไร ?

การสร้างนั้นง่ายมากๆ เพียงการสร้าง Web server ขึ้นเท่านั้นเอง
ดัง code ต่อไปนี้

สามารถดูข้อมูลที่เก็บไว้ใน expvar ผ่าน URL http://localhost:8080/debug/vars
จะแสดงผลดังรูป

Screen Shot 2557-06-03 at 3.50.33 PM

จะเห็นได้ว่าการใช้งาน expvar นั้นง่ายและสะดวกดี
และ expvar ยังสามารถเก็บข้อมูลชนิดอื่นๆ ได้อีกนะ เช่น

  • string
  • time
  • float
  • map

ลองนำไปใช้งานกันดูครับ เป็น package ที่มีประโยชน์มากครับ

ลองนำ expvar ไปใช้งานร่วมกับการ monitoring ระบบดีกว่า

เพื่อทำให้เห็นภาพมากขึ้น จะทำการส่งข้อมูลของระบบไปยัง Graphite
โดย Graphite เป็นระบบที่ใช้เก็บข้อมูลของระบบเป็นแบบ time serie
และแสดงผลข้อมูลออกมาในรูปแบบกราฟที่สวยงาม ( งามบ้างไม่งามบ้างตามรสนิยม )
และใช้งานร่วมกับ Go routine เพื่อประสิทธิภาพที่สูงขึ้น

ขั้นแรกติดตั้ง Graphite เสียก่อน และทำการ run ส่วนแสดงผลผ่าน web ดังรูป

Screen Shot 2557-06-03 at 11.40.27 PM

สิ่งที่เราต้องรู้ก็คือ port ที่ใช้ในการส่งข้อมูลคือ 2003

เมื่อทุกอย่างพร้อมแล้ว เรามาทำการพัฒนาระบบที่ส่งข้อมูลไปยัง Graphite ดีกว่า
และเมื่อไปค้นหาดูว่า สิ่งที่เราต้องการคือ

  • ใช้ expvar
  • ใช้ Go routine

เจอ project ที่น่าสนใจคือ G2G ( หรือเขียนเองก็ได้นะครับ )
ส่วนผมขี้เกียจน จึงเอาของชาวบ้านมาลองใช้งาน

กำหนดโครงสร้างของข้อมูล up1.demo.counter
สามารถเขียนได้ดังนี้

คำอธิบาย
ทำการติดต่อไปยัง Graphite server 127.0.0.1 ผ่าน port = 2003
กำหนดให้มี interval คือ ช่วงเวลาที่จะส่งข้อมูลไปยัง Graphite server

ทำการ register  ข้อมูลที่ต้องการ คือ up1.demo.counter

ใน function CounterServer() จะใช้ Go runtine เพื่อเพิ่มค่าของตัวแปรที่ประกาศเป็น expvar

ทำการ run ระบบที่เราสร้างขึ้นมา
เมื่อเราไปดูข้อมูล Graphite จะพบว่ามีข้อมูลที่เราสร้างขึ้นมาแล้วด้วย
แสดงว่าเราติดต่อไปยัง Graphite  เรียบร้อย ดังรูป

Screen Shot 2557-06-03 at 11.54.36 PM

ต่อจากนั้นลงเพิ่มจำนวน counter กันหน่อย จะมีข้อมูลเพิ่มเข้ามา
แสดงผลในรูปแบบกราฟ ดังรูป

Screen Shot 2557-06-04 at 12.35.56 AM

สงสัยไหมว่า code ใน g2g มันทำงานอย่างไร

เมื่อเข้าไปดูพบว่า มีส่วนที่น่าสนใจ ดังนี้

คำอธิบาย
ใน case แรก คือการ Register ตัวแปรที่เราต้องการจะบันทึกลงใน Graphite นั่นเอง
ซึ่งจะเก็บข้อมูลในรูปแบบ Map โดย key คือ ชื่อของ expvar ส่วน value คือ ค่าใน expvar นั้นๆ

ใน case ที่สอง คือ Ticker ใน package time  ของภาษา Go
เอาไว้กำหนดให้ทำงานตามเวลา interval ที่กำหนดไว้ตั้งแต่การเรียกใช้ function NewGraphite นั่นเอง
การทำงานของ Ticker นั้นจะใช้ Go routine เช่นกัน และเมื่อถึงเวลา interval ที่กำหนดไว้ เช่นทุกๆ 5 วินาที
จะทำการส่ง Ticker.C  ออกมา แล้วจะส่งข้อมูลไปยัง Graphite ผ่าน function postAll()

และนี่คือตัวอย่างการใช้งาน expvar เพื่อจัดเก็บข้อมูลต่างๆ ในระบบงานที่พัฒนาด้วยภาษา Go
น่าจะพอทำให้เห็นประโยชน์ของ expvar บ้างนะครับ