JMXによるアトラシアン製品(Jira)の監視
このエントリーは、Atlassian(Jira , Confluence, Trello, Bitbucket)のTips紹介 Advent Calendar 2019の24日目エントリーです。
Jira SoftwareおよびJira Core(以下Jira)では、JMX(Java Management Extensions )のインターフェースを使用して、課題数やユーザー数などをリアルタイミングでモニタリングすることができます。
Jiraでは設定メニューの「管理」→「システム」→「JMXモニタリング」の項目から、JMXのモニタリングを有効にすることが出来ます。
アトラシアン社のドキュメント「JMX インターフェイスを使用したライブ モニタリング」 に従い接続の設定をすることで、JConsole等のツールから、課題の数、データベースへの接続数などのパフォーマンスに関する指標を取得することができます。
ここでは、JMXをhttp経由で値の取得・操作を行うツールであるJolokiaを使い、取得した値を監視ツールであるMackerelに投稿してグラフ化することを考えます。
まず、Jolokiaのダウンロードサイトから、JVM-Agentをダウンロードし、サーバー上に配置します。
続いて、Jiraの起動オプションに、以下の内容を追加し、Jiraのサーバープロセスを再起動します。
セキュリティー確保のため、公開するリモートホストおよび、ユーザー名とパスワードを設定します。
-javaagent:/usr/local/lib/jolokia-jvm-1.6.2-agent.jar=port=7778,host=localhost,user=(接続するためのユーザー名),password=(接続するためのパスワード)
curlコマンドを使用して、Jiraに関するメトリックが取得できることが可能です。
curl -u (設定したユーザー名):(設定したパスワード) -v http://localhost:7778/jolokia/list/com.atlassian.jira |jq .
また、JMXの機能をJira側で有効にしたことにより、JavaVMやTomcatに関するメトリックも取得可能になっています。
以下のCurlコマンドを実行すると、Jiraを実行しているTomcatのスレッドプールに関する情報を取得することが可能です。
curl -u (設定したユーザー名):(設定したパスワード) http://localhost:7778/jolokia/read/Catalina:type=ThreadPool,name=%22http-nio-8080%22 |jq "."
続いて、取得した値をグラフ化することを考えます。サービス監視ツールMackerelのコマンドラインツールmkrを使用し、Jolokiaから取得した値をMackerelのサービスメトリックとして投稿するスクリプトは以下の通りです。
#!/bin/bash
curl -u (設定したユーザー名):(設定したパスワード) http://localhost:7778/jolokia/read/com.atlassian.jira:type=entity.issues.total |jq ".value.Value" |echo "demo.jira.entiry.issues.total $(cat) $(date +%s)" |/usr/local/bin/mkr throw --service demo-graat-jp
このスクリプトをcronに設定すると、Jiraインスタンス上の総チケット数のグラフが出力されます。
次に、ホスト上のパフォーマンスに関する指標を取得することを考えます。
スレッドプール上での接続数と、ビジー状態のスレッドをMackerelのホストメトリックとして出力するスクリプトは次の通りです。
#!/bin/bash
set -eux
OUT=$(curl -u (設定したユーザー名):(設定したパスワード) http://localhost:7778/jolokia/read/Catalina:type=ThreadPool,name=%22http-nio-8080%22)
connectionCount=$(echo $OUT |jq ".value.connectionCount")
currentThreadsBusy=$(echo $OUT | jq ".value.currentThreadsBusy")
NOW=$(date +%s)
echo -e "jira.connectionCount ${connectionCount} ${NOW}\njira.currentThreadsBusy ${currentThreadsBusy} ${NOW}"
このスクリプトを、Mackerelの設定ファイルであるmackerel-agent.conf
に設定します。
[plugin.metrics.connection]
command = "/usr/local/bin/throw-host-metric"
Mackerelのエージェントを再起動すると、スレッドプールの状態についてのグラフが得られます。
JiraのJMXを使ったメトリック取得について紹介しました。JMXを使用するとJavaVMの状態も含めて、Jiraのリソース使用状況について画面で取得できるよりも詳細な状態を取得し、可視化することができます。大規模インスタンスを運用されている方向けの機能と言えます。