イントロダクションと概要
Cordaは 、Corda Nodeが実行しているシステムやNode自身の状況を監視するために、リアルタイムでJMXメトリクスを監視する機能を提供しています。これはNode operatorに継続的にNodeの状態をチェックし、よく起きているエラーが発生していないか、アクションが必要かどうかを判断するのに役立ちます。
Nodeの監視をするのに、最も簡単な方法はNodeからJMXメトリクスを拾い、外部のビジュアルモニターシステムで表示することです。この例ではJolokia, TelegrafはCorda Nodeと同じサーバー上に、InfluxDBとGrafanaはCorda Nodeとは別のサーバー上に配置して実行します。(2つのDockerコンテナで隔離されています。)
Corda Node内でJolokiaを有効にする
Corda Nodeからメトリクスを取得するためにJolokiaを有効にします。Node上で以下のコマンドを実行します。JolokiaがCorda Nodeからのメトリクスの取得を開始できるように下記を使ってNodeを起動します。
~/home$ java -Dcapsule.jvm.args="-javaagent:jolokia-jvm-1.6.1-agent.jar=port=7777,host=localhost" -jar corda.jar
Jolokiaのテスト
Jolokia が正しく動作しているか、Jolokia がCorda JXM のメトリクスを公開しているかどうかをテストします。この例では、次のFlow メトリクスをテストします。net.corda:type=Flows,name=Success
:成功したFlowの総数
参考:Corda Nodeで入手可能なJMXメトリクスの詳細については Corda documentationをご参考ください。
以下のコマンドラインを実行してJolokia APIを呼び出してください。
curl http://localhost:7777/jolokia/read/net.corda:type=Flows,name=Success | jq
うまくいくと次のJSONファイルが返ってきます。
ubuntu@corda-node-server:~/node$ curl http://localhost:7777/jolokia/read/net.corda:type=Flows,name=Success | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 127 0 127 0 0 124k 0 --:--:-- --:--:-- --:--:-- 124k
{
"request": {
"mbean": "net.corda:name=Success,type=Flows",
"type": "read"
},
"value": {
"Count": 2
},
"timestamp": 1602642396,
"status": 200
}
(jq
は筆者がインストールした便利なJSONプロセッサーのコマンドです。人間に読み取り可能な形式でJSONファイルに出力します。Ubuntu上では次のコマンドでインストールできます。sudo
apt install jq
)
上記コードブロック内の"Count"のvalueはCorda NodeのFlowが実行されると増加します。(例えば、Nodeシェルから以下のコマンドを打つと”Count”のvalueが1増えます。)
flow start com.r3.corda.lib.accounts.workflows.flows.CreateAccount name: JolokiaTestAccount
"value": {
"Count": 3
},
Telegrafをインストールし理解する
Telegrafはメトリクスをあつめ、外部のサービスに利用させることできるオープンソースServer Agentです。例では、Corda NodeはAWS EC2インスタンス上で実行し、OSはUbuntuを使用します。TelegrafをUbuntu上にインストールする方法はこちらのリンクをご参照ください。TelegrafとInfluxDBを以下に従ってつなげます。
Telegrafのインストールが完了したら、jolokia2_agentとよばれるJMXメトリクスのためのプラグインをインストールします。プラグインをインストールするためにtelegraf.conf
内に以下のコードを加えます。
# This is the address of the local Jolokia agent
[[inputs.jolokia2_agent]]
urls = ["http://localhost:7777/jolokia"]
# These are the JMX metrics that we want to monitor
[[inputs.jolokia2_agent.metric]]
name = "jvm_runtime"
mbean = "java.lang:type=Runtime"
paths = ["Uptime"]
[[inputs.jolokia2_agent.metric]]
name = "ActiveThreads"
mbean = "net.corda:type=Flows,name=ActiveThreads"
paths = ["Value"]
[[inputs.jolokia2_agent.metric]]
name = "SuccessFlows"
mbean = "net.corda:type=Flows,name=Success"
paths = ["Count"]
上記の構成でこちらのCorda documentationに示されているすべてのCorda JMXメトリクスの確認が可能となります。
注:新しいメトリクスがTelegrafに追加されたので、OS内でTelegrafサービスを再起動する必要があります。Ubuntuでは次のコマンドで再起動可能です。
sudo systemctl restart telegraf
Dockerを使用したInfluxDBとGrafanaのインストール
InfluxDBとGrafanaはAWSの隔離されたEC2インスタンス上のDocker image(Docker composeを使用)を利用してインストールすることができます。InfluxDBがTelegrafからメトリクスを受け取り、GrafanaでWebインターフェースにメトリクスを映します。
Docker Volumesでデータを永続化
Dockerコンテナを止めたときにデータを失わないようInfluxDBとGrafana用の2つのDocker Volumeを作ります。
docker volume create influxdb-volume
docker volume create grafana-volume
Docker Composeを使ってInfluxDBとGrafanaをインストールする
以下のdocker-compose.ymlファイルを使ってDocker imageを自動的にpullし、コンテナ間のネットワークを設定し、内外部と接続を行うためにポートを公開します。
GrafanaとInfluxDBをインストールするDockerイメージは、DockerHubから入手できます。こちらのGarafanaとInfluxDBをご参照ください。
version: "3"
services:
grafana:
image: grafana/grafana
container_name: grafana_container
restart: always
ports:
- 3000:3000
networks:
- monitoring_network
volumes:
- grafana-volume:/var/lib/grafana
influxdb:
image: influxdb
container_name: influxdb_container
restart: always
ports:
- 8086:8086
networks:
- monitoring_network
volumes:
- influxdb-volume:/var/lib/influxdb
networks:
monitoring_network:
volumes:
grafana-volume:
external: true
influxdb-volume:
external: true
InfluxDBとGrafanaをインストールするために以下のコードを実行します。
docker-compose up -d
インストールが成功すると、コンテナが稼働し、適切なポートが開いていることを確認できます。
ubuntu@monitoring-server:~/monitor$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc39e9648242 grafana/grafana "/run.sh" 13 seconds ago Up 10 seconds 0.0.0.0:3000->3000/tcp grafana_containe
5b86e48f25a4 influxdb "/entrypoint.sh infl…" 13 seconds ago Up 9 seconds 0.0.0.0:8086->8086/tcp influxdb_contain
TelegrafをInfluxDBに接続する
TelegrafをInfluxDBに接続するために、Corda Nodeサーバー内にあるtelegraf.conf
の変更が必要になります。具体的にはInfluxDBサーバーのIPアドレスを挿入する必要があります。(例参照)
デフォルトではInfluxDBの設定するためのコードはすでにファイル内にありますが、コメントアウトされています。以下のようにコメントアウトを外し、IPアドレスを埋めましょう。
TelegraphをInfluxDBに初めて接続するとき、カスタムデータベースを自動的に作成します。このケースでは"telegraf"という名前でデータベースが作成されます。configファイルを変更した後、telegraf serviceをsudo systemctl restart telegraf
で再起動する必要があります。
###############################################################################
# OUTPUT PLUGINS #
##############################################################################
# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
## The full HTTP or UDP URL for your InfluxDB instance.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
# urls = ["unix:///var/run/influxdb.sock"]
# urls = ["udp://127.0.0.1:8089"]
urls = ["http://IP-ADDRESS-INFLUXDB-SERVER:8086"]
## The target database for metrics; will be created as needed.
## For UDP url endpoint database needs to be configured on server side.
database = "telegraf"
Telegrafサービスを再起動したら、sudo systemctl status telegraf
を使ってInfluxDBとつながっているかをチェックしてください。以下のメッセージが出ると思います。
ubuntu@corda-node-server:~/node$ sudo systemctl status telegraf
● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB
Loaded: loaded (/lib/systemd/system/telegraf.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-10-14 04:38:08 UTC; 18min ago
Docs: https://github.com/influxdata/telegraf
Main PID: 1466 (telegraf)
Tasks: 15 (limit: 4915)
CGroup: /system.slice/telegraf.service
└─1466 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
Oct 14 04:56:09 ip-10-0-1-9 telegraf[1466]: 2020-10-14T04:56:09Z D! [outputs.influxdb] Wrote batch of 36 metrics in 3.846805ms
Oct 14 04:56:09 ip-10-0-1-9 telegraf[1466]: 2020-10-14T04:56:09Z D! [outputs.influxdb] Buffer fullness: 0 / 10000 metrics
InfluxDB内に"telegraf"データベースが作られているかでチェックできます。次のコードを使うと、
curl -G http://IP-ADDRESS-INFLUXDB-SERVER:8086/query --data-urlencode "q=SHOW DATABASES"
JSON形式での応答で"telegraf"データベースがあることを見られます。("_internal"データベースはInfluxDB作成時にデフォルトで作成されます。
ubuntu@corda-node-server:~/node$ curl -G http://IP-ADDRESS-INFLUXDB-SERVER:8086/query --data-urlencode "q=SHOW DATABASES" | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 122 0 122 0 0 119k 0 --:--:-- --:--:-- --:--:-- 119k
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "databases",
"columns": [
"name"
],
"values": [
[
"_internal"
],
[
"telegraf"
]
]
}
]
}
]
}
Grafanaを構成する
TelegrafとInfluxDBがつながったら、InfluxDBからデータを取得してモニターシステムに表示するためにGrafanaを構成します。
ブラウザーから次のアドレスにアクセスしてください。
(usernameとPasswordはDockerイメージのuserとPasswordを使います。デフォルト値は admin/adminを使用します。)
http://IP-ADDRESS-GRAFANA:3000
ConfigurationからData Source(InfluxDB)を追加します。
InfluxDBサーバーのIPアドレスをセットして、データベースの名前を"telegraf"にセットします。
参考)GrafanaとInfluxDBはDocker Compose内で稼働しているため、dokcer-compose.ymlで記載したコンテナの名前か、EC2のプライベートIPアドレスを使うことができます。
Grafanaのダッシュボードを作成する
以上の設定が完了したら、Corda NodeからTelegrafを通し送るJMXメトリクスを使ったダッシュボードを作ることができます。例を掲載します。
上の例は以下のメトリクスを表しています。
- 3つのシステムメトリクス(Java Heap使用量、Java classの数、CPU使用率)
- 3つのCordaメトリクス
net.corda:type=Flows,name=Finished
net.corda:type=Flows,name=Checkpointing Rate
net.corda:type=Flows,name=Success