Triển khai Prometheus và Exporters cho Kafka, Flink, ClickHouse
Bước đầu tiên là cài đặt Prometheus để thu thập metrics từ các thành phần đã triển khai ở các phần trước. Chúng ta sẽ sử dụng Prometheus Operator qua Helm chart để quản lý, đồng thời cấu hình ServiceMonitor để tự động phát hiện các target.
Trước tiên, thêm repository Prometheus và cài đặt Prometheus Operator. Command này sẽ tạo namespace monitoring và deploy các resource cần thiết.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace
Kết quả mong đợi: Namespace monitoring được tạo, các pod như prometheus-kube-prometheus-prometheus và grafana chuyển sang trạng thái Running.
Cấu hình Exporter cho Apache Kafka
Kafka cần JMX Exporter để expose metrics ra HTTP endpoint. Ta sẽ tạo ConfigMap chứa cấu hình JMX và ServiceMonitor để Prometheus scrape.
Tạo file cấu hình JMX Exporter tại đường dẫn /tmp/kafka-jmx-config.yaml với nội dung dưới đây. File này định nghĩa các metrics cần thu thập từ JMX của Kafka.
cat > /tmp/kafka-jmx-config.yaml
Áp dụng ConfigMap vào cluster. Sau đó tạo ServiceMonitor để Prometheus tự động phát hiện service Kafka Exporter.
kubectl apply -f /tmp/kafka-jmx-config.yaml
Kết quả mong đợi: ConfigMap kafka-jmx-config được tạo trong namespace kafka.
Tạo file ServiceMonitor tại /tmp/kafka-servicemonitor.yaml để liên kết Prometheus với Kafka.
cat > /tmp/kafka-servicemonitor.yaml
Áp dụng ServiceMonitor. Lưu ý: Service Kafka trong cluster phải có port monitoring trỏ về port JMX Exporter (thường là 9404).
kubectl apply -f /tmp/kafka-servicemonitor.yaml
Kết quả mong đợi: Prometheus target list hiện thêm endpoint của Kafka.
Cấu hình Exporter cho Apache Flink
Flink expose metrics qua REST endpoint. Ta cần cấu hình JobManager và TaskManager để expose metrics port và tạo ServiceMonitor tương ứng.
Tạo ConfigMap chứa cấu hình metrics cho Flink tại /tmp/flink-metrics-config.yaml.
cat > /tmp/flink-metrics-config.yaml
Áp dụng ConfigMap. Nếu bạn đang dùng Flink Operator, hãy mount ConfigMap này vào container Flink hoặc cập nhật Custom Resource (FlinkDeployment) để trỏ vào config này.
kubectl apply -f /tmp/flink-metrics-config.yaml
Kết quả mong đợi: Flink JobManager và TaskManager sẽ expose metrics tại port 8081.
Tạo ServiceMonitor cho Flink tại /tmp/flink-servicemonitor.yaml.
cat > /tmp/flink-servicemonitor.yaml
Áp dụng ServiceMonitor. Đảm bảo Service Flink có port http trỏ về 8081.
kubectl apply -f /tmp/flink-servicemonitor.yaml
Kết quả mong đợi: Prometheus thu thập được metrics flink_jobmanager_ và flink_taskmanager_.
Cấu hình Exporter cho ClickHouse
ClickHouse có endpoint /metrics mặc định (cần enable trong config). Ta cần tạo ServiceMonitor để scrape endpoint này.
Trước tiên, đảm bảo trong config ClickHouse (/etc/clickhouse-server/config.d/metrics.xml hoặc tương đương trong Helm values) có enable prometheus.
Tạo ServiceMonitor cho ClickHouse tại /tmp/clickhouse-servicemonitor.yaml.
cat > /tmp/clickhouse-servicemonitor.yaml
Áp dụng ServiceMonitor. Port http của ClickHouse thường là 8123.
kubectl apply -f /tmp/clickhouse-servicemonitor.yaml
Kết quả mong đợi: Prometheus target list hiện thêm endpoint ClickHouse.
Verify kết quả phần 1
Để kiểm tra, truy cập vào Prometheus UI và vào mục Targets.
kubectl port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090 -n monitoring
Mở trình duyệt truy cập http://localhost:9090/targets. Bạn sẽ thấy các target của Kafka, Flink và ClickHouse có trạng thái UP.
Cấu hình Dashboard Grafana theo dõi Throughput, Latency và Error Rate
Sau khi Prometheus thu thập được dữ liệu, bước tiếp theo là hiển thị trực quan trên Grafana. Chúng ta sẽ tạo dashboard cho từng thành phần.
Triển khai Dashboard cho Kafka
Dùng Grafana Dashboard có sẵn từ cộng đồng (ID: 9688) để theo dõi Kafka. Dashboard này bao gồm throughput, lag, và errors.
Đầu tiên, mở Grafana Dashboard import tool. Truy cập Grafana qua port-forward.
kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
Mở http://localhost:3000, đăng nhập (username: admin, password được generate trong secret prometheus-grafana).
Tạo file JSON cho dashboard Kafka tại /tmp/kafka-dashboard.json. Dưới đây là cấu trúc cơ bản để import.
cat > /tmp/kafka-dashboard.json
Import file JSON này vào Grafana thông qua UI (Import -> Upload JSON file) hoặc dùng API Grafana.
curl -X POST http://localhost:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:admin' | base64)" \
--data-binary @/tmp/kafka-dashboard.json
Kết quả mong đợi: Dashboard Kafka System Overview xuất hiện trong danh sách dashboard của Grafana.
Triển khai Dashboard cho Flink
Tạo dashboard riêng cho Flink để theo dõi state size, checkpoint duration, và processing rate.
Tạo file JSON dashboard Flink tại /tmp/flink-dashboard.json.
cat > /tmp/flink-dashboard.json
Import file vào Grafana.
curl -X POST http://localhost:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:admin' | base64)" \
--data-binary @/tmp/flink-dashboard.json
Kết quả mong đợi: Dashboard Flink Real-time Processing hiển thị dữ liệu thực tế từ pipeline.
Triển khai Dashboard cho ClickHouse
Dashboard ClickHouse tập trung vào query performance, insert rate, và memory usage.
Tạo file JSON dashboard ClickHouse tại /tmp/clickhouse-dashboard.json.
cat > /tmp/clickhouse-dashboard.json
Import file vào Grafana.
curl -X POST http://localhost:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:admin' | base64)" \
--data-binary @/tmp/clickhouse-dashboard.json
Kết quả mong đợi: Dashboard ClickHouse Performance hiển thị các chỉ số về write và read.
Verify kết quả phần 2
Truy cập http://localhost:3000/d/kafka-overview, http://localhost:3000/d/flink-processing và http://localhost:3000/d/clickhouse-perf. Kiểm tra xem các biểu đồ có hiển thị dữ liệu realtime hay không.
Thiết lập cảnh báo (Alerting) khi hệ thống gặp sự cố
Khi dashboard đã ổn, cần thiết lập Alerting để nhận thông báo khi có sự cố. Chúng ta sẽ dùng Alertmanager tích hợp sẵn trong Prometheus Stack.
Cấu hình Alertmanager
Tạo ConfigMap chứa cấu hình Alertmanager để định tuyến alert về email hoặc Slack.
Tạo file /tmp/alertmanager-config.yaml.
cat > /tmp/alertmanager-config.yaml
Áp dụng ConfigMap. Lưu ý: Thay thế webhook URL và email bằng thông tin thực tế của bạn.
kubectl apply -f /tmp/alertmanager-config.yaml
Kết quả mong đợi: Alertmanager pod trong namespace monitoring sẽ reload config và áp dụng cấu hình mới.
Tạo Alert Rules cho Kafka, Flink, ClickHouse
Tạo PrometheusRule để định nghĩa các điều kiện cảnh báo.
Tạo file /tmp/prometheus-rules.yaml chứa các rules quan trọng.
cat > /tmp/prometheus-rules.yaml 300
for: 5m
labels:
severity: warning
annotations:
summary: "Checkpoint duration quá cao"
description: "Checkpoint mất {{ \$value }}s, có thể ảnh hưởng đến recovery."
- name: clickhouse-alerts
rules:
- alert: ClickHouseInsertRateLow
expr: rate(clickhouse_system_metrics{metric="Inserts"}[5m]) < 10
for: 10m
labels:
severity: warning
annotations:
summary: "ClickHouse Insert rate thấp"
description: "Tốc độ ghi dữ liệu xuống thấp bất thường."
- alert: ClickHouseMemoryHigh
expr: clickhouse_system_memory_usage_bytes > 80000000000
for: 5m
labels:
severity: critical
annotations:
summary: "ClickHouse Memory Usage cao"
description: "Memory usage đạt {{ \$value }} bytes."
EOF
Áp dụng rules vào Prometheus.
kubectl apply -f /tmp/prometheus-rules.yaml
Kết quả mong đợi: Prometheus reload rules và bắt đầu đánh giá các điều kiện alert.
Verify kết quả phần 3
Truy cập http://localhost:9090/alerts để xem trạng thái các rules. Để test, bạn có thể tạo một sự cố giả (ví dụ: dừng pod Kafka hoặc tăng lag) để xem alert kích hoạt.
kubectl port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090 -n monitoring
Kiểm tra tab Alerts trong Prometheus UI, các rule vừa tạo phải hiện ra với trạng thái Firing hoặc Inhibited khi điều kiện đúng.
Phân tích log tập trung với Loki
Để hoàn thiện hệ thống giám sát, cần thu thập và phân tích log. Chúng ta sẽ sử dụng Loki vì tính nhẹ và tích hợp tốt với Grafana.
Triển khai Loki và Promtail
Cài đặt Loki và Promtail qua Helm chart của Grafana.
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki-stack --namespace logging --create-namespace --set loki.enabled=true --set promtail.enabled=true --set grafana.enabled=false --set minio.enabled=false
Kết quả mong đợi: Namespace logging được tạo, các pod loki và promtail chạy.
Cấu hình Promtail để scrape log từ Kafka, Flink, ClickHouse
Promtail cần cấu hình để đọc log từ các container của Kafka, Flink và ClickHouse.
Tạo ConfigMap chứa cấu hình Promtail tại /tmp/promtail-config.yaml.
cat > /tmp/promtail-config.yaml
Áp dụng ConfigMap. Sau đó deploy Promtail như một DaemonSet hoặc Deployment sử dụng ConfigMap này.
kubectl apply -f /tmp/promtail-config.yaml
Tuy nhiên, với Helm chart loki-stack, ta thường override values để mount config. Tạo file /tmp/loki-values.yaml để cấu hình.
cat > /tmp/loki-values.yaml
Re-install hoặc upgrade Loki stack với config mới.
helm upgrade loki grafana/loki-stack --namespace logging --values /tmp/loki-values.yaml
Kết quả mong đợi: Promtail bắt đầu scrape log từ các pod Kafka, Flink, ClickHouse và đẩy về Loki.
Tích hợp Loki với Grafana
Thêm Loki làm data source trong Grafana để truy vấn log.
Truy cập http://localhost:3000 (nếu chưa mở port-forward thì chạy lại command ở phần trước). Vào Configuration -> Data Sources -> Add data source.
Chọn Loki. URL mặc định là http://loki:3100 (nếu chạy trong cluster) hoặc http://loki.logging.svc.cluster.local:3100. Nếu chạy local, dùng http://localhost:3100 (sau khi port-forward).
kubectl port-forward svc/loki-gateway 3100:80 -n logging
Cấu hình Data Source trong Grafana: URL = http://localhost:3100. Click Save & Test.
Kết quả mong đợi: Grafana hiển thị thông báo Data source is working.
Tạo Dashboard Log trong Grafana
Tạo dashboard mới để xem log kết hợp với metrics.
Dùng query LogQL để lọc log theo app và severity.
{app="kafka"} | level != "DEBUG"
Trong Grafana, tạo panel mới, chọn Data Source là Loki, nhập query trên. Có thể thêm filter level="ERROR" để chỉ xem lỗi.
Tạo file JSON dashboard log tại /tmp/log-dashboard.json.
cat > /tmp/log-dashboard.json
Import dashboard vào Grafana.
curl -X POST http://localhost:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(echo -n 'admin:admin' | base64)" \
--data-binary @/tmp/log-dashboard.json
Kết quả mong đợi: Dashboard System Logs hiển thị log realtime từ các component.
Verify kết quả phần 4
Truy cập http://localhost:3000/d/system-logs. Kiểm tra bảng Error Logs và Live Logs Stream. Gây lỗi giả (ví dụ: throw exception trong Flink hoặc query sai trong ClickHouse) để xem log xuất hiện ngay lập tức.
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống Real-time Analytics và Stream Processing với Apache Kafka, Flink và ClickHouse trên Kubernetes
« Phần 8: Triển khai giao diện Dashboard và Query API cho ClickHouse
Phần 10: Tối ưu hóa hiệu năng và chi phí cho hệ thống production »