搭建jmeter+influxdb+grafana壓測實時監控平臺(超詳細,小白適用)

寒冰宇若發表於2020-07-20

1.前言

 在使用jmeter做效能測試的時候,監控系統效能的時候,無論是使用外掛還是報告生成,都沒法實現實時監控。使用JMeter+Influxdb+Grafana可以實現實時監控。

 

本次環境搭建各軟體版本說明:

Grafana v6.2.5

InfluxDB 1.7.0

JMeter 5.2.1

 

2.Influxdb簡介
 InfluxDB是用Go語言編寫的高效能、高可用的分散式時序資料儲存資料庫,無其他依賴,安裝簡單快速。
  該資料庫現在主要用於儲存涉及大量的時間戳資料,如DevOps監控資料,APP metrics, loT感測器資料和實時分析資料。


InfluxDB特徵:

  • 無結構(無模式):可以是任意數量的列
  • 可以設定metric的儲存時間
  • 支援與時間有關的相關函式(如min、max、sum、count、mean、median等),方便統計
  • 支援儲存策略:可以用於資料的刪改。(influxDB沒有提供資料的刪除與修改方法)
  • 支援連續查詢:是資料庫中自動定時啟動的一組語句,和儲存策略搭配可以降低InfluxDB的系統佔用量。
  • 原生的HTTP支援,內建HTTP API
  • 支援類似sql語法select * from mysql.user
  • 支援設定資料在叢集中的副本數
  • 支援定期取樣資料,寫入另外的measurement,方便分粒度儲存資料。

schemaless: 結構型資料庫類似Mysql需要先定義列,influxdb無需預先定義,無結構的
與傳統資料庫中的名詞比較

 influxDB中的名詞  傳統資料庫的概念
 database  資料庫
 measurement  資料庫中的表
 points  表裡面的一行資料

 

influxdb的points資料說明

    • time:預設儲存資料會有時間,時間無需關心,會幫我們自動插入
    • tags:用來儲存資料標識,比如CPU.idle
    • fileds:用來儲存資料 value=90

 

3.下載

定位到/usr/local目錄下,執行命令:wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.0.x86_64.rpm --no-check-certificate,然後等待下載完成

 

 4.解壓安裝

執行命令:rpm -ivh influxdb-1.7.0.x86_64.rpm

 安裝完之後,生成預設的配置檔案 /etc/influxdb/influxdb.conf,可以到/ect目錄下去檢視

 

5.修改influxDB配置檔案

執行命令:vi /etc/influxdb/influxdb.conf,將最終修改的配置如下:

[[graphite]]
# Determines whether the graphite endpoint is enabled.
enabled = true
database = "jmeter"    # 資料庫名稱
retention-policy = ""
bind-address = ":2003"    # 埠
protocol = "tcp"
consistency-level = "one"

修改以下資訊
[meta]
dir = "/usr/local/influxdb/meta"    #存放最終儲存的資料,檔案以.tsm結尾
[data]
dir = "/usr/local/influxdb/data"    #存放資料庫後設資料 wal
wal-dir = "/usr/local/influxdb/wal"    #存放預寫日誌檔案

修改HTTP埠資訊
[http]
# Determines whether HTTP endpoint is enabled.
enabled = true

# The bind address used by the HTTP service.
bind-address = ":8086"

修改完成後執行:wq儲存退出

 

6.在上一步中我們設定了存放資料的目錄為/usr/local/influxdb,這個目錄不會自動生成,因此需要手動建立並授權,執行命令如下:

 我這裡使用的是root使用者,使用其他使用者如果報許可權不足則需要切換到root使用者

 

7.啟動influxDB服務

啟動influxDB服務有兩種方式:

方式一: 直接執行命令: influxd -config /etc/influxdb/influxdb.conf

啟動後顯示如下圖:

 方式二(推薦):

-bash-4.2# vi /etc/profile

新增變數:export INFLUXDB_CONFIG_PATH=/etc/influxdb/influxdb.conf,然後儲存,如下圖:

執行:source /etc/profile,是配置檔案生效後,執行:influxd &,啟動

 influxDB的tcp埠是8088,執行:netstat -antp|grep 8088,顯示如下則表示埠啟動成功

 

8.建立資料庫及使用者

執行命令如下:

-bash-4.2$ influx

> show databases

> CREATE DATABASE jmeter

> use jmeter

> create user "admin" with password '123456' with all privileges

此處設定的使用者名稱和密碼需要記錄下來,後面配置JMeter和Grafana時有用到

 

 注:這裡要注意一下,CREATE DATABASE必須使用大寫

網上有使用小寫建立資料庫,如:create databases "jmeter",執行後會報錯,報錯資訊如下

ERR: error parsing query: found DATABASES, expected CONTINUOUS, DATABASE, USER, RETENTION, SUBSCRIPTION at line 1, char 8
Warning: It is possible this error is due to not setting a database.
Please set a database with the command "use <database>".

 

埠說明:
2003埠:Jmeter往資料庫發資料的埠,伺服器端也是該埠接收資料,所以如果使用雲伺服器ECS的話,需要開啟該2003埠
8086埠,Grafana從資料庫取資料的埠

 

9.JMeter配置

新建一個測試計劃,新建一個執行緒組,右鍵測試計劃選擇Add->Listener->Backend Listener,如果使用的是中文則新增後端監聽器的路徑是:右鍵測試計劃選擇新增->監聽器->後端監聽器

 

 

 

 

新增後端監聽器,配置如下圖:

 

 

新建請求,然後執行

 

 

 

 10.在伺服器上檢視influxdb是否有接收資料成功:

執行如下命令:

-bash-4.2$ influx
> show databases
> use jmeter
> show measurements

 

 

11. 安裝配置grafana

配置資料庫:

 選擇InfluxDB

 最終配置如下圖,配置好後點選下面的 Save & Test 按鈕,提示 Data source is working 就表示資料庫連線成功

 

 

 

 

接下來配置監控皮膚,配置panel有兩種方式:1.手動配置panel  2.在官網下載panel模板 

下面先講第一種方式:

點選左上角Grafana圖示,進入Home介面,點選左側“+”號選單,點選Dashboard,

 進入New dashboard介面,點選Add Query(各個版本的顯示不一樣,但是操作流程是一樣的)

進入皮膚設定介面,如下圖

 

說明:想了解這些查詢具體是什麼意思,可以訪問Jmeter的官網地址去檢視 http://jmeter.apache.org/usermanual/realtime-results.html

執行緒數/使用者相關指標
test.minAT-Min active threads:最小活躍執行緒數
test.maxAT-Max active threads:最大活躍執行緒數
test.meanAT-Mean active threads:活躍執行緒數
test.startedT-Started threads:啟動執行緒數
test.endedT-Finished threads:結束執行緒數
響應時間指標
.ok.count:取樣器的成功響應數
.h.count:每秒點選數
.ok.min:取樣器成功最短響應時間
.ok.max:取樣器成功最長響應時間
.ok.avg:取樣器成功平均響應時間
.ok.pct:取樣器成功響應百分比
.ko.count:取樣器失敗響應數
.ko.min:取樣器失敗的響應最短時間
.ko.max:取樣稱失敗最長響應時間
.ko.avg:取樣器失敗平均響應時間
.ko.pct:取樣器失敗響應百分比
.a.count:取樣器響應數(ok.count和ko.count的總和)
.a.min:取樣器最小響應時間(ok.count和ko.count的最小值)
.a.max:取樣器最大響應時間(ok.count和ko.count的最大值)
.a.avg:取樣器平均響應時間(ok.count和ko.count的平均值)
.a.pct:取樣器響應百分比(根據和失敗樣本的總數計算)
Backend Listener的預設百分位設定為“90;95;99”,即百分位數為90%,95%和99%。
Graphite使用點(“.”)去拆分的元素,這可能與十進位制百分位值混淆。JMeter轉換任何此類值,用下劃線(“ - ”)替換點(“.”)。例如,“99.9 ”變為“99_9 ”
預設情況下,JMeter傳送在samplerName“all”下累計的所有采樣器的指標。 如果配置了 BackendListenerSamplersList,那麼JMeter還會傳送匹配樣本名稱的指標,前提是配置 summaryOnly=true

 

 最終顯示結果如下:

 

 接下來講第二種方式:模板方式

點選左上角Grafana圖示,點選Home,然後點選Find dashboards on Grafana.com,會跳轉到Grafana官網,或者可以直接進入官網:https://grafana.com/grafana/dashboards?utm_source=grafana_search

 

 

 

 左側輸入查詢模板的條件,如下圖,這裡選擇比較常用的JMeter Load Test模板

 

 

 下載JMeter-InfluxDB-Writer介面如下圖,這裡下載的是最新版本1.2版本,點選JMeter-InfluxDB-Writer-plugin-1.2.jar即可下載

 

 下載完成後上傳到JMeter安裝目錄lib/ext目錄下,如下圖:

 

 然後重啟jmeter,選擇rocks.nt.apm.jmeter.JMeterinfluxDBBackendListenerClient,輸入influxDB的host和埠,之前建立Influxdb的使用者名稱和密碼,然後儲存。如果host預設是localhost,直接執行會報錯:Failed to connect to localhost/0:0:0:0:0:0:0:1:8086

 

 

上圖中的使用者名稱和密碼可以在伺服器中檢視,密碼是之前建立使用者的時候自己輸入的,執行命令:

influx

show users

接下來匯入Grafana模板,點選左上角Grafana Logo,點選Home,然後選擇Import dashboard

開啟的介面如下圖,這些需要填寫模板ID,模板ID獲取詳見下一步

 

 在JMeter Load Test模板介面點選Copy ID to Clipboard,將ID複製好然後貼上到Grafana匯入模板介面,如下圖:

 

輸入模板ID 1152後,點選空白處,會顯示如下圖資訊,請按照下圖中進行修改:

 

 檢視模板可以點選左上角Grafana Logo,點選模板名稱,這裡是預設的JMeter Load Test

 預設模板顯示如下圖:

 

 重啟JMeter,執行測試,在Grafana介面的右上角選擇要顯示的時間,最終顯示壓測結果如下圖(右上角重新整理時間建議選小一點,效果會比較明顯): 

 

遇到的問題:

1.建立influxdb資料庫的時候使用create databases "jmeter",報錯

解決辦法:必須使用大寫來進行建立,命令是:CREATE DATABASE jmeter

 

2.執行Jmeter請求,jmeter日誌報Error writing to Graphite: connect timed out,具體報錯資訊如下:

2020-07-17 16:51:29,810 ERROR o.a.j.v.b.g.TextGraphiteMetricsSender: Error writing to Graphite: connect timed out
java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[?:1.8.0_171]
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.PlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_171]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.create(SocketOutputStreamPoolFactory.java:77) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.makeObject(SocketOutputStreamPoolFactory.java:48) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.makeObject(SocketOutputStreamPoolFactory.java:34) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1041) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:342) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:265) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender.writeMetrics(TextGraphiteMetricsSender.java:110) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender.writeAndSendMetrics(TextGraphiteMetricsSender.java:104) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient.sendMetrics(GraphiteBackendListenerClient.java:183) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient.run(GraphiteBackendListenerClient.java:146) [ApacheJMeter_components.jar:5.2.1]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.FutureTask.runAndReset(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_171]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_171]

開啟配置檔案,發現enabled的值為false,需要改為true,設定結果如下圖:

 修改之後還是沒有解決,因為用的是阿里雲伺服器,需要去阿里雲開啟對應的埠,設定埠如下圖,我這裡是外網訪問,埠一定開放公網入方向才可以,可以是內網則需要在內網入方向下開放2003埠

 

然後重新執行JMeter,執行一段時間後在伺服器上檢視influxdb的資料庫,顯示結果如下圖則表示jmeter傳送資料到influxdb成功

 

參考資料:

https://www.cnblogs.com/mike-liu/p/10080351.html

相關文章