Cấu hình Prometheus để thu thập Metrics từ các Service
Bước đầu tiên là định nghĩa nguồn dữ liệu đầu vào cho Prometheus. Chúng ta cần cấu hình file prometheus.yml để chỉ định các target cần scrape, bao gồm node exporter, cadvisor và ứng dụng business của bạn.
Tạo file cấu hình tại /etc/prometheus/prometheus.yml với nội dung sau. Cấu hình này sử dụng file_sd_configs để động phát hiện các container trong Kubernetes, hoặc static_configs nếu bạn chạy trên bare-metal.
global:
scrape_interval: 15s
evaluation_interval: 15s
storage:
tsdb:
retention_time: 2h
max_block_duration: 2h
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'app-metrics'
static_configs:
- targets: ['app-service:8080']
Kết quả mong đợi: Prometheus sẽ bắt đầu scrape metrics từ các target đã định nghĩa. Chu kỳ lưu trữ cục bộ (retention_time) được đặt là 2h để giảm tải cho local disk, dữ liệu lịch sử sẽ được đẩy sang Thanos.
Triển khai Thanos Sidecar để lưu trữ vào Object Storage (S3)
Khởi tạo Bucket S3 và Tạo User IAM
Trước khi chạy Thanos Sidecar, bạn cần chuẩn bị Object Storage. Ở đây chúng ta giả định sử dụng AWS S3. Bạn cần tạo một bucket mới và tạo một IAM User có quyền s3:GetObject, s3:PutObject, s3:ListBucket cho bucket đó.
Lưu trữ Access Key ID và Secret Access Key vào biến môi trường hoặc file secret. Ví dụ dưới đây sử dụng biến môi trường trực tiếp để đơn giản hóa tutorial.
Cấu hình và Chạy Prometheus với Thanos Sidecar
Thanos Sidecar sẽ chạy song song với Prometheus, đọc dữ liệu từ TSDB local và upload các block (block) hoàn chỉnh lên S3. Chúng ta cần cấu hình Prometheus để export lên port riêng (thường là 10902) và chạy sidecar lắng nghe port đó.
Tạo file cấu hình cho Prometheus tại /etc/prometheus/prometheus-sidecar.yml. Nội dung này chỉ định đường dẫn TSDB và cấu hình upload lên S3.
global:
scrape_interval: 15s
evaluation_interval: 15s
storage:
tsdb:
retention_time: 2h
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
Kết quả mong đợi: File cấu hình được lưu, Prometheus sẽ đọc file này khi khởi động với sidecar.
Bây giờ, hãy chạy container Prometheus với Sidecar. Command dưới đây sử dụng Docker Compose hoặc docker run trực tiếp. Chúng ta map volume chứa data và cấu hình environment variables cho AWS.
docker run -d \
--name prometheus-thanos \
-v /etc/prometheus:/etc/prometheus:ro \
-v /var/lib/prometheus:/prometheus \
-p 9090:9090 \
-p 10902:10902 \
quay.io/prometheus/prometheus:v2.45.0 \
prometheus \
--config.file=/etc/prometheus/prometheus-sidecar.yml \
--storage.tsdb.path=/prometheus \
--storage.tsdb.retention.time=2h \
--web.enable-lifecycle \
--web.enable-admin-api
Kết quả mong đợi: Prometheus chạy trên port 9090, sidecar chưa chạy. Dữ liệu được lưu vào /prometheus.
Tiếp theo, chạy Thanos Sidecar riêng biệt để đọc từ /prometheus và upload lên S3. Đảm bảo biến môi trường AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY và THANOS_BUCKET được đặt đúng.
docker run -d \
--name thanos-sidecar \
--network host \
-v /var/lib/prometheus:/prometheus:ro \
-p 10902:10902 \
-e AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY \
-e AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY \
-e THANOS_BUCKET=your-aiopts-bucket \
-e THANOS_OBJSTORE_CONFIG_TYPE=s3 \
quay.io/thanos/sidecar:v0.33.1 \
--prometheus.url=http://prometheus:9090 \
--prometheus.http-address=:10902 \
--objstore.config-type=s3 \
--objstore.config='{
"type": "S3",
"bucket": "your-aiopts-bucket",
"region": "us-east-1",
"insecure": false
}'
Kết quả mong đợi: Sidecar bắt đầu đọc block từ Prometheus và upload lên S3. Kiểm tra log bằng docker logs thanos-sidecar, bạn sẽ thấy dòng uploading block sau khi 2h retention.
Verify kết quả upload
Để xác minh dữ liệu đã được upload, hãy dùng AWS CLI hoặc console S3 để list file trong bucket. Bạn sẽ thấy các folder có cấu trúc v1/ chứa các block metrics.
aws s3 ls s3://your-aiopts-bucket/v1 --recursive
Kết quả mong đợi: Xuất hiện các đường dẫn dạng v1/uuid-timestamp/ chứa file meta.json và các file data.
Cài đặt Thanos Store và Thanos Query
Triển khai Thanos Store Gateway
Thanos Store Gateway chịu trách nhiệm đọc dữ liệu từ Object Storage (S3) và trả về cho Thanos Query dưới dạng gRPC. Nó đóng vai trò như một bridge giữa storage và query layer.
Chạy container Thanos Store với cấu hình object storage tương tự như Sidecar.
docker run -d \
--name thanos-store \
--network host \
-p 10901:10901 \
-e AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY \
-e AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY \
-e THANOS_BUCKET=your-aiopts-bucket \
quay.io/thanos/store:v0.33.1 \
--objstore.config-type=s3 \
--objstore.config='{
"type": "S3",
"bucket": "your-aiopts-bucket",
"region": "us-east-1"
}' \
--tsdb.path=/tmp/thanos-store \
--grpc-address=:10901 \
--http-address=:10902
Kết quả mong đợi: Store Gateway chạy và bắt đầu scan bucket S3 để index các block đã upload. Log sẽ hiện dòng scanning bucket.
Triển khai Thanos Query
Thanos Query là điểm truy vấn duy nhất cho người dùng. Nó sẽ aggregate dữ liệu từ các Prometheus local (nếu còn) và các Thanos Store Gateway để trả về kết quả.
Chạy container Thanos Query, chỉ định địa chỉ của Store Gateway và Prometheus.
docker run -d \
--name thanos-query \
--network host \
-p 10902:10902 \
-p 9090:9090 \
quay.io/thanos/query:v0.33.1 \
--query.frontend-address=thanos-query:10902 \
--store=thanos-store:10901 \
--store=thanos-sidecar:10902 \
--http-address=:10902 \
--grpc-address=:10901 \
--query.range=30d
Kết quả mong đợi: Thanos Query lắng nghe trên port 9090 (HTTP) và 10902 (gRPC). Nó đã kết nối thành công với Store và Sidecar.
Xác minh khả năng truy vấn dữ liệu dài hạn với Thanos
Bước cuối cùng là kiểm tra xem Thanos Query có thể trả về dữ liệu lịch sử (lớn hơn 2h retention của Prometheus local) hay không.
Sử dụng curl để gọi API của Thanos Query (chạy trên port 9090) với tham số time range dài hơn 2 giờ, ví dụ 3 ngày.
curl "http://localhost:9090/api/v1/query_range?query=node_cpu_seconds_total&start=$(date -d '3 days ago' +%s)&end=$(date +%s)&step=1h"
Kết quả mong đợi: JSON trả về có trường status là success và mảng data chứa các series dữ liệu kéo dài 3 ngày. Nếu chỉ có Prometheus local, bạn sẽ nhận được dữ liệu trong 2h đầu, nhưng với Thanos, bạn thấy dữ liệu đầy đủ.
Để kiểm tra trực quan, mở trình duyệt truy cập http://localhost:9090/graph. Nhập query node_cpu_seconds_total và kéo thời gian (Time range) về 3 ngày trước. Biểu đồ sẽ hiện đầy đủ lịch sử.
curl -s "http://localhost:9090/api/v1/query?query=up" | jq .
Kết quả mong đợi: Tất cả các target (prometheus, node-exporter, app-metrics) đều có giá trị value: 1, chứng tỏ hệ thống Thanos đang hoạt động ổn định và có thể query dữ liệu từ cả nguồn local và remote storage.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng AIOps với Prometheus, Thanos và LLM để dự báo sự cố
« Phần 1: Khởi động: Kiến trúc tổng quan và chuẩn bị môi trường
Phần 3: Thiết kế pipeline ETL để chuyển đổi metrics sang văn bản »