Corda Enterprise4.5 で追加されたメトリクス監視とその使い方

イントロダクションと概要

Cordaは 、Corda Nodeが実行しているシステムやNode自身の状況を監視するために、リアルタイムでJMXメトリクスを監視する機能を提供しています。これはNode operatorに継続的にNodeの状態をチェックし、よく起きているエラーが発生していないか、アクションが必要かどうかを判断するのに役立ちます。

Nodeの監視をするのに、最も簡単な方法はNodeからJMXメトリクスを拾い、外部のビジュアルモニターシステムで表示することです。この例ではJolokia, TelegrafはCorda Nodeと同じサーバー上に、InfluxDBとGrafanaはCorda Nodeとは別のサーバー上に配置して実行します。(2つのDockerコンテナで隔離されています。)

1.png

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から入手できます。こちらのGarafanaInfluxDBをご参照ください。

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

2.png

ConfigurationからData Source(InfluxDB)を追加します。

3.png

InfluxDBサーバーのIPアドレスをセットして、データベースの名前を"telegraf"にセットします。

参考)GrafanaとInfluxDBはDocker Compose内で稼働しているため、dokcer-compose.ymlで記載したコンテナの名前か、EC2のプライベートIPアドレスを使うことができます。

4.png5.png

Grafanaのダッシュボードを作成する

以上の設定が完了したら、Corda NodeからTelegrafを通し送るJMXメトリクスを使ったダッシュボードを作ることができます。例を掲載します。

6.png

上の例は以下のメトリクスを表しています。

  • 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
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています