Thứ ba, 15/03/2016 | 00:00 GMT+7

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:

Lọc tỷ lệ yêu cầu theo số vô hướng

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ượ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 , methodpath 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:

Lọc tỷ lệ yêu cầu theo tập hợp các chuỗi khác

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 

Lọc tỷ lệ yêu cầu theo điểm giao nhau

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 đồ:

Tạo liên hợp trong số hai bộ tỷ lệ yêu cầ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 :

Chuỗi biểu đồ thô

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:

Lượng tử được tính toán cho tất cả các thứ nguyên yêu cầu

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 , methodstatus ). , 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 , instancepath :

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:

Lượng tử được tính toán cho một số thứ nguyên yêu cầu

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:

Biểu đồ dấu thời gian thô

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:

Biểu đồ tuổi dấu thời gian

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 

Hiển thị hàng loạt công việc bị chậm lại

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:

Tỷ lệ yêu cầu được sắp xếp

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()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]))) 

Ba tỷ lệ yêu cầu hàng đầu

Mặc dù việc sắp xếp chỉ hữu ích trong chế độ xem Control panel , nhưng topk()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 upjobinstance 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:

Hiển thị tình trạng bản sao

Để 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:

Hiển thị các bản sao

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 :

Hiển thị số lượng bản sao

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 .


Tags:

Các tin liên quan

Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 1
2016-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