全網最詳細!Centos7.X 搭建Grafana+Jmeter+Influxdb 效能實時監控平臺
背景
日常工作中,經常會用到Jmeter去壓測,畢竟LR還要錢(@¥&*...),而最常用的介面壓力測試,我們都是通過聚合報告去檢視壓測結果的,然鵝聚合報告的真的是醜到家了,作為程式猿這當然不能忍!那我們要怎麼給它變得好看點捏?
如何華麗變身?
方式 |
優點 |
缺點 |
場景 |
Jmeter+ant+Jenkins |
快捷,上手簡單 |
報告還是不夠美觀、直觀,如果測試介面一多,報告就會顯示臃腫不夠直觀 |
看最終報告 |
Grafana+Jmeter+Influxdb(推薦) |
資料視覺化,資料直觀,篩選功能強大,拓展能力強 |
當然就是要自己部署環境咯,還得了解Influxdb的語法和常用查詢語句,系統方法等..... |
看壓測過程中引數的變化 |
工具介紹
工具 |
介紹 |
Jmeter |
Java語言開發的壓力測試工具(不多介紹) |
InfluxDB |
Go 語言開發的一個開源分散式時序資料庫,非常適合儲存指標、事件、分析等資料 |
Grafana |
純 Javascript 開發的前端工具,用於訪問 InfluxDB,自定義報表、顯示圖表等 |
Centos7安裝InfluxDB
備註:博主是自己買的阿里雲伺服器哈,就不介紹虛擬機器下如何安裝了(畢竟虛擬機器很多坑...)
Influxdata官網下載路徑:https://portal.influxdata.com/downloads/
1、直接執行以下命令進行安裝:
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm sudo yum localinstall influxdb-1.6.3.x86_64.rpm
2、安裝完成後,修改InfluxDB的配置,主要配置jmeter儲存的資料庫與埠號
vim /etc/influxdb/influxdb.conf
3、找到graphite並且修改它的庫與埠
enabled = true database = "jmeter" retention-policy = "" bind-address = ":2003" protocol = "tcp" consistency-level = "one
4、找到http,將前面的#號去掉
5、現在新版本的InfluxDB已取消自帶的資料視覺化介面了,舊版的還是有,可通過找到admin,將前面的#號去掉,開放它的UI埠;(該步驟非必須!)
可通過InfluxDB視覺化工具來檢視我們的資料庫和資料哦,具體安裝和簡單使用參照此篇博文:https://www.cnblogs.com/poloyy/p/12213495.html
[admin] # Determines whether the admin service is enabled. enabled = true # The default bind address used by the admin service. bind-address = ":8083"
6、配置成功後,啟動InfluxDB
啟動命令: systemctl start influxdb.service
檢視狀態命令: systemctl status influxdb.service
到此,InfluxDB已安裝並配置完成了!!*:ஐ٩(๑´ᵕ`)۶ஐ:*
特別說明:
- 8083埠:InfluxDB的UI介面展示的埠
- 8086埠:Grafana用來從資料庫取資料的埠
- 2003埠:剛剛設定的,Jmeter往資料庫發資料的埠
Centos7安裝Grafana
Grafana官網下載路徑:https://grafana.com/grafana/download
1、直接執行以下命令進行安裝:
wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm sudo yum localinstall grafana-6.5.2-1.x86_64.rpm
2、然後啟動即可
啟動命令: systemctl start grafana-server.service
檢視狀態命令: systemctl status grafana-server.service
3、訪問IP加埠 http://xxx.xx.xx.xx:3000 ,輸入使用者名稱,密碼登入系統。使用者名稱與密碼都是"admin",如果能開啟頁面則已經成功了!但是...裝環境這東西怎麼可能這麼簡單??
4、當你檢視狀態是active但是訪問3000時是失敗的話,辣麼有可能就是你的3000埠還未開放!
跟著這篇文章來操作就可以開放3000埠啦:https://www.cnblogs.com/poloyy/p/12213297.html
5.訪問IP加埠 http://xxx.xx.xx.xx:3000 ,若能訪問到grafana就是成功啦!
配置Jmeter
這裡就不教如何安裝Jmeter了哈,主要講Jmeter作為採集端是通過什麼採集資料的
步驟一:線上程組中,新增監聽器(Listener)- Backend Listener
步驟二:配置Backend Listener
可以看到,Jmeter預設選中的Implementatin是 GraphiteBackendListenerClient ,它是Jmeter 2.13就開始提供了;在Jmeter 3.2時又加多了一個 InfluxDBBackendListenerClient ,哎~這兩者有什麼區別呢?後面會講到!
這裡先講選中 GraphiteBackendListenerClient 時,每個配置項的含義
- graphiteHost:InfluxDB安裝的伺服器的ip
- graphitePort:埠;預設就是2003,除非你自己安裝InfluxDB時設定了其他埠是哦(可見上面安裝InfluxDB後關於graphite的配置)
- rootMetricsPrefix:指標的根字首;將測試結果存入資料庫時,不同指標會生成不同表,但這些表都最好要有一個共同的字首,這個就是了;後面會講到不同的指標的含義(重點哦)
- summaryOnly:當你執行緒組有多個請求又想知道每個請求的結果資料時,最好填false,因為true只會返回所有請求的集合資料報告,不會輸出每條請求的資料報告
- samplersList:取樣器列表;想收集哪些請求就填哪些,最好用正則去匹配,減輕工作量
- useRegexpForSamplersList:是否使用正則;如果true則使用,samplersList裡可以匹配正則表示式
- percentiles:百分比;即類似聚合報告裡90% Line,95% Line,99% Line的資料;倘若想要99.9時,需要寫成【99_9】,用下劃線代替點
建議:如果想看每個請求的結果資料的話,根據我的截圖進行配置即可;只需改動samplerList來匹配你需要監控的請求,其他不用動!
步驟三:執行Jmeter指令碼,檢視資料庫
一開始,我的資料庫是隻有兩張表的,這裡方便演示,就只跑get、post請求了
如果成功了代表結果資料也存進InfluxDB裡面了,接下來我們來看看使用 GraphiteBackendListenerClient 時會生成哪些表呢?
可以看到生成了三種字首的表,分別是: jmeter.all 、 jmeter.get 、 jmeter.post ;最後其實還有 jmeter.test 開頭的表,這個後面會單獨拿出來說
============================================
=== 倘若不想了解每個指標的具體含義,可以跳過下面內容
=== 直接點選右側目錄,跳轉至配置Grafana,檢視下一步
============================================
步驟四:細品指標含義
為什麼每個表都有jmeter字首呢?
因為在Jmeter的Backend Listener配置了rootMetricsPrefix 值為 jmeter. ,你不喜歡字首或者想起其他名,在Backend Listener裡直接改 rootMetricsPrefix 的值就可以了
可以參考下官方文件的寫法: <rootMetricsPrefix><samplerName>.ok.count ,rootMetricsPrefix和samplerName都是變數,可配置的
接下來,我們來說明下每個字首的含義
jmeter.all :代表了所有請求;當summaryOnly=true時,就只有samplerName=all的表了
jmeter.get :代表了HTTP請求的名字是get,即samplerName=get
jmeter.post :代表了HTTP請求的名字是post,即samplerName=post
備註:假設你的某個HTTP請求叫【GET請求啊】,辣麼你的資料庫就會生成以jmeter.GET請求啊 為字首的各種表
然後再針對不同指標說下它們的含義
劃重點:這裡的指標含義都是直接翻譯Jmeter官方文件的
喜歡英文的小夥伴可以自行檢視:http://jmeter.apache.org/usermanual/realtime-results.html
Thread/Virtual Users metrics - 執行緒/虛擬使用者指標,跟執行緒組設定相關的
指標 | 全稱 | 含義 |
<rootMetricsPrefix>test.minAT | Min active threads | 最小活躍執行緒數 |
<rootMetricsPrefix>test.maxAT | Max active threads | 最大活躍執行緒數 |
<rootMetricsPrefix>test.meanAT | Mean active threads | 平均活躍執行緒數 |
<rootMetricsPrefix>test.startedT | Started threads | 啟動執行緒數 |
<rootMetricsPrefix>test.endedT | Finished threads | 結束執行緒數 |
Response times metrics - 響應時間指標
劃重點:每個sampler都包含了所有響應時間指標,每個sampler的每個指標都會有單獨的一個表儲存結果資料
指標 | 含義 |
<rootMetricsPrefix><samplerName>.ok.count | sampler的成功響應數 |
<rootMetricsPrefix><samplerName>.h.count | 伺服器每秒命中次數(每秒點選數,即TPS) |
<rootMetricsPrefix><samplerName>.ok.min | sampler響應成功的最短響應時間 |
<rootMetricsPrefix><samplerName>.ok.max | sampler響應成功的最長響應時間 |
<rootMetricsPrefix><samplerName>.ok.avg | sampler響應成功的平均響應時間 |
<rootMetricsPrefix><samplerName>.ok.pct<percentileValue> | sampler響應成功的所佔百分比 |
<rootMetricsPrefix><samplerName>.ko.count | sampler的失敗響應數 |
<rootMetricsPrefix><samplerName>.ko.min | sampler響應失敗的最短響應時間 |
<rootMetricsPrefix><samplerName>.ko.max | sampler響應失敗的最長響應時間 |
<rootMetricsPrefix><samplerName>.ko.avg | sampler響應失敗的平均響應時間 |
<rootMetricsPrefix><samplerName>.ko.pct<percentileValue> | sampler響應失敗的所佔百分比 |
<rootMetricsPrefix><samplerName>.a.count | sampler響應數(ok.count+ko.count) |
<rootMetricsPrefix><samplerName>.sb.bytes | 已傳送位元組 |
<rootMetricsPrefix><samplerName>.rb.bytes | 已接收位元組 |
<rootMetricsPrefix><samplerName>.a.min |
sampler響應的最短響應時間 (ok.count和ko.count的最小值) |
<rootMetricsPrefix><samplerName>.a.max |
sampler響應的最長響應時間 (ok.count和ko.count的最大值) |
<rootMetricsPrefix><samplerName>.a.avg |
sampler響應的平均響應時間 (ok.count和ko.count的平均值) |
<rootMetricsPrefix><samplerName>.a.pct<percentileValue> |
sampler響應的百分比 (根據成功和失敗的總數來計算) |
不知道大家是否有個疑問,為何 a.min 、 a.max 、 a.avg 明明說的都是平均響應時間,但是括號裡備註的又是和響應數相關的;但是Jmeter官方文件說明翻譯過來的確是這樣的..只能等我來尋找答案了!
經過我的“縝密”對比,可以發現官網說明的確是錯的哈,真實情況如下!
a.min :是ok.min和ko.min的最小值
a.max :是ok.max和ko.max的最小值
a.avg :是ok.avg和ko.avg的平均值
接下來就是用資料說明事實!按照上面的指標順序來看圖哈!
不過,博主並不確定這樣比對是否完全科學正確,但是從博主驗證結果來說,我的糾正是正確滴!
附上按官方文件說明翻譯過來的對比圖,可以看到如果是 a.max 的話,跟 ok.count 和 ko.count 是沒有半毛錢關係的
配置Grafana
首先進入Grafana的首頁,可以看到官方畫了個流程:先建立資料來源,再建立資料面板
建立資料來源
一共有兩個入口哈,可以在首頁直接點選 Create your first data source ,也可以看第二張圖按步驟進入建立頁面
然後,選擇InfluxDB作為我們的資料來源
到此為止,資料來源就配置成功啦!!
配置資料看板
Grafana&InfluxDB整合,展示測試結果資料
panel基礎使用
按上面的步驟建立好DashBoard後,再通過panel展示具體資料,先介紹下panel的入口
一般選 Add Query 先,當然選 Choose Visualization 也可以,進去後可以相互切換的
Convert to row 就是生成一行,可以將展示差不多一致型別資料的panel放到裡面,統一管理,收起or展開;
如下圖,我將描述執行緒數和響應數的panel放在同一個Row了
資料繫結
檢視匯流排程數、成功響應數、失敗響應數
可以先點Add Query,進入到下面的介面
若想看成功響應數和失敗響應數,只需要切換表名即可;
可以發現跟我一開始只展示數字不太一樣,因為圖表型別還沒設定;當我們只想看資料而不想看資料趨勢圖的話,可以改變它的型別;
在同一個介面,點選左側列表選中第二個icon,然後選擇Singlestat即可
檢視所有請求、get請求、post請求的TPS
如果想在同一個panel裡展示多個指標資料的話,可以通過在Panel裡Add Query
基本的資料繫結已經教會大家啦,自己想要展示什麼資料直接改變表名就行了
順帶附上官方提供的一個數據看板圖,大家也可以照搬照抄用它的panel,手動新增每個指標
至此,初級版的Grafana+Jmeter+Influxdb 效能實時監控平臺初步搭好啦!
當然博主是不建議Jmeter使用 GraphiteBackendListenerClient 來採集資料的,因為請求多起來的時候會有非常多的表,維護成本也會增加;後面將會介紹如何通過 InfluxDBBackendListenerClient 來採集資料
配置Backend Listener之InfluxDBBackendListenerClient
配置項含義
首先來看看每個配置項的含義
- influxdbUrl:安裝influxdb的路徑;主要格式:http://主機地址:8086/write?db=資料庫名
- application:應用名稱;在 events 表中對應的欄位是 application
- measurement:表名;資料儲存到哪個表,預設是jmeter,不用改即可
- summaryOnly:同GraphiteBackendListenerClient
- samplersRegex:同GraphiteBackendListenerClient
- percentiles:同GraphiteBackendListenerClient
- testTitle:測試名稱;在 events 表中對應的欄位是 text ,JMeter在測試的開始和結束時自動生成註釋,該註釋的值以'start'和'end'結尾
- eventTags:Grafana允許為每個註釋顯示標籤;在 events 表中對應的欄位是 tags
不懂application和testTitle的小夥伴可以看看下面的圖,可以看到同一個testTitle的兩條記錄的時間差就是執行測試計劃的總時長
建議:只需修改application和testTitle即可,可以相同也可以不相同,其他配置跟著圖片走就好了;當然安裝路徑還是要改的哈
檢視InfluxDB
使用InfluxDBBackendListenerClient好處就是,再多的請求也只會生成兩張表:
events :主要拿存事件的
jmeter :存測試結果資料的,Grafana也是從這個表獲取資料再展示
再次Grafana&InfluxDB整合,展示測試結果資料
這次就不再需要自己去建立DashBoard和Panel了,因為在官方模板庫,已經有一個非常完美的模板了,當然前提是你要用 InfluxDBBackendListenerClient 採集資料才能有效的哈
首先,進入官方模板庫: https://grafana.com/dashboards ,然後跟著圖片匯入模板並初始化即可
只要你的資料來源,表名配的沒有錯,Jmeter再執行一下測試計劃,DashBoard中篩選下時間,就可以成功看到資料啦!
模板自帶了三個下拉篩選框
data_source:資料來源,在Grafana配置了多少個就顯示多少個
application:在Jmeter配置好的application,如果每次測試計劃執行時的application都不一樣,你就可以通過這個篩選出對應測試時機的結果資料了
transaction:在Jmeter配置好的sampleList,譬如我只發了get、post請求,這裡就只會給你選get、post;可以滑到頁面下面看到針對某個請求的資料展示
其實這個模板還有很多可以值得改進優化的地方,辣麼這個時候就需要你對Grafana的各種用法熟悉操作啦,後續會補充一篇關於Grafana常見用法&高階用法的文章哦!敬請期待!