CE4.5 Additional Monitoring Metricsと一般的な実装シナリオ

 

アーキテクチャ

Corda は JMX リアルタイムメトリクスを提供しており、これを使って Corda ノード自身やノードが稼働しているシステムの状態を監視することができます。これにより、ノードオペレータは常にノードのステータスをチェックし、一定のシナリオに到達した場合、アクションを取る必要があるかどうかを判断することができます。

Cordaノードのモニタリングを追加する最も簡単な方法は、ノードからのJMXメトリクスをキャッチして、外部のビジュアルモニタリングシステムにリダイレクトすることです。
この例では、jolikia、Telegrafを監視したいCordaノードと同じサーバー上で使用し、InfluxDBとGrafanaは2つの別々のDockerコンテナとして別サーバー上で実行します。

Untitled__1_.png

 

Cordaノードでのjolikiaの有効化

jolokiaがCordaからメトリックスを取得するために、ノードは下記のコマンドで起動します。

~/home$ java -Dcapsule.jvm.args="-javaagent:jolokia-jvm-1.6.1-agent.jar=port=7777,host=localhost" -jar corda.jar

 

jolikiaのテスト

jolokiaが正しく実行されており、Corda JXM メトリクスを公開していることを確認できます。この例では、下記のの Flow メトリクスをテストしています。

net.corda:type=Flows,name=Success

: 成功したフローの総数

Cordaノードで利用可能なJXMメトリクスをすべて知るには、Cordaのドキュメントにあるリストをチェックしてください。

コマンドラインから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 値が増加していることは、Cordaノードでフローを実行するだけで確認できます。

例えば、ノードシェルから次のように実行します。

flow start com.r3.corda.lib.accounts.workflows.flows.CreateAccount name: JolokiaTestAccount 

そうすると値が1増加していることがわかります。

 "value": {
"Count": 3
},

 

Telegrafのインストールと設定

Telegrafはオープンソースのサーバーエージェントで、メトリクスを収集して外部サービスで利用できるようにすることができます。この例では、Cordaノードは、OSとしてUbuntuを搭載したAWS EC2インスタンス上で動作しています。UbuntuにTelegrafをインストールする手順は、Telegrafの公式ドキュメント、こちらに記載されています。

 

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 のドキュメントに記載されているすべての Corda JMX メトリクスを設定することができます。

Telegrafに新しいメトリクスが挿入された場合には、OSのTelegrafサービスを再起動する必要があります。例えば、Ubuntuの場合、次のように実行します。

sudo systemctl restart telegraf

 

Dockerを使用したInfluxDBとGrafanaのインストール

InfluxDBとGrafanaは、(Docker Composeを使用して)Dockerイメージとして、AWSの別のEC2インスタンスにインストールされます。InfluxDBはTelegrafからメトリクスを受け取り、Grafanaはそのメトリクスを見やすいWebインターフェイスに表示します。

 

Docker Volumesによる永続的なデータ

InfluxDBとGrafanaのデータは、Dockerコンテナが停止しても失われないように、永続的なものにする必要があります。これを実現するために、2つのDockerボリュームを作成しましょう。

docker volume create influxdb-volume
docker volume create grafana-volume

 

Docker Composeによるサービスのインストール

ここで、以下のdocker-compose.ymlファイルを使用すると、自動的にDockerイメージを引き出し、コンテナ間のネットワークを設定し、インバウンドおよびアウトバウンドの接続用に適切なポートを公開します。

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

サービスをインストールするには、下記を実行します。

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ノードサーバにあるtelegraf.conf(以下記載)を更新しInfluxDBサーバのIPアドレスを挿入する必要があります。

デフォルトで、InfluxDBの設定がすでに含まれていますが、コメントアウトされています。そのため、以下のようにコメントアウトを解除して、IPアドレスを入力する必要があります。

Telegrafが初めてInfluxDBに接続すると、自動的にカスタムデータベースの作成が開始されます。この例では、"telegraf "という名前のデータベースを作成します。設定ファイルが更新されたら、サービスを再起動します。

sudo systemctl restart telegrafで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

また、"telegraf "データベースがInfluxDB内に作成されていることを、curlを使って確認することができます。

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が接続されたので、GrafanaがInfluxDBからデータを取得するように設定してみましょう。ブラウザから下記ににアクセスします。

http://IP-ADDRESS-GRAFANA:3000 

ユーザー名とパスワードは、dockerイメージが提供するデフォルトのものです:admin/admin

Untitled__6_.png

そして、ConfigurationでData Source (InfluxDB)を追加します。

Untitled__2_.png

InfluxDBサーバのIPアドレスとデータベースの名前"telegraf"を設定します。

GrafanaとInfluxDBはDocker Composeで動作しているため、docker-compose.ymlで宣言されているコンテナ名を使用するか、EC2インスタンスのプライベートIPアドレスを使用してください。

Untitled__3_.png

Untitled__4_.png

 

Grafanaダッシュボードの作成

以上の設定が完了したら、以下の例のように、CordaノードがTelegraf経由で送信しているJXMメトリクスを使って、見やすいダッシュボードを作成することができます。

Untitled__5_.png

 

ここでは、以下のCordaのメトリクスを表示しています。

●3つのシステムメトリクス

・Java Heap used,

・Java class count

・CPU used

 

●3つのCordaメトリクス

net.corda:type=Flows,name=Finished
net.corda:type=Flows,name=Checkpointing Rate
net.corda:type=Flows,name=Success

 

Created by: Alessandro

Editor: Yoshino

Last edit: 2021/7/19

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています