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

Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 1

Prometheus là một hệ thống giám sát open-souce và database chuỗi thời gian. Một trong những khía cạnh quan trọng nhất của Prometheus là mô hình dữ liệu đa chiều cùng với ngôn ngữ truy vấn đi kèm. Ngôn ngữ truy vấn này cho phép bạn chia nhỏ dữ liệu thứ nguyên của bạn để trả lời các câu hỏi hoạt động theo cách đặc biệt, hiển thị xu hướng trong trang tổng quan hoặc tạo cảnh báo về các lỗi trong hệ thống của bạn.

Một bài báo từ người đồng sáng tạo Prometheus Julius Volz

Trong hướng dẫn này, ta sẽ học cách truy vấn Prometheus 1.3.1. Để có dữ liệu mẫu phù hợp để làm việc, ta sẽ cài đặt ba version dịch vụ demo giống nhau để xuất các số liệu tổng hợp thuộc nhiều loại khác nhau. Sau đó, ta sẽ cài đặt một server Prometheus để thu thập và lưu trữ các số liệu đó. Sử dụng các số liệu mẫu, sau đó ta sẽ học cách truy vấn Prometheus, bắt đầu với các truy vấn đơn giản và chuyển sang các truy vấn nâng cao hơn.

Sau hướng dẫn này, bạn sẽ biết cách chọn và lọc chuỗi thời gian dựa trên thứ nguyên của chúng, tổng hợp và biến đổi chuỗi thời gian, cũng như cách thực hiện số học giữa các chỉ số khác nhau. Trong hướng dẫn tiếp theo, Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 2 , ta sẽ xây dựng dựa trên kiến thức từ hướng dẫn này để đề cập đến các trường hợp sử dụng truy vấn nâng cao hơn.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

Bước 1 - Cài đặt Prometheus

Trong bước này, ta sẽ download , cấu hình và chạy server Prometheus để loại bỏ ba version dịch vụ demo (chưa chạy).

Đầu tiên, download Prometheus:

  • wget https://github.com/prometheus/prometheus/releases/download/v1.3.1/prometheus-1.3.1.linux-amd64.tar.gz

Extract tarball:

  • tar xvfz prometheus-1.3.1.linux-amd64.tar.gz

Tạo file cấu hình Prometheus tối thiểu trên hệ thống file server tại ~/prometheus.yml :

  • nano ~/prometheus.yml

Thêm các nội dung sau vào file :

~ / prometheus.yml
# Scrape the three demo service instances every 5 seconds. global:   scrape_interval: 5s  scrape_configs:   - job_name: 'demo'     static_configs:       - targets:         - 'localhost:8080'         - 'localhost:8081'         - 'localhost:8082' 

Lưu và thoát nano.

Cấu hình ví dụ này làm cho Prometheus loại bỏ các version demo. Prometheus hoạt động với mô hình kéo, đó là lý do tại sao nó cần được cấu hình để biết về các điểm cuối để lấy số liệu từ đó. Các version demo vẫn chưa chạy nhưng sẽ chạy trên cổng 8080 , 80818082 sau đó.

Khởi động Prometheus bằng cách sử dụng nohup và như một quy trình :

  • nohup ./prometheus-1.3.1.linux-amd64/prometheus -storage.local.memory-chunks=10000 &

nohup ở đầu lệnh sẽ gửi kết quả đến file ~/nohup.out thay vì stdout . Dấu & ở cuối lệnh sẽ cho phép quá trình tiếp tục chạy ở chế độ nền trong khi cung cấp cho bạn dấu nhắc về các lệnh bổ sung. Để đưa quá trình trở lại nền trước (tức là quay lại quá trình đang chạy của terminal ), hãy sử dụng lệnh fg tại cùng một terminal .

Nếu mọi việc suôn sẻ, trong file ~/nohup.out , bạn sẽ thấy kết quả tương tự như sau:

Đầu ra từ khởi động Prometheus
time="2016-11-23T03:10:33Z" level=info msg="Starting prometheus (version=1.3.1, branch=master, revision=be476954e80349cb7ec3ba6a3247cd712189dfcb)" source="main.go:75" time="2016-11-23T03:10:33Z" level=info msg="Build context (go=go1.7.3, user=root@37f0aa346b26, date=20161104-20:24:03)" source="main.go:76" time="2016-11-23T03:10:33Z" level=info msg="Loading configuration file prometheus.yml" source="main.go:247" time="2016-11-23T03:10:33Z" level=info msg="Loading series map and head chunks..." source="storage.go:354" time="2016-11-23T03:10:33Z" level=info msg="0 series loaded." source="storage.go:359" time="2016-11-23T03:10:33Z" level=warning msg="No AlertManagers configured, not dispatching any alerts" source="notifier.go:176" time="2016-11-23T03:10:33Z" level=info msg="Starting target manager..." source="targetmanager.go:76" time="2016-11-23T03:10:33Z" level=info msg="Listening on :9090" source="web.go:240" 

Trong một terminal khác, bạn có thể theo dõi nội dung của file này bằng lệnh tail -f ~/nohup.out . Khi nội dung được ghi vào file , nó sẽ được hiển thị trên terminal .

Theo mặc định, Prometheus sẽ tải cấu hình của nó từ prometheus.yml (mà ta vừa tạo) và lưu trữ dữ liệu số liệu của nó trong ./data trong folder làm việc hiện tại.

Cờ -storage.local.memory-chunks điều chỉnh mức sử dụng bộ nhớ của Prometheus theo lượng RAM rất nhỏ của hệ thống server (chỉ 512MB) và số lượng nhỏ chuỗi thời gian được lưu trữ trong hướng dẫn này.

Đến đây bạn có thể truy cập server Prometheus của bạn tại http:// your_server_ip :9090/ . Xác minh nó được cấu hình để thu thập số liệu từ ba version demo bằng cách đi tới http:// your_server_ip :9090/status và định vị ba điểm cuối mục tiêu cho công việc demo trong phần Mục tiêu . Cột Trạng thái cho cả ba mục tiêu phải hiển thị trạng thái của mục tiêu là XUỐNG vì các version demo chưa được bắt đầu và do đó không thể loại bỏ:

Các version  demo sẽ được hiển thị dưới dạng XUỐNG

Bước 2 - Cài đặt Phiên bản Demo

Trong phần này, ta sẽ cài đặt và chạy ba version dịch vụ demo.

Download dịch vụ demo:

  • wget https://github.com/juliusv/prometheus_demo_service/releases/download/0.0.4/prometheus_demo_service-0.0.4.linux-amd64.tar.gz

Extract nó:

  • tar xvfz prometheus_demo_service-0.0.4.linux-amd64.tar.gz

Chạy dịch vụ demo ba lần trên các cổng riêng biệt:

  • ./prometheus_demo_service -listen-address=:8080 &
  • ./prometheus_demo_service -listen-address=:8081 &
  • ./prometheus_demo_service -listen-address=:8082 &

& Khởi động các dịch vụ demo trong nền. Họ sẽ không ghi lại bất cứ thứ gì, nhưng họ sẽ hiển thị các chỉ số Prometheus trên điểm cuối HTTP /metrics trên các cổng tương ứng của họ.

Các dịch vụ demo này xuất các số liệu tổng hợp về một số hệ thống con được mô phỏng. Đó là:

  • Server API HTTP hiển thị số lượng và độ trễ yêu cầu (được khóa bằng đường dẫn, phương thức và mã trạng thái phản hồi)
  • Công việc hàng loạt định kỳ hiển thị dấu thời gian của lần chạy thành công cuối cùng và số byte đã xử lý
  • Số liệu tổng hợp về số lượng CPU và việc sử dụng chúng
  • Số liệu tổng hợp về tổng kích thước của đĩa và cách sử dụng

Các số liệu riêng lẻ được giới thiệu trong các ví dụ truy vấn ở phần sau.

Server Prometheus bây giờ sẽ tự động bắt đầu quét ba version demo của bạn. Đi tới trang trạng thái của server Prometheus của bạn tại http:// your_server_ip :9090/status và xác minh các mục tiêu cho công việc demo hiện đang hiển thị trạng thái TĂNG :

Các mục tiêu demo phải được hiển thị là TĂNG

Bước 3 - Sử dụng trình duyệt truy vấn

Trong bước này, ta sẽ tự làm quen với giao diện web truy vấn và vẽ đồ thị được tích hợp sẵn của Prometheus. Mặc dù giao diện này tuyệt vời để khám phá dữ liệu đặc biệt và tìm hiểu về ngôn ngữ truy vấn của Prometheus, nhưng nó không phù hợp để xây dựng các trang tổng quan liên tục và không hỗ trợ các tính năng trực quan hóa nâng cao. Để xây dựng trang tổng quan, hãy xem ví dụ Cách thêm Trang tổng quan Prometheus vào Grafana .

http:// your_server_ip :9090/graph trên server Prometheus của bạn. Nó sẽ giống như thế này:

Giao diện vẽ đồ thị và truy vấn Prometheus

Như bạn thấy, có hai tab: GraphConsole . Prometheus cho phép bạn truy vấn dữ liệu ở hai chế độ khác nhau:

  • Tab Control panel cho phép bạn đánh giá một biểu thức truy vấn tại thời điểm hiện tại. Sau khi chạy truy vấn, một bảng sẽ hiển thị giá trị hiện tại của mỗi chuỗi thời gian kết quả (một hàng bảng trên mỗi chuỗi kết quả ).
  • Tab Biểu đồ cho phép bạn vẽ biểu đồ truy vấn trong một khoảng thời gian cụ thể.

Vì Prometheus có thể mở rộng đến hàng triệu chuỗi thời gian, nên có thể xây dựng các truy vấn rất tốn kém (hãy nghĩ điều này tương tự như việc chọn tất cả các hàng từ một bảng lớn trong database SQL). Để tránh các truy vấn hết thời gian chờ hoặc quá tải server của bạn, bạn nên bắt đầu khám phá và xây dựng các truy vấn trong chế độ xem Control panel trước thay vì vẽ biểu đồ chúng ngay lập tức. Việc đánh giá một truy vấn tiềm năng tốn kém tại một thời điểm sẽ sử dụng ít tài nguyên hơn nhiều so với việc cố gắng vẽ biểu đồ cùng một truy vấn trong một khoảng thời gian.

Khi bạn đã thu hẹp đủ truy vấn (về chuỗi nó chọn để tải, tính toán nó cần thực hiện và số chuỗi thời gian kết quả ), thì bạn có thể chuyển sang tab Đồ thị để hiển thị biểu thức được đánh giá theo thời gian. Biết khi nào một truy vấn đủ rẻ để được vẽ biểu đồ không phải là khoa học chính xác và phụ thuộc vào dữ liệu , yêu cầu về độ trễ của bạn và sức mạnh của máy bạn đang chạy server Prometheus của bạn . Bạn sẽ có cảm giác về điều này theo thời gian.

Vì server Prometheus thử nghiệm của ta sẽ không quét nhiều dữ liệu, ta thực sự sẽ không thể tạo bất kỳ truy vấn tốn kém nào trong hướng dẫn này.Mọi truy vấn mẫu có thể được xem cả trong dạng xem Biểu đồ Control panel mà không gặp rủi ro.

Để giảm hoặc tăng phạm vi thời gian của biểu đồ, hãy nhấp vào nút - hoặc + . Để di chuyển thời gian kết thúc của biểu đồ, hãy nhấn các node << hoặc >> . Bạn có thể xếp chồng một biểu đồ bằng cách kích hoạt hộp kiểm xếp chồng . Cuối cùng, Res. (các) đầu vào cho phép bạn chỉ định độ phân giải truy vấn tùy chỉnh (không cần thiết trong hướng dẫn này).

Bước 4 - Thực hiện các truy vấn chuỗi thời gian đơn giản

Trước khi bắt đầu truy vấn, hãy nhanh chóng xem xét mô hình dữ liệu và thuật ngữ của Prometheus. Về cơ bản, Prometheus lưu trữ tất cả dữ liệu dưới dạng chuỗi thời gian. Mỗi chuỗi thời gian được xác định bằng tên số liệu, cũng như một tập hợp các cặp key-value mà Prometheus gọi là nhãn . Tên chỉ số cho biết khía cạnh tổng thể của hệ thống đang được đo lường (ví dụ: số lượng yêu cầu HTTP được xử lý kể từ khi khởi động quy trình, http_requests_total ). Các nhãn dùng để phân biệt các thứ nguyên phụ của chỉ số như phương thức HTTP (ví dụ: method="POST" ) hoặc đường dẫn (ví dụ: path="/api/foo" ). Cuối cùng, một chuỗi các mẫu tạo thành dữ liệu thực tế cho một chuỗi. Mỗi mẫu bao gồm một dấu thời gian và một giá trị, trong đó dấu thời gian có độ chính xác mili giây và giá trị luôn là giá trị dấu chấm động 64 bit.

Truy vấn đơn giản nhất mà ta có thể lập công thức trả về tất cả các chuỗi có tên chỉ số nhất định. Ví dụ: dịch vụ demo xuất một số liệu demo_api_request_duration_seconds_count đại diện cho số lượng yêu cầu API HTTP tổng hợp được xử lý bởi dịch vụ giả. Bạn có thể tự hỏi tại sao tên chỉ số lại chứa chuỗi duration_seconds . Điều này là do bộ đếm này là một phần của chỉ số biểu đồ lớn hơn có tên demo_api_request_duration_seconds , chủ yếu theo dõi phân phối thời lượng yêu cầu nhưng cũng hiển thị tổng số yêu cầu được theo dõi (kèm theo _count ở đây) như một sản phẩm phụ hữu ích.

Đảm bảo rằng tab truy vấn Control panel được chọn, nhập truy vấn sau vào trường văn bản ở đầu trang và nhấp vào nút Thực thi để thực hiện truy vấn:

demo_api_request_duration_seconds_count 

Vì Prometheus đang theo dõi ba trường hợp dịch vụ, bạn sẽ thấy kết quả dạng bảng chứa 27 chuỗi thời gian kết quả với tên chỉ số này, một chuỗi cho mỗi version dịch vụ được theo dõi, đường dẫn, phương thức HTTP và mã trạng thái HTTP. Bên cạnh các nhãn được đặt bởi chính các version dịch vụ ( method , pathstatus ), chuỗi sẽ có các nhãn instancejob thích hợp để phân biệt các version dịch vụ khác nhau với nhau. Prometheus tự động gắn các nhãn này khi lưu trữ chuỗi thời gian từ các mục tiêu đã được cạo. Đầu ra sẽ như thế này:

Yêu cầu API được tính là  kết quả  dạng bảng

Giá trị số được hiển thị trong cột bảng bên phải là giá trị hiện tại của mỗi chuỗi thời gian. Vui lòng vẽ biểu đồ kết quả (nhấp vào tab Biểu đồ và nhấp lại Thực thi ) cho truy vấn này và các truy vấn tiếp theo để xem các giá trị phát triển như thế nào theo thời gian.

Như vậy, ta có thể thêm trình đối sánh nhãn để giới hạn chuỗi được trả về dựa trên nhãn của chúng. Trình đối sánh nhãn trực tiếp theo sau tên chỉ số trong dấu ngoặc nhọn. Ở dạng đơn giản nhất, chúng lọc các chuỗi có giá trị chính xác cho một nhãn nhất định. Ví dụ: truy vấn này sẽ chỉ hiển thị số lượng yêu cầu cho bất kỳ yêu cầu GET nào:

demo_api_request_duration_seconds_count{method="GET"} 

Đối sánh có thể được kết hợp bằng cách sử dụng dấu phẩy. Ví dụ: ta cũng có thể lọc thêm các chỉ số từ version localhost:8080demo công việc:

demo_api_request_duration_seconds_count{instance="localhost:8080",method="GET",job="demo"} 

Kết quả sẽ như thế này:

Yêu cầu API đã lọc được tính là  kết quả  dạng bảng

Khi kết hợp nhiều trình so khớp, tất cả chúng cần phải khớp để chọn một chuỗi. Biểu thức trên chỉ trả về số lượng yêu cầu API cho version dịch vụ chạy trên cổng 8080 và nơi phương thức HTTP là GET . Ta cũng đảm bảo ta chỉ chọn các chỉ số thuộc về công việc demo .

Lưu ý : Nên luôn chỉ định nhãn job khi chọn chuỗi thời gian. Điều này đảm bảo bạn không vô tình chọn các chỉ số có cùng tên từ một công việc khác (tất nhiên, trừ khi đó thực sự là mục tiêu của bạn!). Mặc dù ta chỉ theo dõi một công việc trong hướng dẫn này, ta vẫn sẽ chọn theo tên công việc trong hầu hết các ví dụ sau để nhấn mạnh tầm quan trọng của thực hành này.

Bên cạnh đối sánh bình đẳng, Prometheus hỗ trợ đối sánh không bình đẳng ( != ), Đối sánh biểu thức chính quy ( =~ ), cũng như đối sánh biểu thức chính quy phủ định ( !~ ). Cũng có thể bỏ qua hoàn toàn tên chỉ số và chỉ truy vấn bằng cách sử dụng trình đối sánh nhãn. Ví dụ: để liệt kê tất cả các chuỗi ( dù tên chỉ số hoặc công việc nào) mà nhãn path bắt đầu bằng /api , bạn có thể chạy truy vấn sau:

{path=~"/api.*"} 

Biểu thức chính quy ở trên cần phải kết thúc bằng .* Vì biểu thức chính quy luôn trùng với một chuỗi đầy đủ trong Prometheus.

Chuỗi thời gian kết quả sẽ là sự kết hợp của nhiều chuỗi với các tên chỉ số khác nhau:

Chuỗi đối sánh regex dưới dạng  kết quả  dạng bảng

Đến đây bạn biết cách chọn chuỗi thời gian theo tên chỉ số của chúng, cũng như bằng cách kết hợp các giá trị nhãn của chúng.

Bước 5 - Tính giá và các phái sinh khác

Trong phần này, ta sẽ tìm hiểu cách tính toán tỷ lệ hoặc tỷ lệ delta của một số liệu theo thời gian.

Một trong những hàm thường xuyên nhất mà bạn sẽ sử dụng trong Prometheus là rate() . Thay vì tính toán tỷ lệ sự kiện trực tiếp trong dịch vụ thiết bị, trong Prometheus, thông thường theo dõi các sự kiện bằng cách sử dụng bộ đếm thô và để server Prometheus tính toán tỷ lệ đặc biệt trong thời gian truy vấn (điều này có một số lợi thế, chẳng hạn như không làm mất đột biến tỷ lệ giữa các mẩu tin lưu niệm, cũng như có thể chọn các cửa sổ tính trung bình động tại thời điểm truy vấn). Bộ đếm bắt đầu từ 0 khi một dịch vụ được giám sát bắt đầu và liên tục tăng dần theo thời gian tồn tại của quy trình dịch vụ. Đôi khi, khi một quá trình được giám sát khởi động lại, bộ đếm của nó sẽ đặt lại về 0 và bắt đầu leo lại từ đó. Vẽ đồ thị bộ đếm thô thường không hữu ích lắm, vì bạn sẽ chỉ thấy một đường ngày càng tăng với các lần đặt lại không thường xuyên. Bạn có thể thấy điều đó bằng cách vẽ biểu đồ số lượng yêu cầu API của dịch vụ demo:

demo_api_request_duration_seconds_count{job="demo"} 

Nó sẽ giống như sau:

Vẽ đồ thị bộ đếm thô

Để làm cho bộ đếm trở nên hữu ích, ta có thể sử dụng hàm rate() để tính tốc độ gia tăng mỗi giây của chúng. Ta cần cho biết rate() trong repository ảng thời gian nào để tỷ lệ trung bình bằng cách cung cấp bộ chọn phạm vi sau trình đối sánh chuỗi (như [5m] ). Ví dụ: để tính mức tăng mỗi giây của chỉ số bộ đếm ở trên, được tính trung bình trong năm phút qua, hãy vẽ biểu đồ cho truy vấn sau:

rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) 

Kết quả bây giờ hữu ích hơn nhiều:

Biểu đồ tỷ lệ của quầy

rate() thông minh và tự động điều chỉnh để đặt lại bộ đếm bằng cách giả định bất kỳ sự giảm giá trị bộ đếm nào cũng là một lần đặt lại.

Một biến thể của rate()irate() . Trong khi rate() trung bình tỷ lệ trên tất cả các mẫu trong repository ảng thời gian nhất định (trong trường hợp này là năm phút), irate() chỉ bao giờ nhìn lại hai mẫu trong quá khứ. Nó vẫn yêu cầu bạn chỉ định một khoảng thời gian (như [5m] ) để biết cách tối đa để nhìn ngược thời gian cho hai mẫu đó. irate() sẽ phản ứng nhanh hơn với các thay đổi tỷ lệ và do đó thường được khuyến khích sử dụng trong đồ thị. Ngược lại, rate() sẽ cung cấp tỷ lệ mượt mà hơn và được khuyến khích sử dụng trong các biểu thức cảnh báo (vì các mức tăng đột biến tỷ lệ ngắn sẽ bị giảm bớt và không đánh thức bạn vào ban đêm).

Với irate() , biểu đồ trên sẽ giống như thế này, cho thấy các mức giảm gián đoạn ngắn trong tỷ lệ yêu cầu:

Vẽ biểu đồ tỷ giá tức thì của quầy

rate()irate() luôn tính tỷ lệ trên giây . Đôi khi bạn cần biết tổng số tiền mà bộ đếm tăng lên trong một khoảng thời gian nhưng vẫn chính xác để đặt lại bộ đếm. Bạn có thể đạt được điều này bằng hàm increase() . Ví dụ: để tính tổng số yêu cầu được xử lý trong một giờ qua, hãy truy vấn:

increase(demo_api_request_duration_seconds_count{job="demo"}[1h]) 

Bên cạnh các bộ đếm (chỉ có thể tăng), có các chỉ số đo. Đồng hồ đo là các giá trị có thể tăng hoặc giảm theo thời gian, như nhiệt độ hoặc dung lượng đĩa trống. Nếu ta muốn tính toán những thay đổi của đồng hồ đo theo thời gian, ta không thể sử dụng họ hàm rate() / irate() / increase() . Tất cả những thứ này đều hướng tới bộ đếm, vì chúng diễn giải bất kỳ sự sụt giảm nào trong giá trị chỉ số là một lần đặt lại bộ đếm và bù đắp cho nó. Thay vào đó, ta có thể sử dụng hàm dẫn xuất deriv() , tính toán đạo hàm trên giây của đại lượng đo dựa trên hồi quy tuyến tính.

Ví dụ: để xem tốc độ sử dụng đĩa hư cấu được xuất bởi dịch vụ demo của ta đang tăng hoặc giảm (tính bằng MiB / giây) dựa trên hồi quy tuyến tính trong 15 phút qua, ta có thể truy vấn:

deriv(demo_disk_usage_bytes{job="demo"}[15m]) 

Kết quả sẽ như thế này:

Vẽ đồ thị phái sinh của việc sử dụng đĩa

Để tìm hiểu thêm về cách tính toán delta() và xu hướng trong đồng hồ đo, hãy xem thêm hàm delta()predict_linear() .

Bây giờ ta biết cách tính toán tỷ lệ trên giây với các hành vi tính trung bình khác nhau, cách xử lý đặt lại bộ đếm trong tính toán tỷ lệ, cũng như cách tính toán phái sinh cho đồng hồ đo.

Bước 6 - Tổng hợp theo chuỗi thời gian

Trong phần này, ta sẽ học cách tổng hợp qua các chuỗi riêng lẻ.

Prometheus thu thập dữ liệu với chi tiết kích thước cao, có thể tạo ra nhiều chuỗi cho mỗi tên chỉ số. Tuy nhiên, bạn thường không quan tâm đến tất cả các thứ nguyên và thậm chí bạn có thể có quá nhiều chuỗi để vẽ biểu đồ cho tất cả chúng cùng một lúc một cách hợp lý. Giải pháp là tổng hợp trên một số kích thước và chỉ giữ lại những thứ bạn quan tâm. Ví dụ: dịch vụ demo theo dõi các yêu cầu API HTTP theo method , pathstatus . Prometheus thêm các thứ nguyên khác vào số liệu này khi cạo nó từ Node Exporter: nhãn instancejob theo dõi quá trình lấy số liệu. Bây giờ, để xem tổng tỷ lệ yêu cầu trên tất cả các thứ nguyên, ta có thể sử dụng toán tử tổng hợp sum() :

sum(rate(demo_api_request_duration_seconds_count{job="demo"}[5m])) 

Tuy nhiên, điều này tổng hợp trên tất cả các thứ nguyên và tạo ra một chuỗi kết quả duy nhất:

Tổng hợp tất cả các thứ nguyên tỷ lệ yêu cầu

Tuy nhiên, thông thường, bạn cần bảo toàn một số kích thước trong kết quả . Đối với điều này, sum() và các trình tổng hợp khác hỗ trợ mệnh đề without(<label names>) chỉ định các thứ nguyên để tổng hợp lại. Ngoài ra còn có một mệnh đề thay thế đối lập với by(<label names>) cho phép bạn chỉ định tên nhãn nào cần giữ lại. Nếu ta muốn biết tổng tỷ lệ yêu cầu được tổng hợp trên cả ba version dịch vụ và tất cả các đường dẫn, nhưng chia nhỏ kết quả theo phương pháp và mã trạng thái, ta có thể truy vấn:

sum without(method, status) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m])) 

Điều này tương đương với:

sum by(instance, path, job) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m])) 

Tổng kết quả hiện được group theo instance , pathjob :

Bảo toàn một số thứ nguyên trong khi tính tổng

Lưu ý : Luôn tính toán rate() , irate() hoặc increase() trước khi áp dụng bất kỳ tổng hợp nào. Nếu bạn áp dụng tổng hợp trước, nó sẽ ẩn các cài đặt lại bộ đếm và các chức năng này sẽ không thể hoạt động bình thường nữa.

Prometheus hỗ trợ các toán tử tổng hợp sau, mỗi toán tử hỗ trợ mệnh đề by() hoặc without() để chọn thứ nguyên nào cần bảo toàn:

  • sum : tổng tất cả các giá trị trong một group tổng hợp.
  • min : chọn giá trị nhỏ nhất trong một group tổng hợp.
  • max : chọn giá trị tối đa trong một group tổng hợp.
  • avg : tính giá trị trung bình (trung bình cộng) của tất cả các giá trị trong một group tổng hợp.
  • stddev : tính toán độ lệch chuẩn của tất cả các giá trị trong một group tổng hợp.
  • stdvar : tính toán phương sai tiêu chuẩn của tất cả các giá trị trong một group tổng hợp.
  • count : tính tổng số chuỗi trong một group tổng hợp.

Đến đây bạn đã học cách tổng hợp trên một danh sách các chuỗi và cách chỉ bảo toàn các thứ nguyên mà bạn quan tâm.

Bước 7 - Thực hiện số học

Trong phần này, ta sẽ học cách làm số học trong Prometheus.

Là ví dụ số học đơn giản nhất, bạn có thể sử dụng Prometheus làm máy tính số. Ví dụ: chạy truy vấn sau trong dạng xem Control panel :

(4 + 7) * 3 

Bạn sẽ nhận được một giá trị kết quả vô hướng duy nhất là 33 :

Kết quả số học vô hướng

Giá trị vô hướng là một giá trị số đơn giản không có bất kỳ nhãn nào. Để làm cho điều này hữu ích hơn, Prometheus cho phép bạn áp dụng các toán tử số học phổ biến ( + , - , * , / , % ) cho toàn bộ vectơ chuỗi thời gian. Ví dụ: truy vấn sau đây chuyển đổi số byte được xử lý bởi một lệnh chạy hàng loạt cuối cùng được mô phỏng thành MiB:

demo_batch_last_run_processed_bytes{job="demo"} / 1024 / 1024 

Kết quả sẽ được hiển thị trong MiB:

Các byte đã xử lý được chuyển đổi MiB

Người ta thường sử dụng số học đơn giản cho các loại chuyển đổi đơn vị này, mặc dù các công cụ trực quan hóa tốt (như Grafana) cũng xử lý chuyển đổi cho bạn.

Một điểm đặc biệt của Prometheus (và nơi Prometheus thực sự tỏa sáng!) Là số học binary giữa hai bộ chuỗi thời gian. Khi sử dụng toán tử binary giữa hai tập hợp chuỗi, Prometheus tự động so khớp các phần tử có bộ nhãn giống hệt nhau ở bên trái và bên phải của phép toán và áp dụng toán tử cho từng cặp khớp để tạo chuỗi kết quả .

Ví dụ: số liệu demo_api_request_duration_seconds_sum cho ta biết đã dành bao nhiêu giây để trả lời các yêu cầu HTTP, trong khi demo_api_request_duration_seconds_count cho ta biết đã có bao nhiêu yêu cầu HTTP. Cả hai chỉ số đều có cùng thứ nguyên ( method , path , status , instance , job ). Để tính toán độ trễ yêu cầu trung bình cho từng thứ nguyên đó, ta có thể chỉ cần truy vấn tỷ lệ tổng thời gian dành cho các yêu cầu chia cho tổng số yêu cầu.

    rate(demo_api_request_duration_seconds_sum{job="demo"}[5m]) /     rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) 

Lưu ý ta cũng bao gồm một hàm rate() xung quanh mỗi bên của hoạt động để chỉ xem xét độ trễ cho các yêu cầu đã xảy ra trong 5 phút qua. Điều này cũng thêm khả năng phục hồi chống lại việc đặt lại bộ đếm.

Biểu đồ độ trễ yêu cầu trung bình thu được sẽ trông như sau:

Vẽ biểu đồ độ trễ yêu cầu trung bình

Nhưng ta phải làm gì khi các nhãn không khớp chính xác ở cả hai bên? Điều này đặc biệt xuất hiện khi ta có các bộ chuỗi thời gian có kích thước khác nhau trên cả hai mặt của hoạt động, bởi vì một bên có nhiều thứ nguyên hơn bên kia. Ví dụ: công việc demo xuất thời gian hư cấu của CPU ở các chế độ khác nhau ( idle , user , system ) dưới dạng số liệu demo_cpu_usage_seconds_total với thứ nguyên nhãn mode . Nó cũng xuất ra tổng số CPU hư cấu dưới dạng demo_num_cpus (không có thứ nguyên bổ sung trên số liệu này). Nếu bạn đã cố gắng chia cái này cho cái kia để đạt được mức sử dụng CPU trung bình theo phần trăm cho từng chế độ trong ba chế độ, thì truy vấn sẽ không tạo ra kết quả:

# BAD!     # Multiply by 100 to get from a ratio to a percentage     rate(demo_cpu_usage_seconds_total{job="demo"}[5m]) * 100   /     demo_num_cpus{job="demo"} 

Trong các đối sánh một-nhiều hoặc nhiều-một này, ta cần cho Prometheus biết tập hợp con nhãn nào sẽ sử dụng để đối sánh và ta cũng cần chỉ định cách xử lý với số chiều phụ. Để giải quyết sự so khớp, ta thêm mệnh đề on(<label names>) vào toán tử binary để chỉ định các nhãn cần so khớp. Để chia nhỏ và group phép tính theo các giá trị riêng lẻ của các kích thước phụ ở cạnh lớn hơn, ta thêm group_left(<label names>) hoặc group_right(<label names>) liệt kê các kích thước phụ ở bên trái hoặc bên phải , tương ứng.

Truy vấn đúng trong trường hợp này sẽ là:

    # Multiply by 100 to get from a ratio to a percentage     rate(demo_cpu_usage_seconds_total{job="demo"}[5m]) * 100   / on(job, instance) group_left(mode)     demo_num_cpus{job="demo"} 

Kết quả sẽ như thế này:

Vẽ biểu đồ mức sử dụng CPU trung bình cho mỗi chế độ

Bật on(job, instance) yêu cầu toán tử chỉ khớp chuỗi từ bên trái và bên phải trên nhãn jobinstance của họ (và do đó không có trên nhãn mode , không tồn tại ở bên phải), trong khi mệnh đề group_left(mode) yêu cầu người vận hành quạt tản nhiệt và hiển thị mức sử dụng CPU trung bình cho mỗi chế độ. Đây là trường hợp kết hợp nhiều-một. Để thực hiện đối sánh ngược lại (một-nhiều), hãy sử dụng group_right(<label names>) theo cách tương tự.

Đến đây bạn biết cách sử dụng số học giữa các tập hợp chuỗi thời gian và cách đối phó với các thứ nguyên khác nhau.

Kết luận

Trong hướng dẫn này, ta cài đặt một group các version dịch vụ demo và theo dõi chúng bằng Prometheus. Sau đó, ta đã học cách áp dụng các kỹ thuật truy vấn khác nhau dựa trên dữ liệu thu thập được để trả lời các câu hỏi mà ta quan tâm. Như vậy, bạn đã biết cách chọn và lọc chuỗi, cách tổng hợp theo thứ nguyên, cũng như cách tính tỷ lệ hoặc phái sinh hoặc thực hiện số học. Bạn cũng đã học cách tiếp cận việc xây dựng các truy vấn nói chung và cách tránh quá tải server Prometheus của bạn.

Để tìm hiểu thêm về ngôn ngữ truy vấn của Prometheus, bao gồm cách tính toán phần trăm từ biểu đồ, cách xử lý các số liệu dựa trên dấu thời gian hoặc cách truy vấn tình trạng version dịch vụ, hãy xem Cách truy vấn Prometheus trên Ubuntu 14.04 Phần 2 .


Tags:

Các tin liên quan

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