Prometheus 是一個開源的監控系統。支持靈活的查詢語言(PromQL),采用 http 協議的 pull 模式拉取數據等特點使 Prometheus 即簡單易懂又功能強大。
Prometheus 的主要特點
-
多維度數據模型
-
靈活的查詢語言
-
不依賴分布式存儲,單個服務器節點是自主的
-
通過 pull 方式采集時序數據
-
可以通過中間網關進行時序列數據推送
-
通過服務發現或者靜態配置來發現目標服務對象
-
支持多種界面展示方案,比如 grafana 等
Prometheus 由 server, client, push gateway, exporter, alertmanager 等核心組件構成。Prometheus server 主要用於抓取和存儲數據。Client libraries 可以用來連接 server 並進行查詢等操作。Push gateway 用於批量,短期的監控數據的匯總節點,主要用於業務數據匯報等。不同的 exporter 用於不同場景下的數據收集,如收集主機信息的 node_exporter,收集 MongoDB 信息的 MongoDB exporter 等等。下圖是 Prometheus 官方提供的架構圖:
從這個架構圖,我們可以看出它的運行邏輯大概是這樣的:
Prometheus server 定期從數據源拉取數據,然后將數據持久化到磁盤。Prometheus 可以配置 rules,然后定時查詢數據,當條件觸發的時候,會將 alert 推送到配置的 Alertmanager。Alertmanager 收到警告的時候,可以根據配置,聚合,去重,降噪,最后發送警告。同時還可以使用 API, Prometheus Console 或者 Grafana 查詢和聚合數據。
本文將介紹在 ubuntu 16.04 系統中安裝 Prometheus Server,並配置它從一台主機上拉取監控信息,然后通過 Prometheus Server 提供的簡易 UI 查詢數據。
在 Ubuntu 16.04 中安裝 Prometheus Server
請從 Prometheus 官方下載 linux 版的二進制壓縮包。注意在下載前要選擇操作系統為 linux。
執行下面的命令把 prometheus server 安裝到 /usr/local/share/prometheus 目錄:
$ tar -xf prometheus-1.7.2.linux-amd64.tar.gz $ sudo mv prometheus-1.7.2.linux-amd64 /usr/local/share/prometheus
理論上來說這樣就算是安裝完成了,但是無論如何這都太簡陋了。因為每次啟動 Prometheus server 都需要手動執行命令:
$ /usr/local/share/prometheus/prometheus -config.file=/usr/local/share/prometheus/prometheus.yml
這實在是太不方便了!應該把它配置成服務,用 systemd 來管理。
先創建一個名為 prometheus 的用戶:
$ sudo adduser prometheus
把目錄 /usr/local/share/prometheus/ 的所有者設置為 prometheus 用戶:
$ sudo chown -R prometheus:prometheus /usr/local/share/prometheus/
然后創建文件 /etc/systemd/system/prometheus.service,內容如下:
[Unit] Description=Prometheus Server Documentation=https://prometheus.io/docs/introduction/overview/ After=network.target [Service] User=prometheus Restart=on-failure WorkingDirectory=/usr/local/share/prometheus/ ExecStart=/usr/local/share/prometheus/prometheus \ -config.file=/usr/local/share/prometheus/prometheus.yml [Install] WantedBy=multi-user.target
好了,現在可以通過 systemd 來控制 Prometheus 服務了,先啟動服務:
$ sudo systemctl daemon-reload $ sudo systemctl start prometheus
再把服務配置為開機時啟動:
$ sudo systemctl enable prometheus
檢查一下服務的狀態:
$ sudo systemctl status prometheus
到此為止 Prometheus Server 已經開始運行了。接下來我們就可以收集數據了。
使用 Node Exporter 收集主機信息
數據收集的任務由不同的 exporter 來完成,如果要收集 linux 主機的信息,可以使用 node exporter。然后由 Prometheus Server 從 node exporter 上拉取信息。接下來我們介紹如何安裝並配置 node exporter。
請從 Prometheus 官方下載 node exporter 的二進制壓縮包。執行下面的命令把 node exporter 安裝到 /usr/local/share/ 目錄:
$ tar -xf node_exporter-0.14.0.linux-amd64.tar.gz $ sudo cp node_exporter-0.14.0.linux-amd64/node_exporter /usr/local/sbin/
同樣的我們把 node exporter 也配置成通過 systemd 管理。創建文件 /etc/systemd/system/node-exporter.service,內容如下:
[Unit] Description=Prometheus Node Exporter After=network.target [Service] ExecStart=/usr/local/sbin/node_exporter User=nobody [Install] WantedBy=multi-user.target
執行下面的命令設置為開機啟動並啟動服務:
$ sudo systemctl daemon-reload $ sudo systemctl enable node-exporter $ sudo systemctl start node-exporter
node exporter 默認監聽 9100 端口,讓我們檢查一下端口的監聽情況:
$ ss -tunl
Node exporter 已經可以收集主機上的信息了,接下來我們還需要配置 Prometheus Server 從 node exporter 那里拉取數據。
配置 Prometheus 從 Node Exproter 拉取數據
Prometheus Server 可以從不同的 exporter 上拉取數據,對於上面的 node exporter 我們可以利用 Prometheus 的 static_configs 來拉取 node exporter 的數據。編輯 Prometheus server 的配置文件:
$ sudo vim /usr/local/share/prometheus/prometheus.yml
在 scrape_configs 中添加一個 名稱為 node 的 static_configs:
- job_name: "node" static_configs: - targets: ["127.0.0.1:9100"]
注意,要把上面的 IP 地址替換為運行 node exporter 的主機的 IP。
保存文件然后重啟 prometheus 服務!重啟后 prometheus 服務會每隔 15s 從 node exporter 上拉取一次數據。
查詢數據
Prometheus Server 提供了簡易的 WebUI 可以進數據查詢並展示,它默認監聽的端口為 9090。接下來我們進行一次簡單的查詢來驗證本文安裝配置的系統。
在瀏覽器中訪問 Prometheus Server 的 9090 端口:
在下拉菜單中選擇 "node_memory_Buffers",然后點擊 "Execute" 按鈕:
查詢出來的結果略微有些粗獷,連單位都沒帶。請選擇 "Graph" 標簽頁:
通過圖表查看查詢結果就好多了!
總結
Prometheus 是當下比較流行的開源監控工具,這里只是簡單的介紹了安裝過程及一個最基本的用例。但是不難看出 Prometheus 雖然支持靈活的查詢語言,但是自身只支持簡單的展示能力。如果要友好的展示 Prometheus 的查詢結果,還需要使用更專業的展示工具 Grafana。