เครื่องมือที่ใช้งานประกอบไปด้วย

  • 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 ก่อนดังนี้

จาก 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 ดังนี้เข้าไปก็จบเลย

โดย dependency ตัวนี้จะสร้าง endpoint ใหม่ชื่อว่า /prometheus ในแต่ละ service
ซึ่งมีข้อมูลดังนี้

จากนั้นทำการ configuration ใน Prometheus ให้ดึงข้อมูลจาก 2 service
ให้ทำการดึงข้อมูลทุก ๆ 5 วินาที
ด้วยการแก้ไขไฟล์ 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 ครับ