Chaos Monkey for Spring Bootの使い方

# 概要
Spring BootをNetflixの[Chaos Monkey](https://github.com/Netflix/chaosmonkey)のようにランダムでエラーを発生させる[Chaos Monkey for Spring Boot](https://codecentric.github.io/chaos-monkey-spring-boot/)というものがあったので試してみた。

## ドキュメント

https://codecentric.github.io/chaos-monkey-spring-boot/

## 説明動画

https://www.youtube.com/watch?v=7sQiIR9qCdA&list=PLD9VybHH2wnZW1UdD1AwgR61a0Ba0OFb5&via=tb

*公式ドキュメント中に存在します。*

## github
https://github.com/codecentric/chaos-monkey-spring-boot

# 説明

*Chaos Monkey for Spring Boot*は、以下の３つのエラーをSpring Bootに対してランダムで発生させることができる

- 速度遅延
- 例外発生
- Spring Bootの停止

その他の主な機能は以下のとおり

- 障害を発生させる頻度(10%単位)を指定できる
- 速度遅延時間の範囲(単位ms)を指定できる
- 障害を発生させるBeanの種類(@Controller, @Service, @Componentなど)を指定できる
- Chaos Monkeyの有効/無効や設定は、*actuator*経由で変更できる

## 組み込み方法
*Chaos Monkey for Spring Boot*は、以下の３つのステップで導入ができる

- pomに依存追加
- active profilesの指定
- applicationプロパティーの設定追加

### pomに依存追加

```
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>chaos-monkey-spring-boot</artifactId>
    <version>2.0.0</version>
</dependency>
```

※ *SNAPSHOT*をご利用の場合は、[ドキュメントのSnapshots](https://codecentric.github.io/chaos-monkey-spring-boot/)を参照

### active profilesの指定

active profilesに`chaos-monkey`を指定する。

application.propertiesで指定する場合:

```
spring.profiles.active=chaos-monkey
```

Spring Bootの起動時に指定する場合:

```
java -jar your-app.jar --spring.profiles.active=chaos-monkey
```

### applicationプロパティーの設定追加

application.propertiesに`chaos.monkey.enabled`を設定(*actuator*経由で変更可能)

application.propertiesの場合:

```
chaos.monkey.enabled=true
```

application.xmlの場合:

```
chaos:
  monkey:
    enabled: true
```

*actuator*経由で設定する場合:

*actuator*から利用する場合は、下の章の「*actuator*を利用した設定確認、設定変更」を参照

以上、３つの設定(pom / active profiles / application.properties)で`Chaos Monkey`が有効になります。

### 起動確認

*Spring Boot*を起動すると起動ログに以下のAAが表示されます。

```
     _____ _                       __  __             _
    / ____| |                     |  \/  |           | |
   | |    | |__   __ _  ___  ___  | \  / | ___  _ __ | | _____ _   _
   | |    | '_ \ / _` |/ _ \/ __| | |\/| |/ _ \| '_ \| |/ / _ | | | |
   | |____| | | | (_| | (_) \__ \ | |  | | (_) | | | |   |  __| |_| |
    \_____|_| |_|\__,_|\___/|___/ |_|  |_|\___/|_| |_|_|\_\___|\__, |
                                                                __/ |
    _ready to do evil!                                         |___/

:: Chaos Monkey for Spring Boot                                    ::
```

## Tips

### 障害の発生頻度の変更

障害発生頻度は、`level`というプロパティーで設定できる。障害の発生率は10%単位で、1-10の数字で指定する。

- 1は発生率10%、10は発生率100%

### 発生する障害の種類を選択

| 種類       |       内容 |    プロパティ    |
|:-----------------|:------------------|:------------------:|
| 遅延            |             指定した時間(ms)の範囲でレイテンシを悪化させます |        latencyActive        |
| 例外           |            Exceptionを発生させます |       exceptionsActive       |
| アプリケーションダウン             |              Spring Bootアプリケーションを停止します |        killApplicationActive        |

- 遅延の障害は、遅延範囲開始(`latencyRangeStart`)と遅延範囲停止(`latencyRangeEnd`)に指定したミリ秒の数値の範囲でランダムで遅延が発生します。中身は`Thread.sleep`です。
- 例外の障害は、`RuntimeException("Chaos Monkey - RuntimeException")`を発生させます。
- アプリケーションダウンは、Spring Boot ApplicationをexitCode0で終了させます。

### 障害を発生させる場所

障害を発生させる場所は、watcherPropertiesで指定ができます。それぞれ以下のアノテーションが付いたクラスをスキャンして障害を発生させる対象を選択しています。

| アノテーション       |       Right align |
|:-----------------|:------------------|
| @Controller   |          controller |
| @RestController   |          restController |
| @Service   |          service |
| @Repository   |          repository |
| @Component   |          component |

※ watcherの設定がすべて`false`の場合は、Chaos Monkeyが動作しないので注意してください。

### *actuator*を利用した設定確認、設定変更

#### actuatorの機能を利用可能にする

以下の設定を追加することで、*actuator*経由で*Chaos Monkey*の設定を変更することができる。

application.propertiesの場合:

```
management.endpoint.chaosmonkey.enabled=true
management.endpoints.web.exposure.include=chaosmonkey
```

application.xmlの場合:

```
management:
  endpoint:
    chaosmonkey:
      enabled: true
  endpoints:
    web:
      exposure:
        include: chaosmonkey
```

#### Chaos Monkeyの設定を確認する

##### コマンド

```
curl http://localhost:8080/actuator/chaosmonkey
```

##### 結果

```
{
  "chaosMonkeyProperties": {
    "enabled": false
  },
  "assaultProperties": {
    "level": 5,
    "latencyRangeStart": 1000,
    "latencyRangeEnd": 3000,
    "latencyActive": true,
    "exceptionsActive": false,
    "killApplicationActive": false
  },
  "watcherProperties": {
    "controller": false,
    "restController": false,
    "service": true,
    "repository": false,
    "component": true
  }
}
```

#### Chaos Monkeyを有効にする

以下のように`chaosMonkeyProperties.enabled`が`false`になっている場合は、Chaos Monkeyは無効になっている。これを*actuator*経由で`true`に変更する。

```
{
  "chaosMonkeyProperties": {
    "enabled": false
  },
  ...
}
```

##### コマンド

```
curl -X POST -H "Content-type: application/json" http://localhost:8080/actuator/chaosmonkey/enable
```

※ POSTになっていることに注意
※ `Content-type`が`application/json`になっていることに注意

##### 結果

```
Chaos Monkey is enabled
```

#### その他の項目(Assault)を変更する

他の項目も*actuator*経由で変更可能です。以下は*Assault*を変更する例です。

##### コマンド

```
curl -X POST -H "Content-type: application/json" http://localhost:8080/actuator/chaosmonkey/assaults -d '{
    "level": 5,
    "latencyRangeStart": 1000,
    "latencyRangeEnd": 3000,
    "latencyActive": true,
    "exceptionsActive": false,
    "killApplicationActive": false
  }'
```

#### 結果

```
Assault config has changed
```

# まとめ

以上がChaos Monkey for Spring Bootの簡単な利用方法になります。