Làm cách nào để khắc phục sự cố dữ liệu bị thiếu trong cơ sở dữ liệu Prometheus của tôi?


13

Tôi đã dần dần tích hợp Prometheus vào quy trình giám sát của mình, để thu thập các số liệu chi tiết về việc chạy cơ sở hạ tầng.

Trong thời gian này, tôi nhận thấy rằng tôi thường gặp phải một vấn đề đặc biệt: đôi khi một nhà xuất khẩu mà Prometheus có nhiệm vụ kéo dữ liệu trở nên không phản hồi. Có thể do cấu hình sai mạng - nó không còn truy cập được nữa - hoặc chỉ do nhà xuất khẩu bị sập.

Dù lý do có thể là gì đi nữa, tôi thấy rằng một số dữ liệu tôi muốn thấy trong Prometheus bị thiếu và không có gì trong chuỗi trong một khoảng thời gian nhất định. Đôi khi, một nhà xuất khẩu thất bại (hết thời gian?) Dường như cũng khiến những người khác thất bại (thời gian chờ đầu tiên đã đẩy toàn bộ công việc lên trên thời gian chờ cấp cao nhất? Chỉ là suy đoán).

Khoảng cách về dữ liệu

Tất cả những gì tôi thấy là một khoảng trống trong loạt bài, như thể hiện trong hình dung ở trên. Không có gì trong nhật ký khi điều này xảy ra. Prometheus tự đo cũng có vẻ khá cằn cỗi. Tôi vừa phải dùng đến cách tự mình cố gắng sao chép những gì Prometheus đang làm và xem nó bị vỡ ở đâu. Điều này thật khó chịu. Phải có cách tốt hơn! Mặc dù tôi không cần thông báo theo thời gian thực, nhưng ít nhất tôi muốn có thể thấy rằng một nhà xuất khẩu không cung cấp dữ liệu. Ngay cả một cờ "hey kiểm tra dữ liệu của bạn" sẽ là một sự khởi đầu.

Làm cách nào để tôi có được thông tin có ý nghĩa về Prometheus không lấy được dữ liệu từ các nhà xuất khẩu? Làm thế nào để tôi hiểu tại sao các khoảng trống tồn tại mà không phải thực hiện mô phỏng thủ công thu thập dữ liệu Prometheus? Các thực tiễn hợp lý trong vấn đề này, có lẽ ngay cả khi được mở rộng để giám sát các bộ sưu tập dữ liệu nói chung, ngoài Prometheus?


Bạn có bất kỳ mục nhật ký hoặc cảnh báo / lỗi liên quan đến vấn đề?
kenorb

Không có gì, tôi chỉ thấy một khoảng trống trong chuỗi dữ liệu. Đầu ra Prometheus chỉ có các dòng thông thường thông thường về việc lưu các thay đổi đang chờ xử lý cứ sau vài phút và không có gì (trừ khi tôi bỏ lỡ một số nhật ký ẩn để xem xét).
Sander

Chúng tôi cũng đang đối mặt với vấn đề này. @Sander bạn đã có thể tìm ra nguyên nhân?
Deepak N

@DeepakN không, tôi không có cái nhìn sâu sắc hữu ích để thêm vào đây, thật không may. Nó vẫn là một điểm đau khi sử dụng Prometheus.
Sander

Câu trả lời:


5

Tôi nghĩ rằng bạn có thể thực hiện một số loại cảnh báo trên một số liệu ratevới một cái gì đó như thế này:

ALERT DropInMetricsFromExporter
  IF rate(<metric_name>[1m]) == 0
  FOR 3m
  ANNOTATIONS {
    summary = "Rate of metrics is 0 {{ $labels.<your_label> }}",
    description = "Rate of metric dropped, actually: {{ $value }}%",
}

Ý tưởng chính là cảnh báo bất cứ khi nào tỷ lệ số liệu ở mức 0 trong 3 phút, với tên số liệu phù hợp và nhãn ở đâu đó cho biết nhà xuất khẩu nào sẽ cung cấp cho bạn thông tin chính xác.

Chọn số liệu phù hợp để theo dõi bởi nhà xuất khẩu có thể phức tạp, không có cái nhìn sâu sắc hơn rất khó để đưa ra lời khuyên tốt hơn từ chân không.
Bài đăng blog này có thể là một nguồn cảm hứng cho một phát hiện chung chung hơn.


tỷ lệ tính toán tốc độ mỗi giây cho một bộ đếm nhất định. Điều này không liên quan gì đến tốc độ mà các số liệu được loại bỏ (-> scrape_interval). Ví dụ của bạn sẽ cảnh báo nếu bộ đếm đã cho (metric_name) không tăng trong 3 phút, đây có thể không phải là điều OP muốn.
Zi 'cá' Ziemke

@ Johannes'fish'Ziemke Đó là lý do tại sao tôi nói việc tìm đúng số liệu có thể phức tạp. timeVí dụ, sử dụng số liệu trên một nhà xuất khẩu nút sẽ làm được. Nếu bạn có cách tốt hơn để cảnh báo về một nhà xuất khẩu thất bại, vui lòng thêm câu trả lời
Tensibai

@ Johannes'fish'Ziemke Chào mừng bạn trên devops.se btw :)
Tensibai

1

Có một vài lý do có thể gây ra khoảng cách. Nhiều khả năng nhà xuất khẩu không thể truy cập trong trường hợp thời upgian sẽ là 0. Bạn có thể cảnh báo về điều này như thế này (lấy từ https://prometheus.io/docs/alerting/rules/#templating ):

# Alert for any instance that is unreachable for >5 minutes.
ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS { severity = "page" }
  ANNOTATIONS {
    summary = "Instance {{ $labels.instance }} down",
    description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
  }

Trên trang trạng thái, bạn cũng sẽ thấy rằng nó bao gồm một thông báo lỗi. Thật không may, không có cách nào để xem lỗi trong quá khứ nhưng có một vấn đề cần theo dõi điều này: https://github.com/prometheus/prometheus/issues/2820

Máy chủ Prometheus của bạn cũng có thể bị quá tải khiến việc cào bằng dừng lại, điều này cũng sẽ giải thích các khoảng trống. Trong trường hợp đó, bạn sẽ thấy Storage needs throttling. Scrapes and rule evaluations will be skipped.lỗi trong nhật ký và tăng trong prometheus_target_skipped_scrapes_totalsố liệu. Bạn cũng nên cảnh báo về điều đó, ví dụ:

ALERT PrometheusSkipsScrapes
  IF rate(prometheus_target_skipped_scrapes_total[2m]) > 0
  FOR 5m

1

Tôi không chắc đây có phải là vấn đề giống như bạn đang gặp không. Nhưng chúng tôi đã thấy những khoảng trống ngẫu nhiên này cho các ứng dụng Java không đặt cài đặt cụ thể. Có nghĩa là chúng ta đã thấy những khoảng trống khi việc thu thập dữ liệu dừng lại vì hoạt động của cá thể dừng lại trong khi JVM đang thực hiện một Full GC. Nếu bạn đang sử dụng Java thì điều này có thể xảy ra. Cách khắc phục của chúng tôi là sử dụng rõ ràng trình thu gom rác G1 (Java 8+) với giới hạn được chỉ định về độ dài của hoạt động GC để ngăn những khoảng trống thời gian này trong việc thu thập dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.