Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 2
Prometheus là một hệ thống giám sát open-souce và database chuỗi thời gian. Trong Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 1 , ta cài đặt ba version dịch vụ demo hiển thị các số liệu tổng hợp cho server Prometheus. Bằng cách sử dụng các chỉ số này, ta sau đó đã học cách sử dụng ngôn ngữ truy vấn Prometheus để chọn và lọc chuỗi thời gian, cách tổng hợp theo các thứ nguyên, cũng như cách tính toán tỷ giá và các dẫn xuất.Một bài báo từ người đồng sáng tạo Prometheus Julius Volz
Trong phần thứ hai của hướng dẫn này, ta sẽ xây dựng dựa trên cài đặt từ phần đầu tiên và tìm hiểu các kỹ thuật và mẫu truy vấn nâng cao hơn. Sau hướng dẫn này, bạn sẽ biết cách áp dụng lọc dựa trên giá trị, hoạt động đặt, biểu đồ và hơn thế nữa.
Yêu cầu
Hướng dẫn này dựa trên cài đặt được nêu trong Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 1 . Tối thiểu, bạn cần phải làm theo các Bước 1 và Bước 2 từ hướng dẫn đó để cài đặt một server Prometheus và ba version dịch vụ demo được giám sát. Tuy nhiên, ta cũng sẽ xây dựng dựa trên các kỹ thuật ngôn ngữ truy vấn được giải thích trong phần đầu tiên và do đó khuyên bạn nên làm việc hoàn toàn qua nó.
Bước 1 - Lọc theo giá trị và sử dụng ngưỡng
Trong phần này, ta sẽ học cách lọc các chuỗi thời gian được trả về dựa trên giá trị của chúng.
Việc sử dụng phổ biến nhất để lọc dựa trên giá trị là cho các ngưỡng cảnh báo số đơn giản. Ví dụ: ta có thể cần tìm các đường dẫn HTTP có tổng tỷ lệ yêu cầu 500
trạng thái cao hơn 0,2 mỗi giây, được tính trung bình trong 15 phút qua. Để thực hiện việc này, ta chỉ cần truy vấn tất cả các tỷ lệ yêu cầu 500
trạng thái và sau đó thêm toán tử bộ lọc > 0.2
vào cuối biểu thức:
rate(demo_api_request_duration_seconds_count{status="500",job="demo"}[15m]) > 0.2
Trong giao diện Console , kết quả sẽ như sau:
Tuy nhiên, như với số học binary , Prometheus không chỉ hỗ trợ lọc theo một số vô hướng duy nhất. Bạn cũng có thể lọc một group chuỗi thời gian dựa trên một group chuỗi khác. , các phần tử được đối sánh với các bộ nhãn của chúng và toán tử bộ lọc được áp dụng giữa các phần tử phù hợp. Chỉ các phần tử từ phía bên trái trùng với một phần tử ở phía bên phải và vượt qua bộ lọc mới trở thành một phần của kết quả . Các mệnh đề on(<labels>)
, group_left(<labels>)
, group_right(<labels>)
hoạt động theo cùng một cách ở đây như trong toán tử số học.
Ví dụ: ta có thể chọn tỷ lệ 500
trạng thái cho bất kỳ kết hợp job
, instance
, method
và path
nào mà tỷ lệ 200
trạng thái không cao hơn ít nhất 50 lần so với tỷ lệ 500
trạng thái như sau:
rate(demo_api_request_duration_seconds_count{status="500",job="demo"}[5m]) * 50 > on(job, instance, method, path) rate(demo_api_request_duration_seconds_count{status="200",job="demo"}[5m])
Điều này sẽ giống như sau:
Bên cạnh >
, Prometheus cũng hỗ trợ các toán tử so sánh >=
, <=
, <
!=
, Và ==
để sử dụng trong lọc.
Bây giờ ta biết cách lọc một tập hợp chuỗi thời gian dựa trên một giá trị số hoặc dựa trên một tập hợp giá trị chuỗi thời gian khác có nhãn phù hợp.
Bước 2 - Sử dụng toán tử bộ
Trong phần này, bạn sẽ học cách sử dụng các toán tử tập hợp của Prometheus để tương quan các tập hợp chuỗi thời gian với nhau.
Thường thì bạn muốn lọc một tập hợp chuỗi thời gian dựa trên một tập hợp khác. Đối với điều này, Prometheus cung cấp toán tử and
cài đặt . Đối với mỗi chuỗi ở phía bên trái của toán tử, nó cố gắng tìm một chuỗi ở phía bên phải có cùng nhãn. Nếu tìm thấy kết quả khớp, chuỗi bên trái sẽ trở thành một phần của kết quả . Nếu không có chuỗi phù hợp nào tồn tại ở bên phải, chuỗi sẽ bị bỏ qua khỏi kết quả .
Ví dụ: bạn có thể cần chọn bất kỳ điểm cuối HTTP nào có độ trễ phân vị thứ 90 cao hơn 50ms (0,05s) nhưng chỉ cho các kết hợp thứ nguyên nhận được nhiều hơn một yêu cầu mỗi giây. Ta sẽ sử dụng hàm histogram_quantile()
để tính phần trăm ở đây. Ta sẽ giải thích trong phần tiếp theo chính xác chức năng này hoạt động. Hiện tại, chỉ quan trọng là nó tính toán độ trễ phân vị thứ 90 cho mỗi thứ nguyên phụ. Để lọc các độ trễ xấu dẫn đến và chỉ giữ lại những độ trễ nhận được nhiều hơn một yêu cầu mỗi giây, ta có thể truy vấn:
histogram_quantile(0.9, rate(demo_api_request_duration_seconds_bucket{job="demo"}[5m])) > 0.05 and rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) > 1
Thay vì lấy điểm giao nhau, đôi khi bạn muốn xây dựng sự kết hợp từ hai bộ chuỗi thời gian. Prometheus cung cấp toán tử or
cài đặt cho việc này. Nó dẫn đến chuỗi ở phía bên trái của thao tác, cũng như bất kỳ chuỗi nào từ phía bên phải không có bộ nhãn phù hợp ở bên trái. Ví dụ: để liệt kê tất cả các tỷ lệ yêu cầu dưới 10 hoặc trên 30, hãy truy vấn:
rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) < 10 or rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) > 30
Kết quả sẽ như thế này trong một biểu đồ:
Như bạn thấy , việc sử dụng bộ lọc giá trị và hoạt động đặt trong biểu đồ có thể dẫn đến chuỗi thời gian xuất hiện và biến mất trong cùng một biểu đồ, tùy thuộc vào việc chúng có trùng với bộ lọc hay không tại bất kỳ thời điểm nào dọc theo biểu đồ. Nói chung, chỉ nên sử dụng loại logic bộ lọc này cho các luật cảnh báo.
Đến đây bạn biết cách xây dựng các giao lộ và các liên hợp ngoài chuỗi thời gian được dán nhãn.
Bước 3 - Làm việc với Biểu đồ
Trong phần này, ta sẽ học cách diễn giải các số liệu biểu đồ và cách tính toán lượng tử (một dạng tổng quát của các phân vị phần trăm) từ chúng.
Prometheus hỗ trợ các số liệu biểu đồ, cho phép một dịch vụ ghi lại sự phân bố của một loạt các giá trị. Biểu đồ thường theo dõi các phép đo như độ trễ yêu cầu hoặc kích thước phản hồi, nhưng về cơ bản có thể theo dõi bất kỳ giá trị nào dao động về độ lớn theo một số phân phối. Dữ liệu mẫu biểu đồ Prometheus ở phía client , nghĩa là chúng đếm các giá trị quan sát bằng cách sử dụng một số group có thể cấu hình (ví dụ: độ trễ) và sau đó hiển thị các group đó dưới dạng chuỗi thời gian riêng lẻ.
Bên trong, biểu đồ được triển khai dưới dạng một group chuỗi thời gian mà mỗi chuỗi đại diện cho số lượng cho một group nhất định (ví dụ: “yêu cầu dưới 10 mili giây”, “yêu cầu dưới 25 mili giây”, “yêu cầu dưới 50 mili giây”, v.v.). Bộ đếm group được tích lũy, nghĩa là các group cho giá trị lớn hơn bao gồm số lượng cho tất cả các group có giá trị thấp hơn. Trên mỗi chuỗi thời gian là một phần của biểu đồ, group tương ứng được biểu thị bằng nhãn le
(nhỏ hơn hoặc bằng) đặc biệt. Điều này thêm một thứ nguyên bổ sung vào bất kỳ thứ nguyên hiện tại nào mà bạn đang theo dõi.
Ví dụ: dịch vụ demo của ta xuất biểu đồ demo_api_request_duration_seconds_bucket
theo dõi phân phối thời lượng yêu cầu API. Vì biểu đồ này xuất 26 group cho mỗi thứ nguyên phụ được theo dõi, số liệu này có rất nhiều chuỗi thời gian. Trước tiên, hãy xem biểu đồ thô chỉ cho một loại yêu cầu, từ một trường hợp:
demo_api_request_duration_seconds_bucket{instance="localhost:8080",method="POST",path="/api/bar",status="200",job="demo"}
Bạn sẽ thấy 26 chuỗi mà mỗi chuỗi đại diện cho một group quan sát, được xác định bằng nhãn le
:
Biểu đồ có thể giúp bạn trả lời các câu hỏi như "Có bao nhiêu yêu cầu của tôi mất hơn 100 mili giây để hoàn thành?" (miễn là biểu đồ có cấu hình group có ranh giới 100ms). Mặt khác, bạn thường muốn trả lời một câu hỏi liên quan như "Độ trễ mà 99% truy vấn của tôi hoàn thành là gì?". Nếu group biểu đồ của bạn đủ chi tiết, bạn có thể tính toán điều này bằng cách sử dụng hàm histogram_quantile()
. Hàm này mong đợi một chỉ số biểu đồ (một group chuỗi có nhãn le
bucket) làm đầu vào và kết quả của các lượng tử tương ứng. Ngược lại với phân vị, nằm trong repository ảng từ phân vị thứ 0 đến phân vị thứ 100, đặc tả lượng tử mục tiêu mà hàm histogram_quantile()
mong đợi như một đầu vào nằm trong repository ảng từ 0
đến 1
(vì vậy phân vị thứ 90 sẽ tương ứng với lượng tử 0.9
).
Ví dụ: ta có thể cố gắng tính toán độ trễ API phân vị thứ 90 mọi lúc cho tất cả các thứ nguyên như sau:
# BAD! histogram_quantile(0.9, demo_api_request_duration_seconds_bucket{job="demo"})
Điều này không phải là rất hữu ích hoặc tin cậy . Bộ đếm group được đặt lại khi các version dịch vụ riêng lẻ được khởi động lại và bạn thường muốn xem độ trễ là "bây giờ" (ví dụ: như được đo trong 5 phút qua), thay vì trong toàn bộ thời gian của chỉ số. Bạn có thể đạt được điều này bằng cách áp dụng một hàm rate()
cho các bộ đếm group biểu đồ bên dưới, hàm này vừa xử lý việc đặt lại bộ đếm và cũng chỉ xem xét tốc độ tăng của mỗi group trong repository ảng thời gian được chỉ định.
Tính độ trễ API phân vị thứ 90 trong 5 phút qua như sau:
# GOOD! histogram_quantile(0.9, rate(demo_api_request_duration_seconds_bucket{job="demo"}[5m]))
Điều này tốt hơn nhiều và sẽ trông như thế này:
Tuy nhiên, điều này hiển thị cho bạn phân vị thứ 90 cho mọi thứ nguyên phụ ( job
, instance
, path
, method
và status
). , ta có thể không quan tâm đến tất cả các thứ nguyên đó và muốn tổng hợp một số thứ nguyên đó đi. May mắn là toán tử tổng hợp sum
của Prometheus có thể được tạo cùng với hàm histogram_quantile()
để cho phép ta tổng hợp theo các thứ nguyên trong thời gian truy vấn!
Truy vấn sau đây tính toán độ trễ phần trăm thứ 90, nhưng chỉ chia kết quả theo thứ nguyên job
, instance
và path
:
histogram_quantile( 0.9, sum without(status, method) ( rate(demo_api_request_duration_seconds_bucket{job="demo"}[5m]) ) )
Lưu ý : Luôn duy trì nhãn le
bucket trong mọi tập hợp trước khi áp dụng hàm histogram_quantile()
. Điều này đảm bảo nó vẫn có thể hoạt động trên các group group và tính toán các lượng tử từ chúng.
Biểu đồ bây giờ sẽ giống như sau:
Tính toán lượng tử từ biểu đồ luôn tạo ra một số sai số thống kê. Lỗi này phụ thuộc vào kích thước group của bạn, sự phân bố của các giá trị được quan sát cũng như các lượng tử mục tiêu mà bạn muốn tính toán. Để tìm hiểu thêm về điều này, hãy đọc về Sai sót của ước lượng lượng tử trong tài liệu Prometheus.
Như vậy, bạn biết cách diễn giải các chỉ số biểu đồ và cách tính toán lượng tử từ chúng cho các phạm vi thời gian khác nhau, đồng thời tổng hợp nhanh chóng trên một số thứ nguyên.
Bước 4 - Làm việc với Chỉ số Dấu thời gian
Trong phần này, ta sẽ tìm hiểu cách sử dụng các chỉ số có chứa dấu thời gian.
Các thành phần trong hệ sinh thái Prometheus thường xuyên hiển thị dấu thời gian. Ví dụ: đây có thể là lần cuối cùng mà một công việc hàng loạt được hoàn thành , lần cuối cùng một file cấu hình được reload thành công hoặc khi một máy được khởi động. Theo quy ước, thời gian được biểu thị dưới dạng dấu thời gian Unix tính bằng giây kể từ ngày 1 tháng 1 năm 1970 UTC.
Ví dụ: dịch vụ demo hiển thị lần cuối cùng khi công việc hàng loạt được mô phỏng thành công:
demo_batch_last_success_timestamp_seconds{job="demo"}
Công việc hàng loạt này được mô phỏng để chạy một lần mỗi phút, nhưng không thành công trong 25% tất cả các lần thử. Trong trường hợp thất bại, chỉ số demo_batch_last_success_timestamp_seconds
giữ giá trị cuối cùng của nó cho đến khi một lần chạy thành công khác xảy ra.
Nếu bạn vẽ biểu đồ cho dấu thời gian thô, nó sẽ giống như sau:
Như bạn thấy , giá trị dấu thời gian thô thường không hữu ích lắm. Thay vào đó, bạn thường muốn biết giá trị dấu thời gian cũ là bao nhiêu. Một mẫu phổ biến là trừ dấu thời gian trong chỉ số khỏi thời gian hiện tại, như được cung cấp bởi hàm time()
:
time() - demo_batch_last_success_timestamp_seconds{job="demo"}
Điều này mang lại thời gian tính bằng giây kể từ lần chạy công việc hàng loạt thành công cuối cùng:
Nếu bạn muốn chuyển đổi độ tuổi này từ giây thành giờ, bạn có thể chia kết quả cho 3600
:
(time() - demo_batch_last_success_timestamp_seconds{job="demo"}) / 3600
Một biểu thức như thế này hữu ích cho cả việc vẽ đồ thị và cảnh báo. Khi hình dung tuổi dấu thời gian như trên, bạn sẽ nhận được một biểu đồ răng cưa, với các đường tăng tuyến tính và thường xuyên đặt lại về 0
khi công việc hàng loạt hoàn thành . Nếu một cành răng cưa quá lớn, điều này cho thấy một công việc hàng loạt chưa hoàn thành trong một thời gian dài. Bạn cũng có thể cảnh báo về điều này bằng cách thêm bộ lọc >
ngưỡng vào biểu thức và cảnh báo về chuỗi thời gian kết quả (mặc dù ta sẽ không đề cập đến các luật cảnh báo trong hướng dẫn này).
Để chỉ cần liệt kê các trường hợp mà công việc hàng loạt chưa hoàn thành trong 1,5 phút qua, bạn có thể chạy truy vấn sau:
time() - demo_batch_last_success_timestamp_seconds{job="demo"} > 1.5 * 60
Như vậy, bạn đã biết cách chuyển các chỉ số dấu thời gian thô thành độ tuổi tương đối, điều này rất hữu ích cho cả việc vẽ đồ thị và cảnh báo.
Bước 5 - Sắp xếp và sử dụng các chức năng topk / bottomk
Trong bước này, bạn sẽ học cách sắp xếp kết quả truy vấn hoặc chỉ chọn các giá trị lớn nhất hoặc nhỏ nhất của một tập hợp chuỗi.
Trong dạng xem Control panel dạng bảng, thường hữu ích khi sắp xếp chuỗi kết quả theo giá trị của chúng. Bạn có thể đạt được điều này bằng cách sử dụng các hàm sort()
(sắp xếp tăng dần) và sort_desc()
(sắp xếp giảm dần). Ví dụ: để hiển thị tỷ lệ yêu cầu trên mỗi đường dẫn được sắp xếp theo giá trị của chúng, từ cao nhất đến thấp nhất, bạn có thể truy vấn:
sort_desc(sum by(path) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m])))
Đầu ra được sắp xếp sẽ giống như sau:
Hoặc có thể bạn thậm chí không quan tâm đến việc hiển thị tất cả các chuỗi mà chỉ xem K chuỗi lớn nhất hoặc nhỏ nhất. Đối với điều này, Prometheus cung cấp các topk()
và bottomk()
. Mỗi chúng nhận một giá trị K (bao nhiêu chuỗi bạn muốn chọn) và một biểu thức tùy ý trả về một tập hợp chuỗi thời gian cần được lọc. Ví dụ: để chỉ hiển thị ba tỷ lệ yêu cầu hàng đầu cho mỗi đường dẫn và phương pháp, bạn có thể truy vấn:
topk(3, sum by(path, method) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m])))
Mặc dù việc sắp xếp chỉ hữu ích trong chế độ xem Control panel , nhưng topk()
và bottomk()
cũng có thể hữu ích trong biểu đồ. Chỉ cần lưu ý kết quả sẽ không hiển thị chuỗi K trên cùng hoặc dưới cùng được tính trung bình trong toàn bộ phạm vi thời gian của biểu đồ - thay vào đó, kết quả sẽ tính toán lại chuỗi kết quả K trên cùng hoặc dưới cùng cho mỗi bước phân giải dọc theo biểu đồ. Do đó, chuỗi K trên cùng hoặc dưới cùng của bạn có thể thay đổi theo phạm vi của biểu đồ và biểu đồ của bạn có thể hiển thị tổng cộng nhiều hơn K chuỗi.
Bây giờ ta đã học cách sắp xếp hoặc chỉ chọn K chuỗi lớn nhất hoặc nhỏ nhất.
Bước 6 - Kiểm tra tình trạng của các vật thể bị phế liệu
Trong bước này, ta sẽ tìm hiểu cách kiểm tra sức khỏe bản sao của ta theo thời gian.
Để làm cho phần thú vị hơn, hãy kết thúc version đầu tiên trong ba version dịch vụ demo nền của bạn (phiên bản đang nghe trên cổng 8080):
- pkill -f -- -listen-address=:8080
Khi nào Prometheus cạo một mục tiêu, nó sẽ lưu một mẫu tổng hợp với tên metric up
và job
và instance
nhãn của instance cạo. Nếu quá trình cạo thành công, giá trị của mẫu được đặt thành 1
. Nó được đặt thành 0
nếu quá trình cạo không thành công. Do đó, ta có thể dễ dàng truy vấn version nào hiện đang "tăng" hoặc "giảm":
up{job="demo"}
Điều này bây giờ sẽ hiển thị một trường hợp dưới dạng:
Để chỉ hiển thị các bản sao, bạn có thể lọc giá trị 0
:
up{job="demo"} == 0
Đến đây bạn sẽ chỉ thấy version mà bạn đã chấm dứt:
Hoặc, để có được tổng số các trường hợp ngược:
count by(job) (up{job="demo"} == 0)
Điều này sẽ hiển thị cho bạn số lượng là 1
:
Những loại truy vấn này hữu ích cho việc cảnh báo tình trạng cạo vôi răng cơ bản.
Lưu ý : Khi không có trường hợp lỗi nào, truy vấn này trả về một kết quả trống thay vì một chuỗi kết quả duy nhất với số lượng là 0
. Điều này là do count()
là một nhà điều hành tập hợp mà hy vọng một tập hợp các chuỗi thời gian chiều như group đầu vào và lon nó series kết quả theo một by
hay without
khoản. Bất kỳ group kết quả nào chỉ có thể dựa trên chuỗi đầu vào hiện có - nếu không có chuỗi đầu vào nào cả, thì không có kết quả nào được tạo ra.
Đến đây bạn biết cách truy vấn trạng thái sức khỏe ví dụ.
Kết luận
Trong hướng dẫn này, ta đã xây dựng dựa trên tiến trình của Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 1 và bao gồm các kỹ thuật và mẫu truy vấn nâng cao hơn. Ta đã học cách lọc chuỗi dựa trên giá trị của chúng, tính toán lượng tử từ biểu đồ, xử lý các chỉ số dựa trên dấu thời gian và hơn thế nữa.
Mặc dù các hướng dẫn này không thể bao gồm tất cả các trường hợp sử dụng truy vấn có thể có, ta hy vọng rằng các truy vấn mẫu sẽ hữu ích cho bạn khi xây dựng các truy vấn, trang tổng quan và cảnh báo trong thế giới thực với Prometheus. Để biết thêm chi tiết về ngôn ngữ truy vấn của Prometheus, hãy xem tài liệu về ngôn ngữ truy vấn của Prometheus .
Các tin liên quan
Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 12016-03-15
Cách tạo và sử dụng bản backup MongoDB trên Ubuntu 14.04
2016-03-08
Cách cài đặt puppet 4 trong thiết lập tác nhân chính trên Ubuntu 14.04
2016-03-08
Cách cài đặt, cấu hình và triển khai Rocket.Chat trên Ubuntu 14.04
2016-03-07
Cách cài đặt ứng dụng khách Dropbox làm dịch vụ trên Ubuntu 14.04
2016-02-24
Cách thiết lập cụm sản xuất Elasticsearch trên Ubuntu 14.04
2016-02-22
Cách chạy ứng dụng Meteor an toàn với Sandstorm trên Ubuntu 14.04
2016-02-10
Cách bảo vệ WordPress khỏi các cuộc tấn công XML-RPC trên Ubuntu 14.04
2016-02-04
Cách tạo blog với Hexo trên Ubuntu 14.04
2016-02-04
Cách cài đặt Graylog 1.x trên Ubuntu 14.04
2016-02-04