SIEM/Log Management Mô hình dữ liệu prometheus và các loại metric

I. Mô hình dữ liệu của Prometheus
1. Giới thiệu

Prometheus lưu các dữ liệu dưới dạng chuỗi thời gian, là những luồng giá trị có gán dấu thời gian thuộc cùng một chỉ số và cùng một tập hợp các chiều có gán nhãn. Ngoài ra Prometheus có thể tạo ra các chuỗi thời gian tạm thời từ kết quả truy vấn. [1]

2. Metric
2.1. Định nghĩa

Mỗi chuỗi thời gian là độc nhất với tên metric hoặc gọi là tên chỉ số, cùng với các cặp khóa-giá trị gọi là nhãn và một giá trị số sample. [2]

2.2. Metric name
Có những đặc điểm sau:
- Thành phần quan trọng cho việc tìm kiếm, tên này phải thể hiện đặc điểm chung của hệ thống đo lường. Ví dụ: http_requests_total là tên cho tổng số HTTP request.
- Tên có thể sử dụng định danh UTF-8
- Tên được khuyến nghị khớp với regex [a-zA-Z_:][a-zA-Z0-9_:]*, để đảm bảo trải nghiệm và khả năng tương thích tốt nhất. Các tên chỉ số không tuân theo quy tắc này sẽ cần được đặt trong dấu ngoặc kép khi sử dụng, chẳng hạn như trong PromQL.
- Dấu hai chấm ":" được dành riêng cho các quy tắc ghi lại do người dùng đặt và không nên sử dụng bởi các thành phần exporter hoặc bởi mã đo lường trực tiếp.

2.3. Metric label
Cho phép người dùng ghi nhận các trường hợp khác nhau của cùng một tên chỉ số, được gọi là mô hình dữ liệu đa chiều. Ngôn ngữ truy vấn cho phép thực hiện lọc và tổng hợp dữ liệu dựa trên các chiều này, nếu có sự thay trong giá trị của nhãn thì sẽ tạo ra một chuỗi thời gian mới, có một số đặc điểm sau:
- Tên nhãn có thể sử dụng bất kỳ ký tự UTF-8.
- Tên nhãn bắt đầu bằng hai dấu gạch dưới "__" được dành riêng cho mục đích sử dụng nội bộ của Prometheus.
- Tên nhãn nên tuân theo regex [a-zA-Z_][a-zA-Z0-9_]* để đảm bảo trải nghiệm và khả năng tương thích tốt nhất, những trường hợp khác phải để trong dấu ngoặc kép.
- Giá trị nhãn có thể chứa bất kỳ ký tự UTF-8.
- Các nhãn có giá trị rỗng được coi là tương đương với các nhãn không tồn tại.

2.4. Sample
Một giá trị số nằm ở cuối chỉ số đại diện một loại giá trị cụ thể, đặc điểm:
- Một giá trị float64 hoặc giá trị biểu đồ tần suất
- Một dấu thời gian có độ chính xác đến mili giây

II. Các loại chỉ số Prometheus
1. Counter

Là một chỉ số tích lũy đại diện đo lường những đại lượng chỉ có xu hướng tăng, giá trị của nó chỉ có thể tăng lên hoặc bị đặt lại về không khi hệ thống khởi động lại.
Lưu ý: Do bộ đếm có thể bị đặt lại về không, người dùng cần đảm bảo hệ thống backend dùng để lưu trữ và truy vấn các chỉ số hỗ trợ trường hợp này và vẫn cung cấp kết quả chính xác.
Phù hợp cho việc ghi lại số lượng yêu cầu đã được xử lý, số tác vụ đã hoàn thành hoặc số lỗi phát sinh. [3] [4]
Ví dụ:
- Đo lường số lượng API được gọi sẽ có kết quả sau
http_requests_total{api="add_product"} 4633433
Kết quả trên sẽ cho biết là tổng số http request của api "add_product" là 4633433 lần từ khi dịch vụ được chạy hoặc bộ đếm bị đặt lại.

- Tính toán trung bình số yêu cầu trên một giây trong vòng 5 phút gần đây sử dụng ngôn ngữ PromQL.
rate(http_requests_total{api="add_product"}[5m])

2. Gauge
Là một chỉ số đại diện đo lường những đại lượng có thể tăng hoặc giảm tùy ý.
Phù hợp cho việc đo nhiệt độ, mức sử dụng CPU và bộ nhớ, hay kích thước của hàng đợi.
Ví dụ:
- Đo lường mức sử dụng bộ nhớ trong một máy chủ sẽ có kết quả sau:
node_memory_used_bytes{hostname="host1.domain.com"} 943348382
Kết quả này cho biết bộ nhớ sử dụng bởi host1.domain.com là 943348382 MB

- Để tính toán trung bình mức sử dụng bộ nhớ của hos1t.domain.com
avg_over_time(node_memory_used_bytes{hostname="host1.domain.com"}[10m])

3. Histograms
Loại này hữu ích để biểu diễn sự phân bố của các phép đo, hoạt động bằng cách chia toàn bộ dải giá trị đo lường thành các khoảng gọi là bucket và đếm số lượng giá trị rơi vào mỗi khoảng đó. [5]
Một histogram sẽ bao gồm 3 thành phần:
- Một bộ đếm ghi lại tổng số lượng các phép đo, tên chỉ số có hậu tố "_count"
- Một bộ đếm ghi lại tổng giá trị các phép đo, tên chỉ số có hậu tố "_sum"
- Các bucket của histogram được hiển thị dưới dạng các bộ đếm, sử dụng tên chỉ số kèm hậu tố "_bucket" và nhãn "le" biểu thị giới hạn trên. Bucket có tính bao hàm nghĩa là bucket trên cùng sẽ bao gồm tất cả các điểm dữ liệu có giá trị nhỏ hơn hoặc bằng N.
Hiện tại có hai phiên bản khác nhau:
- Native histogram: được hiển thị và tiếp nhận dưới dạng các tổng hợp sample, mỗi sample đại diện cho số lượng và tổng giá trị của các quan sát cùng với một tập hợp các bucket linh hoạt.
- Histogram dạng cổ điển bao gồm nhiều chuỗi thời gian chứa các sample kiểu số thực đơn giản.
Ví dụ:
- Chỉ số tổng hợp để đo lường thời gian phản hồi của instance thuộc endpoint API "add_product" đang chạy trên "host1.domain.com" :
# HELP http_request_duration_seconds Api requests response time in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_sum{api="add_product" instance="host1.domain.com"} 8953.332
http_request_duration_seconds_count{api="add_product" instance="host1.domain.com"} 27892
http_request_duration_seconds_bucket{api="add_product" instance="host1.domain.com" le="0"}
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.01"} 0
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.025"} 8
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.05"} 1672
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.1"} 8954
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.25"} 14251
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.5"} 24101
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="1"} 26351
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="2.5"} 27534
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="5"} 27814
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="10"} 27881
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="25"} 27890
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="+Inf"} 27892
Ở đây bao gồm tổng, số lượng và 12 bucket, tổng và số lượng có thể được sử dụng để tính giá trị trung bình của một phép đo theo thời gian.

- Để tính toán thời lượng trung bình trong năm phút cuối:
rate(http_request_duration_seconds_sum{api="add_product", instance="host1.domain.com"}[5m]) / rate(http_request_duration_seconds_count{api="add_product", instance="host1.domain.com"}[5m])

Tài liệu tham khảo
[1] https://prometheus.io/docs/concepts/data_model/
[2] https://www.cncf.io/blog/2025/07/22/prometheus-labels-understanding-and-best-practices/
[3] https://prometheus.io/docs/concepts/metric_types/
[4] https://www.tigerdata.com/blog/four-types-prometheus-metrics-to-collect
[5] https://prometheus.io/docs/practices/histograms/
 
Back
Top