129 lượt đọc

Giám sát dịch vụ Golang với Prometheus: Lựa chọn giữa mô hình kéo và đẩy

từ tác giả Ilia Ivankin5m2025/03/02
Read on Terminal Reader

dài quá đọc không nổi

Prometheus là một hệ thống giám sát mạnh mẽ thu thập và xử lý dữ liệu số (số liệu) từ các ứng dụng. Nó giúp bạn theo dõi các chỉ số chính như: số lượng yêu cầu được dịch vụ của bạn xử lý. Thời gian phản hồi cho mỗi yêu cầu. Sử dụng bộ nhớ và CPU. Lỗi xảy ra trong hệ thống.
featured image - Giám sát dịch vụ Golang với Prometheus: Lựa chọn giữa mô hình kéo và đẩy
Ilia Ivankin HackerNoon profile picture
0-item
1-item

Prometheus là gì và tại sao bạn cần nó?

Prometheus là một hệ thống giám sát mạnh mẽ thu thập và xử lý dữ liệu số (số liệu) từ các ứng dụng. Nó giúp bạn theo dõi các chỉ số chính như:


  • Số lượng yêu cầu được dịch vụ của bạn xử lý.
  • Thời gian phản hồi cho mỗi yêu cầu.
  • Sử dụng bộ nhớ và CPU.
  • Số lượng lỗi xảy ra trong hệ thống.


Bằng cách sử dụng Prometheus, bạn có thể trả lời những câu hỏi quan trọng như:

  • "Dịch vụ của tôi có hoạt động hiệu quả không?"

  • "Những trở ngại về hiệu suất là gì?"

  • "Chúng ta có cần mở rộng cơ sở hạ tầng không?"


Và Prometheus thu thập số liệu như thế nào?

Có hai cách chính để Prometheus thu thập dữ liệu:

  1. Mô hình kéo – Prometheus chủ động truy vấn các dịch vụ để lấy số liệu.
  2. Mô hình đẩy (Pushgateway) – Các dịch vụ đẩy số liệu của mình tới một bên trung gian, sau đó Prometheus sẽ thu thập dữ liệu này.


Chúng ta hãy cùng phân tích chúng nhé.


Mô hình kéo

Trong mô hình kéo , Prometheus chủ động lấy số liệu từ ứng dụng của bạn qua HTTP (ví dụ: http://your-service:8080/metrics ).

Đây là phương pháp mặc định và được sử dụng phổ biến nhất.

Thiết lập Prometheus với Golang (Mô hình kéo)

  1. Cài đặt các thư viện cần thiết:

     go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp


  2. Xác định số liệu của bạn (ví dụ: đếm số yêu cầu HTTP):

     import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", })


  3. Hiển thị điểm cuối /metrics :

     import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) }


  4. Cấu hình Prometheus để thu thập số liệu từ dịch vụ của bạn trong prometheus.yml :

     scrape_configs: - job_name: "example_service" static_configs: - targets: ["localhost:8080"]


Bây giờ, Prometheus sẽ tự động truy vấn http://localhost:8080/metrics sau mỗi vài giây để thu thập dữ liệu.

Tại sao mô hình kéo lại được ưa chuộng?

  • Tính đơn giản – Prometheus kiểm soát lịch trình và tần suất thu thập dữ liệu.
  • Ít điểm lỗi hơn – Không cần dịch vụ bổ sung để nhận số liệu.
  • Tự động dọn dẹp – Nếu một dịch vụ ngừng phản hồi, Prometheus chỉ cần ngừng nhận dữ liệu, tránh các số liệu cũ.



Mô hình đẩy (Phương pháp tiếp cận Pushgateway)

đẩy nó đi!


Trong mô hình đẩy , một dịch vụ sẽ gửi số liệu của mình đến một dịch vụ trung gian gọi là Pushgateway , dịch vụ này sẽ lưu trữ số liệu cho đến khi Prometheus lấy được.

Cách thức hoạt động (Mô hình đẩy)

  1. Ứng dụng của bạn đẩy số liệu lên Pushgateway:

     import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) func main() { registry := prometheus.NewRegistry() jobCounter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "job_execution_count", Help: "Number of executed jobs", }) registry.MustRegister(jobCounter) jobCounter.Inc() err := push.New("http://localhost:9090", "my_service_or_job"). Collector(jobCounter). Grouping("instance", "worker_1"). Push() if err != nil { panic(err) } }


  2. Cấu hình Prometheus để thu thập dữ liệu từ Pushgateway:

     scrape_configs: - job_name: "pushgateway" static_configs: - targets: ["localhost:9091"]

Khi nào thì mô hình đẩy thực sự hữu ích?

  • Các công việc tồn tại trong thời gian ngắn (tác vụ hàng loạt, công việc cron) hoàn tất trước khi Prometheus có thể thu thập chúng.
  • Hạn chế mạng khiến Prometheus không thể truy cập trực tiếp vào dịch vụ.
  • Nguồn dữ liệu bên ngoài (thiết bị IoT, API bên ngoài) không thể thu thập trực tiếp.


Bạn nên sử dụng mô hình nào?

Phương pháp

Tốt nhất cho...

Ưu điểm

Nhược điểm

Kéo (Khuyến nghị)

Dịch vụ web, API, ứng dụng chạy lâu dài

Thiết lập đơn giản, ít phụ thuộc hơn, tự động dọn dẹp

Không phù hợp cho các nhiệm vụ có thời gian thực hiện rất ngắn

Đẩy (Pushgateway)

Các công việc hàng loạt, nhiệm vụ không có quyền truy cập mạng ổn định

Cho phép đẩy dữ liệu từ các công việc tồn tại trong thời gian ngắn

Dữ liệu cũ, phức tạp hơn, nguy cơ tắc nghẽn

Tại sao mô hình đẩy không lý tưởng?

Mặc dù Pushgateway giải quyết được một số vấn đề (ví dụ: các tiến trình tồn tại trong thời gian ngắn kết thúc trước khi Prometheus xóa chúng), nhưng nó lại gây ra một số vấn đề mới :


  1. Khó quản lý dữ liệu cũ
    • Nếu một dịch vụ ngừng hoạt động, số liệu cũ của dịch vụ đó vẫn sẽ nằm trong Pushgateway.

    • Prometheus không có cách nào để biết liệu dịch vụ có còn hoạt động hay không.

    • Bạn phải xóa thủ công các số liệu lỗi thời bằng cách sử dụng push.Delete(...) hoặc cấu hình chính sách hết hạn.


  2. Độ phức tạp bổ sung
    • Thay vì liên kết trực tiếp Dịch vụ → Prometheus , giờ đây bạn có Dịch vụ → Pushgateway → Prometheus .

    • Pushgateway là một phần phụ thuộc bổ sung, làm tăng chi phí bảo trì.


  3. Những nút thắt tiềm ẩn
    • Nếu nhiều dịch vụ thường xuyên đẩy số liệu, Pushgateway có thể bị quá tải.

    • Không giống như các lệnh quét trực tiếp của Prometheus (phân phối tải), tất cả các yêu cầu đều truy cập vào một phiên bản Pushgateway duy nhất.


  4. Các vấn đề về tính nhất quán của dữ liệu
    • Nếu nhiều dịch vụ đẩy số liệu có cùng tên nhưng giá trị khác nhau, dữ liệu có thể bị ghi đè, dẫn đến kết quả không chính xác.



Phần kết luận

Prometheus là một công cụ mạnh mẽ và đáng tin cậy để giám sát các dịch vụ. Đối với hầu hết các ứng dụng, mô hình kéo là lựa chọn tốt nhất—nó đơn giản, hiệu quả và đảm bảo dữ liệu mới mà không phức tạp thêm. Tuy nhiên, nếu bạn đang làm việc với các quy trình tồn tại trong thời gian ngắn như hàm Lambda hoặc tác vụ hàng loạt, mô hình đẩy thông qua Pushgateway có thể hữu ích để nắm bắt số liệu trước khi quy trình thoát.


Việc lựa chọn phương pháp phù hợp sẽ đảm bảo khả năng quan sát và bảo trì hệ thống của bạn tốt hơn.


Bảo trọng!

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks