Kiến trúc Prometheus
Sau khi tìm hiểu những khía cạnh tạo nên một vị thần Prometheus – trong thần thoại Hy Lạp có nghĩa là “Người biết trước tương lai” [Προμηθεύς].
Tiếp theo chúng ta sẽ đề cập các tính năng mà Prometheus mang đến, đi sâu hơn về kiến trúc và cách Prometheus vận hành, chúng ta sẽ có một phép so sánh nó với các hệ thống tương tự khác để chỉ ra điểm mạnh – yếu trong từng thành phần chúng ta đang xây dựng nên và cuối cùng là trả lời câu hỏi “Khi nào thì ta nên sử dụng Prometheus?”.
Prometheus
Prometheus là một hệ thống công cụ giám sát và cảnh báo mã nguồn mở được bắt đầu xây dựng tại SoundCloud vào năm 2012. Kể từ thời điểm ra mắt, Prometheus đã được nhiều công ty và tổ chức đón nhận, và có một cộng đồng nhà phát triển và người dùng rất năng động. Hiện nay, Prometheus đã trở thành một dự án mã nguồn mở độc lập và được duy trì, phát triển riêng biệt bởi các công ty. Vào ngày 09/05/2016, Prometheus chính thức gia nhập vào Cloud Native Computing Foundation với tư cách là dự án được chủ trì thứ 2, sau Kubernetes, nhằm nhấn mạnh tầm quan trọng của dự án cũng như làm rõ cấu trúc quản trị của dự án.
🍻 Prometheus thu thập và lưu trữ các metrics dưới dạng timeseries data, nghĩa là metrics được lưu với dấu mốc thời gian tại thời điểm nó được ghi nhận cùng với cặp key-value gọi là label
Prometheus Feature
Chúng ta sẽ đi sâu vào các đặc trưng tính năng của Prometheus, từ đó có thể hiểu rõ và khai thác tối đa sức mạnh mà nó nó thể mang lại.
Mô hình dữ liệu đa chiều lưu trữ dữ liệu time series, vì vậy dữ liệu có thể được chia nhỏ theo ý muốn, dọc theo các chiều labels mà Prometheus cấu hình.
Về cơ bản, Prometheus lưu trữ tất cả dữ liệu dưới dạng time series. Bên cạnh lưu trữ time series, Prometheus cũng có thể tạo time series kết quả từ các câu truy vấn. Mỗi time series được định danh duy nhất bằng metric name và cặp key-value tùy chọn được gọi là labels.
Metric name chỉ ra feature chung của hệ thống. Ví dụ:kube_pod_container_resource_limits
Bất kỳ label nào được định danh bởi cùng một metric name sẽ thuộc cùng một chiều cụ thể cho metric đó. Ví dụ: kube_pod_container_resource_limits{job="kube-controller-manager"}
PromQL – ngôn ngữ truy vấn linh hoạt tối ưu mô hình dữ liệu của Prometheus để đưa ra các cảnh báo mong muốn và dữ liệu vẽ đồ thị.
Prometheus cung cấp một ngôn ngữ truy vấn được gọi là PromQL (Prometheus query language) cho phép người dùng chọn và tổng hợp dữ liệu chuỗi thời gian trong thời gian thực. Kết quả của một biểu thức có thể được hiển thị dưới dạng biểu đồ, được xem dưới dạng dữ liệu dạng bảng trong Prometheus hoặc được sử dụng bởi các hệ thống bên ngoài thông qua HTTP API.
Thu tập dữ liệu time series thông qua mô hình pull HTTP
Cách tiếp cận pull yêu cầu ít cấu hình và giúp thiết lập giám sát của chúng ta linh hoạt hơn, phương pháp pull không yêu cầu ta phải tái cấu hình lại tất cả các config nguồn nếu ta phải di chuyển endpoints. Prometheus pull metrics từ các mục tiêu đã định cấu hình theo một khoảng thời gian đều đặn – gọi là scrape_interval
.
Để so sánh giữa phương thức pull và push metrics, ta có thể tham khảo tại mã nguồn dưới đây blog.sflow.com
Push time series được hỗ trợ thông qua một cổng trung gian Pushgateway
Không giống như InfluxDB , Prometheus không chấp nhận các metrics được push đến nó từ các dịch vụ khác như đã đề cập ở trên.
Tuy nhiên, cũng có những thiết lập khó theo dõi bằng cách tiếp cận dựa trên pull. Một ví dụ là khi chúng ta có những endpoints không gửi metrics theo chu kỳ, chỉ thỉnh thoảng hoặc có thời gian gửi metrics ngắn hơn thời gian chúng ta cấu hình cho scrape_interval
, với những trường hợp trên Prometheus hỗ trợ một service trung gian mang tên Pushgateway.
Target được phát hiện thông qua Service Discovery hoặc Static Configuration
Prometheus cung câp nhiều tùy chọn để phân tích các service cần scrape metrics, bao gồm kubernetes, consul và nhiều service khác. Nếu chúng ta cần sử dụng hệ thống service discovery hiện không được hỗ trợ, trường hợp đó chúng ta có thể liệt kê các scrape targets từ JSON file (cùng với metadata về các target đó)
Tham khảo các bước hướng dẫn đơn giản sử dụng Node Exporter.
Hỗ trợ vẽ đồ thị – biểu đồ và Dashboard
Prometheus cũng hỗ trợ các biểu đồ đường đơn giản để biểu diễn metrics kết quá mà chúng ta truy vấn thông qua PromQL. Tuy nhiên, như thế vẫn chưa đủ để ta khai thác và có cái nhìn trực quan hơn về số liệu, vì thế các mã nguồn mở hỗ trợ biểu diễn đồ thị như Grafana luôn là một trợ thủ đắc lực cho Prometheus mà ta có thể cấu hình để khai tác tối đa tiềm năng mà chúng mang lại.
Prometheus Architecture
Các thành phần chính trong hệ thống Prometheus
Máy chủ Prometheus – cào và lưu trữ dữ liệu time series
Máy chủ Prometheus là bộ não của hệ thống, nơi thu thập dữ liệu time series, phân tích và tổng hợp dữ liệu thu thập được. Quá trình thu thập dữ liệu được gọi là cào dữ liệu (scraping). Máy chủ Prometheus tự động pull metrics từ các targets, điều này giảm bớt các tác vụ chúng ta cần phải làm khi có một metrics mới cần lấy về.
Pushgateway Prometheus
Pushgateway được sử dụng để hỗ trợ các short-lived jobs. Đơn giản là các tác vụ công việc này không tồn tại lâu đủ để Prometheus chủ động lấy dữ liệu. Vì vậy là mà các metrics sẽ được đẩy về Push Gateway rồi kéo về Prometheus Server.
Exporter hỗ trợ giám sát các dịch vụ hệ thống và gửi metrics về Prometheus theo chuẩn Prometheus mong muốn
Prometheus targets đại diện cho cách Prometheus trích xuất các metrics từ một nguồn khác. Thông thường, các chỉ số được hiển thị bởi chính các ứng dụng – chẳng hạn như Kubernetes, ngoài một vài trường hợp Prometheus có thể thu thập các số liệu trực tiếp, còn lại các dịch vụ không được hỗ trợ, Prometheus phải sử dụng các exporters. Exportes là các chương trình trích xuất dữ liệu từ một ứng dụng và sau đó chuyển đổi chúng theo đúng định dạng Prometheus formats.
AlertManager dịch vụ quản lý, xử lý các cảnh báo.
AlertManager là một phần của kiến trúc Prometheus, nhưng nó được chạy như một máy chủ độc lập ngoài Prometheus. Mặc định, Prometheus sẽ đảm bảo việc gửi cảnh báo trực tiếp đến AlertManager nếu nó được cấu hình chính xác làm Prometheus target.
🍻 Prometheus cào metrics từ các jobs/exporters trực tiếp hoặc thông qua Pushgateway dành cho các short-lived jobs. Nó lưu trữ tất cả các thông số cào được ở local và chạy các rules trên tập dữ liệu này để tổng hợp và ghi lại chuỗi time series mới từ dữ liệu hiện có hoặc tiến hành gửi cảnh báo khi cần thiết. Grafana hoặc các API consumers khác có thể được tích hợp để trực quan hóa dữ liệu mà ta thu thập được.
Phần 1. Prometheus và câu chuyện cây đinh ba 🔱
Phần 2. Kiến trúc Prometheus
Phần 3. Gót chân Achilles của Prometheus (coming soon…)