【Cassandra 】 jmxtermによるメトリクス情報収集

## 0. jmxtermとは？

jmxtermはコマンドラインによるJMXクライアント
Cyclops公式の説明はこちら → https://docs.cyclopsgroup.org/jmxterm

## 1. Cassandraメトリクス取得の例

### ① jmxtermを起動してCassandraに接続

ローカルノードのCassandraに接続

```
# java -jar jmxterm-1.0.0-uber.jar 
Welcome to JMX terminal. Type "help" for available commands.
$>open localhost:7199
#Connection to localhost:7199 is opened
$>
```

### ② ドメイン一覧を出力

domainsサブコマンド実行

```
$>domains
#following domains are available
JMImplementation
ch.qos.logback.classic
com.datastax.bdp
com.sun.management
java.lang
java.nio
java.util.logging
org.apache.cassandra.auth
org.apache.cassandra.db
org.apache.cassandra.internal
org.apache.cassandra.metrics
org.apache.cassandra.net
org.apache.cassandra.request
org.apache.cassandra.service
org.apache.cassandra.transport
$>
```

### ③ ドメイン指定

org.apache.cassandra.metricsを指定

```
$>
$>domain org.apache.cassandra.metrics
#domain is set to org.apache.cassandra.metrics
$>
```

### ④ Mbean一覧出力

beansサブコマンドを実行すると一覧出力する。
一覧はCassandraのバージョンや構成によって異なる。( IPアドレスとか、作成済みのキースペースとかテーブルとかにも依存するので )

```
$>beans
#domain = org.apache.cassandra.metrics:
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesHeapSize,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesLiveDataSize,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesLiveDataSize,type=Keyspace
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesOffHeapDataSize,type=Keyspace
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesOffHeapSize,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=AllMemtablesOnHeapDataSize,type=Keyspace
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterDiskSpaceUsed,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterDiskSpaceUsed,type=Keyspace
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterFalsePositives,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterFalseRatio,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterOffHeapMemoryUsed,scope=node_slow_log,type=ColumnFamily
org.apache.cassandra.metrics:keyspace=dse_perf,name=BloomFilterOffHeapMemoryUsed,type=Keyspace

　　:
　(途中略)
  　:

$>
```

### ⑤ 値を調べたいMbeanを指定

以降の操作でのMbeanはここで指定したMbeanがデフォルト

```
$>bean org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace
#bean is set to org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace
```

### ⑥ メトリクスのattributeを確認

infoサブコマンドを実行するとattributeを一覧出力する。

```
$>info
#mbean = org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace
#class name = com.yammer.metrics.reporting.JmxReporter$Timer
# attributes
  %0   - 50thPercentile (double, r)
  %1   - 75thPercentile (double, r)
  %2   - 95thPercentile (double, r)
  %3   - 98thPercentile (double, r)
  %4   - 999thPercentile (double, r)
  %5   - 99thPercentile (double, r)
  %6   - Count (long, r)
  %7   - EventType (java.lang.String, r)
  %8   - FifteenMinuteRate (double, r)
  %9   - FiveMinuteRate (double, r)
  %10  - LatencyUnit (java.util.concurrent.TimeUnit, r)
  %11  - Max (double, r)
  %12  - Mean (double, r)
  %13  - MeanRate (double, r)
  %14  - Min (double, r)
  %15  - OneMinuteRate (double, r)
  %16  - RateUnit (java.util.concurrent.TimeUnit, r)
  %17  - StdDev (double, r)
# operations
  %0   - javax.management.ObjectName objectName()
  %1   - [D values()
#there's no notifications
$>
```

### ⑦ attributenの値取得

getサブコマンドで値を取得
attribute指定するとき、大文字小文字を区別するので要注意
また*で全attributeを取得できる。

```
$>get Count
#mbean = org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace:
Count = 45;

$>get *
#mbean = org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace:
LatencyUnit = MICROSECONDS;

FiveMinuteRate = 0.010651458468396234;

FifteenMinuteRate = 0.5320173149110301;

RateUnit = SECONDS;

EventType = calls;

MeanRate = 0.02299186601577956;

OneMinuteRate = 0.00279618294442399;

Max = 76222.1;

Count = 45;

Min = 54.433;

75thPercentile = 5601.126;

50thPercentile = 1628.462;

Mean = 5429.523244444445;

StdDev = 12147.787634864962;

95thPercentile = 23945.75149999996;

98thPercentile = 76222.1;

99thPercentile = 76222.1;

999thPercentile = 76222.1;

```

### ⑧ 終了

```
$>bye
#bye
# 
```

## 3. nodetool sjk

標準のnodetoolコマンドでも同様の取得は可能
( ただしCassandraのバージョンによるかも )

```
# nodetool sjk mx -b org.apache.cassandra.metrics:keyspace=system,name=ReadLatency,type=Keyspace -f Count -mg
org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ReadLatency
48
# 
```

## 4. 感想

・メトリクス一覧とかを取得するのに便利
・監視での値取得だけを考えた場合で、1分おきとかで連続して値を取得しようとすると、いちいちJavaで起動することになるので、不可能ではないけど、あまりスマートでない。( 連続でCSV出力するようなツールを使う方がいいかも )
・Cassandraの場合( というか他でも同様だろうけど )、バージョンアップすると取得できるメトリクスが変わってくる( 名前が変わったり廃止されたり )ので、要注意