1, Short conversation
Ngày xửa ngày xưa, có một ông chủ quản lý một nhóm các nhà phát triển chịu trách nhiệm duy trì một bộ ứng dụng microservices. Nhóm bao gồm một số ít thành viên, mỗi người đều có điểm mạnh và điểm yếu riêng.
Sếp nhận ra có vấn đề với hệ thống số liệu cho các ứng dụng và dịch vụ. Đơn giản là có quá nhiều ứng dụng để đo lường và không có sẵn công cụ để đo lưu lượng truy cập, kết nối cơ sở dữ liệu, thời gian truy vấn hoặc thời gian hoạt động. Ông chủ nhận thấy điều này đã trở thành một vấn đề lớn và đang cản trở khả năng cung cấp dịch vụ chất lượng cao cho khách hàng của nhóm.
Boss: Rất nhiều khách hàng đang phàn nàn rằng họ phải đợi rất lâu mới có thể truy cập được vào ứng dụng của chúng ta!
Member A: Có thể do đường truyền mạng ra quốc tế đang gặp vấn đề
Member B: Có thể do lượng data của chúng ta đã quá lớn
Member C: Có thể do bị bottleneck ở database
Member D: Có thể do query của chúng ta
Member A: Hoặc cũng có thể do máy của khách quá cũ
Boss: Chúng ta không thể ngồi không mà đoán mò như vậy được, cần có một công cụ để trace ra được chính xác nguyên nhân gây chậm, và khắc phục nó sớm nhất có thể.
Member A: Số lượng service đã lên tới hàng trăm, làm sao chúng ta có thể truy cập vào từng service và giám sát chúng được.
Member B: Chúng ta cần viết một tool để làm việc đó, nhưng sẽ cần thời gian cho việc này.
Boss: Có lẽ đến lúc đó business của chúng ta đã không còn ai sử dụng nữa
Hãy làm cách này….
2, Khó khăn
Ngoài việc những bài toán hóc búa của kiến trúc microservices hay hệ thống phân phối (distributed system), doanh nghiệp còn cần giải quyết khó khăn trong việc giám sát khả năng hoạt động của các services, health check thường xuyên và sẵn sàng đưa ra cảnh báo nếu có sự cố phát sinh, đồng thời cũng cần tùy chỉnh các loại chỉ số giám sát khác nhau (số lượng connection trong database, request process time, …).
Bên cạnh đó, chúng ta còn phải đối diện với vấn đề có vô số services nhỏ lẻ, mỗi services có một vai trò khác nhau với số lượng instances khác nhau. Để giám sát được từng instance trong mỗi service là nhiệm vụ bất khả thi nếu như không có công cụ để hỗ trợ.
Tự viết tool, sở hữu cho riêng mình những công cụ bổ ích, áp dụng những technical tiên tiến vào trong dự án, là điều mà bất kỳ developers nào cũng muốn.
Nhưng dưới góc nhìn của nhà quản lý, chúng ta cần cân đối về mặt thời gian, nhân lực, nguồn lực tài chính, tài năng của mỗi thành viên và hơn hết là tính cấp thiết của vấn đề, từ đó đưa ra lựa chọn tối ưu nhất cho dự án. Và trong trường hợp này, thay vì bỏ ra nửa tháng đến 1 tháng, cần thêm 1 - 2 nhân sự để phát triển riêng một tool giám sát cho business. Chúng ta mất chưa tới 5 phút để sở hữu một bộ công cụ giám sát mọi ứng dụng một cách mạnh mẽ nhất, tương thích với hầu hết các loại ngôn ngữ phổ biến trên thế giới và cộng đồng người sử dụng vô cùng đông đảo.
Hãy cùng mình cài đặt bộ công cụ toàn năng grafana và prometheus trong 5 phút nhé.
Note: Bạn có thể tìm hiểu thêm về hai công cụ này tại prometheus và grafana.
3, Giải pháp : Grafana - Prometheus bên trong spinner
Trong thực tế, dưới góc nhìn của một developer như mình thì grafana và prometheus cũng giống như các ứng dụng khác, và hoàn toàn có thể coi chúng giống như những microservices và hoạt động hoàn toàn độc lập với business. Nhiệm vụ của chúng là theo dõi, đo lường các chỉ số (prometheus) và visualize các chỉ số đó lên thành biểu đồ (grafana) thông qua các template được build sẵn hoặc tự build, tự dựng những dashboard cá nhân. Về sức mạnh của chúng thì bạn hoàn toàn có thể kiếm chứng trên mọi nền tảng cũng như website.
Với sự phổ biến cũng như dễ sử dụng của bộ công cụ này, chúng ta hoàn toàn có thể tìm ra rất nhiều phương pháp khác nhau để cài đặt và sử dụng chúng.
- Install trên những máy vật lý rồi config bằng "cơm" cho chúng
- Install chúng trên virtual machine để tận dụng một phần sức mạnh của cloud mà họ đang dùng
- Install docker trên virtual machine rồi sau đó tiếp tục sử dụng docker để containerize bộ công cụ này
Mỗi phương pháp đều có những ưu nhược điểm riêng, ví dụ như để tự cài đặt được chúng, bạn cần phải hiểu về kiến trúc, về câu lệnh của OS mà bạn đang sử dụng, container hóa chúng bạn cần thuần thục docker và hệ thống network của docker.
Mọi thứ là không khó, nhưng khi áp dụng vào business thực tế chúng ta sẽ cần cân nhắc về thời gian, kiến trúc và trình độ của mỗi member.
Trong trường hợp này, mình sử dụng Sun Spinner để cài đặt, với ưu điểm là thời gian cài đặt nhanh chóng, không cần hiểu sâu về kiến trúc, về command line cũng như cấu trúc network của cơ sở hạ tầng mà mình đang sử dụng.
Giống như một plugin, có tính plugable, mình thao tác đơn giản và nhanh chóng.
Let’s get started!!
Trước khi bắt đầu thì đây là lí do mình không cần quan tâm tới command line cũng như cấu trúc mạng của hạ tầng, việc của mình chỉ là tập trung vào nhiệm vụ giám sát các business services của mình. Vì mọi thứ đã được đóng gói kỹ lưỡng, mọi component đều được để ở đúng vị trí của nó, mọi services đều nằm trong một workspace và chúng giao tiếp với nhau thông qua internal network. Và mình hoàn toàn không cần quan tâm tới điều này.
4, Demo và hướng dẫn
Trong phần demo này, mình đã xây dựng một hệ thống microservice bao gồm các backend services được viết bằng ngôn ngữ java, và spring framework, bên trong các services mình đã inject các dependency để prometheus có thể pulling metrics về.
- Kiến trúc microservice mà mình sử dụng
Tiếp theo là các step để mình dựng được hệ thống monitor các service này.
4.1, Thêm dependencies trong file pom.xml của các services
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <scope>runtime</scope>
</dependency>
4.2, Chuẩn bị file configuration cho prometheus
Trong phần này mình sử dụng bộ key management - configmap để có thể lưu lại, quản lý tập trung những config này và reuse khi cần.
Service | Link |
---|---|
gateway | api-gateway-service.sunecosystem.svc:8900 |
order | order-service-service.sunecosystem.svc:8813 |
recommandation | productrecommendationservice-4491-service.sunecosystem.svc:8812 |
user | userservice-3411-service.sunecosystem.svc:8811 |
catalog-service | productcatalogservice-9191-service.sunecosystem.svc:8810 |
scrape_configs: - job_name: 'gateway' metrics_path: 'actuator/prometheus' scrape_interval: 2s static_configs: - targets: ['api-gateway-service.sunecosystem.svc:8900'] - labels: application: 'gateway' - job_name: 'order-service' metrics_path: 'actuator/prometheus' scrape_interval: 2s static_configs: - targets: ['order-service-service.sunecosystem.svc:8813'] - labels: application: 'order' - job_name: 'recommandation-service' metrics_path: 'actuator/prometheus' scrape_interval: 2s static_configs: - targets: ['productrecommendationservice-4491-service.sunecosystem.svc:8812'] - labels: application: 'recommandation' - job_name: 'product-catatlog-service' metrics_path: 'actuator/prometheus' scrape_interval: 2s static_configs: - targets: ['productcatalogservice-9191-service.sunecosystem.svc:8810'] - labels: application: 'catalog' - job_name: 'user-service' metrics_path: 'actuator/prometheus' scrape_interval: 2s static_configs: - targets: ['userservice-3411-service.sunecosystem.svc:8811'] - labels: application: 'user'
4.3, Tiếp theo là deploy prometheus, grafana vô spinner
Các steps để tạo prometheus service cũng tương tự như khi bạn tạo mới một application mới trong Sunteco Cloud, điểm khác biết sẽ ở chỗ bạn config.
4.3.1 Deploy prometheus
Bước 1: Chọn tạo spinner
Bước 2: Đặt spinner name cho dễ dàng nhận diện
Bước 3: Chọn prometheus image, luôn có sẵn trên docker hub
Bước 4: Chọn cấu hình cho prometheus service
Đối với bài viết này mình chọn cấu hình là 1vCPU, 2Gb Ram và 20Gb Storage
Cấu hình tối thiểu bạn có thể tham khảo ở đây
Bước 5: Bước quan trọng nhất là mount config của bạn vào trong service thông qua tính năng mount storage
Vì prometheus đọc config lúc start app và thông qua file config, nên mình tạo ra file configmap ở phần 2 và mount vào trong spinner
Lưu ý rằng phần mount path và subpath mình để là prometheus.yml vì prometheus sẽ đọc đúng file này
Ở bước này bạn phải thực hiện chuẩn xác và chắc chắn rằng config của bạn tạo trước đó đã tồn tại
Bước 6: Deploy
Bước cuối cùng bạn chỉ cần thực hiện click next để review những setting mà bạn vừa thực hiện, và deploy lên cloud
4.3.2 Deploy Grafana
Tiếp tục thao tác lại các step vô cùng đơn giản ở phần 3.1
Mình chọn image là grafana/grafana-oss, tag là main-ubuntu
Mình set tài khoản và mật khẩu mặc định cho grafana
4.3.3 Review kết quả
Mọi thứ đã xong, kiến trúc đã đúng như mình mong đợi, giờ là lúc nhìn lại kết quả
Mình nhanh chóng vào tạo một đường link để có thể truy cập grafana dashboard
Sau đó mình truy cập vào domain được cung cấp, import template, chọn datasource là prometheus link và nhìn lại kết quả đạt được
Những thông số cơ bản
Thông số đặc biệt về memory trong java để quản lý memory và tránh memory leak
Database connection và Http request count
Và còn rất nhiều những metrics hữu dụng khác nữa, bạn hãy thử thực hành và trải nghiệm nhé.
Cảm ơn các bạn đã đọc hết bài viết này, trăm hay không bằng tay quen hãy thử thực hành để thấy được cả sự tiện lợi và khó khăn nhé.
Nếu bạn có bất kỳ câu hỏi hay băn khoăn nào hãy comment bên dưới nhé. Mình luôn sẵn sàng support bất kỳ khó khăn nào bạn gặp phải.
Các service trong bài này mình dựng lên dựa trên repo có sẵn trên github. Các bạn cũng có thể xây dựng cho riêng mình một hệ thống microservice như vậy.
5, Tài liệu tham khảo
Hands-On prometheus, Grafana: https://www.oreilly.com/library/view/hands-on-infrastructure-monitoring/9781789612349/bc69aa2f-7482-421f-b070-9116ca39cae7.xhtml
Prometheus get started: https://prometheus.io/docs/prometheus/latest/getting_started/
Grafana: https://grafana.com/docs/grafana-cloud/quickstart/docker-compose-linux/
Sunteco Cloud: https://sunteco.vn/