Bài 12: Kỹ thuật Sử dụng PromQL và Grafana để vẽ mọi Biểu đồ mong muốn *Đây là phần mở rộng cho Series "Xây dựng hệ thống giám sát toàn diện", nếu có góp ý hoặc ý tưởng thêm mọi người có thể liên hệ mình để đề xuất thêm1. Giới thiệuPrometheus Query Language (PromQL) là một ngôn ngữ truy vấn mạnh mẽ được sử dụng để truy vấn dữ liệu từ cơ sở dữ liệu time-series (TSDB) trong Prometheus. PromQL kết hợp với Grafana giúp quản trị viên giám sát và phân tích dữ liệu một cách trực quan và chi tiết.Bài viết này sẽ hướng dẫn sử dụng PromQL để tạo các biểu đồ phổ biến trong Grafana, từ các truy vấn cơ bản đến kỹ thuật nâng cao để gộp dữ liệu từ nhiều metrics khác nhau.2. Hiểu cơ bản về PromQL2.1. PromQL là gì?PromQL là một ngôn ngữ truy vấn mạnh mẽ cho phép lấy dữ liệu từ Prometheus, tổ chức theo dạng time-series. Nó cho phép thực hiện các phép toán, tính toán dựa trên labels, và các hàm xử lý dữ liệu thời gian thực.2.2. Cấu Trúc Truy Vấn Cơ BảnSelectors: Lựa chọn các metrics theo nhãn và thời gian.Ví dụ: node_cpu_seconds_total{job="node"} sẽ truy vấn dữ liệu CPU từ các máy chủ có job="node".Functions: Một số hàm phổ biến bao gồm:rate(): Đo tốc độ thay đổi của một metric trong một khoảng thời gian.sum(): Tính tổng của các giá trị metrics.avg(): Tính giá trị trung bình.Operators: Phép toán số học (+, -, *, /) và logic (and, or) có thể được áp dụng để xử lý dữ liệu.VD: Truy vấn hiển thị CPU sử dụng trên các node exporter trong 5 phút:rate(node_cpu_seconds_total[5m])3. Một số loại Biểu Đồ phổ biến trong Grafana3.1. Biểu đồ Time SeriesTime Series là loại biểu đồ phổ biến nhất, cho phép hiển thị dữ liệu theo thời gian. Mọi truy vấn đều có thể vẽ dưới dạng time-series, nhưng nên chọn các kết quả biến thiên theo thời gian.VD: Truy vấn hiển thị băng thông mạng trên một server cụ thể:rate(node_network_receive_bytes_total{instance="server01"}[5m])Grafana cung cấp nhiều tùy chọn để tùy chỉnh biểu đồ:Thời gian: Lựa chọn khoảng thời gian hiển thị từ 5 phút đến 30 ngày.Kiểu đồ thị: Chuyển đổi giữa các kiểu biểu đồ như line, bar, và point.Định dạng trục: Tùy chỉnh thang đo trên trục y (logarithmic, linear).Biểu đồ Time-series có rất nhiều ứng dụng phổ biến, có thể dùng để truy vết dịch vụ sử dụng nhiều tài nguyên hoặc sự gia tăng đột biến.3.2. Biểu Đồ Stat và GaugeĐây là hai loại biểu đồ phổ biến tiếp theo, hầu như khi đã thiết kế Dashboard đều sẽ sử dụng hai loại này. Thường dùng cho các truy vấn có giá trị tức thời (hiện tại), không quan tâm hoặc quan tâm một phần về sự thay đổi trước đó.VD: Stat: Hiển thị một giá trị cụ thể, như tải CPU hiện tại:avg(node_load1{instance="server01"})VD: Gauge: Hiển thị mức độ sử dụng tài nguyên so với ngưỡng:node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100Biểu đồ Stats ngoài giàu việc hiển thị giá trị ra cũng có thể hiển thị chữ, thường được dùng làm Dashboard tổng quan.3.3. Biểu đồ dạng bảngBảng chắc chắn là kiểu hiển thị cổ điển và lâu đời nhất, mọi dữ liệu đều có thể chuyển hóa thành dạng Bảng.Biểu đồ dạng bảng có thể kết hợp từ nhiều loại biểu đồ khác như Bar, Stats, Sparkline, Text,… Hiểu đơn giản là mỗi Labels của bạn sẽ được parse ra thành các cột trong bảng.Để sử dụng kiểu dữ liệu dạng bảng, metrics cần chuyển Format thành TableNgoài ra còn nhiều loại biểu đồ khác cũng hay dùng như Pie Chart (biểu đồ tròn) và Geo Map (bản đồ), Bar Chart/Bar Gauge (biểu đồ cột), Heatmap (biểu đồ nhiệt - độ phủ).4. Một số kỹ thuật truy vấn với PromQLPhần này mình sẽ lấy một ví dụ về cấu trúc metrics như sau:4.1. Gộp dữ liệu từ nhiều metricsSử dụng các hàm tính toán hoặc phép tính dữ liệu từ nhiều metrics:VD: Tổng CPU sử dụng trên tất cả các máy chủ:sum(rate(node_cpu_seconds_total[5m]))VD: Trung bình bộ nhớ sử dụng trên nhiều máy chủ:avg(node_memory_MemAvailable_bytes{job="node"})4.2. Group By LabelsVí dụ, tổng băng thông trên mỗi khu vực:sum(rate(node_network_receive_bytes_total[5m])) by (region)Ví dụ, so sánh lưu lượng mạng trên nhiều máy chủ:sum(rate(node_network_transmit_bytes_total[5m])) by (instance)4.3. Tính toán và đo lường độ thay đổiRate giúp đo tốc độ thay đổi của một metric theo thời gian.VD: Số lượng packet nhận được trong 5 phút:rate(node_network_receive_packets_total[5m])IRate tính tốc độ thay đổi tức thời:irate(node_cpu_seconds_total[1m])4.4. Kỹ thuật Làm mịn Dữ liệu (Smoothing)Sử dụng các hàm tính thời gian trung bình để làm mượt dữ liệu, tránh biểu đồ bị nhảy đột ngột:avg_over_time(node_cpu_seconds_total[1h])Hoặc sử dụng kĩ thuật moving average để quan sát các xu hướng dài hạn:avg_over_time(rate(node_cpu_seconds_total[5m])[1h:1m])4.5. Theo dõi Sự thay đổi của MetricsSử dụng các hàm increase() và delta() để theo dõi sự thay đổi giá trị của metrics trong một khoảng thời gian:increase(node_network_receive_bytes_total[1h])4.6. Join Metrics by LabelsPhương pháp này gộp nhiều metrics vào nhau thành một metrics tổng, dựa trên Label chung. Rất hữu ích với một số metrics tách rời phân biệt bởi ID.VD: Lấy metric có cả thông tin ifOperStatus và ifName dựa trên điểm chung là ifIndexifOperStatus{} * on (ifIndex) group_left(ifName) ifName{}Join nhiều metrics hơn cũng làm tương tự:ifHCInOctets{} * on (ifIndex) group_left(ifName) ifName{} * on (ifIndex) group_left(ifAlias) ifAlias{}4.7. Rename Labels metricsMột số metrics có tên Labels không trùng khớp có thể khó khăn khi gộp Metrics, có một số kĩ thuật để replace/rename Labels như label_replace() hoặc label_join().VD: Thêm label “new_label” từ label “old_label” cho metrics sample_metriclabel_join(sample_metric, "new_label", ",", "old_label")5. Tạo mọi loại biểu đồ trong GrafanaNếu bạn không muốn truy vấn cầu kỳ từ PromQL, bạn có thể sử dụng Grafana để xử lý dữ liệu phía sau. Dữ liệu dạng bảng cung cấp khả năng mạnh mẽ cho phép xử lý nhiều metrics với nhau.*Đây có lẽ là tính năng hữu ích nhất trong Grafana, giúp bạn có thể làm được mọi biểu đồ mong muốn. Một số trường hợp vẫn nên tiền xử lý ở PromQL thay vì xử lý ở Grafana.5.1. Gộp dữ liệu dạng bảng từ nhiều metricsTôi sẽ minh họa với 2 metrics là fgHwSensorEntName và fgHwSensorEntValue, SNMP về thông tin phần cứng của Fortigate chia ra làm hai metrics tên và giá trị riêng, có điểm chung là ID để phân biệt.Các bạn sang thẻ Transform data, mỗi bước ở đây là một luồng xử lý, thứ tự phải chính xác và không được thay đổi.VD: Inner Join các metrics đó dựa trên Label chung là fgHwSensorEntIndexKết quả:Dữ liệu đã gộp hết về 1 bảng, đến bước lọc dữ liệu.Thêm bước Organize fields by name, ở đây cho phép đổi tên cột và ẩn các cột không cần thiết.Cuối cùng là xoay ngang cột thành hàng, chọn Rows to fields5.2. Định dạng và tùy chỉnh kiểu dữ liệuSau khi đã có các dữ liệu chính xác về dạng bảng, việc tiếp theo là định dạng dữ liệu cho từng cột tương ứng. Tôi hướng dẫn thao tác với Bảng vì các loại biểu đồ khác sẽ tương tự và đơn giản hơn nhiều.Cell options/Cell type chọn Colored text (chữ có màu)Standard options/Unit chọn Number (đơn vị số)Sang thẻ Overrides, tạo định dạng với từng cột (với các loại biểu đồ khác chỉ có đơn dữ liệu thì không cần). Ở đây các bạn có thể chọn tên cột hoặc sử dụng Regex.VD: Mọi field có chữ PSU sẽ có Unit (đơn vị) là On/Off, giá trị tương ứng là 0 (đỏ) và 1 (xanh)VD: Mọi field có chữ Fan sẽ có Unit (đơn vị) là Vòng quay trên phút (rpm), giá trị tương ứng là 5000+ (xanh), 3000+ (vàng), còn lại (đỏ)VD: Mọi field có chữ Temerature sẽ có Unit (đơn vị) là độ C, giá trị tương ứng là 60+ (đỏ), 40+ (vàng), còn lại (xanh)Kết quả:5.3. Tạo Dashboard động dựa trên biếnCác bạn có thể để ý, mọi Dashboard trên Grafana Lab/Community đều có thể lựa chọn để lọc và thay đổi dữ liệu dựa trên bộ lọc trên cùng.Sử dụng biến trong Grafana là cách để chuyển đổi giữa các nguồn dữ liệu hoặc phạm vi, thay đổi thực tiếp dựa trên Template Dashboard của bạn.Tức là bây giờ thay vì đặt giá trị chính xác, chúng ta sẽ đặt dạng biến và truyền từ truy vấn vào, áp dụng cho mọi Instance chẳng hạn.Bạn vào Dashboard Settings:Thẻ General giúp đặt tên, mô tả, tags, thời gian cho DashboardThẻ Variables giúp đặt biến tùy chỉnh Dashboard độngThẻ Permissions giúp phân quyền cho người dùng với DashboardThẻ JSON Model chứa nội dung Template Json có thể lưu và tái sử dụngTạo một biến, giả sử đặt tên là dc_namePhần Query chọn Datasource Prometheus và có nhiều loại truy vấn cho bạn chọn để Retrieve danh sách giá trị để chọn biến.Ở đây chọn Label values:Chọn một metrics bất kỳ có chứa Label mong muốn (dc_name), recommend nên chọn các metrics giá trị tĩnh hoặc ít thay đổi.Sau đó chọn Label là dc_name.Lưu ý: $dc_name là tên biến, dc_name là tên LabelKéo xuống dưới kiểm tra các giá trị là chính xác, ngoài ra bạn có thể chọn Options thêm giá trị All hoặc cho phép chọn nhiều.Tạo biến tiếp theo là phụ thuộc của biến khác. Chỉ cần chọn điều kiện lọc dc_name bằng tên dc nào đó hoặc bằng biến $dc_name là được.Khi này, mọi giá trị cố định trong truy vấn PromQL có thể sử dụng dạng biến như sau:label_name=~”$variable”6. Kết LuậnSử dụng PromQL và Grafana giúp tối ưu hóa quy trình giám sát và trực quan hóa dữ liệu hệ thống. Bằng cách khai thác sức mạnh của PromQL, quản trị viên có thể tạo ra các biểu đồ tùy chỉnh và cảnh báo mạnh mẽ, giúp phát hiện và xử lý vấn đề nhanh chóng. Điều này giúp hệ thống hoạt động ổn định, tiết kiệm tài nguyên và đảm bảo hiệu suất cao.