Mặc định thì Prometheus chỉ thu thập các số liệu về chính nó (ví dụ số request nhận, memory usabel,...). Để có thể mở rộng thu thập từ các nguồn khác thì cần phải sử dụng Exporter và các công cụ khác để tạo metric và thu thập nó.
Exporter đưuọc phát triển bởi Prometheus và cộng đồng, cung cấp mọi thứ thông tin về cơ sở hạ tầng, cơ sở dữ liệu, web server, hệ thống tin nhắn, API,...
Một vài các exporter tiêu biểu:
- node_exporter: tạo ra các số liệu về hạ tầng, bao gồm CPU, memoru, disk usage cũng như các số liệu về disk I/O và network.
- blackbox_exporter: tạo ra các số liệu từ các đầu dò như HTTP, HTTPs để xác định tính khả dụng của các endpoint, thời gian phản hồi,...
- mysqld_exporter: tập hợp các số liệu liên quan đến mysql server
- rabbitmq_exporter: output của exporter này liên quan tới RabbitMQ, bao gồm số lượng các message được publish, số message sẵn sàng để gửi, kích thước các gói tin trong hàng đợi.
- **nginx-vts-exporter:**cung cấp các số liệu về ngĩn server sử dụng module VTS bao gồm số lượng kết nối mở, số lượng phản hồi được gửi và tổng kích thước của các gói tin gửi và nhận.
Tìm hiểu thêm một số các exporter ở đây
Metric
Định dạng chung cử một metric có dạng:
<metric name>{<label name>=<label value>, ...}
Mỗi exporter sẽ thu thập và phơi data ra ngoài để prometheus sever có thể pull về qua giao thức http.
Các metric này có thể xem trực tiếp tại địa chỉ: http://ip-exporter:port/metrics
, ví dụ một đoạn sau:
# TYPE node_filesystem_avail_bytes gauge
node_filesystem_avail_bytes{device="/dev/vda1",fstype="ext4",mountpoint="/"} 1.7972371456e+10
node_filesystem_avail_bytes{device="rootfs",fstype="rootfs",mountpoint="/"} 1.7972371456e+10
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 4.60668928e+08
node_filesystem_avail_bytes{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/1000"} 1.03927808e+08
# HELP node_filesystem_device_error Whether an error occurred while getting statistics for the given device.
# TYPE node_filesystem_device_error gauge
node_filesystem_device_error{device="/dev/vda1",fstype="ext4",mountpoint="/"} 0
node_filesystem_device_error{device="rootfs",fstype="rootfs",mountpoint="/"} 0
node_filesystem_device_error{device="tmpfs",fstype="tmpfs",mountpoint="/run"} 0
node_filesystem_device_error{device="tmpfs",fstype="tmpfs",mountpoint="/run/user/1000"} 0
# HELP node_filesystem_files Filesystem total file nodes.
Dấu #
là chỉ các dòng chú thích
Có bốn kiểu metric được sử dụng trong prometheus:
-
counter: là một số bộ đếm tích lũy, được đặt về 0 khi restart. Ví dụ, có thể dùng counter để đếm số request được phục vụ, số lỗi, số task hoàn thành,... Không sử dụng cho các metric có gia trị giảm như số tiến trình đang chạy. Trong trường hợp đó, ta có thể sử dụng gauge.
-
gauge: đại diện cho số liệu duy nhất, nó có thể lên hoặc xuống, thường được sử dụng cho các giá trị đo.
-
histogram: lấy mẫu quan sát (thường là những thứ như là thời lượng yêu cầu, kích thước pahnr hồi). Nó cũng cung cấp tổng của các giá trị đó.
-
summary: tương tự histogram, nó cung cấp tổng số các quan sát và tổng các giá trị đó, nó tính toàn số lượng có thể cấu hình qua sliding time window (cửa sổ trượt).
Về cơ bản thì prometheus lưu trữ tất cả các dữ liệu dưới dạng time series
Metric names and labels
Mỗi time series được xác định duy nhất bởi tên metric name và một bộ các cặp key-value, hay còn được gọi là labels.
-
Metric name được chỉ định các thông số của hệ thống (VD:
http_requests_total
là tổng số các request HTTP đã nhận). Nó có thể chứa các chữ cái và chữ số ASCII cũng như dấu gạch dưới và dấu hai chấm. Nó phải được match với[a-zA-Z_:][a-zA-Z0-9_:]*
.- Trong đó dấu
:
được dành riêng cho quy tắc ghi do người dùng xác định. Chúng không được sử dụng bởi exporters hoặc direct instrumentation.
- Trong đó dấu
-
Labels: kích hoạt Prometheus's dimensional data model, bất kỳ một nhãn đã cho nào cho cùng một metric name xác định một khởi tạo một chiều của số liệu đó (Ví dụ: tất cả các HTTP request đêu đã sử dụng method
POST
cho trình xử lý/api/tracks
). The query language cho phép filtering và aggregation dựa trên các thước đo này. Thay đổi bất cứ label value nào, thêm hoặc xóa một label, sẽ tạo ra một time series mới. -
Labels names có thể bao gồm các ký tự ASCII, số, cũng như dấu gạch dưới. Chúng phải match regex
[a-zA-Z_][a-zA-Z0-9_]*
. Label names bắt đầu với__
được dành riêng cho việc sử dụng nội bộ. -
Label values có thể bao gồm bất kỳ Unicode characters nào.
Samples
Samples được tạo ra từ dữ liệu thời gian thực. Mỗi sample bao gồm:
- a float64 value
- a millisecond-precision timestamp
Notation
Đặt tên một metric name và một set of labels, time series thường được xác định bằng cách sử dụng notation này:
<metric name>{<label name>=<label value>, ...}
Ví dụ, một time series có metric name là api_http_requests_total
và lable là method="POST"
và handler="/messages
có thể được viết như sau:
api_http_requests_total{method="POST", handler="/messages"}
Prometheus quy định một endpoint mà bạn có thể scrape là một instance, thường tương ứng với một process đơn. Một nhóm các instance có chung một mục đích, chẳng hạn một process được replicated cho việc mở rồng và độ tin cậy thì được gọi là job.
Ví dụ, một API server job với 4 replicated instances:
- job:
api-server
- instance 1:
1.2.3.4:5670
- instance 2:
1.2.3.4:5671
- instance 3:
5.6.7.8:5670
- instance 4:
5.6.7.8:5671
- instance 1:
Tự động sinh ra labels và time series
Khi Prometheus scrapes một target, nó attaches một vài labels tự động để scraped time series, cái mà phục vụ cho việc định danh