軟件測(cè)試 | 普羅米修斯-基本使用
快速了解普羅米修斯
普羅米修斯是用 go 語言編寫的軟件并且利用了 go 語言的交叉編譯特性編譯成了純二進(jìn)制文件, 運(yùn)行的時(shí)候不需要額外安裝依賴。 直接從官網(wǎng)上下載就可以。 下載地址:?Download | Prometheus?這里面除了普羅米修斯的主程序意外, 一些 額外的組件,比如 pushgateway, alertmanager 以及各種官方 exporter 的下載包都可以在這里找到。 由于我們現(xiàn)在部署普羅米修斯都是容器化部署的, 所以這里我選擇用 docker 進(jìn)行部署。
docker run --name=prometheus ?-d -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml ?prom/prometheus
部署方式很簡(jiǎn)單, 只不過需要通過-v 來掛載一個(gè)配置文件到容器里。 至于這個(gè)配置文件, 大概張下面這個(gè)樣子:
global:?
?scrape_interval: ? ? 15s
?
evaluation_interval: 15s?
?scrape_configs:
?
- job_name: 'prometheus'
?
??static_configs:
??
?- targets: ['localhost:9090']?
??- job_name: 'node_exporter'
?
??static_configs:
??
?- targets: ['localhost:9100']?
??- job_name: 'mysql'
??
?static_configs:
?
??- targets: ['localhost:9104']?
??- job_name: 'cadvisor'
?
??static_configs:
??
?- targets: ['localhost:8091']?
??- job_name: 'pushgateway'
? ?
static_configs:
??
?- targets: ['localhost:9091']
??
? ?labels:
? ? ?
??instance: pushgateway
上面便是一個(gè)普羅米修斯的配置文件 其中 global 是全局的配置,上面配置了我們每隔 15s 便向各個(gè) exporter 抓取一次監(jiān)控?cái)?shù)據(jù),而 scrape_configs 配置的是普羅米修斯主服務(wù)要去抓取的各個(gè) exporter 的配置。 普羅米修斯是標(biāo)準(zhǔn)的 pull 架構(gòu), 主服務(wù)并不負(fù)責(zé)監(jiān)控任務(wù), 真正負(fù)責(zé)監(jiān)控的是各種不同的 exporter。 比如要監(jiān)控一個(gè) linux 服務(wù)器的各項(xiàng)性能指標(biāo),則需要在那臺(tái)服務(wù)器上部署一個(gè) node_exporter。然后在普羅米修斯的配置文件上配置上這個(gè) node_exporter 的地址即可。 普羅米修斯的主服務(wù)自然會(huì)周期性的去拉監(jiān)控?cái)?shù)據(jù)并保存在本地。 PS: 普羅米修斯本身就是一個(gè)時(shí)序數(shù)據(jù)庫,所有監(jiān)控?cái)?shù)據(jù)都是帶有時(shí)間戳的。 我們?cè)谄樟_米修斯的 UI 上或者通過 grafana, HTTP 接口等查詢監(jiān)控?cái)?shù)據(jù)的時(shí)候, 都是主服務(wù)直接查詢本地的時(shí)序數(shù)據(jù)庫返回的結(jié)果。 下面是服務(wù)啟動(dòng)后便可通過 9090 端口訪問主服務(wù)的 UI 界面:

如圖如果我們部署了在每臺(tái)機(jī)器 上 都部署了 node_exporter, 就會(huì)通過 PromQL(普羅米修斯自己定義的一個(gè)類 SQL 語言,后面再講)查詢到當(dāng)前的性能信息。 上圖用了 node_load15 這個(gè)語句從所有 node_exporter 獲取到的數(shù)據(jù)中查詢到了當(dāng)前所有機(jī)器的 15 分鐘內(nèi) CPU 的平均負(fù)載。 至于部署 node_exporter 的方法也很 簡(jiǎn)單, 可以二進(jìn)制包部署也可以 docker 部署。 就在上面的鏈接里能下載的到。
總用量 16524?
-rw-r--r-- 1 work work ? ?11357 5月 ?29 2019 LICENSE?
-rwxr-xr-x 1 work work 16900416 5月 ?29 2019 node_exporter?
-rw-r--r-- 1 work work ? ? ?463 5月 ?29 2019 NOTICE
上面就是下載了 node_exporter 解壓后的結(jié)果。 其中 node_exporter 就是個(gè)二進(jìn)制文件 , 直接運(yùn)行就可以了。

上面是普羅米修斯的架構(gòu)圖。 剛才說過普羅米修斯是 pull 架構(gòu), 主服務(wù)會(huì)根據(jù)配置的時(shí)間參數(shù)周期性的拉取各個(gè) exporter 提供的接口來抓取數(shù)據(jù)。 但是這樣的架構(gòu)有兩個(gè)缺陷:
需要 exporter 是一個(gè)持續(xù)運(yùn)行著的并且對(duì)外暴露 http 接口的服務(wù), 可是有些時(shí)候我們的監(jiān)控?cái)?shù)據(jù)的收集不能滿足這樣的條件
主服務(wù)周期性的抓取數(shù)據(jù), 就會(huì)有事件遺漏的可能性。 比如我們要監(jiān)控 k8s 集群中 pod 的事件, 如果有 pod 掛掉需要監(jiān)控到這個(gè)數(shù)據(jù)。 但是很多 pod 的重啟時(shí)間是很快的, 可能 10s 就完成了重啟, 而普羅米修斯的主服務(wù)在 pod crash 的期間沒有調(diào)用 exporter 抓取數(shù)據(jù),那么這個(gè)事件就會(huì)遺漏掉監(jiān)控不到。 PS:大部分的 exporter 的邏輯都是反應(yīng)當(dāng)前這一時(shí)刻的系統(tǒng)狀態(tài),不會(huì)保存歷史狀態(tài)。 所以一旦事件過去了, 主程序才來抓取 exporter, 就無法采樣到這個(gè)事件的數(shù)據(jù)了。
基于以上兩個(gè)原因, 普羅米修斯又推出了上圖中右邊的 pushgateway 和相關(guān)的 client。 pushgateway 可以理解為一種特別的 exporter, 主服務(wù)還是根據(jù)配置周期性的抓取數(shù)據(jù)。 只不過, pushgateway 本身并不監(jiān)控?cái)?shù)據(jù),它的數(shù)據(jù)都來自使用普羅米修斯開源的 client 開發(fā)的程序上 。 這些程序不用像 exporter 一樣需要是持續(xù)運(yùn)行的服務(wù),它可是任何形式的程序,只要它按自己的邏輯收集到監(jiān)控?cái)?shù)據(jù)后, 通過主動(dòng) push 的方式發(fā)送給 pushgateway 就好了。 通過這個(gè)機(jī)制就補(bǔ)全了普羅米修斯沒有主動(dòng) push 機(jī)制的缺點(diǎn)。 在做測(cè)試項(xiàng)目的時(shí)候 , 我們往往在測(cè)試程序中把收集到的測(cè)試數(shù)據(jù)通過 push 到 pushgateway 上, 這樣 就可以讓測(cè)試自定義的監(jiān)控能力無縫的對(duì)接到產(chǎn)品提供的普羅米修斯上了(產(chǎn)品里一般都是會(huì)部署 pushgateway 的)。
對(duì)接 grafana
普羅米修斯本身并不擅長(zhǎng)可視化的能力, 所以對(duì)應(yīng)的可視化報(bào)表一般都是交給 grafana。 所以可以先部署一個(gè) grafana。
docker run --name grafana -d?
-p 8000:3000 grafana/grafana
然后按照下面的步驟進(jìn)行配置:



granfa 的配置非常的復(fù)雜, 所以一般我們都是在社區(qū)找一個(gè)開源的模板 import 進(jìn)來然后自己改吧改吧。 比如可以在https://grafana.com/grafana/dashboardsnode_exporter 的模板。然后引入到 grafana 中。比如我們搜到下面的模板,中搜到 把 id 復(fù)制過來,或者直接下載模板 json。

通過如此配置就可以快速搭建一個(gè)可用的儀表盤了。