SensuとUchiwaの導入

CentOS7系の環境に、SensuとUchiwaをインストールします。
前提条件として、「Sensu(サーバーとクライアント)とUchiwaは1台のマシンにインストール」となります。

## Redis

```bash
# epelレポジトリのインストール
yum install -y epel-release
yum update -y epel-release

# Redisのインストールとサービス起動、サービス自動起動設定
yum install -y redis
systemctl start redis
systemctl enable redis
```

## RabbitMQ

```bash
# RabbitMQのインストールとサービス起動、サービス自動起動設定
yum install -y rabbitmq-server
systemctl start rabbitmq-server
systemctl enable rabbitmq-server

# RabbitMQのSensu向け設定
# Virtual Host(「/sensu」)の追加
rabbitmqctl add_vhost /sensu
# RabbitMQにsensuユーザーの追加(パスワードはsensu)
rabbitmqctl add_user sensu sensu
# sensuユーザーへの「/sensu」へのパーミッション付与
rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"
```

##Sensu&Uchiwa

###Yumリポジトリの追加

```bash
cat << "_EOF_" > /etc/yum.repos.d/sensu.repo
[sensu]
name=sensu
baseurl=http://sensu.global.ssl.fastly.net/yum/$basearch/
gpgcheck=0
enabled=1
_EOF_
```

###SensuとUchiwaインストールと初期設定

```bash
# SensuとUchiwaのインストール
yum install -y sensu uchiwa

# Sensuの設定ファイルの設置
cp /etc/sensu/config.json.example /etc/sensu/config.json

# Uchiwaの設定ファイルの設置
sed -i.original 's/Site 1/Sensu Server/;s/api1.example.com/127.0.0.1/' /etc/sensu/uchiwa.json
sed -i '8,17d' /etc/sensu/uchiwa.json
```

###Sensuプラグインのインストール

```bash
# SNMPの設定(死活監視で使用)
yum install -y net-snmp net-snmp-utils
systemctl start snmpd
systemctl enable snmpd

# Sensuプラグインのインストール時に必要なライブラリ(gcc, gcc-c++)のインストール
yum install -y gcc gcc-c++

# Sensuプラグインのインストール(今回はディスクチェックとCPUチェック、HTTPのチェック、SNMPのチェックのみ)
/usr/bin/sensu-install -P disk-checks,cpu-checks,http, snmp
```

###Sensuプラグインの設定

以下のファイル群を設置

```json:/etc/sensu/conf.d/check-cpu.json
{
  "checks": {
    "cpu": {
      "command": "check-cpu.rb -w 80 -c 95",
      "interval": 10,
      "subscribers": [
        "test"
      ]
    }
  }
}
```

※10分ごとにCPU使用率をチェックし、CPU使用率が80%以上で警告、95%以上で致命的状態を通知

```json:/etc/sensu/conf.d/check-disk.json
{
  "checks": {
    "disk": {
      "command": "check-disk-usage.rb -w 75 -c 90",
      "interval": 600,
      "subscribers": [
        "test"
      ]
    }
  }
}
```

※10分ごとにディスク使用率をチェックし、ディスク使用率が80%以上で警告、95%以上で致命的状態を通知

```json:/etc/sensu/conf.d/check-http.json
{
  "checks": {
    "http": {
      "command": "check-http.rb -t 60 -u http://www.yahoo.co.jp",
      "interval": 600,
      "occurrences": 3,
      "subscribers": [
        "test"
      ]
    }
  }
}
```

※10分ごとに http://www.yahoo.co.jp に対して疎通をし、3回以上疎通ができなかった場合、致命的状態を通知

###SensuとUchiwaの自動起動設定と起動

```bash
/usr/bin/systemctl enable sensu-client sensu-server sensu-api uchiwa
/usr/bin/systemctl start sensu-client sensu-server sensu-api uchiwa
```

###sensu-apiの動作確認

以下のcURLコマンドで確認します。

```bash
$ curl -s http://AAA.BBB.CCC.DDD:4567/info | jq .
{
  "sensu": {
    "version": "0.26.3"
  },
  "transport": {
    "keepalives": {
      "messages": 3,
      "consumers": 1
    },
    "results": {
      "messages": 0,
      "consumers": 1
    },
    "connected": true
  },
  "redis": {
    "connected": true
  }
}
# これならOKです
```

###Uchiwaの動作確認

ブラウザで、 http://AAA.BBB.CCC.DDD:3000/ にアクセスして以下の画面が表示されればOKです。

![uchiwa.png](https://qiita-image-store.s3.amazonaws.com/0/37506/c261e72d-5cda-df5c-ab5f-f4a57f385aa8.png)

参考リンク
[サーバー監視ツール Sensu](http://qiita.com/bezeklik/items/d026e9db4d5305165273)

##Sensu参考情報

###Slack用通知ハンドラ
[sensu-plugins/sensu-plugins-slack](https://github.com/sensu-plugins/sensu-plugins-slack)を利用

```json:/opt/ansible/conf/slack-handler-notify.json
{
  "handlers": {
    "slack-notify": {
      "type": "pipe",
      "command": "handler-slack.rb -j slack-notify"
    }
  },
  "slack-notify": {
    "webhook_url": "https://hooks.slack.com/services/XXXXX",
    "channel": "#any-channel",
    "bot_name": "Sensu Bot",
    "message_template" : "slack-template.erb"
  }
}
```

###Sensuの監視設定

```json:設定例(check-cpu.json)
{
  "checks": {
    "cpu": {
      "type": "standard",
      "command": "check-cpu.rb -w 80 -c 95",
      "interval": 600,
      "occurrences": 3,
      "subscribers": [
        "common"
      ],
      "handlers": [
        "slack"
      ]
    }
  }
}
```

####監視タイプ(type)

以下の2タイプの内いずれか使用するプラグインに合致したものを記載する
- standard・・・標準のcheck用のプラグイン
- metrics・・・metircs用のプラグイン
指定は、「"metrics"」で指定する
※上記の例では、「"standard"」を指定している
※省力した場合は、「"standard"」が指定される

####設定名

設定の名称をつける
※上記の例では、「cpu」
※省略はできない

####コマンド(command)

監視の際、クライアントにて実行されるコマンドを指定する
※上記の例では、「check-cpu.rb -w 80 -c 95」を指定している
※省略はできない(但し、公式ドキュメントに書いてある通り「extension」を指定すれば省略はできる)

####間隔(interval)

監視が実行される間隔を**秒単位**指定する
※上記の例では、「600」(=600秒=10分)を指定している
※省略はできない

####閾値(occurrences)

監視通知の閾値で、閾値回数継続してアラートの条件を満たした場合にアラート通知される
※上記の例では、「3」を指定している
※省略した場合は、「1」が指定される

####対象クライアント(subscribers)

指定されたsubscribersに属するクライアントのみ監視対象とされる
複数の指定ができる
※上記の例では、「common」を指定している
※省略はできない(但し、公式ドキュメントに書いてある通り「standalone」を「true」に指定すれば省略はできる)

####通知ハンドラ(handlers)

通知を行う際、指定された通知ハンドラを使用して通知される
複数の指定ができる
※上記の例では、「slack」を指定している
※省略した場合は、/etc/sensu/config.jsonの「handlers」の「default」の「handlers」に設定された通知ハンドラが指定される

参考リンク
[Sensu | Checks](https://sensuapp.org/docs/0.26/reference/checks.html)
[Sensu | Plugins](https://sensuapp.org/docs/latest/reference/plugins)
[Sensuの監視の設定 - さよならインターネット](http://blog.kenjiskywalker.org/blog/2014/05/03/sensu-monitoring-setting/)
[第361回　Sensuでサーバーのリソースを可視化しよう：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0361)