Kết nối Grafana với các Data Source: Prometheus, Loki và Tempo
Bước đầu tiên là cấu hình Grafana để nhận diện và giao tiếp với các backend đã triển khai ở các phần trước (Prometheus cho Metrics, Loki cho Logs, Tempo cho Traces).
Tại sao cần làm: Grafana không tự động phát hiện data source trong môi trường Hybrid Cloud phức tạp. Bạn cần khai báo rõ địa chỉ kết nối (URL) và các tham số xác thực để tránh lỗi "Data source not found".
Kết quả mong đợi: Khi vào menu Configuration > Data Sources, bạn thấy 3 nguồn dữ liệu với trạng thái "Health: OK".
Cấu hình Prometheus Data Source
Truy cập vào giao diện web Grafana, chọn menu Configuration > Data Sources > Add data source. Chọn Prometheus.
Thay đổi các thông số sau trong tab HTTP và Auth:
Giả sử Prometheus đang chạy ở địa chỉ nội bộ prometheus:9090 (hoặc IP thực tế của bạn).
URL: http://prometheus:9090
Auth Type: Basic Auth (Nếu Prometheus có bật auth, nếu không để trống)
User: admin
Password: your_prometheus_password
Kéo xuống tab HTTP và bật HTTP Method là GET (mặc định). Nhấn Save & Test.
Kết quả mong đợi: Dòng thông báo màu xanh hiện lên "Data source is working". Nếu lỗi, kiểm tra lại DNS resolution giữa container Grafana và Prometheus.
Cấu hình Loki Data Source
Vẫn ở trong màn hình Add data source, chọn Loki.
Cấu hình URL trỏ về Loki. Lưu ý Loki thường chạy trên cổng 3100.
URL: http://loki:3100
Query type: PromQL (Để đồng bộ cú pháp với Prometheus)
Max lines: 500 (Tối ưu hiệu năng khi hiển thị log)
Nhấn Save & Test. Grafana sẽ thực hiện một query đơn giản để kiểm tra kết nối.
Kết quả mong đợi: Dòng thông báo "Data source is working". Nếu lỗi "Connection refused", kiểm tra xem container Loki đã chạy và expose đúng port chưa.
Cấu hình Tempo Data Source
Chọn Tempo từ danh sách data source. Tempo thường chạy trên cổng 3100 (cùng port với Loki trong nhiều deployment mẫu) hoặc 4317 nếu dùng gRPC.
Cấu hình kết nối:
URL: http://tempo:3100
Access: Proxy (Khuyên dùng trong môi trường Docker/K8s để tránh CORS issues)
Datasource UID: tempo (Gán một UID cố định để dùng trong dashboard)
Nhấn Save & Test.
Kết quả mong đợi: Thông báo "Data source is working". Bạn đã hoàn tất việc kết nối 3 trụ cột của Observability.
Tạo Dashboard tổng quan: Kết hợp Metrics, Logs và Traces
Bây giờ chúng ta sẽ xây dựng một dashboard "Single Pane of Glass" để nhìn thấy toàn bộ hệ thống.
Tại sao cần làm: DevOps cần nhìn tổng quan sức khỏe hệ thống (Metrics), trong khi Developer cần debug sự cố cụ thể (Logs/Traces). Việc tách biệt gây mất thời gian chuyển đổi ngữ cảnh.
Kết quả mong đợi: Một dashboard với 3 panel chính: CPU/Memory Usage (Metrics), Error Logs (Logs), và Trace Span (Traces).
Chuẩn bị biến (Variables) cho Dashboard
Trước khi vẽ panel, cần tạo biến Environment và Service để lọc dữ liệu. Điều này giúp dashboard linh hoạt cho cả Dev, Stage, Production.
Vào Dashboards > New > Import (hoặc tạo mới từ blank). Tại tab Variables (trên cùng), thêm 2 biến:
Name: env
Type: Query
Data source: Prometheus
Query: label_values(node_exporter_build_info, environment)
Refresh: On Dashboard Load
Hide: Label
Name: service
Type: Query
Data source: Loki
Query: {env="$env"}
Refresh: On Dashboard Load
Hide: Label
Kết quả mong đợi: Khi mở dashboard, bạn thấy 2 dropdown ở góc trên bên phải. Chọn "env" và "service" để lọc dữ liệu cho các panel bên dưới.
Panel 1: Metrics - CPU và Memory Usage
Thêm panel mới (Add panel). Chọn Data Source là Prometheus.
Sử dụng biểu đồ Time series để theo dõi tài nguyên theo thời gian thực.
Query A:
sum(rate(node_cpu_seconds_total{mode="idle", instance=~"$env"}[5m])) by (instance)
Legend: CPU Idle {{instance}}
Query B:
(node_memory_MemTotal_bytes{instance=~"$env"} - node_memory_MemAvailable_bytes{instance=~"$env"}) / node_memory_MemTotal_bytes{instance=~"$env"} * 100
Legend: Memory Usage {{instance}}
Trong tab Visualization, chọn Time series. Trong tab Thresholds, thiết lập màu đỏ nếu CPU idle < 20% hoặc Memory > 80%.
Kết quả mong đợi: Biểu đồ hiển thị đường cong CPU và Memory của các instance được chọn theo biến $env.
Panel 2: Logs - Lọc Error Logs
Thêm panel mới. Chọn Data Source là Loki. Chuyển sang tab Logs (không phải Time series).
Cấu hình query để chỉ hiển thị log có level "error" hoặc "fatal" thuộc service đang chọn.
Query:
{env="$env", service="$service"} |= "error"
Format: Logs
Limit: 100
Kéo xuống phần Log options, bật Highlight với từ khóa error để dễ nhìn.
Kết quả mong đợi: Danh sách log hiện ra dưới dạng dòng văn bản, chỉ hiển thị các dòng chứa từ "error".
Panel 3: Traces - Top Latency Spans
Thêm panel mới. Chọn Data Source là Tempo.
Sử dụng biểu đồ Bar chart để hiển thị các service có độ trễ cao nhất trong khoảng thời gian được chọn.
Query:
span_name: ".*"
service_name: "$service"
env: "$env"
| histogram(duration) by (span_name)
Trong tab Visualization, chọn Bar chart. Sắp xếp theo Value giảm dần.
Kết quả mong đợi: Các cột biểu thị độ trễ (duration) của các span khác nhau, giúp phát hiện nút thắt cổ chai.
Cấu hình Correlation: Liên kết Trace, Log và Metric
Đây là bước quan trọng nhất để biến dashboard thành công cụ điều tra sự cố (Investigation tool).
Tại sao cần làm: Khi một metric tăng vọt (ví dụ: Latency), bạn cần click vào đó để xem Trace nào gây ra, và từ Trace đó xem Log chi tiết của request đó.
Kết quả mong đợi: Click vào một điểm trên biểu đồ Metrics hoặc một Trace sẽ tự động mở tab Logs hoặc Traces tương ứng.
Bật tính năng "Explore" từ Dashboard
Trong cấu hình của từng Panel (tab Panel > Links), thêm link để mở trang Explore.
Đối với Panel Metrics (CPU/Memory):
Title: Explore Logs for this time range
Url: /explore?left=[now-1h,now]
Keep variables: Checked
Pass variables: Checked
Đối với Panel Traces (Top Latency):
Title: View Logs for this trace
Url: /explore?left=[now-1h,now]
Data source: Loki
Query: {trace_id="{{Data(traceID)"}}
Chú ý: Để việc tương tác này hoạt động mượt mà, bạn cần đảm bảo Loki đã được cấu hình để lưu trace_id trong log label (thường được làm tự động bởi OpenTelemetry Collector nếu cấu hình đúng ở Phần 4).
Cấu hình Link từ Trace sang Log (Tempo to Loki)
Trong panel Trace (Tempo), thêm một link để khi click vào một span cụ thể, nó sẽ mở Log của span đó.
Trong tab Links của panel Tempo:
Title: View Logs
Url: /explore?orgId=1&left=%5B%22now-1h%22%2C%22now%22%5D&right=%5B%22now-1h%22%2C%22now%22%5D&query=%7Benv%3D%22%24env%22%2Cservice%3D%22%24service%22%2Ctrace_id%3D%22%7B%7BData(traceID)%7D%7D%22%7D
Data source: Loki
Keep variables: Checked
Kết quả mong đợi: Khi bạn click vào một hàng trong bảng Trace (hoặc một cột trong biểu đồ), một tab mới mở ra với query log đã được điền sẵn trace_id, hiển thị chính xác log của request đó.
Chia sẻ và xuất bản Dashboard cho team
Khi dashboard đã hoàn thiện và kiểm tra xong, cần đưa vào sản xuất để cả team DevOps và Development cùng sử dụng.
Tại sao cần làm: Tránh việc mỗi người tạo một dashboard riêng gây rời rạc dữ liệu. Cần một nguồn sự thật (Single Source of Truth) cho giám sát.
Kết quả mong đợi: Dashboard được lưu trong thư viện (Library Panels) hoặc xuất bản thành ID để import nhanh cho các thành viên khác.
Lưu và Bảo vệ Dashboard
Nhấn nút Save trên thanh công cụ của Dashboard. Đặt tên rõ ràng, ví dụ: Production - Hybrid Cloud Overview.
Trong tab Version (khi lưu), bạn có thể chọn Save and continue hoặc Save and return to dashboard.
Để bảo vệ dashboard khỏi bị sửa đổi ngẫu nhiên:
Vào Settings > Lock dashboard:
Enable: Yes
Reason: "Standard production dashboard. Contact DevOps Lead to modify."
Kết quả mong đợi: Dashboard bị khóa, người dùng thường chỉ có quyền xem (View) không thể sửa (Edit).
Xuất Dashboard sang JSON để chia sẻ
Để chia sẻ cho các thành viên khác hoặc backup, hãy xuất file JSON.
Nhấn Actions (biểu tượng 3 chấm) > Export.
Chọn Export version: Current.
Chọn Include dashboard version: Yes.
Nhấn Export để tải file dashboard.json.
Kết quả mong đợi: Bạn có một file JSON chứa toàn bộ cấu hình, query và layout. Gửi file này qua email hoặc Slack cho team.
Import Dashboard cho người dùng khác
Người dùng khác sẽ vào Dashboards > New > Import.
Họ upload file JSON bạn vừa gửi, hoặc paste nội dung JSON vào ô Import via panel json.
Nhấn Load. Sau đó, họ cần chọn Data Source tương ứng (Prometheus, Loki, Tempo) trong bảng hiện ra.
Nhấn Import.
Kết quả mong đợi: Dashboard hiện ra y hệt như bản gốc, dữ liệu tự động được tải về từ các data source của họ (về sau).
Thêm vào Home Dashboard
Để dashboard này luôn hiển thị khi login, vào Home > Save as home.
Nhấn Save.
Kết quả mong đợi: Khi người dùng đăng nhập vào Grafana, trang mặc định sẽ là Dashboard quan trọng này.
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống observability toàn diện (Logging, Metrics, Tracing) cho môi trường Hybrid Cloud với Prometheus, Grafana và OpenTelemetry
« Phần 4: Triển khai nền tảng Tracing: Tích hợp OpenTelemetry Collector
Phần 6: Cấu hình Alerting: Thiết lập hệ thống cảnh báo thông minh »