![]()
![]()
เครื่องมือที่ใช้งานประกอบไปด้วย
- Spring boot application ซึ่งจะมี 2 service คือ User service กับ Order service
- Prometheus สำหรับจัดเก็บข้อมูลของแต่ละ service ในรูปแบบ time series
- Grafana สำหรับแสดงข้อมูลในรูปแบบ graph ที่สวยงาม
มาดูขั้นตอนการสร้างระบบ Monitoring อย่างง่ายกันดู
ขั้นตอนที่ 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 อะไรบ้าง
ตัวอย่างของ health ดังรูป
ปัญหาที่ตามมาคือ
ถ้าเราต้องการเก็บข้อมูลการใช้งานต่าง ๆ ของ service ในรูปแบบ time series จะต้องทำอย่างไร ?
ตัวอย่างเช่น
API แต่ละตัวนั้นในแต่ละนาทีมีการใช้งานอย่างไรทั้งสำเร็จและไม่สำเร็จ
ขั้นตอนที่ 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 ในกรณีที่พบข้อมูลและไม่พบข้อมูล
ตัวอย่างการ configuration ใน graph ของ User service เมื่อพบข้อมูล
โดยใช้ metric ชื่อว่า
counter_status_200_user_userId
แสดงข้อมูลในทุก ๆ 1 วินาที
ที่สำคัญต้องกำหนด datasource ไปยัง prometheus ด้วยนะครับ
แสดงดังรูป
แสดงผลทำงานทั้งหมดดังนี้
เพียงเท่านี้เราก็ได้ระบบ Monitoring สำหรับ service ที่พัฒนาด้วย Spring boot กันแล้วนะครับ
โดยที่ dashboard ที่ได้ดูดีเลยทีเดียว
ขอให้สนุกกับการพัฒนาและ monitoring ครับ