1. Prometheus là gì?
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, không phải logs) 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 sẽ đượ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.
2. Kiến trúc của Prometheus bao gồm những gì?
2.1 Client Libraries
Thông thường, các ứng dụng không tự động sinh ra các chỉ số (metrics), 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 (official 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.
Dưới đây là ví dụ về cách tích hợp Prometheus client library vào một ứng dụng Python. Trong ví dụ này, chúng ta sẽ tạo một server đơn giản sử dụng Flask và thu thập các chỉ số về số lượng yêu cầu HTTP mà server nhận được.
from flask import Flask, Response
from prometheus_client import Counter, generate_latest
# Tạo ứng dụng Flask
app = Flask(__name__)
# Tạo một Counter để theo dõi số lượng yêu cầu
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint'])
# Định nghĩa route cho ứng dụng
@app.route('/')
def home():
# Tăng chỉ số số lượng yêu cầu cho endpoint '/'
REQUEST_COUNT.labels(method='GET', endpoint='/').inc()
return 'Hello, Prometheus!'
# Route để cung cấp dữ liệu metrics cho Prometheus
@app.route('/metrics')
def metrics():
# Tạo phản hồi với các chỉ số hiện tại
return Response(generate_latest(), mimetype='text/plain')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
Khi bạn truy cập http://localhost:8000/metrics
, bạn sẽ thấy kết quả như sau:
# HELP http_requests_total Total HTTP Requests
# TYPE http_requests_total counter
http_requests_total{method="GET",endpoint="/"} 5.0
2.2 Exporters
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 (direct instrumentation).
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ông giống như 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.
2.3 Service Discovery
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.
2.4 Scraping
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).
2.5 Storage
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.
2.6 Dashboards
Prometheus cung cấp một số API cho phép bạn yêu cầu dữ liệu hoặc chạy truy vấn PromQL, bạn có thể sử dụng các API này để tạo biểu đồ và dashboard. Nhưng để tạo bảng điều khiển toàn diện, Grafana là lựa chọn tốt hơn. Grafana hỗ trợ đầy đủ các tính năng và tích hợp tốt với Prometheus, giúp bạn dễ dàng tạo và quản lý các dashboard chuyên nghiệp.
2.7 Recording Rules and Alerts
Mặc dù PromQL (ngôn ngữ truy vấn của Prometheus) và hệ thống lưu trữ của Prometheus rất mạnh mẽ, nhưng việc truy vấn và tổng hợp dữ liệu từ hàng ngàn máy để hiển thị lên biểu đồ có thể khiến hệ thống bị chậm.
Recording rules giúp giải quyết điều này bằng cách tính toán các truy vấn PromQL định kỳ và lưu kết quả vào hệ thống lưu trữ. Điều này giúp bạn có thể hiển thị biểu đồ nhanh hơn vì kết quả đã được tính sẵn.
Alerting rules là một dạng recording rules đặc biệt. Chúng cũng tính toán các truy vấn PromQL định kỳ, nhưng nếu kết quả của truy vấn đạt đến một ngưỡng cảnh báo nào đó, Prometheus sẽ tạo cảnh báo. Các cảnh báo này sẽ được gửi đến Alertmanager, nơi chúng được xử lý và gửi thông báo cho bạn.
2.8 Alert Management
Alertmanager nhận cảnh báo từ các máy chủ Prometheus và chuyển chúng thành thông báo. Thông báo này có thể được gửi qua email, các ứng dụng chat như Slack, Telegram, ... Alertmanager có thể tạm ngừng cảnh báo, ví dụ khi bạn đã biết về sự cố hoặc khi đang bảo trì, để tránh bị làm phiền bởi các thông báo không cần thiết.
2.9 Long-Term Storage
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.
3. Kết luận
Prometheus không chỉ đơn thuần là một công cụ giám sát, mà còn là một giải pháp hữu ích giúp các tổ chức theo dõi và phản ứng nhanh chóng với các sự cố trong hệ thống. Với sự hỗ trợ mạnh mẽ từ cộng đồng và khả năng tích hợp dễ dàng với nhiều công cụ khác, Prometheus phù hợp cho cả những hệ thống nhỏ lẫn hạ tầng lớn và phức tạp.
Các bài viết liên quan:
Bài viết liên quan
Grafana Loki là gì? So sánh Loki và Elasticsearch
Nov 16, 2024 • 6 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read
ELK là gì? So sánh hiệu suất giữa ELK và PLG
Nov 06, 2024 • 9 min read
Docker Best Practices: Tối ưu Dung lượng Docker Image
Oct 30, 2024 • 8 min read
SQL Injection là gì? Những cách phòng ngừa SQL Injection
Oct 25, 2024 • 10 min read