GrafanaでJavaヒープ使用率のパネルを作る

jmxtransというツールでJavaのメトリックを取得して、Grafanaでパネル表示させてみました。

構成はこんな感じ
f:id:hmen:20200924184503p:plain

1. jmxtransインストール

rpmでインストールしました。
パッケージのダウンロードやインストール方法はこちらで。
https://github.com/jmxtrans/jmxtrans/wiki/Installation

2. jsonファイルを準備

apserver01への接続方法と、メトリックの格納方法をファイルに書きます。

{
  "servers" : [ {
    "port" : "39999",                            # JMXポート
    "host" : "apserver01",                       # APサーバのホスト名
    "queries" : [ {
      # Java Heap
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/",         # 格納先influxdbのURL
        "username" : "admin",                        # influxdbのユーザ名
        "password" : "admin",                        # influxdbのパスワード
        "database" : "influxdb",                     # 格納先DB名
        "tags"     : {"application" : "ap01"}        # メトリックのタグ
      } ],
      "obj" : "java.lang:type=Memory",                      # オブジェクトタイプ
      "resultAlias":"jvmMemory",                            # Alias
      "attr" : [ "HeapMemoryUsage", "NonHeapMemoryUsage" ]  # 属性
    },{
  } ]
}


オブジェクトタイプや属性は、事前にjconsole等で確認しておくといい。

f:id:hmen:20200924184322p:plain

オブジェクトタイプ、属性が複数ある場合、(例えばJavaHeap以外にもThreadPoolやold、new領域等を取得したい場合)は、
以下のようにオブジェクト毎に並べて記述する。
※まとめて記述する方法があるかもしれません。。。

{
  "servers" : [ {
    "port" : "39999",
    "host" : "apserver01",
    "queries" : [ {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=Memory",
      "resultAlias":"jvmMemory",
      "attr" : [ "HeapMemoryUsage", "NonHeapMemoryUsage" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=GarbageCollector,name=*",
      "resultAlias": "jvmMemory",
      "attr" : [ "CollectionCount", "CollectionTime" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:name=CMS Old Gen,type=MemoryPool",
      "resultAlias": "cmsoldgen",
      "attr" : [ "Usage" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=MemoryPool,name=Par Eden Space",
      "resultAlias": "edengen",
      "attr" : [ "Usage" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=MemoryPool,name=Par Survivor Space",
      "resultAlias": "survivorgen",
      "attr" : [ "Usage" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=MemoryPool,name=CMS Perm Gen",
      "resultAlias": "cmspermgen",
      "attr" : [ "Usage" ]
    },{
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://192.168.10.1:8086/", 
        "username" : "admin",
        "password" : "admin",
        "database" : "influxdb",
        "tags"     : {"application" : "ap01"}
      } ],
      "obj" : "java.lang:type=Threading",
      "resultAlias": "jvmMemory",
      "attr" : [ "DaemonThreadCount", "PeakThreadCount", "ThreadCount", "TotalStartedThreadCount" ]
    } ]
  } ]
}


作成したファイルはファイル名を<適用な名前>.jsonとして、以下に配置する。
/var/lib/jmxtrans/

(3) jmxtransを起動

# /etc/init.d/jmxtrans start
Starting JmxTrans...

起動失敗したらconfigが間違ってると思います。

(4) Grafanaパネル作成

パネルのQuery設定で、SQLを書きます。

事前に以下のようにVariablesを設定しておきます。
f:id:hmen:20200924185247p:plain

以下は参考のSQLです。これはJavaヒープサイズのMAX値(-Xmx)を取得するものです。
SELECT mean("HeapMemoryUsage_max") FROM "autogen"."jvmMemory" WHERE ("hostname" =~/^$host$/ AND "application" =~ /^$host$ AND "application" =~ /^$app$/) AND $timeFilter GROUP BY time($inter_val) fill(none)

SQLをパネルのQuery設定に記述
f:id:hmen:20200924185455p:plain

Javaヒープ使用率のパネルができました。

f:id:hmen:20200924193222p:plain

同じようにJavaヒープ以外もパネルにして、並べて表示。
f:id:hmen:20200924185524p:plain