構成
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