構成
| Compornent | 用途 |
|---|---|
| Sensu-Server | 監視サーバとしてRabbitMQを通じてクライアントとの監視結果のやり取りを行う 監視結果/監視設定はRedisに保存 |
| Sensu-API | API受け付けて監視情報の取得や設定を行うことができる |
| Uchiwa | 監視コンソール画面 ブラウザで接続する 監視情報はSensu-APIを通じて取得 |
| RabbitMQ | Client⇆Server間は全てキューを介した非同期通信で行われる |
| Redis | 監視設定や監視結果を保存 |
| Redis-Sentinel | Redisの監視用として自動フェイルオーバやどのサーバがMaster(またはSlave)なのかを通知してくれる |
| Sensu-Client | 監視クライアント 監視結果をRabbitMQを通じてSensu-Serverへ通知する |
前職場で構築した環境同様、全て3台構成で構築する。
RedisSentinel/RabbitMQはノードダウン判定に過半数必要なので3台は必須。(多分・・・)
Sensuは2台以上で冗長化できると思うが、他サーバに合わせて3台で作る。
Sensu-Server内でも各ノード毎に細かい役割があった気がするけど、忘れた。。。

構築手順
前提
- Redis/Redis-Sentinelの環境は構築済み(https://blog.megunlabo.net/2018/04/06/redis-sentinel/)
- RabbitMQの環境は構築済み(https://blog.megunlabo.net/2018/03/10/rabbitmq_cluster_provision/)
- OSは全てCentOS7
インストール(Sensu-Server/Sensu-API/Sensu-Client/Uchiwa)
ServerもAPIもClientも一緒にインストールされる
- リポジトリ設定
[sensu] name=sensu baseurl=https://sensu.global.ssl.fastly.net/yum/$releasever/$basearch/ gpgkey=https://repositories.sensuapp.org/yum/pubkey.gpg gpgcheck=1 enabled=1
インストール
sudo yum install sensu uchiwa
設定
RabbitMQにvhost/user作成
https://blog.megunlabo.net/2018/03/10/rabbitmq_commands/
参考にRabbitMQサーバ上でSensu用のvhostとユーザを作成する。
rabbitmqctl add_vhost /sensu rabbitmqctl add_user sensu secret rabbitmqctl set_permissions -p /sensu sensu '.*' '.*' '.*'
RabbitMQ接続設定
各SensuサーバにRabbitMQへの接続設定を記載する。
{
"transport": {
"name": "rabbitmq",
"reconnect_on_error": true
}
}
{
"rabbitmq": [
{
"host": "192.168.22.11",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
},
{
"host": "192.168.22.12",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
},
{
"host": "192.168.22.13",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
}
]
}
Redis接続設定
各SensuサーバにRedisへの接続設定を記載する。
{
"redis": {
"master": "mymaster",
"sentinels": [
{
"host": "192.168.22.11",
"port": 26379
},
{
"host": "192.168.22.12",
"port": 26379
},
{
"host": "192.168.22.13",
"port": 26379
}
]
}
}
Sensu-API用の設定
各SensuサーバにSensu-APIの設定を記載する。
{
"api": {
"host": "localhost",
"bind": "0.0.0.0",
"port": 4567
}
}
Uchiwa設定
各Sensuサーバ上にUchiwaを起動する。
Uchiwa設定ファイルに自分自身のSensu-APIへ接続するようにする。
他のSensu-APIへの接続情報も記載できるが、今回は3台とも同じ監視をしているので、自分自身の情報のみ記載しておく。
{
"sensu": [
{
"name": "sensu1",
"host": "127.0.0.1",
"port": 4567
}
],
"uchiwa": {
"host": "0.0.0.0",
"port": 3000
}
}
プロセス再起動
各Sensuサーバ上のコンフィグ設定が完了したらプロセスを再起動する。
systemctl restart sensu-server systemctl restart sensu-api systemctl restart uchiwa
Uchiwaへ接続
http://xxx.xxx.xxx.xxx:3000 に接続してエラーなければOK
監視用プラグイン追加
Sensuで監視するためのプラグインを追加する。
https://github.com/sensu-plugins
必要なものをインストールする必要がある。
独自プラグイン作成して監視をすることも可能。
そのプラグインを使用するサーバへインストールする必要がある。
cpuチェックプラグインを追加
cpuの使用率をチェックするプラグイン
- pluginのインストール
sensu-install -p cpu-checks
- plugin直接実行
/opt/sensu/embedded/bin/check-cpu.rb
slackプラグイン追加
slackへ通知するプラグイン
サーバ側で使用するものなので、Sensuサーバのみにインストールする
- pluginのインストール
sensu-install -p slack
check/handler設定
- 監視設定(check)
{
"checks": {
"check-cpu": {
"command": "check-cpu.rb -w :::cpu.warning|80::: -c :::cpu.critical|90:::",
"interval": 60,
"refresh": 10,
"subscribers": ["all"],
"handlers": ["slack"]
}
}
}
- 通知設定(handler)
{
"handlers": {
"slack": {
"type": "pipe",
"command": "handler-slack.rb"
}
},
"slack": {
"webhook_url": "https://hooks.slack.com/services/xxxx/xxxx/xxxxxx",
"icon_url": "https://avatars2.githubusercontent.com/u/10713628"
}
}
Clientの設定
- subscriptionsで監視内容を設定
- cpuで個別に閾値を変更可能(check-cpu.jsonのcpu.warning/cpu.criticalと対応)
{
"client": {
"name": "client1",
"address": "192.168.22.11",
"environment": "production",
"subscriptions": [
"all",
"web",
],
"cpu": {
"warning": 5,
"critical": 10
},
"socket": {
"bind": "127.0.0.1",
"port": 3030
}
}
}
- client側のRabbitMQ接続設定
{
"transport": {
"name": "rabbitmq",
"reconnect_on_error": true
}
}
{
"rabbitmq": [
{
"host": "192.168.22.11",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
},
{
"host": "192.168.22.12",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
},
{
"host": "192.168.22.13",
"port": 5672,
"vhost": "/sensu",
"user": "sensu",
"password": "secret",
"heartbeat": 30,
"prefetch": 50
}
]
}
下記のようにみえてればOK
