在本文中,我將把幾個(gè)常用的監(jiān)控部分給梳理一下。前面我們提到過,在性能監(jiān)控圖譜中,有操作系統(tǒng)、應(yīng)用服務(wù)器、中間件、隊(duì)列、緩存、數(shù)據(jù)庫、網(wǎng)絡(luò)、前端、負(fù)載均衡、Web 服務(wù)器、存儲(chǔ)、代碼等很多需要監(jiān)控的點(diǎn)。顯然這些監(jiān)控點(diǎn)不能在一個(gè)專欄中全部覆蓋并一一細(xì)化,我只能找最常用的幾個(gè),做些邏輯思路的說明,同時(shí)也把具體的實(shí)現(xiàn)描述出來。如果你遇到了其他的組件,也需要一一實(shí)現(xiàn)這些監(jiān)控。
在本篇中,主要想說明白下圖的這個(gè)監(jiān)控邏輯。
這應(yīng)該是現(xiàn)在最流行的一套監(jiān)控邏輯了吧。我今天把常見的使用 Grafana、Prometheus、InfluxDB、Exporters 的數(shù)據(jù)展示方式說一下,如果你剛進(jìn)入性能測試領(lǐng)域,也能有一個(gè)感性的認(rèn)識(shí)。
有測試工具,有監(jiān)控工具,才能做后續(xù)的性能分析和瓶頸定位,所以有必要把這些工具的邏輯跟你擺一擺。
所有做性能的人都應(yīng)該知道一點(diǎn),不管數(shù)據(jù)以什么樣的形式展示,最要緊的還是看數(shù)據(jù)的來源和含義,以便做出正確的判斷。
我先說明一下 JMeter 和 node_exporter 到 Grafana 的數(shù)據(jù)展示邏輯。至于其他的 Exporter,我就不再解釋這個(gè)邏輯了,只說監(jiān)控分析的部分。
JMeter + InfluxDB + Grafana 的數(shù)據(jù)展示邏輯
一般情況下,我們用 JMeter 做壓力測試時(shí),都是使用 JMeter 的控制臺(tái)來查看結(jié)果。如下圖所示:
或者裝個(gè)插件來看結(jié)果:
或者用 JMeter 來生成 HTML:
這樣看都沒有問題,我們在前面也強(qiáng)調(diào)過,對于壓力工具來說,我們最多只關(guān)心三條曲線的數(shù)據(jù):TPS(T 由測試目標(biāo)定義)、響應(yīng)時(shí)間、錯(cuò)誤率。這里的錯(cuò)誤率還只是輔助排查問題的曲線,沒有問題時(shí),只看 TPS 和響應(yīng)時(shí)間即可。不過采取以上三種方式有幾個(gè)方面的問題。
整理結(jié)果時(shí)比較浪費(fèi)時(shí)間。
在 GUI 用插件看曲線,做高并發(fā)時(shí)并不現(xiàn)實(shí)。
在場景運(yùn)行時(shí)間比較長的時(shí)候,采用生成 HTML 的方式,會(huì)出現(xiàn)消耗內(nèi)存過大的情況,而實(shí)際上,在生成的結(jié)果圖中,有很多生成的圖我們并不是那么關(guān)注。
生成的結(jié)果保存之后再查看比較麻煩,還要一個(gè)個(gè)去找。
那么如何解決這幾個(gè)問題呢?
用 JMeter 的 Backend Listener 幫我們實(shí)時(shí)發(fā)送數(shù)據(jù)到 InfluxDB 或 Graphite 可以解決這樣的問題。
Graphite Backend Listener 的支持是在 JMeter 2.13 版本,InfluxdDB Backend Listener 的支持是在 JMeter 3.3 的版本,它們都是用異步的方式把數(shù)據(jù)發(fā)送出來,以便查看。
其實(shí)有這個(gè) JMeter 發(fā)送給 InfluxDB 的數(shù)據(jù)之后,我們不需要看上面的那些 HTML 數(shù)據(jù),也可以直觀地看到系統(tǒng)性能的性能趨勢。
并且這樣保存下來的數(shù)據(jù),在測試結(jié)束后想再次查看也比較方便比對。
JMeter + InfluxDB + Grafana 的結(jié)構(gòu)如下:
在這個(gè)結(jié)構(gòu)中,JMeter 發(fā)送壓力到服務(wù)器的同時(shí),統(tǒng)計(jì)下 TPS、響應(yīng)時(shí)間、線程數(shù)、錯(cuò)誤率等信息。默認(rèn)每 30 秒在控制臺(tái)輸出一次結(jié)果(在 jmeter.properties 中有一個(gè)參數(shù) #summariser.interval=30 可以控制)。
配置了 Backend Listener 之后,將統(tǒng)計(jì)出的結(jié)果異步發(fā)送到 InfluxDB 中。最后在 Grafana 中配置 InfluxDB 數(shù)據(jù)源和 JMeter 顯示模板。
然后就可以實(shí)時(shí)查看 JMeter 的測試結(jié)果了,這里看到的數(shù)據(jù)和控制臺(tái)的數(shù)據(jù)是一樣。
但如果這么簡單就說完了,這篇文章也就沒價(jià)值了。下面我們來說一下,數(shù)據(jù)的傳輸和展示邏輯。
JMeter 中 Backend Listener 的配置
下面我們就 InfluxDB 的 Backend Listener 做個(gè)說明。它的配置比較簡單,在腳本中加上即可。
我們先配置好 InfluxDB URL、Application 等信息,Application 這個(gè)配置可以看成是場景名。
那么 JMeter 如何將數(shù)據(jù)發(fā)給 InfluxDB 呢?請看源碼中的關(guān)鍵代碼,如下所示:
privatevoidaddMetrics(Stringtransaction,SamplerMetricmetric){ //FORALLSTATUS addMetric(transaction,metric.getTotal(),metric.getSentBytes(),metric.getReceivedBytes(),TAG_ALL,metric.getAllMean(),metric.getAllMinTime(), metric.getAllMaxTime(),allPercentiles.values(),metric::getAllPercentile); //FOROKSTATUS addMetric(transaction,metric.getSuccesses(),null,null,TAG_OK,metric.getOkMean(),metric.getOkMinTime(), metric.getOkMaxTime(),okPercentiles.values(),metric::getOkPercentile); //FORKOSTATUS addMetric(transaction,metric.getFailures(),null,null,TAG_KO,metric.getKoMean(),metric.getKoMinTime(), metric.getKoMaxTime(),koPercentiles.values(),metric::getKoPercentile); metric.getErrors().forEach((error,count)->addErrorMetric(transaction,error.getResponseCode(), error.getResponseMessage(),count)); }
從這段代碼可以看出,站在全局統(tǒng)計(jì)的視角來看,這里把 JMeter 運(yùn)行的統(tǒng)計(jì)結(jié)果,比如事務(wù)的 Total 請求、發(fā)送接收字節(jié)、平均值、最大值、最小值等,都加到 metric 中,同時(shí)也會(huì)把成功和失敗的事務(wù)信息添加到 metric 中去。 在源碼中,還有更多的添加 metric 的步驟,你有興趣的話,也可以看一下 JMeter 源碼中的InfluxdbBackendListenerClient.java。 保存了 metric 之后,再使用 InfluxdbMetricsSender 發(fā)送到 InfluxDB 中去。發(fā)送關(guān)鍵代碼如下:
@OverridepublicvoidwriteAndSendMetrics(){ ........if(!copyMetrics.isEmpty()){try{if(httpRequest==null){ httpRequest=createRequest(url); } StringBuildersb=newStringBuilder(copyMetrics.size()*35);for(MetricTuplemetric:copyMetrics){//AddTimeStampinnanosecondfromepoch(defaultinInfluxDB) sb.append(metric.measurement) .append(metric.tag) .append("")//$NON-NLS-1$ .append(metric.field) .append("") .append(metric.timestamp+"000000") .append(" ");//$NON-NLS-1$ } StringEntityentity=newStringEntity(sb.toString(),StandardCharsets.UTF_8); httpRequest.setEntity(entity); lastRequest=httpClient.execute(httpRequest,newFutureCallback
InfluxDB 中的存儲(chǔ)結(jié)構(gòu)
然后我們再來看下 InfluxDB 中如何存儲(chǔ):
>showdatabases name:databases name ---- _internal jmeter >usejmeter Usingdatabasejmeter > >showMEASUREMENTS name:measurements name ---- events jmeter >select*fromeventswhereapplication='7ddemo' name:events timeapplicationtexttitle ------------------------ 15752554628060000007ddemoTestCycle1startedApacheJMeter 15752564638200000007ddemoTestCycle1endedApacheJMeter .............. n>select*fromjmeterwhereapplication='7ddemo'limit10 name:jmeter timeapplicationavgcountcountErrorendedThitmaxmaxATmeanATminminATpct90.0pct95.0pct99.0rbresponseCoderesponseMessagesbstartedTstatuttransaction --------------------------------------------------------------------------------------------------------------------------------------------- 15752554628210000007ddemo00000internal 15752554678180000007ddemo232.8235294117647217017849122384.999999999999684984900allall 15752554678240000007ddemo232.8235294117647217849122384.999999999999684984900all0_openIndexPage 15752554678260000007ddemo232.8235294117647217849122384.9999999999996849849ok0_openIndexPage 15752554678290000007ddemo01111internal 15752554728110000007ddemo205.441860465116326026849122252.6271.484900allall 15752554728120000007ddemo01111internal 15752554728120000007ddemo205.441860465116326849122252.6271.4849ok0_openIndexPage 15752554728120000007ddemo205.441860465116326849122252.6271.484900all0_openIndexPage 15752554778110000007ddemo198.214285714285727027849117263.79999999999995292.350000000000184900allall 這段代碼也就是說,在 InfluxDB 中,創(chuàng)建了兩個(gè) MEASUREMENTS,分別是 events 和 jmeter。這兩個(gè)各自存了數(shù)據(jù),我們在界面中配置的 testtile 和 eventTags 放在了 events 這個(gè) MEASUREMENTS 中。在模板中這兩個(gè)值暫時(shí)都是不用的。 在 JMeter 這個(gè) MEASUREMENTS 中,我們可以看到 application 和事務(wù)的統(tǒng)計(jì)信息,這些值和控制臺(tái)一致。在 Grafana 中顯示的時(shí)候,就是從這個(gè)表中取出的數(shù)據(jù),根據(jù)時(shí)序做的曲線。
Grafana 中的配置
有了 JMeter 發(fā)送到 InfluxDB 中的數(shù)據(jù),下面就來配置一下 Grafana 中的展示。首先,要配置一個(gè) InfluxDB 數(shù)據(jù)源。如下所示
SELECTlast("count")/$send_intervalFROM"$measurement_name"WHERE("transaction"=~/^$transaction$/AND"statut"='ok')AND$timeFilterGROUPBYtime($__interval)
上面這個(gè)就是 Total TPS 了,在這里稱為 throughput。 關(guān)于這個(gè)概念,我在第一篇中就已經(jīng)有了說明,這里再次提醒,概念的使用在團(tuán)隊(duì)中要有統(tǒng)一的認(rèn)識(shí),不要受行業(yè)內(nèi)一些傳統(tǒng)信息的誤導(dǎo)。 這里取的數(shù)據(jù)來自 MEASUREMENTS 中成功狀態(tài)的所有事務(wù)。 響應(yīng)時(shí)間曲線:SELECTmean("pct95.0")FROM"$measurement_name"WHERE("application"=~/^$application$/)AND$timeFilterGROUPBY"transaction",time($__interval)fill(null)
這里是用 95 pct 內(nèi)的響應(yīng)時(shí)間畫出來的曲線。
整體展示出來的效果如下:
數(shù)據(jù)比對
首先,我們在 JMeter 中配置一個(gè)簡單的場景。10 個(gè)線程,每個(gè)線程迭代 10 次,以及兩個(gè) HTTP 請求。
也就是說,這時(shí)會(huì)產(chǎn)生 10x10x2=200 次請求。我們用 JMeter 跑起來看一下。
看到了吧,這個(gè)請求數(shù)和我們預(yù)想的一樣。下面我們看一下 Grafana 中展示出來的結(jié)果。
還有針對每個(gè)事務(wù)的統(tǒng)計(jì)情況。
至此,JMeter 到 Grafana 的展示過程就完成了。以后我們就不用再保存 JMeter 的執(zhí)行結(jié)果了,也不用等著 JMeter 輸出 HTML 了。
node_exporter + Prometheus + Grafana 的數(shù)據(jù)展示邏輯
對性能測試來說,在常用的 Grafana + Prometheus + Exporter 的邏輯中,第一步要看的就是操作系統(tǒng)資源了。所以在這一篇中,我們將以 node_exporter 為例來說明一下操作系統(tǒng)抽取數(shù)據(jù)的邏輯,以便知道監(jiān)控?cái)?shù)據(jù)的來源,至于數(shù)據(jù)的含義,我們將在后續(xù)的文章中繼續(xù)描述。
首先,我們還是要畫一個(gè)圖。
現(xiàn)在 node_exporter 可以支持很多個(gè)操作系統(tǒng)了。官方列表如下:
當(dāng)然不是說只支持這些,你也可以擴(kuò)展自己的 Exporter。
配置 node_exporter
node_exporter 目錄如下:
[root@7dgroup2node_exporter-0.18.1.linux-amd64]#ll total16524 -rw-r--r--13434343411357Jun500:50LICENSE -rwxr-xr-x13434343416878582Jun500:41node_exporter -rw-r--r--134343434463Jun500:50NOTICE}
啟動(dòng):[root@7dgroup2node_exporter-0.18.1.linux-amd64]#./node_exporter--web.listen-address=:9200&
是不是很簡潔?如果想看更多的功能 ,可以查看下它的幫助。 配置 Prometheus 先下載 Prometheus:[root@7dgroup2data]#wget-chttps://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz .......... 100%[=============================================================================================>]58,625,125465KB/sin6m4s 2019-11-291516(157KB/s)-‘prometheus-2.14.0.linux-amd64.tar.gz’saved[58625125/58625125] [root@7dgroup2data]
解壓之后,我們可以看到目錄結(jié)構(gòu)如下:[root@7dgroup2prometheus-2.11.1.linux-amd64]#ll total120288 drwxr-xr-x.2343434344096Jul1023:26console_libraries drwxr-xr-x.2343434344096Jul1023:26consoles drwxr-xr-x.3rootroot4096Nov3012:55data -rw-r--r--.13434343411357Jul1023:26LICENSE -rw-r--r--.1rootroot35Aug723:19node.yml -rw-r--r--.1343434342770Jul1023:26NOTICE -rwxr-xr-x.13434343476328852Jul1021:53prometheus -rw-r--r--1343434341864Sep2109:36prometheus.yml -rwxr-xr-x.13434343446672881Jul1021:54promtool [root@7dgroup2prometheus-2.11.1.linux-amd64]#
在prometheus.yml中添加如下配置,以取數(shù)據(jù):-job_name:'s1' static_configs: -targets:['172.17.211.143:9200']
啟動(dòng):[root@7dgroup2data]#./prometheus--config.file=prometheus.yml&
這樣就行了嗎?當(dāng)然不是。根據(jù)上面的流程圖,我們還需要配置 Grafana。 配置 Grafana 首先配置一個(gè)數(shù)據(jù)源,非常簡單。如下所示:
avg(irate(node_cpu_seconds_total{instance=~"$node",mode="system"}[30m]))by(instance)avg(irate(node_cpu_seconds_total{instance=~"$node",mode="user"}[30m]))by(instance)avg(irate(node_cpu_seconds_total{instance=~"$node",mode="iowait"}[30m]))by(instance)1-avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[30m]))by(instance)
這些都是從 Prometheus 中取出來的數(shù)據(jù),查詢語句讀了 Prometheus 中node_cpu_seconds_total的不同的模塊數(shù)據(jù)。 下面我們來看一下,node_exporter暴露出來的計(jì)數(shù)器。
總結(jié)
為什么要解釋數(shù)據(jù)的邏輯呢?因?yàn)樽罱诠ぷ髦杏龅揭恍┣闆r,有人覺得有了 Prometheus + Grafana + Exportor 這樣的組合工具之后,基本上都不再用手工執(zhí)行什么命令了。但我們要了解的是,對于監(jiān)控平臺(tái)來說,它取的所有的數(shù)據(jù)必然是被監(jiān)控者可以提供的數(shù)據(jù),像 node_exporter 這樣小巧的監(jiān)控收集器,它可以獲取的監(jiān)控?cái)?shù)據(jù),并不是整個(gè)系統(tǒng)全部的性能數(shù)據(jù),只是取到了常見的計(jì)數(shù)器而已。這些計(jì)數(shù)器不管是用命令查看,還是用這樣炫酷的工具查看,它的值本身都不會(huì)變。所以不管是在監(jiān)控平臺(tái)上看到的數(shù)據(jù),還是在命令行中看到的數(shù)據(jù),我們最重要的是要知道含義以及這些值的變化對性能測試和分析的下一步驟的影響。
原文鏈接:https://www.cnblogs.com/siguadd/p/14878035.html-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7246瀏覽量
91110 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7775瀏覽量
90438 -
GUI
+關(guān)注
關(guān)注
3文章
677瀏覽量
40796 -
Web 服務(wù)器
+關(guān)注
關(guān)注
0文章
3瀏覽量
1502
原文標(biāo)題:基于 Prometheus、InfluxDB 與 Grafana 打造監(jiān)控平臺(tái)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
業(yè)務(wù)監(jiān)控—一站式搭建jmeter+telegraf+influxdb+Grafana看板

詳解Prometheus的數(shù)據(jù)類型

工業(yè)設(shè)備數(shù)據(jù)集中監(jiān)控可視化管理平臺(tái)是什么
使用Prometheus與Grafana實(shí)現(xiàn)MindIE服務(wù)可視化監(jiān)控功能

云服務(wù)器計(jì)算池的運(yùn)維團(tuán)隊(duì)需要掌握的網(wǎng)絡(luò)工具
從零入門Prometheus:構(gòu)建企業(yè)級(jí)監(jiān)控與報(bào)警系統(tǒng)的最佳實(shí)踐指南

云服務(wù)器 Flexus X 實(shí)例,Docker 集成搭建 Grafana 開源數(shù)據(jù)可視化平臺(tái)

云端監(jiān)控新體驗(yàn),打造強(qiáng)大的 Zabbix 主機(jī)監(jiān)控解決方案

可與MES系統(tǒng)集成的數(shù)據(jù)采集監(jiān)控平臺(tái)
EasyRoCE統(tǒng)一監(jiān)控面板:一站式運(yùn)維體驗(yàn)

devops使用最廣泛的集成工具盤點(diǎn)
安科瑞電力智能監(jiān)控平臺(tái)的應(yīng)用

評(píng)論