Chuyên mục
Linux Network

[Prometheus] – Phần 2 – Cài đặt Prometheus

 Cách Hoạt Động?

Prometheus thu thập dữ liệu bằng cách kéo dữ liệu từ hạ tầng và ứng dụng cần giám sát. Những hạ tầng và ứng dụng này được gọi là targets, và chúng được định nghĩa trong file cấu hình của Prometheus.

Các targets phải cung cấp HTTP endpoints để Prometheus có thể gọi đến, lấy dữ liệu và lưu kết quả trả về dưới dạng time series data (dữ liệu chuỗi thời gian).

Để các targets cung cấp được time series data, chúng ta có hai cách:

  • Đối với hạ tầng: Sử dụng các công cụ gọi là exporters. Ví dụ: máy chủ sử dụng prometheus/node_exporter.
  • Đối với ứng dụng: Cài đặt các thư viện Prometheus tương ứng vào ứng dụng. Ví dụ: ứng dụng viết bằng Java có thể dùng thư viện prometheus/client_java.

Bạn sẽ thường nghe đến thuật ngữ metrics. Đơn giản, metrics là tập hợp của nhiều time series có cùng tên. Để hiểu rõ hơn về time series và metrics từ các targets, chúng ta sẽ tìm hiểu cách dữ liệu được định dạng.

Prometheus Data Model

Dưới đây là ví dụ về một time series được trả về từ một target trong Prometheus:

container_cpu_load_average_10s{id="/docker", instance="10.0.2.15:8080", job="docker"} 0

Định đạng của dữ liệu ở trên như sau:

<metric name>{<label name>=<label value>, ...} <samples>

Tiếp theo là những thuật ngữ:

  • Phần <samples> được gọi là Samples, nó là dữ liệu của time series, giá trị của nó là một số thuộc kiểu dữ liệu float64.
  • Phần <metric name> là tên của metric.
  • Phần <label name>=<label value> sẽ chứa tập hợp của các labels, một label là dữ liệu kiểu key-value pairs.

Ví dụ dữ liệu ở trên ta sẽ có

  • container_cpu_load_average_10s là metric name
  • id="/docker" là label với key là id và value là docker
  • container_cpu_load_average_10s{id="/docker", instance="10.0.2.15:8080", job="docker"} notation để định nghĩa time series trên
  • 0 dữ liệu của nó

Khi Prometheus gọi vào endpoint của một target, nó sẽ nhận được rất nhiều time series data tương tự như các ví dụ trên. Prometheus lưu trữ tất cả dữ liệu này lại và cung cấp một bộ công cụ mạnh mẽ để chúng ta có thể truy vấn và phân tích dữ liệu.

Để xem tình trạng của hệ thống và ứng dụng, chúng ta có thể:

  • Truy vấn dữ liệu trực tiếp từ Prometheus thông qua ngôn ngữ truy vấn PromQL, cho phép lọc, tính toán và phân tích dữ liệu chi tiết.
  • Kết hợp với các công cụ trực quan hóa như Grafana, nơi các dữ liệu sẽ được biểu diễn thành các biểu đồ trực quan, giúp chúng ta nắm bắt nhanh chóng tình trạng hệ thống qua các dashboard.
Querying Data, Alert và Visualization

Để truy vấn dữ liệu trong Prometheus ta sử dụng ngôn ngữ PromQL, Prometheus có cung cấp cho ta một Expression Browser để ta gõ câu truy vấn, hình minh họa.

Ta không thể lúc nào cũng bật máy tính lên và quan sát hệ thống, ta cần có một hệ thống cảnh báo, Prometheus có cung cấp cho ta bộ công cụ Alertmanager. Nếu có gì bất thường trong hệ thống của ta thì Prometheus sẽ thông báo cho ta thông qua Alertmanager.

Và cuối cùng để biểu diễn dữ liệu lên biểu đồ thì ta sẽ dùng Grafana.

image

Cài đặt Prometheus bằng Linux Package

  • Truy cập vào trang Prometheus Download và tìm package phù hợp với hệ điều hành của bạn (Ở đây mình sẽ setup trên hệ điều hành CentOS)
wget https://github.com/prometheus/prometheus/releases/download/v2.39.0/prometheus-2.39.0.linux-amd64.tar.gz
  • Nếu đã có wget thì bỏ qua bước này

sudo yum install wget

  • Giải nén file đã tải ở trên.
tar -xzf prometheus-2.39.0.linux-amd64.tar.gz
sudo mv prometheus-2.39.0.linux-amd64/prometheus /usr/local/bin/
  • Chúng ta sẽ dùng tool promtool đang có sẳn trong thư mục prometheus-2.39.0.linux-amd64 để kiểm tra cấu hình
sudo mv prometheus-2.39.0.linux-amd64/promtool /usr/local/bin/
  • Thông tin như bên dưới là đã cài đặt thành công
prometheus --version
prometheus, version 2.39.0 (branch: HEAD, revision: 6d7f26c46ff70286944991f95d791dff03174eea)
  build user:       root@bc053716806f
  build date:       20221005-05:09:43
  go version:       go1.19.1
  platform:         linux/amd64
Cấu hình Prometheus

Xem file cấu hình bằng lệnh sau

cat prometheus-2.39.0.linux-amd64/prometheus.yml
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

Mặc định có 4 phần cấu hình chính là: global, alerting, rule_files,scrape_configs.

  • Global: cấu hình chung cho toàn bộ Prometheus.
    • Trường scrape_interval định nghĩa trong bao lâu thì Prometheus sẽ thực hiện kéo dữ liệu một lần (ở đây đang mặc định là 15 giây)
    • Trường evaluation_intervalđịnh nghĩa trong bao lâu thì Prometheus sẽ thực hiện đánh giá lại rule một lần
  • Alerting: chứa cấu hình về công cụ mà ta sẽ gửi cảnh báo tới khi hệ thống có vấn đề, đối với Prometheus thì ta sẽ dùng Alertmanager
  • Rule files: chứa cấu hình định nghĩa rule khi nào Prometheus sẽ cần cảnh báo qua Alertmanager và các rule về recording
  • Scrape configuration: chứa cấu hình để ta định nghĩa các targets mà ta sẽ cần giám sát.
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
    • job_name định nghĩa tên của target mà ta giám sát (ở đây là prometheus)
    • targets dùng để định nghĩa địa chỉ của target

Cấu hình mặc định của Prometheus là sẽ giám sát chính bản thân nó, khi bạn chạy Prometheus thì nó sẽ lắng nghe ở port 9090 và cung cấp một đường dẫn là /metrics để ta lấy metrics của nó

curl localhost:9090/metrics

ví dụ:

scrape_configs:
  - job_name: "nodejs-server"
    metrics_path: /other-path
    static_configs:
      - targets: ["localhost:3000"]

Prometheus sẽ kéo dữ liệu thông qua endpoint localhost:3000/other-path.

Chạy Prometheus
  • Tạo và di chuyển file cấu hình
sudo mkdir -p /etc/prometheus
sudo mv prometheus-2.39.0.linux-amd64/prometheus.yml /etc/prometheus/
  • Chạy file cấu hình
prometheus --config.file "/etc/prometheus/prometheus.yml"
...
ts=2022-10-05T07:21:29.148Z caller=main.go:500 level=info msg="No time or size retention was set so using the default time retention" duration=15d
ts=2022-10-05T07:21:29.148Z caller=main.go:544 level=info msg="Starting Prometheus Server" mode=server version="(version=2.39.0, branch=HEAD, revision=6d7f26c46ff70286944991f95d791dff03174eea)"
  • Kiểm tra hoạt động bằng cách mở một terminal khác và chạy lệnh sau
curl localhost:9090/metrics
...
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.3545e-05
go_gc_duration_seconds{quantile="0.25"} 1.6924e-05
go_gc_duration_seconds{quantile="0.5"} 3.8626e-05
go_gc_duration_seconds{quantile="0.75"} 4.503e-05
go_gc_duration_seconds{quantile="1"} 0.000437923
...
  • Mở trình duyệt và truy cập bằng địa chỉ http://<IP Prometheus>:9090
image

Chạy thử một câu truy vấn up{job="prometheus"}, đây là time series để kiểm tra target

image

Cài đặt Prometheus bằng Docker

  • Chạy lệnh sau khi đã cài docker căn bản
docker run --name prometheus --net="host" -p 9090:9090 -v /etc/prometheus:/etc/prometheus -d prom/prometheus

Vậy là xong bài tiếp theo trong chuỗi Series về Prometheu !!!!!