Logo
    Logo

    Search

    R3-Solana連携

    Blockchainトレンド

    Corda活用事例

    Corda技術

    おすすめ記事

    記事を探す

    その他

    お客様サポート

    SBI R3 Japan HP

    お問い合わせ

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

    公開日
    Jul 19, 2021
    カテゴリ
    Corda技術を知る
    タグ
    🛠️Node運用
    筆者
    image
    icon
    この記事で学べること

    Cordaノードのモニタリングツールの構築方法が理解できる。

    icon
    目次
    • アーキテクチャ
    • 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コンテナとして別サーバー上で実行します。

    image

    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を呼び出します。

    curlhttp://localhost:7777/jolokia/read/net.corda:type=Flows,name=Success | jq

    JSON形式の結果が表示されます。

    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に以下のオプションを追加するだけです。

    上記の設定では、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イメージを引き出し、コンテナ間のネットワークを設定し、インバウンドおよびアウトバウンドの接続用に適切なポートを公開します。

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

    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

    Telegrafのサービスが再起動すると、

    sudo systemctl status telegraf

    でInfluxDBに接続されていることが確認でき、以下のように表示されるはずです。

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

    curl -Ghttp://IP-ADDRESS-INFLUXDB-SERVER:8086/query --data-urlencode "q=SHOW DATABASES"

    JSONレスポンスにtelegrafデータベースがリストアップされているはずです。

    (_internalデータベースは、InfluxDBで作成されたデフォルトのものです)

    Grafanaの設定

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

    http://IP-ADDRESS-GRAFANA:3000

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

    image

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

    image

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

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

    image
    image

    Grafanaダッシュボードの作成

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

    image

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

    ●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
    📬
    最後までお読みいただきありがとうございます。当社へのご質問・ご要望がございましたら、📪SBI R3 Japan お問い合わせフォーム📪よりお気軽にお問い合わせください!

    <ご質問・ご要望の例>

    • Corda Portalの記事について質問したい
    • ブロックチェーンを活用した新規事業を相談したい
    • 企業でのブロックチェーン活用方法を教えて欲しい 等々
    📢
    また、厳選されたCordaに関する最新情報をお伝えるするメールマガジンやX、当社主催のイベントコミュニティを運営しております。ぜひご登録ください。
    • Cordaメールマガジンに登録
    • X(旧Twitter)をフォロー
    • 弊社イベントコミュニティ(Connpass)に参加
    Logo

    © copyright SBI R3 Japan 2025

    GitHubYouTubeXFacebookLinkedIn
    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
    }
      # 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"]
    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
    ###############################################################################
    # 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"
    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
    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"
                 ]
               ]
              }
            ]
          }
       ]
    }