เครื่องมือที่ใช้งานประกอบไปด้วย
- Spring boot application ซึ่งจะมี 2 service คือ User service กับ Order service
- Prometheus สำหรับจัดเก็บข้อมูลของแต่ละ service ในรูปแบบ time series
- Grafana สำหรับแสดงข้อมูลในรูปแบบ graph ที่สวยงาม
ขั้นตอนที่ 1 พัฒนา service ต่าง ๆ ด้วย Spring boot
เริ่มต้นด้วยการพัฒนา service ด้วย Spring boot ซึ่งมีอยู่ด้วยกัน 2 service คือ 1. User service มีอยู่ 1 api คือ ดึงข้อมูลผู้ใช้งานตาม id 2. Order service มีอยุ่ 1 api คือ ดึงข้อมูลการสั่งซื้อของผู้ใช้งานแต่ละคน ทั้งสอง api นั้นถ้าไม่พบข้อมูลจะ return code 404 กลับมา (Not found) โดยปกติแล้วนั้น service ที่พัฒนาด้วย Spring boot จะยังไม่มีส่วนของ metrics ต่าง ๆ ให้ เราจะต้องเพิ่ม dependency ชื่อว่า Actuator ก่อนดังนี้ [gist id="a4e6cdc0dbf015ffc6c1077bfafb557c" file="pom.xml"] จาก dependency นี้ทำให้ service ของเรานั้นมี endpoint ต่าง ๆ ดังจต่อไปนี้- /health แสดงสถานะของ service เช่น uptime, disk และ database ที่ใช้งาน
- /info แสดงรายละเอียดของ service
- /metrics แสดงรายละเอียดของ server เช่นการใช้งาน CPU, Memory และพวก Heap size เป็นต้น
- /trace แสดงการ access มายัง service ว่าเข้ามาใช้งาน api/endpoint อะไรบ้าง
ขั้นตอนที่ 2 ทำการเก็บข้อมูลของ service จากข้อ 1 ลงใน Prometeus
หลังจากการศึกษาแบบคร่าว ๆ พบว่า เราสามารถจัดเก็บข้อมูลการใช้งานของแต่ละ service แบบง่าย ๆ ลงใน Prometheus ได้ แต่ต้องสร้าง metric หรือข้อมูลให้ตรงตามรูปแบบของ Prometheus ด้วย มีสถาปัตยกรรมดังรูป ปล. ตัวอย่างของรูปแบบข้อมูลที่จัดเก็บลงใน Prometheus มีรูปแบบตาม metric ของ Prometheus นั่นเอง ดูที่ metric url ของ Prometheus server ดังนี้ แต่ service ที่พัฒนาด้วย Spring boot นั้นยังมีข้อมูลการใช้งานไม่ตรงตามที่ Prometheus ต้องการ ดังนั้นจำเป็นต้องทำการ custom service กันนิดหน่อย โชคดีที่มีคนช่วยทำไว้ให้แบบง่าย ๆ (แต่ถ้าไม่ตรงตามความต้องการก็เขียน code เองได้นะ) แต่ในบทความนี้จะใช้วิธีการง่าย ๆ คือ เพิ่ม dependency ดังนี้เข้าไปก็จบเลย [gist id="a4e6cdc0dbf015ffc6c1077bfafb557c" file="pom2.xml"] โดย dependency ตัวนี้จะสร้าง endpoint ใหม่ชื่อว่า /prometheus ในแต่ละ service ซึ่งมีข้อมูลดังนี้ จากนั้นทำการ configuration ใน Prometheus ให้ดึงข้อมูลจาก 2 service ให้ทำการดึงข้อมูลทุก ๆ 5 วินาที ด้วยการแก้ไขไฟล์ prometheus.yml ดังนี้ [gist id="a4e6cdc0dbf015ffc6c1077bfafb557c" file="prometheus.yml"] ต่อมาให้ลองทำการ query ข้อมูลที่เราต้องการมาแสดงผลนิดหน่อย เพื่อตรวจสอบว่าการดึงข้อมูลถูกต้องตามที่ต้องการ เช่นต้องการดูข้อมูลการดึงข้อมูลจาก user service จาก metric ชื่อว่า counter_status_200_user_userId แสดงดังรูป จาก graph ข้างต้นมีไว้สำหรับการทดสอบดึงข้อมูลมาแสดงผลตามที่ต้องการเท่านั้น แต่ถ้าต้องการสร้างเป็น dashboard หรือ graph แบบถาวรแล้ว มี 2 วิธีให้เลือกคือ 1. ใช้ Grafana 2. ใช้ Console template ในบทความนี้เลือกใช้งาน Grafana เพราะว่าง่ายดี แถมสวยด้วย !! ดังนั้นมาลองใช้งาน Grafana กันดูขั้นตอนที่ 3 นำข้อมูลจาก Prometheus มาแสดงผลด้วย Grafana
มีขั้นตอนการใช้งานดังนี้ 1. ทำการเพิ่ม Datasource เพื่อดึงข้อมูลจาก Promethus 2. ทำการสร้าง Dashboard และเพิ่ม Graph ที่เราต้องการดู สิ่งที่ผมต้องการคือ ใน graph แต่ละตัวให้แสดงข้อมูลจาก metric เดียวไปเลย ดังนี้- User service ในกรณีที่พบข้อมูลและไม่พบข้อมูล
- Order service ในกรณีที่พบข้อมูลและไม่พบข้อมูล
เพียงเท่านี้เราก็ได้ระบบ Monitoring สำหรับ service ที่พัฒนาด้วย Spring boot กันแล้วนะครับ โดยที่ dashboard ที่ได้ดูดีเลยทีเดียว ขอให้สนุกกับการพัฒนาและ monitoring ครับ