JMeter外掛-----JMXMon外掛監控JVM
阿新 • • 發佈:2019-01-01
準備
1、以windows為例,本地準備jmeter,這裡用的是3.1
2、要監控的jvm配置jmx:
-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=10.255.255.150(使用的時候改成自己的ip)
安裝
兩種方式:
- 直接下載 放入對應JMETER_HMOE/lib/ext
第一種方式有時候會比較慢,我們採用第二種方式
啟動jmeter,按下面嚮導操作
注意:我這裡之前裝好了,所以在installed中,正常未安裝應該在availiable plugins中,勾選,安裝,會自動重啟
使用
1、建立測試計劃
2、新增監視器
JMX Sampler介紹
- Label:填寫監控圖表裡的曲線名稱。
- URI:填寫被測JVM的JMX連線地址
service:jmx:rmi:///jndi/rmi://YOURHOST:JMXPORT/jmxrmi 或者
service:jmx:rmi://YOURHOST:JMXPORT/jndi/rmi://YOURHOST:JMXPORT/jmxrmi
這個欄位可以包含jmeter變數,如果retry被勾選就可以靈活進行jxm配置。比如一個伺服器產生外部程序,它可以返回jmx連線的ip和埠,可將這些值提取到變數(s)中並在URI欄位中使用。 - Object Name:填寫監控的具體物件名稱。
- Attribute:填寫監控的具體屬性。
- Key:如果是複雜型別的屬性,還需要填寫Key。
- Delta:表示差異,在此理解為增量(見最後程式碼)。
- retry:勾選時,在測試期間嘗試新的連線,丟失的連線可以恢復。
獲取屬性和objectName
通過jconsole或者jvisualVM獲取
以jvisualVM為例
demo執行示意
比如再新增一個
delta屬性示例
表示增量
扒了扒原始碼
JMXMonCollector.java
……
boolean isDelta = ((JMeterProperty)row.get(7 )).getBooleanValue();
……
initiateConnector(attributes, jmxUrl, label, isDelta, objectName, attribute, key, canRetry);
……
protected void initiateConnector(Hashtable attributes, String jmxUrl, String name, boolean delta, String objectName, String attribute, String key, boolean canRetry)
throws IOException
{
if ((!canRetry) && (pool.getConnection(jmxUrl, attributes, true) == null)) {
return;
}
this.jmxMonSamplers.add(new JMXMonSampler(pool, attributes, jmxUrl, name, objectName, attribute, key, delta, canRetry));
}
JMXMonSampler.java
public JMXMonSampler(JMXMonConnectionPool pool, Hashtable attributes, String url, String name, String objectName, String attribute, String key, boolean sampleDeltaValue, boolean canRetry)
{
this.pool = pool;
this.connectionAttributes = attributes;
this.metricName = name;
this.url = url;
this.objectName = objectName;
this.attribute = attribute;
this.sampleDeltaValue = sampleDeltaValue;
this.key = key;
this.canRetry = canRetry;
}
public void generateSamples(JMXMonSampleGenerator collector){
……
if (this.sampleDeltaValue)
{
if (!Double.isNaN(this.oldValue)) {
collector.generateSample(val - this.oldValue, this.metricName);
}
this.oldValue = val;
}
else
{
collector.generateSample(val, this.metricName);
}
……
}