控平臺)
1. 項目概述為什么需要這個監(jiān)控平臺做性能測試的朋友應該都深有體會光跑完腳本、拿到JMeter的聚合報告是遠遠不夠的。那堆數(shù)字表格看著就頭大更別提在壓測過程中實時觀察TPS、響應時間、錯誤率的曲線變化了。老板或者項目組問你“現(xiàn)在系統(tǒng)表現(xiàn)怎么樣瓶頸在哪”你總不能現(xiàn)場打開一個CSV文件去數(shù)吧這就是為什么我們需要一個像樣的性能監(jiān)控看板。今天要聊的就是在Windows環(huán)境下把JMeter、InfluxDB和Grafana這三兄弟攢到一起搭建一個實時、可視化的性能監(jiān)控平臺。簡單來說JMeter負責“干活”發(fā)請求、產(chǎn)生數(shù)據(jù)InfluxDB負責“存數(shù)據(jù)”專門為時序數(shù)據(jù)優(yōu)化的數(shù)據(jù)庫Grafana負責“秀出來”把數(shù)據(jù)變成酷炫的圖表和儀表盤。這個組合在測試圈里非常經(jīng)典因為它開源、免費、功能強大而且各司其職配合起來相當絲滑。無論你是測試工程師、開發(fā)人員還是運維只要涉及到需要評估系統(tǒng)在高負載下的表現(xiàn)這個平臺都能讓你從“盲人摸象”變成“全局在握”。接下來我會手把手帶你走通整個搭建和配置流程并分享一些我踩過的坑和調優(yōu)技巧。2. 平臺架構與核心組件選型解析2.1 為什么是JMeter InfluxDB Grafana在動手之前我們先搞清楚為什么選它們而不是其他組合。理解背后的“為什么”配置時才能更得心應手。JMeter這個沒得說Apache旗下的老牌開源性能測試工具功能全面社區(qū)活躍。它本身可以通過“后端監(jiān)聽器”將測試結果實時發(fā)送到數(shù)據(jù)庫這是整個數(shù)據(jù)流的起點。雖然JMeter 5.0之后自帶了一些簡單的圖表但用于生產(chǎn)級監(jiān)控和匯報還遠遠不夠。InfluxDB這是整個架構的數(shù)據(jù)中樞。性能測試數(shù)據(jù)天生就是時序數(shù)據(jù)——每個時間點對應著請求數(shù)、響應時間、錯誤數(shù)等指標。InfluxDB是專為處理時序數(shù)據(jù)而設計的數(shù)據(jù)庫寫入和查詢速度極快特別適合這種高頻、帶時間戳的數(shù)據(jù)流。相比傳統(tǒng)的關系型數(shù)據(jù)庫如MySQL它在存儲效率和查詢性能上優(yōu)勢明顯。我們用它的1.x版本就足夠了穩(wěn)定且資源占用相對友好。Grafana數(shù)據(jù)可視化領域的“瑞士軍刀”。它不生產(chǎn)數(shù)據(jù)只是數(shù)據(jù)的搬運工和美容師。Grafana支持多種數(shù)據(jù)源其中就包括InfluxDB。它能把InfluxDB里冷冰冰的數(shù)字通過豐富的圖表折線圖、柱狀圖、儀表盤、熱圖等和靈活的儀表盤布局變成直觀、美觀的監(jiān)控大屏。你可以自定義監(jiān)控項設置報警閾值非常適合在壓測時投屏到電視上讓整個團隊對系統(tǒng)狀態(tài)一目了然。這個組合的優(yōu)勢在于解耦和專業(yè)化。JMeter專注壓測生成InfluxDB專注高效存儲Grafana專注炫酷展示。任何一個組件出問題或需要升級都不會嚴重影響其他部分。2.2 Windows環(huán)境下的特殊考量雖然這個組合在Linux服務器上部署更常見但在Windows下搭建對于很多開發(fā)測試人員來說是更貼近實際工作環(huán)境的起點。Windows下需要注意幾點路徑與權限Windows的路徑使用反斜杠\且對空格和特殊字符更敏感。在配置文件和命令行中要特別注意。安裝時盡量選擇無空格、較短的路徑如D:\Apps\。服務管理InfluxDB和Grafana在Windows下通常以控制臺應用或Windows服務方式運行。我們需要學會如何通過命令行啟動、停止它們并配置開機自啟。端口占用這三個工具都會占用端口。JMeter的GUI本身不占固定端口但后端監(jiān)聽器會向InfluxDB的端口發(fā)送數(shù)據(jù)。InfluxDB默認使用8086HTTP API和8088管理端口。Grafana默認使用3000。確保這些端口沒有被其他程序如Skype、某些虛擬機軟件占用。防火墻如果需要在局域網(wǎng)內(nèi)其他機器訪問Grafana看板需要在Windows防火墻中放行對應端口如3000。3. 分步搭建從零開始構建監(jiān)控平臺3.1 第一步基礎環(huán)境準備與組件下載工欲善其事必先利其器。我們先確?;A環(huán)境并下載好所有需要的軟件。Java環(huán)境JMeter依賴 JMeter是基于Java開發(fā)的所以必須先安裝JDK。推薦使用JDK 8或JDK 11LTS長期支持版本這兩個版本與JMeter的兼容性最廣。前往Oracle官網(wǎng)或Adoptium等開源站點下載Windows x64 Installer。安裝后需要配置系統(tǒng)環(huán)境變量JAVA_HOME指向你的JDK安裝目錄例如C:\Program Files\Java\jdk-11.0.xx并將%JAVA_HOME%\bin添加到Path變量中。驗證打開命令提示符CMD輸入java -version能正確顯示版本信息即可。注意不建議使用過新如JDK 17或過舊的JDK可能會遇到JMeter啟動或插件兼容性問題。如果公司有統(tǒng)一要求請以公司要求為準。下載三大組件Apache JMeter去官網(wǎng) https://jmeter.apache.org/ 下載最新的Binaries壓縮包如apache-jmeter-5.6.3.zip。解壓到任意目錄例如D:\Tools\apache-jmeter-5.6.3。這就是JMeter的家了里面bin目錄下的jmeter.bat就是啟動腳本。InfluxDB前往InfluxData官網(wǎng)下載Windows版本的1.x歸檔版本。我推薦使用1.8.x因為它非常穩(wěn)定。下載influxdb-1.8.10_windows_amd64.zip解壓到一個目錄如D:\Apps\influxdb-1.8.10。里面會有一個influxd.exe數(shù)據(jù)庫守護進程和influx.exe命令行客戶端。Grafana前往Grafana官網(wǎng)下載Windows版本。選擇“Windows”標簽頁下載.zip壓縮包如grafana-10.2.3.windows-amd64.zip。解壓到目錄如D:\Apps\grafana-10.2.3。主要可執(zhí)行文件在bin目錄下。3.2 第二步配置與啟動InfluxDBInfluxDB是我們的數(shù)據(jù)倉庫需要先把它跑起來并做好初始化。1. 修改配置文件可選但推薦 進入InfluxDB解壓目錄你會看到一個默認的配置文件influxdb.conf。對于初次使用大部分默認設置即可。但我們可以修改兩個關鍵點以便管理用記事本或VS Code打開influxdb.conf。找到[http]部分確認enabled truebind-address :8086。這個端口就是JMeter和Grafana要連接的端口。找到[meta]、[data]和[wal]部分下的dir配置項。它們默認指向解壓目錄內(nèi)的meta、data、wal文件夾。如果你想將數(shù)據(jù)存放到其他磁盤如D盤可以修改這些路徑例如dir D:/influxdb/data。注意InfluxDB配置文件中的路徑建議使用正斜杠/或者將反斜杠\轉義為\\。2. 啟動InfluxDB服務 打開命令提示符CMD使用管理員身份運行避免權限問題。切換到InfluxDB的解壓目錄。首次初始化并啟動influxd.exe -config influxdb.conf如果看到類似[httpd] 127.0.0.1:8086 - 127.0.0.1:8086 [httpd] log: listening on [::]:8086的日志說明啟動成功正在監(jiān)聽8086端口。實操心得第一次啟動可能會稍慢因為它要初始化數(shù)據(jù)庫結構。不要關閉這個CMD窗口關閉就意味著停止了InfluxDB服務。對于長期使用建議將其配置為Windows服務開機自啟??梢允褂肗SSMNon-Sucking Service Manager這個工具來將influxd.exe安裝為服務網(wǎng)上教程很多這里不展開。3. 創(chuàng)建數(shù)據(jù)庫 保持上一步的CMD窗口運行新開一個CMD窗口切換到InfluxDB目錄。連接本地InfluxDBinflux.exe -host 127.0.0.1 -port 8086成功后會進入InfluxDB的CLI提示符為。創(chuàng)建一個專門給JMeter用的數(shù)據(jù)庫比如叫jmeterCREATE DATABASE jmeter驗證一下SHOW DATABASES你應該能看到jmeter在列表中。輸入exit退出CLI。至此你的數(shù)據(jù)倉庫InfluxDB已經(jīng)就緒正在等待接收JMeter發(fā)來的數(shù)據(jù)。3.3 第三步配置JMeter的后端監(jiān)聽器現(xiàn)在我們來配置JMeter讓它把壓測結果“喂”給InfluxDB。1. 啟動JMeter GUI 進入你的JMeter解壓目錄雙擊bin文件夾下的jmeter.bat啟動圖形界面。建議先創(chuàng)建一個簡單的測試計劃來驗證配置。2. 添加后端監(jiān)聽器在測試計劃上右鍵添加-監(jiān)聽器-后端監(jiān)聽器。在右側的“后端監(jiān)聽器實現(xiàn)”下拉框中選擇InfluxDBBackendListenerClient。這是JMeter 3.2版本后內(nèi)置的監(jiān)聽器專門用于對接InfluxDB。3. 配置關鍵參數(shù) 這是核心步驟參數(shù)配錯會導致數(shù)據(jù)發(fā)送失敗。influxdbMetricsSender保持默認的org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender。influxdbUrl填入InfluxDB的HTTP寫入地址。格式為http://你的InfluxDB IP:8086/write?db數(shù)據(jù)庫名。因為我們都在本機所以是http://127.0.0.1:8086/write?dbjmeter。務必確認數(shù)據(jù)庫名jmeter和你剛才創(chuàng)建的一致。application自定義應用名稱這個會作為數(shù)據(jù)的一個標簽tag方便在Grafana里區(qū)分不同項目的測試數(shù)據(jù)。例如填MyWebApp。measurement保持默認jmeter即可這是InfluxDB中存儲這些數(shù)據(jù)的表在InfluxDB里叫Measurement的名字。summaryOnly通常設置為false。如果為true則只發(fā)送聚合數(shù)據(jù)如整個測試的均值、最大值等不會發(fā)送每個采樣器的詳細數(shù)據(jù)。為了實時監(jiān)控我們需要看到每個時間點的細節(jié)所以選false。samplersRegex.。這是一個正則表達式匹配哪些采樣器的數(shù)據(jù)需要發(fā)送。.表示所有采樣器。percentiles可以設置需要發(fā)送的百分位數(shù)例如90;95;99表示發(fā)送90%、95%、99%響應時間。用分號分隔。其他參數(shù)可以暫時保持默認。一個配置示例如下圖此處為文字描述實際界面為表格參數(shù)名參數(shù)值說明influxdbMetricsSenderorg.apache.jmeter...HttpMetricsSender發(fā)送器實現(xiàn)類influxdbUrlhttp://127.0.0.1:8086/write?dbjmeter核心配置確保IP、端口、庫名正確applicationMyWebApp應用標簽用于區(qū)分measurementjmeterInfluxDB中的表名summaryOnlyfalse發(fā)送詳細數(shù)據(jù)samplersRegex.匹配所有采樣器4. 運行測試驗證 添加一個線程組和一個HTTP請求采樣器隨便請求一個如http://httpbin.org/get的公共API然后運行測試。觀察JMeter的日志查看jmeter.log文件位于bin目錄如果沒有報錯并且看到類似INFO o.a.j.v.b.i.HttpMetricsSender: Metrics sent to influxDB的日志說明數(shù)據(jù)發(fā)送成功。5. 在InfluxDB中驗證數(shù)據(jù) 回到之前連接InfluxDB CLI的CMD窗口。連接并切換到jmeter數(shù)據(jù)庫influx.exe -host 127.0.0.1 -port 8086 -database jmeter查看有哪些MeasurementSHOW MEASUREMENTS。你應該能看到jmeter。查詢最近幾條數(shù)據(jù)看看SELECT * FROM jmeter WHERE applicationMyWebApp ORDER BY time DESC LIMIT 5。 如果能看到返回了帶有時間戳、responseTime、errorCount、hits等字段的數(shù)據(jù)行恭喜你JMeter到InfluxDB的通道打通了3.4 第四步安裝、配置與啟動Grafana最后一步我們把數(shù)據(jù)可視化。1. 啟動Grafana 進入Grafana的解壓目錄找到bin文件夾。雙擊grafana-server.exe。它會啟動一個控制臺應用輸出一堆日志。當看到“HTTP Server Listen”在http://0.0.0.0:3000時說明啟動成功。注意同樣關閉這個窗口就會停止Grafana。長期使用建議也用NSSM配置成Windows服務。2. 登錄并添加數(shù)據(jù)源打開瀏覽器訪問http://localhost:3000。首次登錄默認用戶名和密碼都是admin。登錄后會強制要求修改密碼按提示操作即可。進入主界面后點擊左側齒輪圖標Configuration -Data sources。點擊Add data source選擇InfluxDB。配置數(shù)據(jù)源Name起個名字如JMeter_InfluxDB。HTTP-URL填入InfluxDB的地址http://localhost:8086。注意這里不是寫入地址不需要/write?dbxxx。InfluxDB Details-Database填入我們創(chuàng)建的數(shù)據(jù)庫名jmeter。HTTP-Access選擇Server (default)。這意味著查詢由Grafana服務端發(fā)起。其他保持默認點擊最下方的Save test。如果看到綠色提示框“Data source is working”說明Grafana已經(jīng)成功連上InfluxDB。3. 導入JMeter儀表盤模板 從頭創(chuàng)建一個完整的監(jiān)控儀表盤很費時間好在Grafana社區(qū)有現(xiàn)成的、針對JMeter的儀表盤模板。點擊左側號 -Import。在Import via grafana.com輸入框中輸入模板ID5496這是一個非常流行和全面的JMeter儀表盤模板然后點擊Load。在下一步中選擇我們剛剛創(chuàng)建的數(shù)據(jù)源JMeter_InfluxDB然后點擊Import。瞬間一個功能齊全、圖表豐富的性能監(jiān)控儀表盤就出現(xiàn)在你面前了它通常包括活躍線程數(shù)、響應時間平均、中位數(shù)、百分位數(shù)、吞吐量TPS/每分鐘請求數(shù)、錯誤率、網(wǎng)絡流量等關鍵指標的實時圖表。4. 平臺調優(yōu)與高級配置技巧基礎平臺搭好了但要讓它好用、穩(wěn)定還需要一些優(yōu)化和深入配置。4.1 InfluxDB性能與數(shù)據(jù)管理默認配置下InfluxDB可能無法應對高并發(fā)、長時間的壓測數(shù)據(jù)寫入。1. 調整批處理與隊列大小 回到JMeter的后端監(jiān)聽器配置。queueSize發(fā)送隊列大小。默認5000。如果JMeter采樣非??旄卟l(fā)可以適當調大比如10000防止隊列滿導致數(shù)據(jù)丟失。batchSize批處理大小。默認1000。表示累積多少條數(shù)據(jù)后一次性發(fā)送給InfluxDB。增大此值如2000可以減少HTTP請求次數(shù)提升效率但會增加少量延遲。根據(jù)你的網(wǎng)絡和壓測強度調整。2. InfluxDB數(shù)據(jù)保留策略Retention Policy, RP 壓測數(shù)據(jù)通常不需要永久保存。InfluxDB默認的RP是autogen永久保存。我們可以創(chuàng)建一個新的RP例如只保留7天數(shù)據(jù)。在InfluxDB CLI中執(zhí)行CREATE RETENTION POLICY one_week ON jmeter DURATION 7d REPLICATION 1 DEFAULT這條命令在jmeter數(shù)據(jù)庫創(chuàng)建了一個名為one_week、數(shù)據(jù)保留7天、副本數(shù)為1的RP并設為默認。之后寫入的數(shù)據(jù)7天后會自動刪除。3. 監(jiān)控InfluxDB自身狀態(tài) InfluxDB自帶一個_internal數(shù)據(jù)庫存儲其內(nèi)部運行指標。你可以在Grafana中再添加一個數(shù)據(jù)源指向這個庫URL相同Database填_internal然后導入相關的監(jiān)控模板如ID2125來監(jiān)控InfluxDB的CPU、內(nèi)存、寫入性能等確保它不會成為瓶頸。4.2 Grafana儀表盤定制與告警1. 理解模板變量 導入的模板ID 5496通常已經(jīng)配置好了變量比如application、transaction。在儀表盤左上角你可以通過下拉框選擇不同的應用對應JMeter后端監(jiān)聽器里的application參數(shù)和事務對應JMeter采樣器名稱實現(xiàn)動態(tài)過濾數(shù)據(jù)。這是Grafana非常強大的功能。2. 自定義查詢與面板 如果你想監(jiān)控某個特定接口的99%響應時間可以新建一個面板。點擊儀表盤標題 -Edit- 點擊Add panel加號圖標。在Query選項卡數(shù)據(jù)源選擇JMeter_InfluxDB在FROM下拉框中選擇jmeter。寫查詢語句例如SELECT percentile(responseTime, 99) FROM jmeter WHERE (application MyWebApp AND transaction 你的接口名) AND $timeFilter GROUP BY time(10s)percentile(responseTime, 99)計算99%分位響應時間。$timeFilter是Grafana的時間范圍變量。GROUP BY time(10s)每10秒聚合一次數(shù)據(jù)。在右側設置面板標題、單位ms、圖表類型Graph等。3. 設置告警Alerting 當錯誤率飆升或響應時間超閾值時你需要立即知道。Grafana的告警功能可以幫到你。編輯任何一個圖表面板如錯誤率圖表。切換到Alert選項卡點擊Create alert。定義規(guī)則比如WHEN avg() OF query(A, 1m, now) IS ABOVE 0.05表示當最近1分鐘的平均錯誤率超過5%時觸發(fā)。在Notifications部分可以配置告警通道如郵件、Slack、釘釘、Webhook等。你需要先在Alerting-Notification channels中配置好對應的通道。這樣一旦系統(tǒng)在壓測中出現(xiàn)異常告警信息就能及時推送到你指定的地方。4.3 JMeter分布式測試與監(jiān)控整合單機JMeter可能無法產(chǎn)生足夠大的壓力或者受限于本機網(wǎng)絡、端口數(shù)。這時需要用到JMeter的分布式測試Master-Slave模式。1. 架構變化Master機運行JMeter GUI控制測試并且運行InfluxDB和Grafana。它負責收集所有Slave的數(shù)據(jù)并展示。Slave機只運行JMeter的jmeter-server.bat無GUI模式接收Master指令執(zhí)行測試腳本并將結果回傳給Master。2. 關鍵配置在所有Slave機的jmeter.properties文件中配置后端監(jiān)聽器將其influxdbUrl指向Master機的InfluxDB地址如http://master_ip:8086/write?dbjmeter。在Master機的JMeter中修改測試計劃確保其后端監(jiān)聽器的influxdbUrl也指向本機的InfluxDB。運行測試時在Master的GUI中通過運行-遠程啟動來指定Slave機。這樣所有Slave產(chǎn)生的數(shù)據(jù)都會統(tǒng)一寫入到Master機的InfluxDB中在Grafana上看到的就是聚合了所有壓力機的全局視圖。5. 常見問題排查與實戰(zhàn)心得搭建和使用過程中你肯定會遇到各種問題。這里把我踩過的坑和解決方法總結一下。5.1 數(shù)據(jù)寫入失敗JMeter到InfluxDB現(xiàn)象JMeter日志中大量報錯如Failed to send metrics to influxDB或者InfluxDB中查詢不到數(shù)據(jù)。排查步驟檢查網(wǎng)絡連通性在運行JMeter的機器上用瀏覽器或curl命令訪問http://influxdb_ip:8086/ping。InfluxDB如果正常運行會返回204 No Content。如果連不上檢查InfluxDB是否啟動、防火墻是否放行8086端口。檢查URL和數(shù)據(jù)庫反復核對JMeter后端監(jiān)聽器中的influxdbUrl。確保IP、端口、數(shù)據(jù)庫名dbjmeter完全正確。特別注意URL中不能有空格數(shù)據(jù)庫名要和你用CREATE DATABASE創(chuàng)建的名稱嚴格一致大小寫敏感。檢查InfluxDB日志查看InfluxDB啟動的控制臺窗口或日志文件默認在解壓目錄看是否有關于寫入錯誤的報錯信息。常見錯誤是“database not found”。降低JMeter發(fā)送頻率臨時將batchSize設為100queueSize設為1000減少單次發(fā)送壓力看是否緩解。5.2 Grafana圖表無數(shù)據(jù)或顯示“No data”現(xiàn)象Grafana面板顯示“No data to show”。排查步驟檢查數(shù)據(jù)源連接在Grafana的Data Sources設置里對JMeter_InfluxDB再次點擊Save test確認連接成功。檢查查詢語句和時間范圍確認面板的查詢語句中FROM選擇了正確的measurementjmeter。確認WHERE條件中的application標簽值是否和JMeter發(fā)送的數(shù)據(jù)一致。大小寫必須完全匹配。檢查Grafana右上角的時間范圍選擇器。是不是選到了未來時間或者很久以前選擇Last 1 hour或Last 5 minutes試試。在InfluxDB中直接查詢用InfluxDB CLI執(zhí)行Grafana面板上顯示的查詢語句可以在面板編輯狀態(tài)點擊Query inspector看到原始語句看是否能返回數(shù)據(jù)。這是最直接的驗證方法。5.3 平臺資源占用過高現(xiàn)象壓測過程中本機卡頓InfluxDB或Grafana響應變慢。優(yōu)化建議分離部署這是最根本的解決方案。將InfluxDB和Grafana部署到一臺獨立的、配置較好的Linux服務器上。JMeter Master/Slave也盡量用獨立機器。Windows本機只作為控制端和查看端。調整InfluxDB配置在influxdb.conf中可以調整[http]部分的max-concurrent-write-limit和max-enqueued-write-limit限制并發(fā)寫入隊列防止內(nèi)存爆掉。根據(jù)機器內(nèi)存調整[cache-max-memory-size]。精簡Grafana儀表盤一個儀表盤上不要放置過多面板特別是刷新間隔短、查詢復雜的面板。非核心監(jiān)控項可以放到另一個儀表盤或延長刷新間隔。清理舊數(shù)據(jù)如前所述設置合理的數(shù)據(jù)保留策略定期自動清理過期數(shù)據(jù)釋放磁盤空間。5.4 關于時間戳同步潛在問題如果JMeter壓力機、InfluxDB服務器、Grafana服務器分布在不同的機器上且系統(tǒng)時間不同步會導致Grafana圖表上的時間軸錯亂。解決方案確保所有機器使用NTP服務進行時間同步。在Windows上可以設置自動與Internet時間服務器同步。在生產(chǎn)環(huán)境中務必保證所有服務器時間一致。最后這個平臺搭建起來只是第一步真正的價值在于用它去發(fā)現(xiàn)性能問題、定位瓶頸。多跑幾次測試熟悉每個圖表的含義嘗試定制自己的監(jiān)控面板設置關鍵的告警閾值。當你能夠指著實時變化的圖表清晰地說出“當前TPS達到1200平均響應時間穩(wěn)定在200ms但95分位響應時間在500ms以上說明有部分請求較慢需要結合應用日志進一步分析”時這個平臺才真正成為了你手中的利器。