thảo luận Giám sát hệ thống với Prometheus và Grafana

I. Tổng quan​

Prometheus và Grafana là các phần mềm mã nguồn mở được sử dụng rộng rãi trong giám sát (monitoring), đánh giá độ ổn định và cảnh báo sớm khi một hoặc nhiều mục tiêu trong hệ thống gặp sự cố. Mục tiêu này (dưới đây được gọi chung là node) có thể là một máy chủ server Linux, một router (ví dụ Mikrotik, thông qua SNMP, API), hoặc một firewall trên nền Free- hoặc Open-BSD (ví dụ như pfsense, thông qua package Prometheus có sẵn trên repo của pfsense; OPNSense với plugin node-exporter cho Prometheus)... Có thể cài Prometheus và Grafana trên một node, hoặc trên nhiều node để tạo thành cluster (cụm/hệ thống).

Trong bộ đôi trên thì mỗi phần mềm có một tính năng riêng biệt, ngắn gọn như sau:

1.1. Prometheus​

Prometheus được dùng để giám sát hệ thống thông qua các daemon cài sẵn trên các node, qua đó thu thập các thông tin cần thiết. Prometheus giao tiếp với node qua giao thức HTTP/https và lưu trữ data theo dạng time-series database (TSDB).

Nói thêm, TSDB là thuật ngữ dùng để chỉ những cơ sở dữ liệu chuyên dụng, được tối ưu để lưu trữ dữ liệu theo mốc thời gian. Dữ liệu đầu vào của TSDB là các metrics (thông số) về tình trạng của node như lượng RAM, CPU đã dùng của mỗi dịch vụ (service), số lượng truy vấn tới server, dung lượng đĩa cứng..., nói chung là bất cứ thông số hệ thống nào người dùng quan tâm. Các metric luôn gắn với một mốc thời gian cụ thể, tạo thành một chuỗi dữ liệu theo dòng thời gian, do vậy người dùng có thể thông qua Prometheus để xem lại dữ liệu của node ở bất kỳ thời điểm nào trước đó khi có sự cố, hay cũng có thể giúp phát hiện, cảnh báo sớm những điều bất thường của node.

Prometheus sử dụng một giao diện web đơn giản để người dùng theo dõi thông tin hệ thống, HTTP API. Prometheus sử dụng ngôn ngữ truy vấn rất mạnh mẽ để pull các metrics từ các node, sau đó chuyển dữ liệu cho Grafana để hiển thị qua trình duyệt web. Prometheus có một exporter được dựng sẵn (build-in), xuất các metric về service của Prometheus ra tại URL: http://prometheus.lc:9090/metrics. Tuy nhiên, để có thể lấy được các metric khác thì Prometheus phải nhờ đến các exporter của bên thứ ba hoặc do các cá nhân khác phát hành.

Các exporter khá đa dạng, được xếp thành nhiều loại: ví dụ như exporter liên quan đến database, đến hệ thống, storage (lưu trữ), hoặc http...vv. Xem thêm list các exporter ở đây. Một số exporter thông dụng:
  • SQL, MySQL, PostgreSQL...: xuất các metric liên quan đến cơ sở dữ liệu...
  • nginx-vts-exporter: cung cấp các số liệu về nginx server sử dụng module VTS bao gồm số lượng kết nối mở, số lượng phản hồi được gửi và tổng kích thước của các gói tin gửi và nhận.
  • cAdvisor: xuất các metric của docker service, các process trên host.
  • Node Exporter: xuất các metric của một node như CPU, RAM, dung lượng ổ đĩa, số lượng request tới node...
  • blackbox_exporter: tạo ra các số liệu từ các end-point (đầu dò) như HTTP, http để xác định tính khả dụng của các end-point, thời gian phản hồi,..
Cơ chế hoạt động của Prometheus như hình dưới đây

2021021e150c-1823-424c-bed7-05e8bd0dc44c.png


So sánh cơ chế lấy metric từ node giữa hai công cụ phổ biến là Prometheus và Influxdb

2021dbaa2900-3f28-481b-8156-6c64ca63fc3f.png


1.2. Grafana​

Grafana là một vizualizer, nôm na là công cụ hiển thị các metric dưới dạng các biểu đồ (chart) hoặc đồ thị (graph), được tập hợp lại thành dashboard có tính tùy biến cao, giúp dễ dàng theo dõi tình trạng của node.

Grafana có thể truy xuất dữ liệu từ Graphite, Elasticsearch, InfluxDB, Prometheus... Trước đây mình có xài bộ TIG stack (gồm Telegraf, Influxdb và Grafana), chạy tương đối ổn định. Tuy nhiên, từ cuối tháng 11/2020, sau khi Influxdb phát hành chính thức phiên bản v2.00 OSS, sử dụng ngôn ngữ mới Flux để truy vấn dữ liệu thì việc cấu hình Telegraf và Influxdb trở nên phức tạp một cách không cần thiết. Vì thế, mình bỏ bộ TIG stack để quay sang sử dụng Prometheus và Grafana, dễ cấu hình hơn. Một lý do nữa là Prometheus có các exporter cho cả Mikrotik và pf/OPN-sense, trong khi Telegraf chỉ có plugin hỗ trợ pfSense.

II. Mô hình​

Code:
Router: Mikrotik HapAC2, là DHCP server, IP 192.168.1.1. Chạy 24/7.
Node 1: tx3mini (Armbian Debian-based headless server, docker, 2gb ram/16gb rom), IP 192.168.1.13. Cắm chạy 24/7.
Node 2: desktop (headless server, Debian 10.9). IP 192.168.1.24.
Node 3: laptop (win10/debian 10.9 GNOME GUI), IP 192.168.1.7.
Grafana, Prometheus và node-exporter (để lấy metric của node) sẽ được cài đặt qua docker trên cả hai node 1, 2. Node 3 dùng để làm ssh controler/monitor, xem các metric thu thập được từ các node khác trên trình duyệt web qua dashboard của Grafana.

Do cả node 1 và 2 đều dùng distro nền Debian nên dưới đây minh họa các bước trên node 1 (tx3 mini).
 

III. Cách làm​

3.1. Các bước chuẩn bị​

Kiểm tra phiên bản docker, đảm bảo phiên bản này là mới nhất:
Code:
$ docker --version
$ sudo apt-get upfate 
$ sudo apt-get -y upgrade

Tạo một file yml mới để chạy trên Portainer. Đặt tên file là prograf.yml
Code:
 sudo touch prograf.yml

3.1.1. Chuẩn bị để cài đặt Prometheus
Trước tiên, tạo một user cho Prometheus, thêm user này vào group có cùng tên gọi:
Code:
 $ sudo useradd -rs /bin/false prometheus

20210d5e8143-be93-4b60-8e7f-d06defc2a006.png


Tạo một directory trên hdd để lưu database lâu dài:
Code:
 $ sudo mkdir prometheus_db

Trong directory này, tạo một file có tên là prometheus.yml. File này sau đó sẽ được bind-mount vào /etc/prometheus/prometheus.yml của docker, Prometheus sẽ hoạt động dựa trên config từ file yml này.
Code:
 $ cd /prometheus_db/ && sudo touch prometheus.yml

202160a7468e-475a-440e-ad40-78f00de0573a.png


Thiết lập quyền read và write của user và group prometheus cho directory này:
Code:
 $ sudo chown prometheus:prometheus ./prometheus/*

202126b2f827-47ec-4c38-b0b1-8a20050b6402.png


Kiểm tra lại quyền truy cập directory:
Code:
 $ ls -lh /prometheus/

Dùng một editor như vim, nano mở file prometheus.yml
Code:
 $ sudo nano prometheus.yml

Copy đoạn code sau, dán vào:
Code:
global:
  scrape_interval: 5s
  external_labels:
    monitor: 'svr-01'

scrape_configs:
- job_name: 'prometheus'
  static_configs:
    - targets: ['192.168.1.13:9090']

Lưu ý:
  • Kiểm tra xem port 9090 (port mặc định của Prothemeus) đã có dịch vụ nào sử dụng chưa:
    Code:
     $ sudo netstat -tulpn | grep 9090
    2021d80b97e5-53e4-408b-8045-d1f6a5359051.png

  • Sửa lại các tham số cho phù hợp thực tế: IP của node theo IP thực tế; svr-01 thành tên node (hostname) thực tế.

Lưu nội dung file và thoát trình editor. Trong ví dụ này mình dùng nano nên các tổ hợp phím như sau: Ctrl + O; Enter; Ctrl + X.

Mở file prograf.yml ở bước trên, dán đoạn code sau vào:

Code:
version: '2'
services:
 
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    user: "$UID:$GID"
    volumes:
      - /root/prometheus_db/prometheus.yml:/etc/prometheus/prometheus.yml
      - /root/prometheus_db:/var/lib/prometheus
      - /root/prometheus_db:/prometheus
      - /root/prometheus_db:/etc/prometheus
      - /root/prometheus_db/alert.rules:/etc/prometheus/alert.rules
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--web.route-prefix=/'
      - '--storage.tsdb.path=/root/prometheus_db'
      - '--storage.tsdb.retention.time=100h'
      - '--web.enable-lifecycle'
    restart: always
    network_mode: "host"
    ports:
      - '9090:9090'

Lưu lại nội dung file; kết thúc bước chuẩn bị cho container Prometheus.

Lưu ý:
  • Do bản chất của Docker >v2.0, Prometheus luôn được chạy với user/group là nobody/nogroup (xem thêm ở đây: http://github.com/prometheus/prometheus/issues/3441 và ở đây: http://github.com/keep-network/keep-core/pull/1826). Do vậy, Prometheus sẽ không được cấp quyền truy cập vào directory prometheus_db tạo ở trên, dẫn đến không thể bind/mount prometheus.yml từ directory này vào /etc/prometheus. Để tránh những lỗi liên quan đến quyền truy cập, phải thiết lập permission cho user/group prometheus và trong docker compose nên chỉ định user bằng "$UID:$GID".
  • Cần trỏ đúng đường dẫn của directory prometheus_db trên đĩa cứng: trong ví dụ này, qua kiểm tra bằng lệnh whoami, pwd thì mình đang là account root, luôn ở top directory /root. Do vậy đường dẫn để bind/mount directory sẽ là /root/prometheus_db. Nếu trỏ không đúng directory này sẽ dẫn đến báo lỗi "...../etc/prometheus is a directory..." khi chạy Prometheus.
  • Trong trường hợp sử dụng untangled firewall (ufw) thì mở port 9090 cho Prometheus WebUI. Nếu không, sẽ không thể truy cập vào Prometheus qua địa chỉ http://<node_ip>:9090.
    Code:
    sudo ufw allow 9090/tcp
    sudo ufw allow 9090/udp

3.1.2. Chuẩn bị để cài đặt Node-exporter

Các bước chuẩn bị cài đặt Node-exporter tương tự như trên: tạo account node-exporter, lấy ID của node-exporter, thêm vào prometheus.yml phần cấu hình của node-exporter, thêm vào prograf.yml phần cấu hình để chạy container node-exporter.

Tạo account node-exporter
Code:
$ sudo useradd -rs /bin/false node_exporter

Lấy ID của node-exporter
Code:
$ cat /etc/passwd | grep node_exporter 
prometheus:x:995:996:/home/node_exporter:/bin/false

202139b726b9-26ba-481d-b457-f417d05df1fd.png


User ID của node-exporter trên node khác nhau là khác nhau.

Kiểm tra xem port 9100 của node-exporter có bị dịch vụ nào đang sử dụng không; nếu có thì đổi dịch vụ đó sang port khác
Code:
 $ sudo netstat -tulpn | grep 9100

20210a6e63a0-c574-4248-9888-6bec30c63f6d.png


Sửa file prometheus.yml, thêm vào sau đoạn config của prothemeus đoạn code dưới đây:
Code:
- job_name: 'node_exporter'
    scrape_interval: 10s
    target_groups:
      - targets: ['192.168.1.13:9100']

Thêm vào phần dưới cùng của file prograf.yml đoạn code dưới đây:
Code:
node-exporter:
    image: prom/node-exporter
    user: '995:996'
    restart: unless-stop
    network_mode: "host"
    ports:
      - '9100:9100'

Container node-exporter được khởi tạo sẽ chạy với cấu hình mặc định, active tất cả các plugin kèm theo.

Lưu ý:
  • Tại phần target: Đổi sang IP thực tế của node.
  • Phải mở port 9100 để node-exporter có thể bind, kết nối với Prothemeus; qua đó Prometheus mới có thể pull các metric khác từ node-exporter.
    Code:
    sudo ufw allow 9100/tcp
    sudo ufw allow 9100/udp

3.1.3. Chuẩn bị để cài đặt Grafana

Tạo một directory tên là grafana_db để lưu database của Grafana
Code:
 sudo mkdir grafana_db

Kiểm tra xem port 3000 mặc định của Grafana đã có dịch vụ nào sử dụng hay chưa
Code:
 $ sudo netstat -tulpn | grep 3000

Mở port 3000 cho webui của Grafana:
Code:
sudo ufw allow 3000/tcp
sudo ufw allow 3000/udp

Đối với Grafana thì chỉ cần thêm phần config của container vào đoạn cuối của prograf.yml:
Code:
grafana:
    container_name: grafana
    image: grafana/grafana
    user: "$UID:$GID"
    volumes:
      - /grafana_db:/var/lib/grafana
    restart: always
    network_mode: "host"
    ports:
      - '3000:3000'

Lưu và thoát trình editor.
 

3.2. Dùng Portainer để cài đặt Prometheus và Grafana​

Xem thêm ở đây về cách cài đặt Portainer.

Mở Portainer, chuyển sang tab Stack > Add Stack.
Tại box Name nhập prograf
Tại khung Compose: copy và paste phần nội dung của file prograf.yml tạo ở bước 3.1.3 vào khung compose

2021b49a8dac-29e4-45f6-b064-38565517db2e.png


Tại button "Add Environment", click vào dấu "+", nhập lần lượt các tham số TZ, Asia/Ho_Chi_Minh
Nhấn button Deploy và đợi cho đến khi xuất hiện thông báo màu xanh thì các container Prothemeus, Node-exporter, Grafana đã được khởi tạo thành công.

Kiểm tra bằng lệnh sau để lấy tên các container và tình trạng:
Code:
 docker ps -a

20212a1316dc-8037-4d83-9369-1648668584b7.png

2021f92ab4a3-48dd-4739-8524-1415c8d27adf.png


Hoặc lệnh sau:
Code:
 sudo systemctl status <container-name>

3.3. Kiểm tra hoạt động của Prothemeus​

Truy cập vào webui của Prothemeus tại địa chỉ http://<ip-node>:9090. Sau đó vào tab Status > Target để xem hiện trạng của Prometheus và Node-exporter

2021797ce516-9825-4557-9a7f-01352224b3a7.png


Như trên hình, có thể thấy cả Prometheus và Node đều đang hoạt động: ở trạng thái UP, màu xanh.

3.4. Nhập database và tạo dashboard trên Grafana​

Truy cập vào địa chỉ http://<ip-node>:3000 để vào giao diện web của Grafana. Ở lần đăng nhập đầu tiên, dùng user/pass là admin/admin.

20213eb7efe8-0878-4cb0-8aa6-a91e8438b0bf.png


Ngay sau đó, Grafana sẽ chuyển sang trang yêu cầu thay đổi mật khẩu mới. Nhập mật khẩu mới (tùy chọn) và nhấn Save:

2021fefeacc0-7db6-4b0f-ac55-abb9a143fb1f.png


3.4.1. Nhập database từ Prometheus
Tại giao diện Home của Grafana, click chọn Configuration > Data Source > Add data source

202135352a90-3046-413a-a7f5-231b688704bf.png

2021e61e4195-5492-40ef-bc57-634ba3c82839.png


Click chọn datasource là Prometheus:

2021028c82bb-9063-4cce-a7ba-ac23f69e94a2.png


Cấu hình datasource như hình dưới đây (thay địa chỉ IP thực tế của node)

2021ade198a8-22a9-4234-85b1-de170dc7e2f4.png


Nhấn Save and Test

2021d1c13565-aaf8-4218-af1f-9c68e218fffc.png


Nếu nhập datasource thành công, Grafana đã lấy được các metric thì sẽ xuất hiện thông báo màu xanh như hình

2021bdcca938-8614-435f-b5e4-c9e31fba94c4.png


3.4.2. Tạo dashboard trên Grafana
Người dùng có thể tạo các dashboard riêng phù hợp với các tiêu chí của riêng mình. Tuy nhiên, việc này mất khá nhiều thời gian. Vì vậy, có thể dùng các mẫu dashboard đã được nhiều người dùng khác tạo sẵn, sau đó thêm hoặc bớt các board phù hợp với tiêu chí cá nhân. Cách làm như sau:

Truy cập website của Grafana, mục Dashboard để tìm dashboard phù hợp. Lưu lại mã dashboard ưng ý (ví dụ 1860).

2021ea6438ff-fd02-4753-be28-3a7d940d135a.png


Sau đó truy cập Grafana webUI, Dashboard > Manage > Import và điền mã nói trên.

2021821bd7fd-1d59-4948-8b49-33645ce4d528.png

20218d2566a8-3f6d-479f-8c06-c05f9dd45a9f.png


Từ các tùy chọn, click chọn datasource là prometheus

2021808e7adc-be1c-4c75-8f00-0e3d6dd1ad46.png


Dashboard hoàn chỉnh:

2021e8837c99-9061-48a3-af15-9cccb62dc055.png


Một số dashboard cho Grafana, sử dụng database của Prometheus:
https://grafana.com/grafana/dashboards/1860
https://grafana.com/grafana/dashboards/10242
https://grafana.com/grafana/dashboards/6287
https://grafana.com/grafana/dashboards/9894
https://grafana.com/grafana/dashboards/12055

Nguồn: Prometheus, Grafana documentation...

Chủ đề kế tiếp
  • Sử dụng các mikrotik-exporter (như mktxp, mikrotik-exporter...), Prometheus, Grafana để lấy và hiển thị các metric của Router OS.
  • Cảnh báo sớm với cAdvisor, AlertManager và Prometheus.
 
Last edited:
Thím có biết các Total network traffic kia nó là gì ko. Đang pull trên con Openwrt về. Ko biết có phải tổng download nhỉ. Tổng download thì làm gì đã down đến 8Tb :D
 

Attachments

  • 1619540560271.png
    1619540560271.png
    379.6 KB · Views: 173
Bác cho mình hỏi làm sao để lấy thông số các thứ vậy. Mình toàn bị no data
Bác kiểm tra checklist sau:
1. promethus, node-exporter đã hoạt động chưa (trạng thái UP)?,
2. mở port của prothmeus, node-exporter chưa?
3. và cuối cùng trên grafana đã chọn datasource là prothemeus chưa?
 
Bác đã sửa lại ip cho đúng chưa?
Và xem lại indent của các dòng; yml nó dị ứng với tab, phải dùng space khi indent các dòng.
cảm ơn bác.
Nếu mình muốn monitor thêm các máy khác thì cần phải cài thêm phần mềm nào nữa để nó đẩy về grafana
 
Để monitor nhiều máy thì bác nên dùng bộ TIG, gồm telegraf, influxdb, grafana. Inffluxdb chỉ cần cài trên một máy controler, sau đó cài thêm influxdb agent ở các máy khác. Tất cả các máy đều có chung một dâtbase của influxdb. Recommend cách này.
Còn nếu dùng bộ prometheus và grafana thì phải cài prothemeus trên tất cả các máy cần monitor, sửa grafana tương ứng. Not recommend.
 
Để monitor nhiều máy thì bác nên dùng bộ TIG, gồm telegraf, influxdb, grafana. Inffluxdb chỉ cần cài trên một máy controler, sau đó cài thêm influxdb agent ở các máy khác. Tất cả các máy đều có chung một dâtbase của influxdb. Recommend cách này.
Còn nếu dùng bộ prometheus và grafana thì phải cài prothemeus trên tất cả các máy cần monitor, sửa grafana tương ứng. Not recommend.
bác có tài liệu không cho mình xin với.
Cảm ơn bác đã giúp mình
 
Em đang muốn vẽ cái biểu đồ này trên grafana thì dùng loại type nào ae
Graph/diagram of uploads of the last 30 days (for the last 30 days, or with selection of time duration)
  • Graph shows the number of uploads per day
  • tables Temp_row
 
Back
Top