1. 程式人生 > >JMeter外掛-----JMXMon外掛監控JVM

JMeter外掛-----JMXMon外掛監控JVM

準備

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,按下面嚮導操作
jmeter
注意:我這裡之前裝好了,所以在installed中,正常未安裝應該在availiable plugins中,勾選,安裝,會自動重啟

使用

1、建立測試計劃
2、新增監視器
新增監視器

JMX Sampler介紹

  1. Label:填寫監控圖表裡的曲線名稱。
  2. 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欄位中使用。
  3. Object Name:填寫監控的具體物件名稱。
  4. Attribute:填寫監控的具體屬性。
  5. Key:如果是複雜型別的屬性,還需要填寫Key。
  6. Delta:表示差異,在此理解為增量(見最後程式碼)。
  7. retry:勾選時,在測試期間嘗試新的連線,丟失的連線可以恢復。

獲取屬性和objectName

通過jconsole或者jvisualVM獲取
以jvisualVM為例
attr

demo執行示意
resutl

比如再新增一個
newattr
result

delta屬性示例

表示增量
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);
    }
    ……
}