SensuでRabbitMQを監視する

# 概要
RabbitMQをSensuで監視するもろもろについて調べました。

# rabbitmqプラグイン
RabbitMQを監視するために[sensu-plugins-rabbitmq](https://github.com/sensu-plugins/sensu-plugins-rabbitmq)というプラグインが用意されています。

このプラグインでは次の監視スクリプトが用意されています。

* bin/check-rabbitmq-alive.rb
* bin/check-rabbitmq-amqp-alive.rb
* bin/check-rabbitmq-cluster-health.rb
* bin/check-rabbitmq-consumers.rb
* bin/check-rabbitmq-messages.rb
* bin/check-rabbitmq-network-partitions.rb
* bin/check-rabbitmq-node-health.rb
* bin/check-rabbitmq-queue-drain-time.rb
* bin/check-rabbitmq-queue.rb
* bin/check-rabbitmq-stomp-alive.rb
* bin/metrics-rabbitmq-overview.rb
* bin/metrics-rabbitmq-queue.rb

# Sensuからの監視
個別のスクリプトを見る前にSensuから監視対象サーバをどうやって監視するかを説明します。

Sensuの監視の仕組みはざっくりこんな感じです。

![2ab5bf60-0c18-0ef2-dfd3-a0200b8cf888.png](https://qiita-image-store.s3.amazonaws.com/0/43208/08a0339e-e143-9d40-48e1-a398fe6335ae.png)

1. Sensuサーバが監視対象のSensuクライアントに実行するコマンドを送信する
2. クライアントはコマンドを実行して結果をサーバに返す
3. サーバは結果に応じてアクションを起こす

クライアントとなるサーバでは、Sensuサーバから指示されるコマンドとなるバイナリやスクリプトがインストールされている必要があります。

サーバに置く監視ひとつの設定はこんな感じです。
詳しくは[ドキュメント](https://sensuapp.org/docs/0.20/checks)をみてください。

```json
{
  "checks": {
    "check_rabbitmq_alive": {
      "handlers": ["notify_slack"],
      "command": "ruby /path/to/bin/check-rabbitmq-alive.rb",
      "subscribers": ["rabbitmq"],
      "interval": 60
    }
  }
}
```

`handlers`はSensuサーバが監視に対して行うアクションです。
`subscribers`はこの監視項目の対象ノード(のグループ)です。

# rabbitmqプラグインの使い方
## インストール方法
このプラグインはrubygemsでインストールできます。監視対象のノードでインストールしましょう。

```bash
gem install sensu-plugins-rabbitmq
```

## 実行方法
gemでインストールするとコマンドとして実行できるようになるので、次のように実行できます。

```bash
$ check-rabbitmq-alive.rb -w localhost
```

## スクリプト
### bin/check-rabbitmq-alive.rb
REST APIで死活監視をします。

```
    -w, --host HOST                  RabbitMQ host
    -p, --password PASSWORD          RabbitMQ password
    -P, --port PORT                  RabbitMQ API port
        --ssl                        Enable SSL for connection to RabbitMQ
    -u, --username USERNAME          RabbitMQ username
    -v, --vhost VHOST                RabbitMQ vhost
```

### bin/check-rabbitmq-amqp-alive.rb
AMQP経由で死活監視をします。

```
    -w, --host HOST                  RabbitMQ host
    -p, --password PASSWORD          RabbitMQ password
    -P, --port PORT                  RabbitMQ AMQP port
        --ssl                        Enable SSL for connection to RabbitMQ
    -u, --username USERNAME          RabbitMQ username
    -v, --vhost VHOST                RabbitMQ vhost
```

### bin/check-rabbitmq-cluster-health.rb
REST APIでクラスタのノードがRunningかチェックします。

```
    -w, --host HOST                  RabbitMQ host
    -n, --nodes NODE1,NODE2          Optional comma separated list of expected nodes in the cluster
    -p, --password PASSWORD          RabbitMQ password
    -P, --port PORT                  RabbitMQ API port
    -u, --username USERNAME          RabbitMQ username
```

`http://rabbitmq/api/nodes`をみてます。

### bin/check-rabbitmq-consumers.rb
REST API経由でConsumerの数をチェックします。

```
    -c, --critical NUM_CONSUMERS     CRITICAL consumer count threshold
        --exclude queue_name         Comma separated list of RabbitMQ queues to NOT monitor.  All others will be monitored.
        --host HOST                  RabbitMQ management API host
        --password PASSWORD          RabbitMQ management API password
        --port PORT                  RabbitMQ management API port
        --queue queue_name           Comma separated list of RabbitMQ queues to monitor.
        --ssl                        Enable SSL for connection to the API
        --user USER                  RabbitMQ management API user
    -w, --warn NUM_CONSUMERS         WARNING consumer count threshold
```

### bin/check-rabbitmq-messages.rb
REST API経由でキューに入っているメッセージの総数をチェックします。

```
    -c, --critical NUM_MESSAGES      CRITICAL message count threshold
    -e, --excludedqueues queue_name  Comma separated list of queues to exclude when using queue level monitoring
        --host HOST                  RabbitMQ management API host
        --password PASSWORD          RabbitMQ management API password
        --port PORT                  RabbitMQ management API port
    -q, --queuelevel                 Monitors that no individual queue is above the thresholds specified
        --ssl                        Enable SSL for connection to the API
        --user USER                  RabbitMQ management API user
    -w, --warn NUM_MESSAGES          WARNING message count threshold
```

### bin/check-rabbitmq-network-partitions.rb
AMQP経由でRabbitMQクラスタにネットワーク分離が発生しているかチェックします。

```
    -w, --host HOST                  RabbitMQ management API host
    -p, --password PASSWORD          RabbitMQ management API password
        --port PORT                  RabbitMQ management API port
        --ssl                        Enable SSL for connection to the API
    -u, --username USERNAME          RabbitMQ management API user
```

### bin/check-rabbitmq-node-health.rb
REST API経由でノード状態がヘルシーかチェックします。

```
    -w, --host HOST                  RabbitMQ host
    -p, --password PASSWORD          RabbitMQ password
    -P, --port PORT                  RabbitMQ API port
    -c, --mcrit PERCENT              Critical % of socket usage vs high watermark
    -m, --mwarn PERCENT              Warning % of socket usage vs high watermark
    -u, --username USERNAME          RabbitMQ username
    -a, --alarms BOOLEAN             Sound critical if one or more alarms are triggered
```

ぱっと見でソース見ただけですがバグありそうなので、使うならPR送るかした方がよさそうです。

### bin/check-rabbitmq-queue-drain-time.rb
REST API経由。
今のメッセージ消費速度を元に、今Queueにあるメッセージが何秒後に消費されるかをチェックします。
例えば、次のような状況の時、

* キューには1000メッセージたまってる
* 消費速度は 1 msg/sec

1000秒後にメッセージが消費されると予測されます。
なので、もし閾値が1000以下であれば発火します。

```
    -c, --critical PROCESS_TIME_SECS CRITICAL time that messages will process at current rate
        --filter REGEX               Regular expression for filtering queues
        --host HOST                  RabbitMQ management API host
        --password PASSWORD          RabbitMQ management API password
        --port PORT                  RabbitMQ management API port
        --ssl                        Enable SSL for connection to the API
        --user USER                  RabbitMQ management API user
    -w, --warning PROCESS_TIME_SECS  WARNING that messages will process at current rate
```

### bin/check-rabbitmq-queue.rb
REST API経由。
各Queueごとのメッセージ数をチェックします。

```
    -c, --critical NUM_MESSAGES      CRITICAL message count threshold
        --host HOST                  RabbitMQ management API host
        --password PASSWORD          RabbitMQ management API password
        --port PORT                  RabbitMQ management API port
        --queue queue_names          RabbitMQ queue to monitor (required)
        --ssl                        Enable SSL for connection to the API
        --user USER                  RabbitMQ management API user
    -w, --warn NUM_MESSAGES          WARNING message count threshold
```

### bin/check-rabbitmq-stomp-alive.rb
STOMP経由で死活監視します。

```
    -w, --host HOST                  RabbitMQ host
    -p, --password PASSWORD          RabbitMQ password
    -P, --port PORT                  RabbitMQ STOMP port
    -q, --queue QUEUE                Queue to post a message to and receive from
        --ssl                        Enable SSL for connection to RabbitMQ
    -u, --username USERNAME          RabbitMQ username
```

### bin/metrics-rabbitmq-overview.rb
RabbitMQのManagement UIのメインページと同じメトリクスを取得します。

```
#   $ rabbitmq-queue-metrics.rb
#    host.rabbitmq.queue_totals.messages.count 0 1344186404
#    host.rabbitmq.queue_totals.messages.rate  0.0 1344186404
#    host.rabbitmq.queue_totals.messages_unacknowledged.count  0 1344186404
#    host.rabbitmq.queue_totals.messages_unacknowledged.rate 0.0 1344186404
#    host.rabbitmq.queue_totals.messages_ready.count 0 1344186404
#    host.rabbitmq.queue_totals.messages_ready.rate  0.0 1344186404
#    host.rabbitmq.message_stats.publish.count 4605755 1344186404
#    host.rabbitmq.message_stats.publish.rate  17.4130186829638  1344186404
#    host.rabbitmq.message_stats.deliver_no_ack.count  6661111 1344186404
#    host.rabbitmq.message_stats.deliver_no_ack.rate 24.6867565643405  1344186404
#    host.rabbitmq.message_stats.deliver_get.count 6661111 1344186404
#    host.rabbitmq.message_stats.deliver_get.rate  24.6867565643405  1344186404#
```

### bin/metrics-rabbitmq-queue.rb
Queueごとに次のメトリクスを取得します。

* メッセージ数
* 平均排出速度
* メッセージ消費予測時間
* Consumer数