Cordaノードのモニタリングツールの構築方法が理解できる。
- アーキテクチャ
- Cordaノードでのjolikiaの有効化
- jolikiaのテスト
- Telegrafのインストールと設定
- Dockerを使用したInfluxDBとGrafanaのインストール
- Docker Volumesによる永続的なデータ
- Docker Composeによるサービスのインストール
- TelegrafとInfluxDBの接続
- Grafanaの設定
- Grafanaダッシュボードの作成
アーキテクチャ
Corda は JMX リアルタイムメトリクスを提供しており、これを使って Corda ノード自身やノードが稼働しているシステムの状態を監視することができます。これにより、ノードオペレータは常にノードのステータスをチェックし、一定のシナリオに到達した場合、アクションを取る必要があるかどうかを判断することができます。
Cordaノードのモニタリングを追加する最も簡単な方法は、ノードからのJMXメトリクスをキャッチして、外部のビジュアルモニタリングシステムにリダイレクトすることです。
この例では、jolikia、Telegrafを監視したいCordaノードと同じサーバー上で使用し、InfluxDBとGrafanaは2つの別々のDockerコンテナとして別サーバー上で実行します。
Cordaノードでのjolikiaの有効化
jolokiaがCordaからメトリックスを取得するために、ノードは下記のコマンドで起動します。
~/home$ java -Dcapsule.jvm.args="-javaagent:jolokia-jvm-1.6.1-agent.jar=port=7777,host=localhost" -jar corda.jarjolikiaのテスト
jolokiaが正しく実行されており、Corda JXM メトリクスを公開していることを確認できます。この例では、下記のの Flow メトリクスをテストしています。
net.corda:type=Flows,name=Success: 成功したフローの総数
Cordaノードで利用可能なJXMメトリクスをすべて知るには、Cordaのドキュメントにあるリストをチェックしてください。
コマンドラインからjolokiaのAPIを呼び出します。
curlhttp://localhost:7777/jolokia/read/net.corda:type=Flows,name=Success | jqJSON形式の結果が表示されます。
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 telegrafDockerを使用した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-volumeDocker 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_containTelegrafと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 -Ghttp://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
そして、ConfigurationでData Source (InfluxDB)を追加します。
InfluxDBサーバのIPアドレスとデータベースの名前"telegraf"を設定します。
GrafanaとInfluxDBはDocker Composeで動作しているため、docker-compose.ymlで宣言されているコンテナ名を使用するか、EC2インスタンスのプライベートIPアドレスを使用してください。
Grafanaダッシュボードの作成
以上の設定が完了したら、以下の例のように、CordaノードがTelegraf経由で送信しているJXMメトリクスを使って、見やすいダッシュボードを作成することができます。
ここでは、以下メトリクスを表示しています。
●3つのシステムメトリクス
・Java Heap used,
・Java class count
・CPU used
●3つのCordaメトリクス
net.corda:type=Flows,name=Finishednet.corda:type=Flows,name=Checkpointing Ratenet.corda:type=Flows,name=Success<ご質問・ご要望の例>
- Corda Portalの記事について質問したい
- ブロックチェーンを活用した新規事業を相談したい
- 企業でのブロックチェーン活用方法を教えて欲しい 等々
- Cordaメールマガジンに登録
- X(旧Twitter)をフォロー
- 弊社イベントコミュニティ(Connpass)に参加
