Prometheus là gì?

Tháng 2 10, 2025

Prometheus là một hệ thống giám sát và cảnh báo mã nguồn mở, được thiết kế để thu thập và xử lý các chỉ số (metrics) từ ứng dụng và hạ tầng. Prometheus hoạt động theo mô hình pull, tức là nó định kỳ gửi yêu cầu HTTP để thu thập dữ liệu từ các mục tiêu được cấu hình. Dữ liệu thu thập được lưu trữ cục bộ trong một cơ sở dữ liệu tùy chỉnh và có thể truy vấn bằng ngôn ngữ PromQL. Prometheus rất hiệu quả trong việc giám sát các hệ thống phân tán và được tối ưu hóa để làm việc với các công nghệ hiện đại như Docker và Kubernetes.

Hình 1: Kiến trúc tổng quan của Prometheus, bao gồm các thành phần chính như Client Libraries, Exporters, Service Discovery, Scraping, Storage, Dashboards, Recording Rules and Alerts, Alert Management và Long-Term Storage.

Thông thường, các ứng dụng không tự động sinh ra các chỉ số, mà cần lập trình viên tích hợp phần instrumentation (đo lường) vào mã nguồn để tạo ra chúng. Client Libraries giúp đơn giản hóa quá trình này, chỉ với vài dòng code, bạn có thể vừa định nghĩa chỉ số vừa tích hợp đo lường trực tiếp vào mã nguồn mà bạn đang kiểm soát. Đây được gọi là direct instrumentation (đo lường trực tiếp). Prometheus cung cấp Client libraries cho các ngôn ngữ phổ biến như Go, Python, Java/JVM, Ruby và Rust. Ngoài ra, còn có nhiều thư viện từ bên thứ ba dành cho các ngôn ngữ khác như C#/.Net, Node.js, Haskell, và Erlang.

Không phải lúc nào bạn cũng có thể truy cập vào mã nguồn của phần mềm để thực hiện chèn thêm code, tức là bạn không thể thực hiện đo lường trực tiếp. Exporter là một phần mềm nhỏ, được cài đặt chung với ứng dụng mà bạn muốn lấy số liệu. Nó nhận các yêu cầu từ Prometheus, thu thập dữ liệu từ ứng dụng, chuyển chúng sang định dạng mà Prometheus có thể hiểu và trả về kết quả. Bạn có thể hình dung exporter như một bộ chuyển đổi dữ liệu giữa ứng dụng và Prometheus. Khác với việc tích hợp trực tiếp bằng client libraries, exporters sử dụng một loại đo lường khác gọi là custom collectors hoặc ConstMetrics.

Sau khi bạn đã tích hợp Prometheus vào các ứng dụng và cấu hình các exporters, Prometheus cần biết chính xác vị trí của các ứng dụng và exporters để có thể giám sát chúng. Trong môi trường động như cloud, dịch vụ có thể thay đổi liên tục (bị tạo hoặc xóa), do đó bạn không thể cung cấp danh sách các ứng dụng và exporters một lần duy nhất. Danh sách này sẽ nhanh chóng lỗi thời, đây là lý do chúng ta cần Service Discovery. Prometheus tích hợp với các cơ chế Service Discovery phổ biến như Kubernetes, EC2, và Consul, giúp nó tự động tìm thấy các ứng dụng cần giám sát. Nếu hệ thống của bạn không dùng những dịch vụ này, Prometheus cũng cung cấp phương pháp tích hợp chung cho các hệ thống khác.

Hình 2: Service Discovery trong Prometheus cho phép tự động phát hiện và giám sát các dịch vụ trong môi trường động, đảm bảo việc thu thập dữ liệu luôn chính xác và hiệu quả.

Sau khi Prometheus tìm ra danh sách các mục tiêu cần giám sát thông qua service discovery và relabeling, nó sẽ cần lấy dữ liệu từ những mục tiêu đó. Prometheus làm việc này bằng cách gửi yêu cầu HTTP, gọi là scrape, để thu thập các chỉ số (metrics). Khi thu thập dữ liệu, Prometheus còn ghi lại một số thông tin hữu ích như: scrape có thành công không? Mất bao lâu để hoàn thành việc scrape? Scraping được cấu hình để diễn ra thường xuyên, thường mỗi 10 đến 60 giây cho mỗi mục tiêu. Prometheus sử dụng mô hình pull, trong đó nó chủ động thu thập dữ liệu từ các mục tiêu giám sát (trái ngược với mô hình push).

Prometheus lưu trữ dữ liệu trực tiếp trên máy chủ của mình, sử dụng cơ sở dữ liệu tùy chỉnh. Thay vì cố gắng xây dựng hệ thống lưu trữ phân tán phức tạp, Prometheus chọn cách lưu trữ cục bộ để hệ thống dễ vận hành và đáng tin cậy hơn. Phiên bản Prometheus 2.0 hiện tại có thể thu thập hàng triệu mẫu dữ liệu mỗi giây, đủ mạnh để theo dõi hàng ngàn máy chỉ với một máy chủ Prometheus duy nhất. Prometheus sử dụng thuật toán nén mạnh, với mức nén đạt 1.3 byte cho mỗi mẫu dữ liệu thực tế. Họ khuyến nghị sử dụng SSD để tăng tốc độ, nhưng không bắt buộc. Prometheus chỉ lưu dữ liệu trên máy chủ cục bộ, nên bạn bị giới hạn bởi dung lượng ổ đĩa của máy đó. Điều này có thể gây khó khăn nếu bạn muốn lưu dữ liệu trong thời gian dài. Prometheus không có giải pháp để lưu trữ dữ liệu trên nhiều máy (clustered storage). Tuy nhiên, nó có các API remote read và remote write cho phép kết nối với các hệ thống lưu trữ bên ngoài. Nhờ vậy, bạn có thể thực hiện truy vấn dữ liệu từ cả dữ liệu cục bộ lẫn dữ liệu từ xa mà không phải thay đổi cách truy vấn.

Leave A Comment

Create your account