性能監控之 node_exporter+Prometheus+Grafana 實現主機監控
概述
功能
安裝
二進制包
docker容器
使用 Kubernetes Operator 安裝
概述
功能
安裝
二進制包
docker容器
使用 Kubernetes Operator 安裝
Node_exporter 監控指標
配置 Prometheus
使用 PromQL 查詢監控數據
數據可視化
擴展知識
推薦的exporter
注意版本
實現原理
小結
概述
在 Prometheus 的架構設計中,Prometheus Server 并不直接服務監控特定的目標,其主要任務負責數據的收集,存儲并且對外提供數據查詢支持。因此為了能夠能夠監控到某些東西,如主機的 CPU 使用率,我們需要使用到 Exporter。Prometheus 周期性的從 Exporter 暴露的 HTTP 服務地址(通常是 /metrics)拉取監控樣本數據。
從上面的描述中可以看出 Exporter 可以是一個相對開放的概念,其可以是一個獨立運行的程序獨立于監控目標以外,也可以是直接內置在監控目標中。只要能夠向 Prometheus 提供標準格式的監控樣本數據即可。
這里為了能夠采集到主機的運行指標如 CPU, 內存,磁盤等信息。我們可以使用 Node_exporter。
node_exporter 用于采集服務器層面的運行指標,包括機器的 loadavg、filesystem、meminfo等基礎監控,類似于傳統主機監控維度的 zabbix-agent
node-export 由 prometheus 官方提供、維護,不會捆綁安裝,但基本上是必備的 exporter
功能
node_exporter 用于提供 *NIX 內核的硬件以及系統指標。
如果是 windows 系統,可以使用 wmi_exporterr
如果是采集 NVIDIA 的 GPU 指標,可以使用 prometheus-dcgm
根據不同的 *NIX 操作系統,node_exporter 采集指標的支持也是不一樣的,如:
diskstats 支持 Darwin, Linux
cpu 支持Darwin, Dragonfly, FreeBSD, Linux, Solaris 等,
詳細信息參考:node_exporter
我們可以使用 –collectors.enabled 參數指定node_exporter 收集的功能模塊,或者用 –no-collector 指定不需要的模塊,如果不指定,將使用默認配置。
安裝
二進制包
node_exporter 同樣采用 Golang 編寫,并且不存在任何的第三方依賴,只需要下載,解壓即可運行。可以從https://prometheus.io/download/ 獲取最新的 node_exporter 版本的二進制包。
curl -OL https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.darwin-amd64.tar.gz tar -xzf node_exporter-1.1.2.darwin-amd64.tar.gz
運行 node_exporter:
cd node_exporter-1.1.2.darwin-amd64 cp node_exporter-1.1.2.darwin-amd64/node_exporter /usr/local/bin/ node_exporter
啟動成功后,可以看到以下輸出:
INFO[0000] Listening on :9100 source="node_exporter.go:76"
訪問 http://localhost:9100/ 可以看到以下結果:
# curl http://localhost:9100
Node Exporter
docker容器
docker run -d \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \ quay.io/prometheus/node-exporter \ --path.rootfs /host
使用 Kubernetes Operator 安裝
參考:Kubernetes 集群監控 kube-prometheus 部署
node_exporter 監控指標
如果是二進制或者 docke r部署,部署成功后可以訪問:http://${IP}:9100/metrics,可以看到當前 node_exporter 獲取到的當前主機的所有監控數據,如下所示:
...... de_cpu_seconds_total{cpu="2",mode="nice"} 1.43 node_cpu_seconds_total{cpu="2",mode="softirq"} 77.66 node_cpu_seconds_total{cpu="2",mode="steal"} 618.42 node_cpu_seconds_total{cpu="2",mode="system"} 20981.5 node_cpu_seconds_total{cpu="2",mode="user"} 26925.45 node_cpu_seconds_total{cpu="3",mode="idle"} 2.52970118e+06 node_cpu_seconds_total{cpu="3",mode="iowait"} 58.83 node_cpu_seconds_total{cpu="3",mode="irq"} 0 node_cpu_seconds_total{cpu="3",mode="nice"} 1.57 node_cpu_seconds_total{cpu="3",mode="softirq"} 54.37 node_cpu_seconds_total{cpu="3",mode="steal"} 538.14 node_cpu_seconds_total{cpu="3",mode="system"} 18511.33 node_cpu_seconds_total{cpu="3",mode="user"} 24297.44 # HELP node_disk_io_now The number of I/Os currently in progress. # TYPE node_disk_io_now gauge node_disk_io_now{device="dm-0"} 0 node_disk_io_now{device="dm-1"} 0 node_disk_io_now{device="vda"} 0 # HELP node_disk_io_time_seconds_total Total seconds spent doing I/Os. # TYPE node_disk_io_time_seconds_total counter node_disk_io_time_seconds_total{device="dm-0"} 0.321 node_disk_io_time_seconds_total{device="dm-1"} 13765.443000000001 node_disk_io_time_seconds_total{device="vda"} 317.065 ......
每一個監控指標之前都會有一段類似于如下形式的信息:
# HELP node_disk_io_time_seconds_total Total seconds spent doing I/Os. # TYPE node_disk_io_time_seconds_total counter node_disk_io_time_seconds_total{device="dm-0"} 0.321 node_disk_io_time_seconds_total{device="dm-1"} 13765.443000000001 node_disk_io_time_seconds_total{device="vda"} 317.065
其中 HELP 用于解釋當前指標的含義,TYPE 則說明當前指標的數據類型。
除了這些以外,在當前頁面中根據物理主機系統的不同,你還可能看到如下監控指標:
node_boot_time_seconds:系統啟動時間
node_cpu_seconds_total:系統CPU使用量
nodedisk*:磁盤IO
nodefilesystem*:文件系統用量
node_load1:系統負載
node_memory*:內存使用量
node_network*:網絡帶寬
node_time:當前系統時間
go_*:node exporter中go相關指標
process_*:node exporter自身進程相關運行指標
配置 Prometheus
為了能夠讓 Prometheus Server 能夠從當前 node exporter 獲取到監控數據,這里需要修改 Prometheus 配置文件。編輯 prometheus.yml 并在 scrape_configs 節點下添加以下內容:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # 采集node exporter監控數據 - job_name: 'node' static_configs: - targets: ['172.16.106.84:9100']
重新啟動 Prometheus Server
訪問 http://${IP}:9090/,進入到 Prometheus Server。如果輸入“up”并且點擊執行按鈕以后,可以看到如下結果:
其中“1”表示正常,反之“0”則為異常。
此時查看 targets 狀態:
注意:對于而一組用于相同采集目的的實例,或者同一個采集進程的多個副本則通過一個一個任務(Job)進行管理。
* job: node * instance 2: 1.2.3.4:9100 * instance 4: 5.6.7.8:9100
對于配置文件設置如下:
job_name: node static_configs: - targets: ['172.16.106.116:9100'] labels: instance: vm-1 - targets: ['172.16.106.119:9100'] labels: instance: vm-2
使用 PromQL 查詢監控數據
Prometheus UI 是 Prometheus 內置的一個可視化管理界面,通過 Prometheus UI 用戶能夠輕松的了解 Prometheus 當前的配置,監控任務運行狀態等。 通過 Graph 面板,用戶還能直接使用 PromQL 實時查詢監控數據,也可以使用 PromQL 表達式查詢特定監控指標的監控數據。如下所示,查詢主機負載變化情況,可以使用關鍵字 node_load1 可以查詢出 Prometheus 采集到的主機負載的樣本數據,這些樣本數據按照時間先后順序展示,形成了主機負載隨時間變化的趨勢圖表:
PromQL 是 Prometheus 自定義的一套強大的數據查詢語言,除了使用監控指標作為查詢關鍵字以為,還內置了大量的函數,幫助用戶進一步對時序數據進行處理。例如使用 rate() 函數,可以計算在單位時間內樣本數據的變化情況即增長率,因此通過該函數我們可以近似的通過 CPU 使用時間計算 CPU 的利用率:
r
a
t
e
(
n
o
d
e
c
p
u
s
e
c
o
n
d
s
t
o
t
a
l
[
2
m
]
)
rate(node_cpu_seconds_total[2m])
rate(nodec pus econdst otal[2m])
這時如果要忽略是哪一個 CPU 的,只需要使用 without 表達式,將標簽 CPU 去除后聚合數據即可:
a
v
g
w
i
t
h
o
u
t
(
c
p
u
)
(
r
a
t
e
(
n
o
d
e
c
p
u
s
e
c
o
n
d
s
t
o
t
a
l
[
2
m
]
)
)
avg without(cpu) (rate(node_cpu_seconds_total[2m]))
avgwithout(cpu)(rate(nodec pus econdst otal[2m]))
數據可視化
Prometheus UI 提供了快速驗證 PromQL 以及臨時可視化支持的能力,而在大多數場景下引入監控系統通常還需要構建可以長期使用的監控數據可視化面板(Dashboard)。這時用戶可以考慮使用第三方的可視化工具如 Grafana,Grafana是一個開源的可視化平臺,并且提供了對 Prometheus 的完整支持。
二進制包安裝:
wget https://dl.grafana.com/oss/release/grafana-7.4.5.linux-amd64.tar.gz tar -zxvf grafana-7.4.5.linux-amd64.tar.gz
docker 安裝:
docker run -d --name=grafana -p 3000:3000 grafana/grafana
訪問 http://localhost:3000 就可以進入到 Grafana 的界面中,默認情況下使用賬戶 admin/admin 進行登錄。
在 Grafana 首頁中顯示默認的使用向導,包括:安裝、添加數據源、創建 Dashboard、邀請成員、以及安裝應用和插件等主要流程:
這里將添加 Prometheus 作為默認的數據源,如下圖所示,指定數據源類型為 Prometheus 并且設置 Prometheus 的訪問地址即可,在配置正確的情況下點擊“Add”按鈕,會提示連接成功的信息:
在完成數據源的添加之后就可以 在Grafana 中再配置一個 node_exporter 的模板,當然作為開源軟件,Grafana 社區鼓勵用戶分享 Dashboard 通過 https://grafana.com/dashboards 網站,可以找到大量可直接使用的Dashboard:比如我這里選擇了熱門模板(ID:8919),展示效果如下:
擴展知識
推薦的exporter
node_exporterr 是Prometheus官方推薦的 exporter,類似的還有:
官方推薦的都會在 https://github.com/prometheus 下,在 exporter推薦頁,也會有很多第三方的exporter,由個人或者組織開發上傳,如果有自定義的采集需求,可以自己編寫exporter。
注意版本
因為 node_exporter 是比較老的組件,有一些最佳實踐并沒有 merge 進去,比如符合 Prometheus 命名規范),因此建議使用較新版本,目前(2021.3)最新版本為 1.1.2
一些指標名字的變化(詳細比對)
* node_cpu -> node_cpu_seconds_total * node_memory_MemTotal -> node_memory_MemTotal_bytes * node_memory_MemFree -> node_memory_MemFree_bytes * node_filesystem_avail -> node_filesystem_avail_bytes * node_filesystem_size -> node_filesystem_size_bytes * node_disk_io_time_ms -> node_disk_io_time_seconds_total * node_disk_reads_completed -> node_disk_reads_completed_total * node_disk_sectors_written -> node_disk_written_bytes_total * node_time -> node_time_seconds * node_boot_time -> node_boot_time_seconds * node_intr -> node_intr_total
解決版本問題的方法有兩種:
一是在機器上啟動兩個版本的node-exporter,都讓prometheus去采集。
二是使用指標轉換器,他會將舊指標名稱轉換為新指標
對于 grafana 的展示,可以找同時支持兩套指標的 dashboard 模板
實現原理
node-exporter的主函數:
package main import ( "fmt" "net/http" _ "net/http/pprof" "os" "os/user" "sort" "github.com/prometheus/common/promlog" "github.com/prometheus/common/promlog/flag" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/version" "github.com/prometheus/exporter-toolkit/web" "github.com/prometheus/node_exporter/collector" kingpin "gopkg.in/alecthomas/kingpin.v2" )
可以看到 exporter 的實現需要引入 github.com/prometheus/client_golang/prometheus 庫,client_golang 是 prometheus 的官方 go 庫,既可以用于集成現有應用,也可以作為連接 Prometheus HTTP API 的基礎庫。
比如定義了基礎的數據類型以及對應的方法:
Counter:收集事件次數等單調遞增的數據 Gauge:收集當前的狀態,比如數據庫連接數 Histogram:收集隨機正態分布數據,比如響應延遲 Summary:收集隨機正態分布數據,和 Histogram 是類似的
參考地址:https://github.com/prometheus/client_golang/tree/master/prometheus
client_golang 庫的詳細解析可以參考:Prometheus 原理和源碼分析
小結
或許有人覺得有了 Prometheus+Grafana+node_exporter 這樣的組合工具之后,基本上都不再用手工執行什么命令了。但我們要了解的是,對于監控平臺來說,它取的所有的數據必然是被監控者可以提供的數據,像 node_exporter 這樣小巧的監控收集器,它可以獲取的監控數據,并不是整個系統全部的性能數據,只是取到了常見的計數器而已。這些計數器不管是用命令查看,還是用這樣炫酷的工具查看,它的值本身都不會變。所以不管是在監控平臺上看到的數據,還是在命令行中看到的數據,我們最重要的是要知道含義以及這些值的變化對性能測試和分析的下一步驟的影響。
參考資料:
[1]:http://www.xuyasong.com/?p=1539
[2]:《性能測試實戰30講》
Kubernetes Node.js 云監控服務 壓力測試
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。