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

1.前言html

 在使用jmeter作性能測試的時候,監控系統性能的時候,不管是使用插件仍是報告生成,都無法實現實時監控。使用JMeter+Influxdb+Grafana能夠實現實時監控。java

 

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

Grafana v6.2.5sql

InfluxDB 1.7.0數據庫

JMeter 5.2.1apache

 

2.Influxdb簡介
 InfluxDB是用Go語言編寫的高性能、高可用的分佈式時序數據存儲數據庫,無其餘依賴,安裝簡單快速。
  該數據庫如今主要用於存儲涉及大量的時間戳數據,如DevOps監控數據,APP metrics, loT傳感器數據和實時分析數據。

後端


InfluxDB特徵:bash

  • 無結構(無模式):能夠是任意數量的列
  • 能夠設置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數聽說明less

    • 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

相關文章
相關標籤/搜索