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インスタンス上の総チケット数のグラフが出力されます。

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のリソース使用状況について画面で取得できるよりも詳細な状態を取得し、可視化することができます。大規模インスタンスを運用されている方向けの機能と言えます。