catapult-service-bootstrap その５ catapult.tools.health/network

# 概要

[catapult-service-bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap)を使って[catapult48gh23s.xyz](http://catapult48gh23s.xyz:8000) というオレオレcatapultをやっています。

よくAPIノードやmongoDBがストップしています。

風のうわさで、ヘルスチェックツールがあるということを聞いたので、使ってみます。

# 作業

## catapult.tools.health

新しく`peer-node-2-health`を作ります。環境に合わせて、`peer-node-0-health`とか`peer-node-1-health`とかに変えてください。

```yaml:docker-compose.yml
  peer-node-2-health:
    build: dockerfiles/health
    command: bash -c "/bin-mount/wait /state/configs-generated && /bin/bash /userconfig/health.sh && touch /state/peer-node-2-health"
    stop_signal: SIGINT
    volumes:
    - ./build/catapult-config/peer-node-2/userconfig/resources/:/userconfig/resources/
    - ./bin/bash:/bin-mount
    - ./build/state:/state:rw
```

ディレクトリ作ります。

```bash
$ mkdir -p dockerfiles/health/userconfig
```

`Dockerfile`作ります。

```bash
$ vi dockerfiles/health/Dockerfile
```

```:Dockerfile
FROM techbureau/catapult-tools:gcc-0.1.0.2
ADD ./userconfig /userconfig
```

実行シェル作ります。

```bash
$ vi dockerfiles/health/userconfig/health.sh
```

```bash:health.sh
/catapult/bin/catapult.tools.health --resources /userconfig/
```

起動します。

ひとつ目のコマンドで、標準出力に結果が表示されます。もう一度みたければ、２つ目のコマンドが使えます。

```bash
$ docker-compose up --build peer-node-2-health
$ docker-compose logs peer-node-2-lealth
```

設定ファイルが読み込まれます。

```
loading resources from "/userconfig/resources"
loading configuration from "/userconfig/resources/config-network.properties"
loading configuration from "/userconfig/resources/config-user.properties"
loading configuration from "/userconfig/resources/config-logging.properties"
loading configuration from "/userconfig/resources/config-node.properties"
loading configuration from "/userconfig/resources/peers-p2p.json"
loading configuration from "/userconfig/resources/peers-api.json"
```

なにかステータスが表示されます。

```
2018-09-24 04:52:01.540353 0x00007f878ebb2700: <info> (health::main.cpp@169) peer-node-2 @ peer-node-2
     ACNTST C : 27    |  ACTIVE PINGS : 0     |     B WRITERS : 0     |  BLK ELEM ACT : 0     | 
 BLK ELEM TOT : 1'369 |      BLKDIF C : 620   |        HASH C : 0     |    HASHLOCK C : 0     | 
  MEM CUR RSS : 16    |  MEM CUR VIRT : 752   |   MEM MAX RSS : 32    |   MEM SHR RSS : 0     | 
     MOSAIC C : 1     |   MOSAIC C DS : 1     |          NS C : 1     |       NS C AS : 1     | 
      NS C DS : 1     | RB COMMIT ALL : 14    | RB COMMIT RCT : 0     | RB IGNORE ALL : 19    | 
RB IGNORE RCT : 2     |       READERS : 5     |  SECRETLOCK C : 0     | SUCCESS PINGS : 0     | 
        TASKS : 12    |   TOTAL PINGS : 0     |   TS NODE AGE : 17    | TS OFFSET ABS : 0     | 
TS OFFSET DIR : 0     |  TS TOTAL REQ : 0     |   TX ELEM ACT : 0     |   TX ELEM TOT : 4     | 
 UNLKED ACCTS : 1     |      UT CACHE : 0     |       WRITERS : 2     |  
```

各ノードのブロック高とブロックスコアが表示されます。

~~APIノードは、接続ポートが`3000`に固定されているようで、うまく動きませんでした。~~

（追記）これについてNEMのSlackで質問しました。ブロック高とスコアはrest-gatewayに問い合わせおり、ポート3000で問題ないのではないか。そして、APIノードとrest-gatewayのIPが同じであることを前提とした作りなのではないか、ということでした。実際、dockerネットワークの外側からアクセスしたところ、うまく表示されます。

```
2018-09-24 04:52:01.541330 0x00007f878ebb2700: <warning> (health::main.cpp@136)             peer-node-2 @ peer-node-2 [P2P] at height 1279 with score 114882633655565888 
2018-09-24 04:52:01.541616 0x00007f878ebb2700: <error> (health::main.cpp@136)               api-node-0 @ api-node-0 [API] at height    0 with score 0 
```

#### ステータスの意味

こういうテストコードからヒントを探ります。

https://github.com/nemtech/catapult-server/blob/master/tests/int/api/LocalNodeTests.cpp#L87

| key | value | hint word | hint file | 意味を考える |
|:----|:------|:--------|:--------|:------------|
| ACNTST C | 27 | cache counters | LocalNodeTests.cpp | ？ |
| ACTIVE PINGS | 0 | - | NodeDiscoveryServiceTests.cpp | ？ |
| B WRITERS | 0 | NumActiveBroadcastWriters | LocalNodeTestUtils.cpp | ？ |
| BLK ELEM ACT | 0 | Block_Elements_Active_Counter_Name | DispatcherServiceTests.cpp | ？ |
| BLK ELEM TOT | 1'369 | Block_Elements_Counter_Name | DispatcherServiceTests.cpp | ？ |
| BLKDIF C | 620 | - | - | ？ |
| HASH C | 0 | - | - | Secret Lock Txで使われたsecretの数？ |
| HASHLOCK C | 0 | - | - | ？ |
| MEM CUR RSS | 16 | memory counters | LocalNodeTests.cpp | ？ |
| MEM CUR VIRT | 752 | - | - | ？ |
| MEM MAX RSS | 32 | - | - | ？ |
| MEM SHR RSS | 0 | - | - | ？ |
| MOSAIC C | 1 | GetMosaicView(cache)->size() | NamespacePlugin.cpp | モザイクの数 |
| MOSAIC C DS | 1 | GetMosaicView(cache)->deepSize() | NamespacePlugin.cpp | モザイクの何か |
| NS C | 1 | GetNamespaceView(cache)->size() | NamespacePlugin.cpp | ネームスペースの数 |
| NS C AS | 1 | GetNamespaceView(cache)->activeSize() | NamespacePlugin.cpp | ネームスペースの何か |
| NS C DS | 1 | GetNamespaceView(cache)->deepSize() | NamespacePlugin.cpp | ネームスペースの何か |
| RB COMMIT ALL | 14 | Rollback_Elements_Committed_All | DispatcherServiceTests.cpp | ブロック分岐の巻き戻し？ |
| RB COMMIT RCT | 0 | Rollback_Elements_Committed_Recent | DispatcherServiceTests.cpp | ブロック分岐の巻き戻しの最近？ |
| RB IGNORE ALL | 19 | Rollback_Elements_Ignored_All | DispatcherServiceTests.cpp | ブロック分岐の何か？ |
| RB IGNORE RCT | 2 | Rollback_Elements_Ignored_Recent | DispatcherServiceTests.cpp | ブロック分岐の何か？ |
| READERS | 5 | NumActiveReaders | LocalNodeTestUtils.cpp | ？ |
| SECRETLOCK C | 0 | - | - | 有効期限内のSecret Lock Txの数？ |
| SUCCESS PINGS | 0 | - | NodeDiscoveryServiceTests | ？ |
| TASKS | 12 | NumScheduledTasks | LocalNodeTestUtils.cpp | ？ |
| TOTAL PINGS | 0 | - | NodeDiscoveryServiceTests | ？ |
| TS NODE AGE | 17 | Node_Age_Counter_Name | TimeSynchronizationServiceTests.cpp | ？ |
| TS OFFSET ABS | 0 | Time_Offset_Absolute_Counter_Name | TimeSynchronizationServiceTests.cpp | ？ |
| TS OFFSET DIR | 0 | Time_Offset_Direction_Counter_Name | TimeSynchronizationServiceTests.cpp | ？ |
| TS TOTAL REQ | 0 | Total_Requests_Counter_Name | TimeSynchronizationServiceTests.cpp | ？ |
| TX ELEM ACT | 0 | Transaction_Elements_Active_Counter_Name | DispatcherServiceTests.cpp | ？ |
| TX ELEM TOT | 4 | service local node counters | LocalNodeTests.cpp | ？ |
| UNLKED ACCTS | 1 | NumUnlockedAccounts | LocalNodeTestUtils.cpp | nemesis以外でTXを投げたことのあるアカウント数？ |
| UT CACHE | 0 | basic local node counters | LocalNodeTests.cpp | ？ |
| WRITERS | 2 | NumActiveWriters | LocalNodeTestUtils.cpp | ？ |

ぜんぜんわかりませんでした。わかったら更新していきます。

## catapult.tools.network

```yaml:docker-compose.yml
  peer-node-2-network:
    build: dockerfiles/network
    command: bash -c "/bin-mount/wait /state/configs-generated && /bin/bash /userconfig/network.sh && touch /state/peer-node-2-network"
    stop_signal: SIGINT
    volumes:
    - ./build/catapult-config/peer-node-2/userconfig/resources/:/userconfig/resources/
    - ./bin/bash:/bin-mount
    - ./build/state:/state:rw
```



ディレクトリを作ります。

```bash
$ mkdir -p dockerfiles/network/userconfig
```

`Dockerfile`を作ります。

```
$ vi dockerfiles/health/Dockerfile
```

```:Dockerfile
FROM techbureau/catapult-tools:gcc-0.1.0.2
ADD ./userconfig /userconfig
```

実行シェルを作ります。

```
$ vi dockerfiles/health/userconfig/network.sh
```

```bash:network.sh
/catapult/bin/catapult.tools.network --resources /userconfig/
```

起動します。

```bash
$ docker-compose up --build peer-node-2-network
$ docker-compose logs peer-node-2-network
```

```
loading resources from "/userconfig/resources"
loading configuration from "/userconfig/resources/config-network.properties"
loading configuration from "/userconfig/resources/config-user.properties"
loading configuration from "/userconfig/resources/config-logging.properties"
loading configuration from "/userconfig/resources/config-node.properties"
loading configuration from "/userconfig/resources/peers-p2p.json"
loading configuration from "/userconfig/resources/peers-api.json"
```

各ノードへ接続し、マトリックスで表示されます。


```
2018-09-24 04:59:46.548541 0x00007fe03a469700: <info> (network::main.cpp@288) 
                   |       peer-node-1 |    peer-node-     | peer-node-        |       api-node-19 |     api-node-     
 ----------------- | ----------------- | ----------------- | ----------------- | ----------------- | ----------------- |
       peer-node-1 |                   |               R S |               R S |                 R |                 R |
    peer-node-     |               R S |                   |               R S |                 R |                 R 
 peer-node-        |               R S |               R S |                   |                 R |                 R |
       api-node-19 |                 S |                 S |                 S |                   |               P R |
     api-node-     |                 S |                 S |                 S |               P R |                   |
 ----------------- | ----------------- | ----------------- | ----------------- | ----------------- | ----------------- | 
```

`R`が`READ`、`S`が`SYNC`、`P`が`PART`です（意味はわかりません）。

`peer <=> peer`は`R S`
`api <=> api`は`P R`
`peer <=> api`は、`S`か`R`

おそらく、`peer`は`api`へ書き込み（`SYNC`）して、`api`は`peer`から読み取り（`READ`）ということでしょうか。


# 所感

これを使って、死活監視とかできないかな～と思っていたけど、この出力は整形する必要がありますね。

`techbureau/catapult-tools:gcc-0.1.0.2`には、`nemgen`と`address`も入っているので、必要に応じて同じパターンで作れますね。

ヘルスステータスの意味をご存知の方はぜひおしえてください。

# 関連記事

catapult-service-bootstrapにpeer-nodeを追加する その１ サービス追加
https://qiita.com/planethouki/items/b80fe29157d80a63122c

catapult-service-bootstrapにpeer-nodeを追加する その２ サーバー編
https://qiita.com/planethouki/items/4c73a6b924b92529bd32

catapult-service-bootstrap その３ ホスト名とポート変更
https://qiita.com/planethouki/items/d365f2344c0f7a6c3523

catapult-service-bootstrap その４ チェーンの手動削除
https://qiita.com/planethouki/items/7ec5404701adeb96bb8e

catapult-service-bootstrap その５ catapult.tools.health/network
https://qiita.com/planethouki/items/5ed19ae8ceb67ad6fee0