Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

มาทำระบบ monitoring สำหรับ Spring Boot application อย่างง่ายกัน

$
0
0

เครื่องมือที่ใช้งานประกอบไปด้วย
  • 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 ครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles