nodered_settings.js

Node-RED自体の動作設定を行います。 既定では {ICE_HOME}/core/conf ディレクトリに配置されています。

Node-RED単体で動作する際の設定ファイル(settings.js)と同様の設定項目に対応しています。 設定項目の詳細は以下のURLを参照してください。

https://nodered.org/docs/user-guide/runtime/configuration

既定では以下のように設定されています。

const nodered_util = require('ddl/nodered_util');

module.exports = {
    userDir: nodered_util.defaultUserDir,
    flowFile: "flows.json",
    httpAdminRoot: false,
    httpNodeRoot: false,
    disableEditor: true,
    uiHost: "127.0.0.1",
    uiPort: 22408,
    logging: {
        console: {
            level: "off"
        },
        iceLogger: {
            level: "info",
            handler: nodered_util.iceLogger
        }
    }
};

注)userDirを既定値から変更する場合、Node-REDがICE提供ノードを参照できるように、{userDir}/node_modulesディレクトリを変更後のパスにコピ ーしておく必要があります。

ログ設定

Node-REDのカスタムロギングモジュールの機能を利用し、ICE CoreのロガーからNode-REDのログ出力を行います。
logging.iceLoggerがNode-RED側の設定となっており、ここでログレベルの変更が可能です。

ログ出力先やログローテートの設定はICE Coreのcore_logger.jsonで行います。 既定では以下のように設定されています。

    "NODE-RED": {
        "type": "file",
        "filename": "/var/log/ice/node-red.log",
        "maxLogSize":102400,
        "backups":3
    },

Node-REDフロー統計情報出力機能の有効化と動作設定

機能の有効化

次のコマンドを実行し、nodered_settings.jsをエディタで開きます。

# vi {ICE_HOME}/conf/nodered_settings.js
module.exports = {

    <省略>

    logging: {

        <省略>
        ,
        perfmon: {
            level: "off",
            metrics: true,
            handler: nodered_util.perfLogger,
            format: 'json',
            interval: 10,
            groups : [
              {
                id: "perf1",
                send: [],
                receive: [],
                done: []
              }
            ]
        }
    },

    <省略>
};

上記のperfmonの箇所を追記してファイルを保存します。
続いて次のコマンドを実行し、core_logger.jsonをエディタで開きます。

# vi {ICE_HOME}/conf/core_logger.json
{
    "appenders": {

      <省略>

        },
        "PERFMON": {
            "disabled": false,
            "type": "file",
            "filename": "/var/log/ice/flow_perf.log",
            "maxLogSize": 10485760,
            "backups": 3,
            "layout" : {
                "type" : "messagePassThrough"
            }
        }
    },
    "categories": {

      <省略>

        "SYSLOG": {"appenders": ["SYSLOG"], "level": "INFO"},
        "PERFMON": {"appenders": ["PERFMON"], "level": "ALL"}
    }
}

上記のappenders.PERFMONの箇所とcategories.PERFMONの箇所を追記し、ファイルを保存します。その後、ICE Coreを再起動します。

# systemctl restart ice-core

/var/log/ice/debug.logを確認し、以下の文章が表示されていればパフォーマンスモニタ機能が有効化されています。

"ICE performance monitor function is enabled."

動作設定と出力イメージ

簡単な統計情報の採取

Node-REDエディタを開き、統計情報を採取するノードのノードIDを確認します。 (対象ノードをクリックし、画面右側のペインから、ノードIDを確認する)

次のコマンドを実行し、nodered_settings.jsをエディタで開きます。

# vi {ICE_HOME}/conf/nodered_settings.js

確認したいノードIDをsend, receive, doneの配列に文字列型で追加します。

この操作を採取したいノードだけ繰り返し行い、ファイルを保存します。

ICE Coreを再起動します。

# systemctl restart ice-core

以下のファイルに統計情報を出力されることを確認します。

Linux /var/log/ice/flow_perf.log

Windows C:\ice\core\logs\flow_perf.log

出力イメージは以下になります。
(実際の出力では改行はなく1行で表示されます)

{
  timestamp: 1609927931568,
  memory : {
    rss: 67118694.4,
    heapTotal: 31305728,
    heapUsed: 28940419.2
  },
  perf1 : {
    send: 1.399,
    receive: 1.399,
    done: 0
  }
}

出力は以下の意味を表します。

ラベル 意味 単位
timestamp 情報採取時刻です ミリ秒
memory.rss プロセスのヒープメモリが使用する実メモリのサイズです バイト
memory.heapTotal ヒープの総サイズです バイト
memory.heapUsed ヒープの使用サイズです バイト
perf1.send id: perf1のsendで指定ノードが採取期間に送信したメッセージ数の秒あたりの平均値です
perf1.receive id: perf1のreceiveで指定ノードが採取期間に受信したメッセージ数の秒あたりの平均値です
perf1.done id: perf1のdoneで指定ノードが採取期間に完了したメッセージ数の秒あたりの平均値です

高度な使い方

① 対象ノードを複数指定する
send, receive, doneで対象ノードを指定する配列に、ノードIDを複数指定できます。
この場合、複数の指定ノードの総和の秒あたりの平均値が統計値として使われます。
設定は以下のように行います。
以下の例では、二つのノードのsendの合計値の統計情報を取得します。

module.exports = {

    <省略>

    logging: {

        <省略>
        ,
        perfmon: {
            level: "off",
            metrics: true,
            handler: nodered_util.perfLogger,
            format: 'json',
            interval: 10,
            groups : [
              {
                id: "perf1",
                send: ["11111.11111", "22222.22222"],
                receive: [],
                done: []
              }
            ]
        }
    },

    <省略>
};

② 採取範囲(モニタリンググループ)を複数定義する
統計情報を採取するノードの組み合わせを複数指定できます。 例えばあるフローの開始部分と終了部分でモニタリンググループを分ける場合は、以下のように設定を行います。

module.exports = {

    <省略>

    logging: {

        <省略>
        ,
        perfmon: {
            level: "off",
            metrics: true,
            handler: nodered_util.perfLogger,
            format: 'json',
            interval: 10,
            groups : [
              {
                id: "head",
                send: ["11111.11111"],
                receive: [],
                done: []
              },
              {
                id: "tail",
                send: [],
                receive: ["22222.22222"],
                done: []
              }
            ]
        }
    },

    <省略>
};

この場合、統計情報は以下のような出力になります。
(実際の出力では改行はなく1行で表示されます)

{
  timestamp: 1609927931568,
  memory : {
    rss: 67118694.4,
    heapTotal: 31305728,
    heapUsed: 28940419.2
  },
  head : {
    send: 1.399,
    receive: 0,
    done: 0
  },
  tail : {
    send: 0,
    receive: 1.399,
    done: 0
  }
}

③ 採取間隔を変更する
{ICE_HOME}/conf/nodered_settings.js内でintervalを設定することにより、採取間隔を秒単位の1(秒)以上86400(秒)以下の数値で指定できます。指定した間隔を一つの単位として、統計情報の算出を行います。 短くしすぎた場合、HW性能によってはCPUを一定量使用し続ける状態となる可能性があります。 本機能によりマシンの使用リソースがどのくらい増加するかを確認しながら値を変更してください。 この設定は任意で、既定値は10秒となります。

④ ファイル出力形式を変更する 出力フォーマットをJSONとCSVから選択できます。
{ICE_HOME}/conf/nodered_settings.js内のformatに'csv'を指定することで、統計情報の出力形式をCSVにすることができます。
この時の出力イメージは以下です。なお、実際にはヘッダ行は出力されません。

timestamp, rss, heapTotal, heapUsed, id1, send1, receive1, done1
1610087191548,34320383,16177151,14962551,perf1,0,0,0,

⑤ ファイル出力の動作設定
統計情報を出力するファイルの動作(ファイルのローテーション条件や保持数)を設定することができます。
設定は{ICE_HOME}/conf/core_logger.jsonで定義した"PERFMON"の設定を変更します。
この設定は必須で、既定値は以下となります。

ファイルアペンダ
ファイルサイズ 10MB
世代数 3

設定項目一覧

項目名 意味 値域 既定値 必須
level 内部で使用するパラメータです。変更できません。 - "off"
metrics 内部で使用するパラメータです。変更できません。 - "metrics"
handler 内部で使用するパラメータです。変更できません。 - "nodered_util.perfLogger"
format 統計情報の出力フォーマットを設定します。 "json"または"csv" "json"
interval 統計情報の採取間隔を秒で指定します。 1以上86400以下 10
groups.id モニタリンググループを区別するidを指定します。
他のモニタリンググループのidと重複できません。
任意の文字列 "perf1"
groups.send モニタリンググループで採取する送信メッセージを
送信するノードのidを指定します。複数の指定が可能です。
任意の文字列要素で構成される配列 []
groups.receive モニタリンググループで採取する受信メッセージを
受信するノードのidを指定します。複数の指定が可能です。
任意の文字列要素で構成される配列 []
groups.done モニタリンググループで採取する完了メッセージを
完了するノードのidを指定します。複数の指定が可能です。
任意の文字列要素で構成される配列 []