1. Tổng quan Kiến trúc
Hệ thống giám sát được thiết kế dựa trên hệ sinh thái Prometheus, đảm bảo khả năng thu thập metics đa dạng từ máy chủ, thiết bị mạng và ứng dụng cơ sở dữ liệu. Để đảm bảo tính sẵn sàng cao (High Availability - HA) cho việc truy cập và query dữ liệu, Keepalived được sử dụng để cung cấp một Virtual IP (VIP).
Luồng hoạt động cơ bản:
- Các Exporter & Agent (Node, Windows, Telegraf, SNMP, Elasticsearch): Thu thập metrics từ các nguồn tương ứng và mở một cổng HTTP để expose dữ liệu.
- Prometheus Server: Chủ động "scrape" (pull) dữ liệu từ các endpoints này theo chu kỳ đã cấu hình.
- Keepalived: Gắn trước các máy chủ Prometheus để cung cấp một địa chỉ IP duy nhất (VIP) cho hệ thống Dashboard (Grafana) hoặc người dùng truy cập.
2. Mô tả Chức năng các Thành phần
- Prometheus: Là lõi của hệ thống, đóng vai trò Time Series Database (TSDB). Nó có nhiệm vụ gọi đến các Exporter để kéo metrics về lưu trữ và đánh giá các luật cảnh báo (Alerting Rules).
- Keepalived: Cung cấp cơ chế Failover. Nếu máy chủ Prometheus Active gặp sự cố, Keepalived sẽ tự động chuyển VIP sang máy chủ Prometheus Standby, giúp gián đoạn truy cập ở mức tối thiểu.
- Node Exporter: Thành phần chuẩn hóa của Prometheus chuyên dụng để giám sát các chỉ số phần cứng và hệ điều hành cho các máy chủ nhân Linux/Unix (như Ubuntu, CentOS, RedHat). Nó trích xuất chi tiết các thông số về CPU, RAM, Disk I/O, Network, và trạng thái Filesystem.
- Windows Exporter: Là tác nhân dành riêng cho hệ điều hành Windows (Windows Server & Windows Client). Nó giao tiếp với WMI và Performance Counters của Windows để lấy các số liệu về phần cứng cũng như các dịch vụ đặc thù như IIS, Active Directory, Hyper-V.
- SNMP Exporter: Đóng vai trò cầu nối để giám sát các thiết bị mạng (Router, Switch, Firewall). Nó nhận yêu cầu từ Prometheus, chuyển đổi thành các truy vấn SNMP (v1, v2c, v3) tới thiết bị mạng, và trả về kết quả dưới định dạng Prometheus metrics.
- Telegraf: Là agent mạnh mẽ của InfluxData nhưng hỗ trợ xuất dữ liệu ra định dạng Prometheus. Nó thường được cài đặt trực tiếp lên các OS (Linux/Windows) để thu thập metrics về CPU, RAM, Disk, Network và các services nội bộ.
- Elasticsearch Exporter: Truy vấn các API nội bộ của cụm Elasticsearch để lấy ra các metrics về tình trạng cluster, nodes, indices, shards và hiệu suất JVM.
3. Hướng dẫn Cài đặt & Cấu hình
3.1. Cấu hình High Availability với Keepalived và cài đặt Prometheus
Bài viết tham khảo để cài đặt:
3.2. Node Exporter (Dành cho máy chủ Linux)
Node Exporter thu thập các số liệu về CPU, bộ nhớ, disk I/O, network traffic và hệ thống file của các máy chủ Linux.
Tải Node Exporter:
Giải nén:
tar xvf node_exporter-1.10.2.linux-amd64.tar.gz
Copy binary:
cd node_exporter-1.10.2.linux-amd64
sudo cp node_exporter /usr/local/bin/
Tạo user chạy service:
sudo useradd --no-create-home --shell /bin/false node_exporter
Tạo service systemd:
Tạo file:
sudo nano /etc/systemd/system/node_exporter.service
Nội dung file:
Chạy service:[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --collector.systemd
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
Chỉnh config /etc/prometheus/prometheus.yml :
static_configs:
- targets:
- 10.120.100.9:9100
3.3. Windows Exporter (Dành cho máy chủ Windows Server / Windows Client)
Windows Exporter (trước đây là wmi_exporter) chạy như một Windows Service để thu thập các số liệu đặc thù của Windows như IIS, Hyper-V, Active Directory, CPU, RAM, Services status...
Cài đặt:
- Truy cập vào trang Releases của windows_exporter và tải về file cài đặt .msi mới nhất.
- Mở PowerShell với quyền Administrator và chạy lệnh sau để cài đặt và tự động kích hoạt các bộ thu thập dữ liệu phổ biến:
Sau khi cài đặt, trình cài đặt sẽ tạo một service tên là windows_exporter tự động chạy cùng hệ thống và mở cổng 9182.msiexec /i windows_exporter-amd64.msi ENABLED_COLLECTORS="os,cpu,memory,net,logical_disk,system,service"
Bạn có thể mở trình duyệt trên máy bất kỳ và truy cập http://<IP_MAY_WINDOWS>:9182/metrics để đảm bảo dữ liệu đã được expose thành công.
3.4. SNMP Exporter (Dành cho các thiết bị mạng: router, switch, firewall, ...)
SNMP Exporter là công cụ chuyên dụng được khuyên dùng để trích xuất (expose) dữ liệu SNMP từ các thiết bị mạng sang định dạng mà hệ thống giám sát Prometheus có thể thu thập và xử lý được
Dưới đây là các đặc điểm chính của SNMP Exporter:
- Chuyển đổi dữ liệu tự động: SNMP sử dụng cấu trúc dữ liệu phân cấp dạng cây (dựa trên OID và MIB), trong khi Prometheus sử dụng dữ liệu dạng ma trận đa chiều. SNMP Exporter đảm nhiệm việc ánh xạ (map) hoàn hảo giữa hai cấu trúc này, ví dụ như tự động biến các chỉ mục (index) của SNMP thành các nhãn (labels) trên Prometheus
- Mô hình hoạt động dạng Proxy: SNMP Exporter được thiết kế để chạy trên một vài máy chủ trung tâm và hoạt động giống như một "Prometheus proxy". Nó có khả năng mở rộng rất mạnh mẽ, một bản cài đặt (instance) duy nhất có thể dùng để quét (walk) và thu thập dữ liệu cho hàng ngàn thiết bị.
- Quản lý cấu hình qua Generator: Cấu hình cốt lõi của công cụ này nằm ở file snmp.yml. Bạn không nên chỉnh sửa file này bằng tay mà cần dùng công cụ generator (như chúng ta đã trao đổi ở trên) để đọc các file MIB và tự động biên dịch ra cấu hình chuẩn.
- Bảo mật: SNMP Exporter hỗ trợ xác thực cơ bản và mã hóa TLS. Mặc định cấu hình sử dụng public_v2 (SNMP v1/v2c), nhưng do dữ liệu ở các phiên bản này không được mã hóa, tài liệu khuyên bạn nên cấu hình sử dụng SNMP v3 nếu môi trường yêu cầu bảo mật nghiêm ngặt
Tải và giải nén SNMP Exporter:sudo useradd --system --no-create-home --shell /bin/false snmp_exporter
Phân quyền và di chuyển file:wget https://github.com/prometheus/snmp_....30.1/snmp_exporter-0.30.1.linux-amd64.tar.gz
tar xvf snmp_exporter-0.30.1.linux-amd64.tar.gz
cd snmp_exporter-0.30.1.linux-amd64
Tạo Systemd Service:sudo cp snmp_exporter /usr/local/bin/
sudo chown snmp_exporter:snmp_exporter /usr/local/bin/snmp_exporter
sudo mkdir /etc/snmp_exporter
sudo cp snmp.yml /etc/snmp_exporter/
sudo chown -R snmp_exporter:snmp_exporter /etc/snmp_exporter
Nội dung file:sudo nano /etc/systemd/system/snmp_exporter.service
Khởi động service:[Unit]
Description=Prometheus SNMP Exporter
After=network.target
[Service]
User=snmp_exporter
Group=snmp_exporter
ExecStart=/usr/local/bin/snmp_exporter \
--config.file=/etc/snmp_exporter/snmp.yml \
--web.listen-address=":9116"
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Bật SNMP v3 trên Switch và lấy authen:sudo systemctl daemon-reload
sudo systemctl enable snmp_exporter
sudo systemctl start snmp_exporter
Cách generate file cấu hình snmp.yml để snmp exporter có thể hoạt động:
https://securityzone.vn/t/snmp_exporter-cach-tu-tao-cau-hinh-generator-yml-cho-snmp_exporter.12875/
Cấu hình prometheus, thêm một job vào prometheus với authen sử dụng chinh_v3_profile.
Đối với các dòng Core Switch chịu tải cao, việc bắt nó trả về hàng nghìn dòng thông số port có thể làm mệt CPU của Switch. Giao thức SNMP mặc định đi hỏi từng dòng một (GetNext) rất chậm. Set thời gian quét 60s và timeout lâu hơn windows exporter và node exporter.
Thêm các host switch trong file targets_network.yml:
Kiểm tra và thấy log:
3.5. Telegraf - plugin Vsphere (Sử dụng làm exporter)
Chạy đoạn code sau để tải telegraf:
Vì cần metric của vsphere nên sẽ dùng plugin vsphere trong telegraf, ta vào file /etc/telegraf/telegraf.conf cấu hình những thông tin cần thiết như link đến vcenter, username và password của tài khoản có role read-only để get dữ liệu từ API.curl --silent --location -O https://repos.influxdata.com/influxdata-archive.key
gpg --show-keys --with-fingerprint --with-colons ./influxdata-archive.key 2>&1 \
| grep -q '^fpr:\+24C975CBA61A024EE1B631787C3D57159FC2F927:$' \
&& cat influxdata-archive.key \
| gpg --dearmor \
| sudo tee /etc/apt/keyrings/influxdata-archive.gpg > /dev/null \
&& echo 'deb [signed-by=/etc/apt/keyrings/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' \
| sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt-get update && sudo apt-get install telegraf
Ở phần vm_metric_include điền vào các field dữ liệu cần lấy từ vmware từ vcenter đó quản lý, host_metric_include điền field dữ liệu cần lấy từ các host EXSI, datacenter_metric_include điền field dữ liệu cần lấy từ datastore, và vsan_metric_include cũng tương tự.
Ở dưới sẽ là config mẫu lấy dữ liệu cơ bản cần để monitor:
Ở phần outputs mở port cho prometheus scrape lấy metric.### ==============================================================================
### AGENT CONFIGURATION
### ==============================================================================
[agent]
interval = "60s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = "0s"
omit_hostname = false
# -- INSTANCE 1: REALTIME METRICS (INTERVAL: 60s) --
[[inputs.vsphere]]
interval = "60s"
vcenters = [ "https://x.x.x.x/sdk/" ]
username = "test@vsphere.local"
password = "Poptech@123!"
vm_metric_include = [
"sys.uptime.latest",
"sys.osUptime.latest",
"cpu.usage.average",
"cpu.ready.summation",
"cpu.readiness.average",
"mem.usage.average",
"mem.active.average",
"virtualDisk.read.average",
"virtualDisk.write.average",
"net.bytesRx.average",
"net.bytesTx.average",
"net.droppedRx.summation",
"net.droppedTx.summation",
]
host_metric_include = [
"sys.uptime.latest",
"cpu.usage.average",
"cpu.coreUtilization.average",
"cpu.readiness.average",
"mem.usage.average",
"mem.active.average",
"disk.deviceReadLatency.average",
"disk.deviceWriteLatency.average",
"net.bytesRx.average",
"net.bytesTx.average",
"net.droppedRx.summation",
"net.droppedTx.summation",
"vmop.numPoweroff.latest",
"vmop.numVMotion.latest",
"vmop.numPoweron.latest",
"vmop.numPoweroff.latest"
]
datastore_metric_exclude = ["*"]
cluster_metric_exclude = ["*"]
datacenter_metric_exclude = ["*"]
vsan_metric_exclude = ["*"]
resource_pool_metric_exclude = ["*"]
max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"
# -- INSTANCE 2: HISTORICAL METRICS (INTERVAL: 300s/5m) --
[[inputs.vsphere]]
interval = "300s"
vcenters = [ "https://x.x.x.x/sdk/"" ]
username = "test@vsphere.local"
password = "Poptech@123!"
datastore_metric_include = [
"disk.capacity.latest",
"disk.used.latest",
]
cluster_metric_include = [
"vmop.numPoweroff.latest",
"vmop.numVMotion.latest",
]
vsan_metric_exclude = ["*"]
datacenter_metric_exclude = ["*"]
vm_metric_exclude = ["*"]
host_metric_exclude = ["*"]
resource_pool_metric_exclude = ["*"]
historical_interval = "5m"
max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"
[[inputs.vsphere]]
interval = "300s"
vcenters = [ "https://x.x.x.x/sdk/" ]
username = "test@vsphere.local"
password = "Poptech@123!"
vm_metric_exclude = ["*"]
datastore_metric_exclude = ["*"]
datacenter_metric_exclude = ["*"]
host_metric_exclude = ["*"]
cluster_metric_exclude = ["*"]
resource_pool_metric_exclude = ["*"]
vsan_metric_include = [
"summary.disk-usage",
"summary.health",
"summary.resync",
"performance.cluster-domclient",
"performance.cluster-domcompmgr",
"performance.host-domclient",
"performance.host-domcompmgr",
"performance.cache-disk",
"performance.disk-group",
"performance.capacity-disk",
"performance.disk-group",
"performance.virtual-machine",
"performance.vscsi",
"performance.virtual-disk",
"performance.vsan-host-net",
"performance.vsan-vnic-net",
"performance.vsan-pnic-net",
"performance.vsan-iscsi-host",
"performance.vsan-iscsi-target",
"performance.vsan-iscsi-lun",
"performance.lsom-world-cpu",
"performance.nic-world-cpu",
"performance.dom-world-cpu",
"performance.cmmds-world-cpu",
"performance.host-cpu",
"performance.host-domowner",
"performance.host-memory-slab",
"performance.host-memory-heap",
"performance.system-mem",
]
vsan_metric_skip_verify = true
vsan_metric_exclude = []
historical_interval = "5m"
max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"
### OUTPUT
[[outputs.prometheus_client]]
listen = ":9273"
expiration_interval = "360s"
Thực hiện chạy service và enable cho service chạy khi boot server:
Sau đó cấu hình tạo job scrape metric trên prometheus:systemctl start telegraf
systemctl enable telegraf
Kiểm tra trên prometheus:- job_name: 'telegraf_vsphere'
scrape_interval: 60s
scrape_timeout: 45s
static_configs:
- targets: ['telegraf_ip:9273']
Trên opensearch metric cũng đã được gửi lên:
3.6. Elasticsearch exporter (áp dụng cho monitor Opensearch)
Sử dụng elastic exporter để thu thập metric từ cụm Opensearch/Elasticsearch.
Kiến trúc thu thập dữ liệu: Khác với các exporter truyền thống, Elasticsearch Exporter phiên bản mới khuyến nghị sử dụng mô hình Multi-Target.
- Exporter chạy độc lập như một proxy.
- Prometheus sẽ gọi vào endpoint /probe của Exporter, truyền tham số target (IP OpenSearch) và module xác thực.
- Exporter đứng ra kết nối với OpenSearch, lấy dữ liệu và trả ngược lại cho Prometheus.
Bước 1: Tải và cài đặt Binary
Trên máy chủ dự kiến chạy Exporter, thực hiện tải phiên bản mới nhất từ kho lưu trữ chính thức của Prometheus Community:
Bước 2: Tạo cấu hình xác thực (YAML)wget https://github.com/prometheus-commu...sticsearch_exporter-1.10.0.linux-amd64.tar.gz
tar -xvf elasticsearch_exporter-1.10.0.linux-amd64.tar.gz
sudo cp elasticsearch_exporter-1.10.0.linux-amd64/elasticsearch_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/elasticsearch_exporter
Tạo thư mục chứa cấu hình:
Cấu hình thông tin xác thực (auth_modules):sudo mkdir -p /etc/elasticsearch_exporter
sudo nano /etc/elasticsearch_exporter/exporter-config.yml
Phân quyền bảo mật cho file:auth_modules:
opensearch_auth:
type: userpass
userpass:
username: admin
password: mat_khau_cua_ban
Bước 3: Cấu hình Systemd Servicesudo chmod 600 /etc/elasticsearch_exporter/exporter-config.yml
Tạo file service:
Định nghĩa cấu hình service. Tại đây, chúng ta bổ sung các cờ (flags) quan trọng:sudo nano /etc/systemd/system/elasticsearch_exporter.service
- --es.ssl-skip-verify: Bỏ qua lỗi chứng chỉ SSL tự cấp.
- --es.all: Thu thập toàn bộ metric hệ thống.
- --es.indices: Thu thập metric chi tiết ở cấp độ từng index.
Nạp lại systemd và khởi chạy:[Unit]
Description=Elasticsearch Exporter
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/elasticsearch_exporter --config.file=/etc/elasticsearch_exporter/exporter-config.yml --es.ssl-skip-verify --es.all --es.indices
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
Tích hợp vào Prometheus:sudo systemctl daemon-reload
sudo systemctl enable elasticsearch_exporter
sudo systemctl start elasticsearch_exporter
Mở file cấu hình của Prometheus (thường nằm ở /etc/prometheus/prometheus.yml) để thêm Job thu thập dữ liệu mới.
scrape_configs:
- job_name: 'opensearch_cluster'
scrape_interval: 1m # Chu kỳ thu thập: 1 phút
scrape_timeout: 30s # Thời gian chờ tối đa
metrics_path: /probe # Trỏ vào endpoint probe của exporter
params:
auth_module: [opensearch_auth] # Trùng với tên module trong file exporter-config.yml
static_configs:
- targets:
- 'https://<IP_OPENSEARCH_CỦA_BẠN>:9200' # Thay IP thực tế của node OpenSearch
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9114 # Địa chỉ của Elasticsearch Exporter
3.7. Ping exporter
Ping exporter, một công cụ mã nguồn mở được thiết kế để thu thập dữ liệu ICMP echo requests cho hệ thống giám sát Prometheus. Phần mềm này đo lường các chỉ số mạng quan trọng như độ trễ (RTT) và tỷ lệ mất gói tin, giúp người dùng theo dõi hiệu suất kết nối của các mục tiêu được chỉ định. Tổng quan, đây là giải pháp kỹ thuật hiệu quả để tích hợp dữ liệu kiểm tra mạng vào các biểu đồ và hệ thống cảnh báo của Prometheus.
Cài đặt:
Giải nén:
Di chuyển file thực thi vào thư mục bin:tar -xvf ping_exporter_1.2.0_linux_amd64.tar.gz
Cấp quyền thực thi:sudo mv ping_exporter /usr/local/bin/
Để ping_exporter có thể gửi các gói tin ICMP (ping) mà không cần chạy dưới quyền root thì cấp quyền cap_net_raw:sudo chmod +x /usr/local/bin/ping_exporter
Tạo file config cho ping exporter:sudo setcap cap_net_raw+ep /usr/local/bin/ping_exporter
Nội dung:mkdir /etc/ping_exporter/
sudo nano /etc/ping_exporter/ping_exporter.yml
Tạo service systemd để chạy ngầm:targets:
- 8.8.8.8
- 1.1.1.1
- 10.120.100.31
- host: google.com
dns:
refresh: 2m
nameserver: 8.8.8.8
ping:
interval: 5s
timeout: 3s
history-size: 10
payload-size: 56
options:
disableIPv6: true
Nội dung file:sudo nano /etc/systemd/system/ping_exporter.service
Khởi động và cho phép service chạy cùng hệ thống:[Unit]
Description=Ping Exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/ping_exporter --config.path=/etc/ping_exporter/ping_exporter.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
Trên prometheus thêm job vào:sudo systemctl daemon-reload
sudo systemctl enable ping_exporter
sudo systemctl start ping_exporter
sudo systemctl status ping_exporter
- job_name: 'ping'
scrape_interval: 60s
static_configs:
- targets: ['10.120.100.9:9427']