Saturday, September 28, 2024

Cài đặt giám sát RabbitMQ với Prometheus và Grafana

-

1. Tổng quan.

Đây là hướng dẫn cài đặt giám sát cho môi trường production, khác với hướng dẫn Quick Start đơn giản hơn.

2. Các công cụ cần thiết (giả sử đã được cài đặt và chạy).

  • RabbitMQ cluster 3 node phiên bản 3.11
  • Prometheus, có kết nối mạng với tất cả các node trong RabbitMQ cluster
  • Grafana được cấu hình sử dụng Prometheus làm Datasource.

3. Cấu hình RabbitMQ.

3.1. Đặt tên cho RabbitMQ cluster.

  • Đặt tên dễ nhớ để phân biệt với các cluster khác.
  • Để xem tên hiện tại của cluster, sử dụng lệnh:
rabbitmq-diagnostics -q cluster_status
  • Chạy lệnh này trên bất kỳ node nào trong cluster.
  • Nếu tên hiện tại phù hợp, bỏ qua bước tiếp theo.
  • Để đổi tên cluster, sử dụng lệnh (tên “testing-prometheus” chỉ là ví dụ):
rabbitmqctl -q set_cluster_name testing-prometheus

3.2. Kích hoạt plugin rabbitmq_prometheus

Bật plugin rabbitmq_prometheus trên tất cả các node:

rabbitmq-plugins enable rabbitmq_prometheus

Kiểm tra kết quả đầu ra, nó sẽ hiển thị các plugin được kích hoạt, bao gồm rabbitmq_prometheus.

3.3. Kiểm tra metrics

  • Để xác nhận RabbitMQ đang xuất metrics theo định dạng Prometheus, sử dụng lệnh:
curl -s localhost:15692/metrics | head -n 3

Kết quả sẽ hiển thị các dòng đầu tiên của metrics, lưu ý cổng mặc định là 15692.

4. Cấu hình Prometheus.

Sau khi RabbitMQ được cấu hình xuất metrics, cần thông báo cho Prometheus biết vị trí lấy metrics. Tham khảo tài liệu chính thức của Prometheus.

Prometheus mặc định scrape (đọc) metrics từ các hệ thống được giám sát cứ 60 giây 1 lần. RabbitMQ cập nhật metrics cứ 5 giây.

Kiểm tra interval cập nhật metrics của RabbitMQ bằng lệnh:

rabbitmq-diagnostics environment | grep collect_statistics_interval
  • Giá trị trả về sẽ bằng milliseconds (ms).
  • Đối với hệ thống Production:
    • Khuyến nghị interval scrape của Prometheus tối thiểu là 15 giây và interval collect_statistics_interval của RabbitMQ là 10000ms (10 giây).
    • Điều này giúp Prometheus không scrape RabbitMQ quá thường xuyên và RabbitMQ không cập nhật metrics không cần thiết.
    • Nếu bạn cấu hình interval scrape của Prometheus khác, nhớ đặt interval phù hợp khi hiển thị metrics trong Grafana với hàm rate(). Giá trị an toàn là gấp 4 lần interval scrape.
  • Nếu bạn sử dụng chế độ auto-refresh 5 giây mặc định của RabbitMQ Management UI, thì giữ nguyên giá trị mặc định của collect_statistics_interval là tối ưu (cả 2 đều mặc định là 5 giây).

6. Xác nhận Prometheus đang thu thập metrics từ RabbitMQ.

6.1. Kiểm tra trang Targets trên Prometheus.

Để xác nhận Prometheus đang thu thập metrics từ tất cả các node của RabbitMQ, hãy đảm bảo tất cả các endpoint của RabbitMQ đều có trạng thái “Up” trên trang Targets của Prometheus, như hình dưới đây.

6.2. Cấu hình port export RabbitMQ.

Cổng được cấu hình bằng key prometheus.tcp.port:

prometheus.tcp.port = 15692

Bạn cũng có thể cấu hình ip address mà endpoint API của plugin Prometheus sẽ sử dụng, tương tự như cách cấu hình listener giao thức nhắn tin, bằng cách sử dụng key prometheus.tcp.ip:

prometheus.tcp.ip = 0.0.0.0
  • Giá trị mặc định 0.0.0.0 cho phép kết nối từ bất kỳ địa chỉ IP nào.
  • Để kiểm tra giao diện và cổng được sử dụng bởi một node đang chạy, sử dụng lệnh rabbitmq-diagnostics:
shell> rabbitmq-diagnostics -s listeners
# => Interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP

Hoặc sử dụng các công cụ như lsof, ss hoặc netstat.

6.3. Tổng hợp và theo từng đối tượng (Metrics).

  • RabbitMQ có thể trả về metrics cho Prometheus theo hai chế độ:
    • Tổng hợp (Aggregated): metrics được tổng hợp theo tên. Chế độ này có chi phí hiệu suất thấp hơn với kích thước đầu ra không đổi, ngay cả khi số lượng đối tượng (ví dụ: kết nối và hàng đợi) tăng lên.
    • Theo từng đối tượng (Per-object): Mỗi cặp đối tượng-metric có một metric riêng lẻ. Với một số lượng lớn các thực thể phát ra thống kê (ví dụ: nhiều kết nối và hàng đợi), điều này có thể dẫn đến dữ liệu đầu ra rất lớn và tốn nhiều tài nguyên CPU để tuần tự hóa dữ liệu thành đầu ra.

Lựa chọn Aggregated metrics thường thực tế và dễ dự đoán hơn cho các triển khai lớn. Nó có khả năng mở rộng tốt về số lượng đối tượng phát ra metric trong hệ thống (kết nối, kênh, hàng đợi, người dùng, v.v.) bằng cách giữ cho kích thước và thời gian phản hồi nhỏ. Nó cũng dễ dàng để trực quan hóa.

Nhược điểm của việc Aggregated metrics là nó làm mất độ chính xác của dữ liệu. Không thể cảnh báo theo từng đối tượng và metrics với chế độ tổng hợp. Mặc dù metrics theo từng đối tượng rất hữu ích trong một số trường hợp, nhưng chúng cũng khó trực quan hóa. Hãy tưởng tượng một biểu đồ với 200.000 kết nối được vẽ trên đó và liệu người vận hành có thể hiểu được nó hay không.

7. Các endpoint của Prometheus trong RabbitMQ.

/metrics

Theo mặc định, Prometheus (và các giải pháp tương thích với Prometheus) mong đợi metrics có sẵn trên đường dẫn /metrics. RabbitMQ trả về metrics tổng hợp trên endpoint này theo mặc định.

Nếu bạn muốn trả về metrics theo từng đối tượng (chưa tổng hợp) trên endpoint /metrics, hãy đặt prometheus.return_per_object_metrics thành true:

# can result in a really excessive output produced,
# only suitable for environments with a relatively small
# number of metrics-emitting objects such as connections and queues
prometheus.return_per_object_metrics = true

Lưu ý: Sử dụng chế độ per-object chỉ khi cần thiết vì nó có thể ảnh hưởng đến hiệu suất.

/metrics/per-object

RabbitMQ cung cấp một endpoint chuyên dụng:

GET /metrics/per-object

Luôn trả về metrics theo từng đối tượng, bất kể giá trị của prometheus.return_per_object_metrics. Do đó, bạn có thể giữ nguyên giá trị mặc định của prometheus.return_per_object_metricsfalse và vẫn thu thập metrics theo từng đối tượng khi cần thiết bằng cách đặt metrics_path = /metrics/per-object trong cấu hình target của Prometheus (kiểm tra tài liệu Prometheus để biết thêm thông tin).

/metrics/detailed

Như đã đề cập trước đó, việc sử dụng metrics theo từng đối tượng trong môi trường có nhiều thực thể sẽ tốn rất nhiều tài nguyên tính toán. Ví dụ, /metrics/per-object trả về tất cả các metrics cho tất cả các thực thể trong hệ thống, ngay cả khi nhiều trong số chúng không được hầu hết các client sử dụng (chẳng hạn như các công cụ giám sát).

Đây là lý do tại sao có một endpoint riêng cho metrics theo từng đối tượng, cho phép người gọi chỉ truy vấn các metrics họ cần:

GET /metrics/detailed?vhost=vhost-1&vhost=2&family=queue_coarse_metrics&family=queue_consumer_count

Chỉ trả về các metrics được yêu cầu và bỏ qua các metrics khác, ví dụ như tất cả các metrics về kênh mà client này không quan tâm.

Các tham số được hỗ trợ bởi endpoint /metrics/detailed

Không hoặc nhiều giá trị family. Chỉ các họ metrics được yêu cầu sẽ được trả về. Danh sách đầy đủ được ghi chú bên dưới;

Không hoặc nhiều vhost: nếu được cung cấp, các metrics liên quan đến hàng đợi (queue_coarse_metrics, queue_consumer_count và queue_metrics) sẽ chỉ được trả về cho các hàng đợi trong các virtual host được cung cấp

Metrics trả về sử dụng một tiền tố khác: rabbitmq_detailed_ (thay vì rabbitmq_ được sử dụng bởi các endpoint khác). Điều này có nghĩa là endpoint này có thể được sử dụng cùng với GET /metrics và các công cụ dựa vào các endpoint khác sẽ không bị ảnh hưởng.

Hiệu quả của việc sử dụng /metrics/detailed

Do truy vấn và phục vụ ít dữ liệu hơn trong hầu hết các trường hợp, endpoint này ít gây tải cho hệ thống hơn. Ví dụ,

GET /metrics/detailed?family=queue_coarse_metrics&family=queue_consumer_count

Chỉ cung cấp đủ metrics để xác định có bao nhiêu message được xếp hàng đợi và có bao nhiêu consumer cho các hàng đợi đó. Trong một số môi trường, truy vấn này hiệu quả hơn tới 60 lần so với truy vấn GET /metrics/per-object để chỉ lấy một vài metrics từ kết quả trả về.

8. Generic metrics.

Chi tiết về các nhóm Metrics (/metrics/detailed).

RabbitMQ cung cấp nhiều nhóm metrics chi tiết (/metrics/detailed) cho phép bạn truy vấn các thông tin cụ thể về hệ thống. Lưu ý rằng một số nhóm metrics này có thể gây tốn nhiều tài nguyên tính toán, vì vậy hãy sử dụng chúng một cách thận trọng.

Connections/channels/queues.

Churn trong ngữ cảnh này đề cập đến quá trình liên tục tạo và hủy các kết nối, kênh và hàng đợi của RabbitMQ. Nhóm connection_churn_metrics cung cấp các thông tin sau:

  • rabbitmq_detailed_connections_opened_total: Tổng số kết nối được mở.
  • rabbitmq_detailed_connections_closed_total: Tổng số kết nối đã đóng hoặc bị hủy.
  • rabbitmq_detailed_channels_opened_total: Tổng số kênh được mở.
  • rabbitmq_detailed_channels_closed_total: Tổng số kênh đã đóng.
  • rabbitmq_detailed_queues_declared_total: Tổng số hàng đợi được khai báo.
  • rabbitmq_detailed_queues_created_total: Tổng số hàng đợi được tạo.
  • rabbitmq detailed_queues_deleted_total: Tổng số hàng đợi đã xóa.

Erlang VM/IO disk thông qua RabbitMQ.

Nhóm node_coarse_metrics cung cấp thông tin về tài nguyên máy chủ được sử dụng bởi RabbitMQ:

  • rabbitmq_detailed_process_open_fds: Tổng số File Descriptors đang mở.
  • rabbitmq_detailed_process_open_tcp_sockets: Tổng số Socket TCP đang mở.
  • rabbitmq_detailed_process_resident_memory_bytes: Bộ nhớ đang sử dụng (bytes).
  • rabbitmq_detailed_disk_space_available_bytes: Dung lượng trống của ổ đĩa (bytes).
  • rabbitmq_detailed_erlang_processes_used: Số tiến trình Erlang đang sử dụng.
  • rabbitmq_detailed_erlang_gc_runs_total: Tổng số lần chạy Garbage Collector của Erlang.
  • rabbitmq_detailed_erlang_gc_reclaimed_bytes_total: Tổng số bytes bộ nhớ được giải phóng bởi Garbage Collector.
  • rabbitmq_detailed_erlang_scheduler_context_switches_total: Tổng số lần chuyển đổi ngữ cảnh của bộ lập lịch Erlang.

Nhóm node_metrics cung cấp các giới hạn cho các tài nguyên:

  • rabbitmq_detailed_process_max_fds: Giới hạn File Descriptors.
  • rabbitmq_detailed_process_max_tcp_sockets: Giới hạn Socket TCP.
  • rabbitmq_detailed_resident_memory_limit_bytes: Giới hạn bộ nhớ.
  • rabbitmq_detailed_disk_space_available_limit_bytes: Giới hạn dung lượng trống ổ đĩa.
  • rabbitmq_detailed_erlang_processes_limit: Giới hạn tiến trình Erlang.
  • rabbitmq_detailed_erlang_scheduler_run_queue: Hàng đợi chạy của bộ lập lịch Erlang.
  • rabbitmq_detailed_erlang_net_ticktime_seconds: Khoảng thời gian giữa các nhịp tim giữa các node.
  • rabbitmq_detailed_erlang_uptime_seconds: Thời gian hoạt động của node (giây).

Nhóm node_persister_metrics cung cấp thông tin về hoạt động đọc/ghi của RabbitMQ:

  • rabbitmq_detailed_io_read_ops_total: Tổng số hoạt động đọc I/O.
  • rabbitmq_detailed_io_read_bytes_total: Tổng số bytes đọc I/O.
  • rabbitmq_detailed_io_write_ops_total: Tổng số hoạt động ghi I/O.
  • rabbitmq_detailed_io_write_bytes_total: Tổng số bytes ghi I/O.
  • rabbitmq_detailed_io_sync_ops_total: Tổng số hoạt động đồng bộ I/O.
  • rabbitmq_detailed_io_seek_ops_total: Tổng số hoạt động tìm kiếm I/O.
  • rabbitmq_detailed_io_reopen_ops_total: Tổng số lần mở lại file.
  • rabbitmq_detailed_schema_db_ram_tx_total: Tổng số giao dịch cơ sở dữ liệu Schema trong RAM.
  • rabbitmq_detailed_schema_db_disk_tx_total: Tổng số giao dịch cơ sở dữ liệu Schema trên ổ đĩa.
  • rabbitmq_detailed_msg_store_read_total: Tổng số hoạt động đọc Message Store.

Lưu ý: Một số nhóm metric sử dụng nhiều tài nguyên tính toán, vì vậy hãy sử dụng chúng một cách thận trọng khi cần thiết.

9. Các metric liên quan đến lưu trữ message (Message Store) và quản lý hàng đợi (Queue Index).

  • rabbitmq_detailed_msg_store_write_total: Tổng số lần ghi dữ liệu vào Message Store.
  • rabbitmq_detailed_queue_index_read_ops_total: Tổng số lần đọc dữ liệu từ Queue Index.
  • rabbitmq_detailed_queue_index_write_ops_total: Tổng số lần ghi dữ liệu vào Queue Index.

Queue Index là một cấu trúc dữ liệu lưu trữ thông tin về các message trong hàng đợi, giúp RabbitMQ truy cập nhanh chóng đến các message cần thiết. Message Store là nơi lưu trữ nội dung thực tế của các message.

10. Các metric liên quan đến hoạt động read/write.

  • rabbitmq_detailed_io_read_time_seconds_total: Tổng thời gian thực hiện các hoạt động đọc đĩa (giây).
  • rabbitmq_detailed_io_write_time_seconds_total: Tổng thời gian thực hiện các hoạt động ghi đĩa (giây).
  • rabbitmq_detailed_io_sync_time_seconds_total: Tổng thời gian thực hiện các hoạt động đồng bộ hóa dữ liệu giữa RAM và ổ đĩa (giây).
  • rabbitmq_detailed_io_seek_time_seconds_total: Tổng thời gian tìm kiếm dữ liệu trên ổ đĩa (giây).

Những metric này giúp bạn đánh giá hiệu suất của hoạt động đọc/ghi đĩa của RabbitMQ. Nếu thời gian đọc/ghi quá cao, có thể ổ đĩa đang hoạt động quá tải hoặc cần tối ưu cấu trúc lưu trữ dữ liệu.

Các metric liên quan đến Raft (chỉ dành cho RabbitMQ triển khai cluster).

  • rabbitmq_detailed_raft_term_total: Số phiên (term) hiện tại của Raft consensus algorithm.
  • rabbitmq_detailed_raft_log_snapshot_index: Chỉ số của snapshot gần nhất của log Raft.
  • rabbitmq_detailed_raft_log_last_applied_index: Chỉ số của message cuối cùng đã được áp dụng cho tất cả các node trong cụm.
  • rabbitmq_detailed_raft_log_commit_index: Chỉ số của message cuối cùng đã được đồng ý bởi tất cả các node trong cụm.
  • rabbitmq_detailed_raft_log_last_written_index: Chỉ số của message cuối cùng được ghi vào log Raft trên node hiện tại.
  • rabbitmq_detailed_raft_entry_commit_latency_seconds: Thời gian trung bình để một message được ghi vào log Raft và đồng bộ trên toàn cụm (giây).

Raft là thuật toán đồng thuận được sử dụng để đảm bảo tính nhất quán dữ liệu giữa các node trong cụm RabbitMQ. Các metric này giúp bạn theo dõi quá trình đồng bộ dữ liệu và phát hiện các vấn đề tiềm ẩn.

Các metric liên quan đến xác thực (Authentication).

  • rabbitmq_detailed_auth_attempts_total: Tổng số lần thử đăng nhập.
  • rabbitmq_detailed_auth_attempts_succeeded_total: Tổng số lần đăng nhập thành công.
  • rabbitmq_detailed_auth_attempts_failed_total: Tổng số lần đăng nhập thất bại.
  • rabbitmq_detailed_auth_attempts_detailed_total: Tổng số lần thử đăng nhập với thông tin chi tiết về nguồn (có thể bao gồm địa chỉ IP hoặc tên người dùng).
  • rabbitmq_detailed_auth_attempts_detailed_succeeded_total: Tổng số lần đăng nhập thành công với thông tin chi tiết về nguồn.
  • rabbitmq_detailed_auth_attempts_detailed_failed_total: Tổng số lần đăng nhập thất bại với thông tin chi tiết về nguồn.

Những metric này giúp bạn theo dõi hoạt động đăng nhập và phát hiện các lỗ hổng bảo mật tiềm ẩn (chẳng hạn như các đợt tấn công brute-force).

Lưu ý: Nhóm auth_attempt_metrics cung cấp tổng số lượt đăng nhập, trong khi auth_attempt_detailed_metrics cung cấp thông tin chi tiết hơn về từng lượt thử đăng nhập.

Các metric liên quan đến hàng đợi (Queue).

Queue coarse metrics (Các metric cơ bản của hàng đợi).

  • rabbitmq_detailed_queue_messages_ready: Số message sẵn sàng để gửi đến consumer.
  • rabbitmq_detailed_queue_messages_unacked: Số message đã được gửi đến consumer nhưng chưa được xác nhận.
  • rabbitmq_detailed_queue_messages: Tổng số message đang có trong hàng đợi (b
  • rabbitmq_detailed_queue_process_reductions_total: Tổng số lần giảm tải cho quá trình xử lý hàng đợi.

Per-queue consumer count (Số consumer cho từng hàng đợi).

  • rabbitmq_detailed_queue_consumers: Số consumer hiện đang kết nối với hàng đợi.

Detailed queue metrics (Các metric chi tiết của hàng đợi).

  • rabbitmq_detailed_queue_consumers: Số consumer hiện đang kết nối với hàng đợi.
  • rabbitmq_detailed_queue_consumer_capacity: Dung lượng tối đa của consumer (số message tối đa mà consumer có thể lưu trữ).
  • rabbitmq_detailed_queue_consumer_utilisation: Tỷ lệ sử dụng dung lượng consumer (tỷ lệ giữa số message đang lưu trữ và dung lượng tối đa).
  • rabbitmq_detailed_queue_process_memory_bytes: Bộ nhớ sử dụng bởi quá trình xử lý hàng đợi (bytes).
  • rabbitmq_detailed_queue_messages_ram: Số message sẵn sàng và chưa xác nhận được lưu trữ trong RAM.
  • rabbitmq_detailed_queue_messages_ram_bytes: Kích thước bộ nhớ của các message sẵn sàng và chưa xác nhận được lưu trữ trong RAM (bytes).
  • rabbitmq_detailed_queue_messages_ready_ram: Số message sẵn sàng được lưu trữ trong RAM.
  • rabbitmq_detailed_queue_messages_unacked_ram: Số message chưa được xác nhận được lưu trữ trong RAM.
  • rabbitmq_detailed_queue_messages_persistent: Số message bền bỉ (message sẽ không bị xóa khi RabbitMQ khởi động lại).
  • rabbitmq_detailed_queue_messages_persistent_bytes: Kích thước bộ nhớ của các message bền bỉ (bytes).
  • rabbitmq_detailed_queue_messages_bytes: Kích thước bộ nhớ của tất cả các message trong hàng đợi (bytes).
  • rabbitmq_detailed_queue_messages_ready_bytes: Kích thước bộ nhớ của các message sẵn sàng (bytes).
  • rabbitmq_detailed_queue_messages_unacked_bytes: Kích thước bộ nhớ của các message chưa được xác nhận (bytes).
  • rabbitmq_detailed_queue_messages_paged_out: Số message đã được chuyển sang lưu trữ trên ổ đĩa do thiếu bộ nhớ RAM.
  • rabbitmq_detailed_queue_messages_paged_out_bytes: Kích thước bộ nhớ của các message đã được chuyển sang lưu trữ trên ổ đĩa (bytes).
  • rabbitmq_detailed_queue_head_message_timestamp: Thời gian tạo của message đầu tiên trong hàng đợi (nếu có).
  • rabbitmq_detailed_queue_disk_reads_total: Tổng số lần hàng đợi đọc message từ ổ đĩa.
  • rabbitmq_detailed_queue_disk_writes_total: Tổng số lần hàng đợi ghi message vào ổ đĩa.

Nhóm queue_metrics cung cấp thông tin chi tiết về từng hàng đợi, bao gồm số message đang có, dung lượng bộ nhớ sử dụng, hiệu suất xử lý, v.v.

Các metric liên quan đến kết nối và kênh (Connection/channel metrics).

Connection metrics (Các metric liên quan đến kết nối).

  • rabbitmq_detailed_connection_incoming_bytes_total: Tổng số byte nhận được trên kết nối.
  • rabbitmq_detailed_connection_outgoing_bytes_total: Tổng số byte được gửi trên kết nối.
  • rabbitmq_detailed_connection_process_reductions_total: Tổng số lần giảm tải cho quá trình xử lý kết nối.

Nhóm connection_coarse_metrics cung cấp thông tin cơ bản về các kết nối, bao gồm số byte nhận/gửi và số lần giảm tải. Nhóm connection_metrics cung cấp thông tin chi tiết hơn, bao gồm số gói tin nhận/gửi, số gói tin đang chờ gửi và số kênh trên kết nối.

General channel metrics (Các metric chung của kênh).

  • rabbitmq_detailed_channel_consumers: Số consumer hiện đang kết nối với kênh.
  • rabbitmq_detailed_channel_messages_unacked: Số message đã được gửi đến consumer nhưng chưa được xác nhận.
  • rabbitmq_detailed_channel_messages_unconfirmed: Số message đã được xuất bản nhưng chưa được xác nhận.
  • rabbitmq_detailed_channel_messages_uncommitted: Số message được nhận trong giao dịch nhưng chưa được commit.
  • rabbitmq_detailed_channel_acks_uncommitted: Số xác nhận message trong giao dịch nhưng chưa được commit.
  • rabbitmq_detailed_consumer_prefetch: Số message tối đa mà mỗi consumer có thể lưu trữ.
  • rabbitmq_detailed_channel_prefetch_total: Tổng số message tối đa mà tất cả consumer trên một kênh có thể lưu trữ.

Nhóm channel_metrics cung cấp thông tin chung về các kênh, bao gồm số consumer, số message chưa được xác nhận, số message chưa được commit, v.v. Nhóm channel_process_metrics cung cấp thông tin về hiệu suất xử lý kênh, bao gồm số lần giảm tải.

Channel metrics with queue/exchange breakdowns (Các metric của kênh với phân tích theo hàng đợi và exchange).

  • rabbitmq_detailed_channel_messages_published_total: Tổng số message được xuất bản vào exchange trên một kênh.
  • rabbitmq_detailed_channel_messages_confirmed_total: Tổng số message được xuất bản vào exchange và được xác nhận trên kênh.
  • rabbitmq_detailed_channel_messages_unroutable_returned_total: Tổng số message được xuất bản với chế độ mandatory vào exchange nhưng không thể định tuyến và được trả về cho publisher.
  • rabbitmq_detailed_channel_messages_unroutable_dropped_total: Tổng số message được xuất bản với chế độ non-mandatory vào exchange nhưng không thể định tuyến và bị loại bỏ.

Nhóm channel_exchange_metrics cung cấp thông tin về số message được xuất bản, xác nhận và trả về trên từng kênh.

  • rabbitmq_detailed_channel_get_ack_total: Tổng số message được lấy bằng basic.get trong chế độ xác nhận thủ công.
  • rabbitmq_detailed_channel_get_total: Tổng số message được lấy bằng basic.get trong chế độ xác nhận tự động.
  • rabbitmq_detailed_channel_messages_delivered_ack_total: Tổng số message được gửi đến consumer trong chế độ xác nhận thủ công.
  • rabbitmq_detailed_channel_messages_delivered_total: Tổng số message được gửi đến consumer trong chế độ xác nhận tự động.
  • rabbitmq_detailed_channel_messages_redelivered_total: Tổng số message được gửi lại cho consumer.
  • rabbitmq_detailed_channel_messages_acked_total: Tổng số message được consumer xác nhận.
  • rabbitmq_detailed_channel_get_empty_total: Tổng số lần basic.get không lấy được bất kỳ message nào.

Nhóm channel_queue_metrics cung cấp thông tin về số message được lấy, gửi, xác nhận và redeliver bởi từng kênh trên từng hàng đợi.

  • rabbitmq_detailed_queue_messages_published_total: Tổng số message được xuất bản vào hàng đợi.

Nhóm channel_queue_exchange_metrics cung cấp thông tin về số message được xuất bản vào hàng đợi trên từng kênh.

Các metric liên quan đến virtual host và exchange.

  • rabbitmq_cluster_vhost_status: Cho biết trạng thái hoạt động của một virtual host cụ thể.
  • rabbitmq_cluster_exchange_name: Danh sách các exchange trong RabbitMQ.
  • rabbitmq_cluster_exchange_bindings: Số lượng binding cho từng exchange.

Nhóm vhost_status cung cấp thông tin về trạng thái hoạt động của từng virtual host. Nhóm exchange_names cung cấp danh sách các exchange. Nhóm exchange_bindings cung cấp số lượng binding cho từng exchange.

Giải thích về Scrape Endpoint Timeouts trong RabbitMQ và Prometheus.

Vấn đề:

Trong một số môi trường, RabbitMQ có thể có nhiều hoặc ít các thực thể tạo ra dữ liệu thống kê (như hàng đợi, kết nối, kênh). Đôi khi, endpoint HTTP trả về một lượng dữ liệu lớn cho client (ví dụ: hàng nghìn hàng). Điều này có thể khiến thời gian xử lý yêu cầu vượt quá thời gian chờ nhất định trong máy chủ HTTP được nhúng và client HTTP được sử dụng bởi Prometheus.

Giải pháp:

Bạn có thể điều chỉnh thời gian chờ yêu cầu phía plugin bằng cách sử dụng các cài đặt prometheus.tcp.idle_timeout, prometheus.tcp.inactivity_timeout, prometheus.tcp.request_timeout.

  • prometheus.tcp.inactivity_timeout: Kiểm soát thời gian chờ không hoạt động của kết nối TCP của client HTTP(S). Khi đạt đến thời gian này, kết nối sẽ bị máy chủ HTTP đóng.
  • prometheus.tcp.request_timeout: Kiểm soát khung thời gian mà client phải gửi yêu cầu HTTP.
  • prometheus.tcp.idle_timeout: Kiểm soát khung thời gian mà client phải gửi thêm dữ liệu (nếu có) trong ngữ cảnh của một yêu cầu HTTP.

Lưu ý về Load Balancer:

Nếu sử dụng load balancer hoặc proxy giữa nút Prometheus và các nút RabbitMQ được scrape, thì giá trị inactivity_timeoutidle_timeout phải ít nhất bằng, và thường lớn hơn, giá trị timeout và inactivity được sử dụng bởi load balancer.

Ví dụ:

prometheus.tcp.idle_timeout = 120000 (120 giây)
prometheus.tcp.inactivity_timeout = 120000 (120 giây)
prometheus.tcp.request_timeout = 120000 (120 giây)

Các bước thực hiện.

Dưới đây là hướng dẫn bạn cấu hình Grafana để hiển thị các metric được thu thập từ RabbitMQ bởi Prometheus.

  • Tích hợp Grafana với Prometheus (nếu chưa thực hiện):
  • Import dashboard Grafana
    • Team RabbitMQ cung cấp các dashboard Grafana để hiển thị trực quan các metric của RabbitMQ.
    • Tài liệu tham khảo: https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/import-dashboards/
    • Các dashboard này là mã nguồn mở và có sẵn trên GitHub repository của rabbitmq-server.
    • Bạn có thể import dashboard theo hai cách:
      • Thứ nhất: Truy cập trang web Grafana và tìm danh sách các dashboard RabbitMQ chính thức. Chọn “RabbitMQ-Overview” và click “Download JSON” hoặc sao chép ID của dashboard. Dán nội dung file hoặc ID vào Grafana, sau đó click “Load”.
      • Thứ hai: Dán ID dashboard vào ô “Grafana.com Dashboard” trong Grafana.
  • Lặp lại bước import cho các dashboard khác
    • Bạn có thể import nhiều dashboard khác nhau để hiển thị chi tiết hơn về các metric của RabbitMQ.
  • Chọn data source mặc định
    • Chọn “prometheus” làm data source mặc định để Grafana sử dụng dữ liệu từ Prometheus.

Chúc mừng! Bây giờ bạn đã thiết lập monitor RabbitMQ với Prometheus và Grafana.

Kết luận.

Các metric chi tiết (/metrics/detailed) của RabbitMQ cung cấp nhiều thông tin hữu ích để theo dõi hiệu suất và sức khỏe của hệ thống. Việc sử dụng các metric này một cách hiệu quả giúp bạn phát hiện sớm các vấn đề tiềm ẩn, tối ưu hóa hiệu suất và đảm bảo RabbitMQ hoạt động ổn định.

Lưu ý:

  • Một số nhóm metric có thể gây tốn nhiều tài nguyên tính toán, vì vậy hãy sử dụng chúng một cách thận trọng.
  • Nên tham khảo tài liệu chính thức của RabbitMQ và Prometheus để hiểu rõ hơn về ý nghĩa và cách sử dụng các metric.

Tài liệu tham khảo.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories