ようへいの日々精進XP

よかろうもん

sensu + JMX + jolokia で Cassandra のヒープ使用量を監視する(1)

はじめに

  • 引き続き Amazon Linux で sensu-server を...シリーズ
  • Cassandra が稼働しているノードのプロセス監視やヒープ使用量を sensu-client でやってみたい
  • ヒープ使用量は JMX から jolokia を介して値を取る簡単なシェルスクリプトを作って監視してみる

プロセス監視

プロセスの監視はドキュメントにも登場している check-procs.rb を利用する。

check-procs.rb -h

check-procs.rb のヘルプ。

Usage: ./check-procs.rb (options)
    -p, --pattern PATTERN            Match a command against this pattern
    -c, --critical-over N            Trigger a critical if over a number
    -C, --critical-under N           Trigger a critial if under a number
    -e, --esec-over SECONDS          Match processes that older that this, in SECONDS
    -E, --esec-under SECONDS         Match process that are younger than this, in SECONDS
    -f, --file-pid PID               Check against a specific PID
    -M, --match-parent               Match parent process it uses ruby {process.ppid}
    -m, --match-self                 Match itself
    -t, --metric METRIC              Trigger a critical if there are METRIC procs
    -P, --proportional-set-size PCPU Trigger on a Proportional Set Size is bigger than this
    -r, --resident-set-size RSS      Trigger on a Resident Set size is bigger than this
    -s, --state STATE                Trigger on a specific state, example: Z for zombie
    -u, --user USER                  Trigger on a specific user
    -z, --virtual-memory-size VSZ    Trigger on a Virtual Memory size is bigger than this
    -w, --warn-over N                Trigger a warning if over a number
    -W, --warn-under N               Trigger a warning if under a number

基本的な使い方としては...

/etc/sensu/plugins/check-procs.rb -p cassandra -C 1

以下のように出力される。

CheckProcs OK: Found 1 matching processes; cmd /cassandra/

Cassandra のプロセスが落ちた場合には以下のように critical となる。

f:id:inokara:20140309112051p:plain


Heap 使用量監視

プロセスの死活の次は Heap 使用量の監視は JMXjolokia を介して値を取得する。

jolokia の設定

こちらの手順で Cassandra と jolokia を連携させる。とっても簡単。

Heap 使用量を取得する

以下のようなリクエストを curl で投げる。

curl -s http://127.0.0.1:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage/ | jq .

以下のような結果が得られる。

{
  "value": {
    "used": 51262496,
    "init": 311427072,
    "committed": 303693824,
    "max": 304742400
  },
  "request": {
    "type": "read",
    "attribute": "HeapMemoryUsage",
    "mbean": "java.lang:type=Memory"
  },
  "status": 200,
  "timestamp": 1394376385
}

jq でもう少し絞り込むことで used の値のみを取得することが出来る。また、Cassandra の nodetool を利用することでヒープの使用量も取得することが出来る。

/usr/local/cassandra/bin/nodetool -h 127.0.0.1 info

以下のように出力される。

Token            : 7066488264533032227
ID               : 329c345b-8aa5-4f57-b1f4-e23a423e202c
Gossip active    : true
Thrift active    : true
Native Transport active: true
Load             : 82.77 KB
Generation No    : 1394376362
Uptime (seconds) : 1449
Heap Memory (MB) : 39.04 / 290.63
Data Center      : datacenter1
Rack             : rack1
Exceptions       : 0
Key Cache        : size 504 (bytes), capacity 14680064 (bytes), 25 hits, 28 requests, 0.893 recent hit rate, 14400 save period in seconds
Row Cache        : size 0 (bytes), capacity 0 (bytes), 0 hits, 0 requests, NaN recent hit rate, 0 save period in seconds

簡単なシェルスクリプト

ということで以下のようなシェルスクリプトを仕込む。

#!/bin/bash

CS_HOST=127.0.0.1
HEAP_THRESHHOLD=58766040
HEAP_WARN_THRESHHOLD=60000000
HEAP_CRIT_THRESHHOLD=100000000
HEAP_USED=`curl -s http://127.0.0.1:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage/ | jq '.value.used'`

if [ ${HEAP_USED} -gt ${HEAP_CRIT_THRESHHOLD} ];then
  echo "Critical Heap used ${HEAP_USED} (${HEAP_USED} >= ${HEAP_CRIT_THRESHHOLD})"
  exit 2
elif [ ${HEAP_USED} -gt ${HEAP_WARN_THRESHHOLD} ];then
  echo "Warning Heap used ${HEAP_USED} (${HEAP_USED} >= ${HEAP_WARN_THRESHHOLD})"
  exit 1
else
  echo "Normally Heap used ${HEAP_USED}"
  exit 0
fi

HEAP_WARN_THRESHHOLDHEAP_CRIT_THRESHHOLD はとりあえずテスト用の値。シェルスクリプト/etc/sensu/plugins/check-cassandra-heap-used.sh という名前で保存して /etc/sensu/conf.d/check_cassandra_heap_used.json を以下のように作成する。(ファイル名自体は任意で...)

{
  "checks": {
    "cassandrai_heap_used_check": {
      "handlers": ["default"],
      "command": "/etc/sensu/plugins/check-cassandra-heap-used.sh",
      "interval": 60,
      "standalone": true
    }
  }
}

上記の設定を行った後で sensu-client を再起動する。

監視なう

暫くすると以下のように Warning が上がる。

f:id:inokara:20140310000307p:plain

おお、後はしきい値をちゃんと設定すれば最低限の監視は出来そう。また、値の推移をグラフに出来ればちゃんとした監視らしくなるかな。


引き続き

  • handler を設定してアラートメールを飛ばせるようにする
  • 同じく handler で Heap 使用量をグラフ化したい