Tìm kiếm Blog này

Translate

Thứ Ba, 1 tháng 12, 2020

Prometheus - Cơ bản

 

Prometheus là gì?

Prometheus là một bộ công cụ giám sát và cảnh báo hệ thống, mã nguồn mở. Một số đặc điểm, tính năng của Prometheus:

  1. Mô hình dữ liệu đa chiều với chuỗi dữ liệu theo thời gian.

  2. Cung cấp ngôn ngữ truy vấn dữ liệu - PromQL: tổng hợp dữ liệu chuỗi thời gian trong thời gian thực.

  3. Triển khai đơn giản: bắt đầu từ 1 server duy nhất, có thể mở rộng theo nhu cầu.

  4. Dữ liệu chuỗi thời gian được thu thập qua giao thức HTTP.

  5. Hỗ trợ đẩy dữ liệu thông qua bên thứ 3 trung gian.

  6. Tự động nhận diện mục tiêu hoặc cấu hình tĩnh.

  7. Giao diện người dùng hỗ trợ phong phú, nhiều loại biểu đồ.

  8. Quản lý được trên Cloud và máy chủ vật lý. Được dùng phổ biến để giám sát các hệ thống container và microservices.

Các thành phần tạo nên Prometheus

Hệ sinh thái Prometheus được tạo nên từ nhiều phần độc lập, một số là tùy chọn:

  1. Phần lõi Prometheus: quét và lưu trữ dữ liệu theo chuỗi thời gian.

  2. Thư viện API: GO, Java/Scala, Python, Ruby được hỗ trợ chính thức, ngoài ra vẫn có các thư viện được viết bằng ngôn ngữ khác như C++, C#, Node.JS, PHP, Lua, R,...

  3. PUSH Gateway: cung cấp khả năng đẩy dữ liệu nhằm hỗ trợ cho các loại công việc ngắn hạn, không tồn tại lâu.

  4. Exporter: lấy dữ liệu từ nguồn cần giám sát chuyển đổi thành định dạng theo chuẩn của  Prometheus, và cung cấp 1 api cho Prometheus server PULL dữ liệu.

  5. Ngoài ra, còn có vô số công cụ hỗ trợ khác nhau.

Khi nào cần đến Prometheus?

Công việc DevOps ngày càng trở nên áp lực khi hệ thống là sự tổng hợp vô số các thành phần khác nhau và có các nhu cầu quản trị, điều hành, bảo trì,...cũng rất riêng biệt, không thể làm thủ công ngày này qua ngày khác.

Hoặc cụ thể hơn, trong môi trường containerized như Docker, Kubernetes, khi có vô số máy chủ chạy hàng ngàn container, và có sự liên kết lẫn nhau thì việc đảm bảo cho hệ thống ổn định, trơn tru là một nhiệm vụ rất thách thức. 

Một số nhu cầu cụ thể như

  • Giám sát hệ thống tài nguyên phân tán.

  • Giám sát tình trạng máy chủ: CPU, memory, hdd, lỗi hệ thống, server ngừng hoạt động,...

  • Giám sát các chương trình phần mềm: lỗi phần mềm, độ trễ,...

  • Nhanh chóng nhận diện sự cố, nguồn gốc phát sinh, cung cấp thông tin cụ thể cho developer kịp thời xử lý.

  • Tự động giám sát và đưa ra cảnh báo.

Kiến trúc xây dựng Prometheus

Máy chủ Prometheus

Bao gồm 3 thành phần chính

  1. Retrieval: thu thập thông tin từ các nguồn cần giám sát như phần mềm, dịch vụ, máy chủ,...

  2. Storage: lưu trữ dữ liệu theo chuỗi thời gian, như %CPU, số lỗi xảy ra

  3. HTTP server: cung cấp API hỗ trợ truy vấn dữ liệu.


Đối tượng và các chỉ số đo lường

Đối tượng

Đối tượng giám sát của Prometheus rất phong phú: máy chủ như Linux/Windows, chương trình phần mềm, hoặc dịch vụ, cơ sở dữ liệu,...

Chỉ số đo lường

Chỉ số đo lường đa dạng như mức độ sử dụng CPU, RAM, HDD, số lỗi xảy ra, lưu lượng xử lý,...

Prometheus có 3 loại chỉ số quan trọng như sau:

  1. Counter: chỉ số tích lũy hay còn gọi là bộ đếm, có đặc điểm chỉ tăng chứ không giảm như đếm số yêu cầu, đếm số lỗi xảy ra

  2. Gauge: chỉ số có thể tăng hoặc giảm theo thời gian như mức độ sử dụng CPU, bộ nhớ

  3. Histogram: liên quan về kích thước hoặc thời gian như thời gian truy vấn, khối lượng dữ liệu trả về

Prometheus thu thập dữ liệu như thế nào?

Prometheus cào (pull) dữ liệu từ các đối tượng cần giám sát thông qua giao thức HTTP với các điều kiện như sau:

  1. Có địa chỉ Endpoint, định dạng: hostaddress/metrics

  2. Dữ liệu phải theo đúng format mà Prometheus có thể hiểu.

Không phải máy chủ hay dịch vụ nào cũng có sẵn Endpoint để Prometheus có thể “cào” dữ liệu và có thể hiểu được. Đây là lý do cần tới một thành phần tiếp theo, đó là Exporter.

Exporters

Exporter về cơ bản như là 1 loại hình dịch vụ (Services) có khả năng thu thập các chỉ số từ đối tượng cần giám sát, sau đó chuyển đổi thành định dạng mà Prometheus có thể hiểu. Exporter cũng cung cấp 1 địa chỉ Endpoint đúng theo yêu cầu mà Prometheus cần, dùng để cào dữ liệu.

Hiện tại, danh sách exporter trải dài từ cơ sở dữ liệu (MongoDB, MySql, PostgreSQL,...), phần cứng (NVIDIA GPU, Fortigate, Netgear Router, IoT Edison,...), lưu trữ (Hadoop HDFS FSImage, ScaleIO, GPFS, Gluster,...), máy chủ web (Apache, Nginx, HAProxy,...), hoặc là các nền tảng đám mây như AWS, Cloudflare, DigitalOcean,...

Xem đầy đủ danh sách exporter tại đây.

Client Libraries

Câu hỏi đặt ra là làm thế nào để có thể giám sát các phần mềm/dịch vụ mà không có sẵn các Exporter? Prometheus cung cấp bộ thư viện được viết bằng rất nhiều ngôn ngữ lập trình như Go, Java, NodeJS, Ruby, C++, C#,...

Thư viện này giúp chúng ta tạo ra endpoint “/metrics” theo nhu cầu riêng, và định dạng dữ liệu theo chuẩn mà Prometheus có thể hiểu và xử lý.

Pull vs Push

Như đề cập ở trên, Prometheus sử dụng cơ chế “kéo” (pull) để thu thập dữ liệu từ các đối tượng cần giám sát. Đặc điểm này rất quan trọng trong kiến trúc của Prometheus.

Mặc dù với cơ chế “đẩy” tạo ra sự chủ động trong quá trình cập nhật dữ liệu, nhưng vẫn có một số hạn chế sau:

  1. Khi hệ thống cần giám sát bao gồm hàng trăm hoặc hơn microservices cùng hoạt động. Mỗi microservice cần đẩy dữ liệu về trung tâm giám sát tạo nên sự quá tải về đường truyền dẫn đến tình trạng thắt cổ chai. Đặt ra nhu cầu phải đầu tư lớn về hạ tầng, cũng như ảnh hưởng hạ tầng mạng.

  2. Ngoài ra, mô hình này đòi hỏi cần phải có 1 chương trình chạy nền trên từng máy chủ liên tục đẩy dữ liệu về trung tâm.

Ngược lại, Prometheus chỉ cần biết địa chỉ endpoint và chủ động kéo dữ liệu từ 1 hoặc nhiều Prometheus instances.

Mặt khác, có những trường hợp mà chúng ta không thể dùng cơ chế kéo, ví dụ như đối với batch job, schedule job có vòng đời ngắn, không tồn tại lâu. Prometheus cũng cung cấp Push Gateway hỗ trợ cho các đối tượng này đẩy dữ liệu chủ động.

Configurations

Làm sao Prometheus biết đối tượng nào cần giám sát, khi nào cần thu thập dữ liệu, hay qui định luật lệ như thế nào? 

Tất cả yêu cầu được định nghĩa trong file prometheus.yml. Prometheus sử dụng cơ chế service discovery để tìm kiếm các endpoint.

Một số nội dung quan trọng trong file prometheus.yml như sau:

global:

  # Bao lâu thì lấy thông tin, mặc định là 1 phút

  scrape_interval:     15s

  # Bao lâu thì kiểm tra và cập nhật rules, mặc định là 1 phút

  evaluation_interval: 30s

#----------------------------------------#

# rule_files: Các quy định thu thập thông tin và phát ra thông báo khi gặp điều kiện nhất định (ví dụ như phát ra thông báo khi CPU đạt 80%)

 

rule_files:

- "first.rules"

#----------------------------------------#

# scrape_configs: Định nghĩa tất cả đối tượng mà Prometheus cần giám sát

 

scrape_configs:

# Tên Job

- job_name: prometheus

  # metrics_path: ‘your-custom-metrics-path’ # giá trị mặc định là '/metrics'

  # scheme: ‘https’ # giá trị mặc định là 'http'.

 

  static_configs:

  # Địa chỉ đối tượng cần giám sát

  - targets: ['localhost:9090']

AlertManager

Prometheus có 1 thành phần gọi là AlertManager phụ trách công việc quản lý các thông báo, phát ra cảnh báo khi hệ thống gặp sự cố. Thành phần này cũng bao gồm nhiệm vụ loại bỏ thông báo trùng lặp, phân nhóm, và định tuyến đến các kênh thích hợp như email, slack, PagerDuty hoặc OpsGenie,...

Lưu trữ dữ liệu

Prometheus lưu trữ tất cả dữ liệu vào cơ sở dữ liệu chuỗi thời gian trên ổ cứng. Ngoài ra, Prometheus cũng hỗ trợ lưu trữ dữ liệu lên các hệ thống lưu trữ từ xa. Dữ liệu định dạng theo chuỗi thời gian nên không thể sử dụng Relational Database thông thường.

PromQL

Prometheus cung cấp một ngôn ngữ truy vấn gọi là PromQL, cho phép người dùng chọn lọc và tổng hợp dữ liệu chuỗi thời gian trong thời gian thực. Chúng ta có thể trực tiếp truy vấn thông qua API hoặc dùng một số công cụ mạnh mẽ có thể biểu diễn dữ liệu dưới dạng biểu đồ, hình ảnh trực quan hơn như là Grafana

Ưu và nhược điểm của Prometheus

Ưu điểm

  1. Độ tin cậy cao

  2. Độc lập và không phụ thuộc vào bên ngoài: do đó khi hệ thống có bất kỳ sự có gì, Prometheus vẫn có thể tiến hành giám sát mà không bị gián đoạn.

  3. Không cần mở rộng cơ sở hạ tầng

Nhược điểm

  1. Hơi phức tạp nếu cần mở rộng trong trường hợp đối tượng cần giám sát tăng lên.

  2. Do hoạt động độc lập, nên số lượng các chỉ số giám sát bị phụ thuộc vào sức mạnh cũng như khả năng lưu trữ của máy chủ.

Để giải quyết vấn đề tăng khả năng xử lý cho Prometheus, chúng ta có thể:

  1. Nâng cấp phần cứng máy chủ Prometheus.

  2. Hoặc giới hạn số lượng chỉ số cần giám sát.


Không có nhận xét nào:

Đăng nhận xét

Bài đăng phổ biến