Logo
Prometheus: Công cụ giám sát mạnh mẽ

Prometheus: Công cụ giám sát mạnh mẽ

November 29, 2024
9 min read
Table of Contents
index

Trong thời đại mà hệ thống phần mềm ngày càng phức tạp và phân tán, việc giám sát hiệu suất và trạng thái hoạt động của các thành phần trong hệ thống trở nên quan trọng hơn bao giờ hết. Prometheus, một công cụ giám sát mã nguồn mở được phát triển bởi SoundCloud, đã nổi lên như một giải pháp hiệu quả cho các tổ chức và cá nhân cần một hệ thống giám sát đáng tin cậy và dễ mở rộng.


Prometheus là gì?

Prometheus là một hệ thống giám sát và cảnh báo thời gian thực, được thiết kế để thu thập, lưu trữ và phân tích dữ liệu metric (số liệu). Dữ liệu này thường được sử dụng để:

  • Theo dõi hiệu suất của các dịch vụ.

  • Phát hiện lỗi và bất thường.

  • Xác định nguyên nhân gốc rễ của các vấn đề.

Đặc điểm nổi bật của Prometheus là khả năng hoạt động độc lập, không phụ thuộc vào các hệ thống lưu trữ dữ liệu hoặc công cụ khác. Prometheus được tối ưu hóa để thu thập dữ liệu metric thông qua giao thức HTTP và lưu trữ dữ liệu này ở định dạng time-series (chuỗi thời gian).

Lý do để sử dụng Prometheus rất nhiều nhưng có thể kể đến các lý do chính như:

  • Prometheus là một dự án thuộc CNCF (Cloud Native Computing Foundation), có cộng đồng lớn và được hỗ trợ tích cực.

  • Prometheus sử dụng mô hình pull-based, nghĩa là nó chủ động thu thập dữ liệu từ các ứng dụng hoặc dịch vụ qua giao thức HTTP.

  • PromQL cho phép bạn thực hiện các truy vấn phức tạp để phân tích dữ liệu metric, từ đó dễ dàng tạo báo cáo hoặc cảnh báo.

  • Prometheus hỗ trợ nhiều hệ sinh thái khác như Kubernetes, Docker, và Grafana, giúp việc triển khai và hiển thị dữ liệu trực quan trở nên dễ dàng hơn.

Kiến trúc của Prometheus

Prometheus có kiến trúc module với các thành phần chính như sau:

Prometheus architecture

Nguồn ảnh: https://prometheus.io/docs/introduction/overview/

  1. Prometheus Server: Thành phần cốt lõi, chịu trách nhiệm thu thập, lưu trữ và xử lý dữ liệu metric.

  2. Client Libraries: Các thư viện tích hợp cho phép bạn dễ dàng instrument (chèn metric) vào mã nguồn ứng dụng của mình. Ví dụ: prometheus-client cho Python, prom-client cho Node.js.

  3. Pushgateway: Dùng để thu thập dữ liệu từ các job ngắn hạn (short-lived jobs) hoặc các dịch vụ không thể hoạt động theo mô hình pull.

  4. Alertmanager: Quản lý và xử lý cảnh báo dựa trên các quy tắc được cấu hình trong Prometheus.

  5. Exporters: Các công cụ hoặc agent được sử dụng để xuất dữ liệu metric từ các dịch vụ phổ biến như MySQL, Redis, hoặc hệ thống máy chủ.

Prometheus định kỳ truy cập vào các endpoint (điểm cuối) được cấu hình để lấy dữ liệu metric dưới dạng HTTP. Để có thể có endpoint thì tại các node bạn muốn theo dõi sẽ cần phải cài đặt các exporter (mình sẽ đề cập sâu hơn ở phần cài đặt)

Sau đó dữ liệu được lưu trữ trong định dạng time-series, với mỗi điểm dữ liệu bao gồm giá trị metric và dấu thời gian.

Người dùng có thể sử dụng PromQL để phân tích dữ liệu và tạo biểu đồ hoặc báo cáo. Đồng thời có thể tạo các alert rules để Prometheus gửi thông báo qua Alertmanager.

Cách cài đặt

Prometheus Server

Có muôn vàn cách cài đặt Prometheus được nhắc tới tại official docs. Trong bài viết này mình sẽ cài đặt bằng docker cho gọn

Terminal window
# Create persistent volume for your data
docker volume create prometheus-data
# Start Prometheus container
docker run \
-p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus-data:/prometheus \
prom/prometheus

Các câu lệnh trên sẽ tạo 1 volume để lưu data của prometheus, đồng thời map file prometheus.yml ở ngoài vào trong container. Vậy nên hãy tạo file prometheus.yml trước nhé.

Nội dung file chi tiết rất dàiiiiiii tại đây. Mình sẽ sử dụng 1 cấu hình đơn giản là chỉ scape metrics từ node exporter - exporter lấy metrics từ các hệ thống linux

global:
scrape_interval: 15s
scrape_configs:
- job_name: "node-exporter"
static_configs:
- targets: ["SERVER_IP:9100"]

Thay SERVER_IP bằng IP mà server mà bạn muốn monitor. Mặc định node_exporter sẽ tạo endpoint tại port 9100, nếu bạn điều chỉnh port thì sẽ cần thay đổi cả số port tại file config này.

Phần global là nơi chứa các thiết lập chung áp dụng cho toàn bộ các scrape_configs. Nếu có bất kỳ cấu hình nào bị trùng lặp giữa global và từng job trong scrape_configs, thì cấu hình trong từng job sẽ được ưu tiên hơn. Với cấu hình trên, Prometheus sẽ có một target mang tên node-exporter và tự động lấy dữ liệu metric (scrape) từ dịch vụ đang chạy tại SERVER_IP:9090 với tần suất 15 giây một lần.

Sau khi deploy thì đây chính là giao diện của Prometheus Server. Trong tab config có thể thấy file config cơ bản ban đầu đã được load và thêm các config mặc định khác. Phần quan trọng là target đã được load chính xác.

Tại tab target có thể thấy target health và chi tiết các lần scrape gần nhất và thời gian phản hồi

Node exporter

Node Exporter là một ứng dụng nhỏ chạy trên các máy chủ (host) để thu thập các thông số tài nguyên hệ thống, như:

  • CPU Usage

  • Memory Usage

  • Disk I/O

  • Network Statistics

  • File System Information

Các dữ liệu này được hiển thị dưới dạng metric và sẵn sàng để Prometheus scrape (thu thập). Với Node Exporter, bạn có thể giám sát hiệu suất và tình trạng của bất kỳ máy chủ vật lý hoặc máy ảo nào trong hệ thống của mình.

Để cài đặt, hãy vào trang https://prometheus.io/download/ tìm phiên bản node exporter bạn cần và tải về server của bạn. Có nhiều cách, nhiều phiên bản, với trường hợp của mình sẽ dùng node exporter cho linux

Tiếp theo là giải nén và cài đặt

Terminal window
tar xvfz node_exporter-*.linux-amd64.tar.gz
cd node_exporter-*.linux-amd64/
sudo mv node_exporter /usr/local/bin/

Và sau đó bạn có thể chạy nó như 1 câu lệnh bình thường ở chế độ nền

Terminal window
node_exporter &

Hoặc chạy như 1 service để lần sau server có restart thì node exporter tự chạy

Terminal window
sudo nano /etc/systemd/system/node_exporter.service

Thêm nội dung vào file service

[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter # Chạy dưới quyền user gì. Bạn cần tạo node_exporter user trên linux hoặc chạy hẳn với quyền root bằng cách thay chỗ này thành root
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=default.target

Tiếp theo là kích hoạt service

Terminal window
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Khi này bạn truy cập vào IP:9100 sẽ thấy giao diện endpoint của node exporter

Truy cập vào IP:9110/metrics để thấy metrics của server này

cAdvisor

CAdvisor (Container Advisor) là một công cụ mã nguồn mở, được phát triển bởi Google, chuyên dùng để thu thập, xử lý và xuất dữ liệu liên quan đến hiệu suất và sử dụng tài nguyên của container. Nó hỗ trợ hầu hết các runtime container phổ biến, bao gồm Docker

Để kết hợp cAdvisor với prometheus, có thể làm như sau:

version: '3.2'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379

File này sẽ khởi chạy 2 docker container bao gồm: cAdvisor và Redis để làm ví dụ. Ở đây cAdvisor sẽ tự lấy dữ liệu metrics từ container redis.

Khởi chạy với lệnh sau

Terminal window
docker compose up -d

Các dịch vụ đã được khởi chạy thành công. Truy cập cAdvisor tại IP:8080

Sửa file prometheus.yml như sau

global:
scrape_interval: 15s
scrape_configs:
- job_name: "node-exporter"
static_configs:
- targets: ["SERVER_IP:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["SERVER_IP:8080"]

Truy cập lại prometheus server. Thấy xuất hiện thêm target

Test thử query: rate(container_cpu_usage_seconds_total{name="redis"}[1m])Mức sử dụng CPU của cgroup trong phút cuối của container redis

Kết luận

Prometheus quả thực là một trong những công cụ giám sát hàng đầu với khả năng thu thập, lưu trữ và phân tích dữ liệu metric mạnh mẽ. Từ việc giám sát tài nguyên hệ thống với Node Exporter đến quản lý hiệu suất container với CAdvisor, Prometheus giúp bạn có một cái nhìn toàn diện về trạng thái hoạt động của hệ thống.

Tuy nhiên, khi triển khai trong môi trường thực tế, việc bảo mật các metric endpoints là rất quan trọng để đảm bảo dữ liệu giám sát không bị lạm dụng hoặc truy cập trái phép. Trong bài viết tiếp theo, chúng ta sẽ cùng tìm hiểu cách thêm một lớp bảo mật cho các metric endpoints, giúp bảo vệ dữ liệu của bạn một cách an toàn và hiệu quả. Hãy cùng đón chờ nhé! 🚀

Tài liệu tham khảo

  1. https://prometheus.io/

  2. https://github.com/google/cadvisor