システムの監視を行うためにSensuを導入する手順を示す。
Sensuは収集したデータを格納するRedisとサーバ・クライアント間のメッセージのやり取りのためのRabbitMQを必要とするのでそれらもあわせてインストールする。またフロントエンドとしてUchiwaもインストールする。
尚、導入先はUbuntu 18.04とする。
準備
まずパッケージをアップデートする。
% sudo apt update % sudo apt upgrade % sudo reboot
Redisインストール
Redisをインストールする。
% sudo apt install redis-server % redis-cli ping PONG
設定ファイルは/etc/redis/redis.confだがデフォルトでひとまずよい。
% systemctl list-unit-files -t service | egrep '(UNIT|redis)' UNIT FILE STATE redis-server.service enabled redis-server@.service disabled redis.service enabled % systemctl -l status redis-server ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-12-30 16:47:33 JST; 5min ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 17688 (redis-server) Tasks: 4 (limit: 4915) CGroup: /system.slice/redis-server.service └─17688 /usr/bin/redis-server 127.0.0.1:6379 12月 30 16:47:33 zero systemd[1]: Starting Advanced key-value store... 12月 30 16:47:33 zero systemd[1]: redis-server.service: Can't open PID file /var/run/redis/redi 12月 30 16:47:33 zero systemd[1]: Started Advanced key-value store.
RabbitMQインストール(socat + Erlang)
Redisの次にRabbitMQをインストールする。
% sudo apt install socat erlang-nox % sudo apt install rabbitmq-server
% systemctl list-unit-files -t service | egrep '(UNIT|rabbitmq)' UNIT FILE STATE rabbitmq-server.service enabled % systemctl -l status rabbitmq-server ● rabbitmq-server.service - RabbitMQ Messaging Server Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/rabbitmq-server.service.d └─limits.conf Active: active (running) since Sun 2018-12-30 16:51:42 JST; 2min 31s ago Main PID: 18158 (rabbitmq-server) Tasks: 92 (limit: 4915) CGroup: /system.slice/rabbitmq-server.service ├─18158 /bin/sh /usr/sbin/rabbitmq-server ├─18182 /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server ├─18415 /usr/lib/erlang/erts-9.2/bin/epmd -daemon ├─18490 /usr/lib/erlang/erts-9.2/bin/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db - ├─18604 erl_child_setup 65536 ├─18682 inet_gethost 4 └─18683 inet_gethost 4 12月 30 16:51:37 zero systemd[1]: Starting RabbitMQ Messaging Server... 12月 30 16:51:39 zero rabbitmq[18159]: Waiting for rabbit@zero 12月 30 16:51:39 zero rabbitmq[18159]: pid is 18182 12月 30 16:51:42 zero systemd[1]: Started RabbitMQ Messaging Server.
RabbitMQではキューやメッセージのために大量のファイルを開くため、ファイルディスクリプタを変更しておく。
% echo "rabbitmq soft nofile 65536" | sudo tee -a /etc/security/limits.conf % echo "rabbitmq hard nofile 65536" | sudo tee -a /etc/security/limits.conf % echo "session required pam_limits.so" | sudo tee -a /etc/pam.d/common-session % echo "session required pam_limits.so" | sudo tee -a /etc/pam.d/common-session-noninteractive % sudo mkdir -p /etc/systemd/system/rabbitmq-server.service.d % echo "[Service]" | sudo tee -a /etc/systemd/system/rabbitmq-server.service.d/limits.conf % echo "LimitNOFILE=65536" | sudo tee -a /etc/systemd/system/rabbitmq-server.service.d/limits.conf % sudo systemctl daemon-reload % sudo systemctl restart rabbitmq-server
Sensu用のバーチャルホストとユーザーを作成する。
% sudo rabbitmqctl add_vhost /sensu Creating vhost "/sensu" % sudo rabbitmqctl add_user sensu <password> Creating user "sensu" % sudo rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*" (権限は左から「設定変更」「書込」「読込」) Setting permissions for user "sensu" in vhost "/sensu" % sudo rabbitmqctl list_vhosts Listing vhosts / /sensu % sudo rabbitmqctl list_users Listing users sensu [] guest [administrator] % sudo rabbitmqctl list_permissions -p /sensu Listing permissions in vhost "/sensu" sensu .* .* .*
Sensuインストール
RedisとRabbitMQがインストールできたらSensu本体をインストールする。
ここではサーバ(sensu-server)もクライアント(sensu-client)も同一マシンにインストールするものとする。
% wget -q https://sensu.global.ssl.fastly.net/apt/pubkey.gpg -O- | sudo apt-key add - % echo "deb https://sensu.global.ssl.fastly.net/apt xenial main" | sudo tee /etc/apt/sources.list.d/sensu.list % sudo apt install sensu
インストールが終わったら各種設定を行う。
⦿ API設定ファイル作成
% sudo vi /etc/sensu/conf.d/api.json { "api": { "host": "localhost", "bind": "0.0.0.0", "port": 4567 } }
⦿ RabbitMQアクセス設定ファイル作成
% sudo vi /etc/sensu/conf.d/rabbitmq.json { "rabbitmq": { "host": "127.0.0.1", "port": 5672, "vhost": "/sensu", "user": "sensu", "password": "<password>" } }
⦿ Redisアクセス設定ファイル作成
% sudo vi /etc/sensu/conf.d/redis.json { "redis": { "host": "127.0.0.1", "port": 6379 }
⦿ Sensuクライアント設定ファイル作成
% sudo vi /etc/sensu/conf.d/client.json { "client": { "name": "zero.local", "address": "192.168.0.8", "environment": "development", "subscriptions": ["all"] } }
⦿ サービス有効化 & 起動
% sudo systemctl enable sensu-server % sudo systemctl enable sensu-client % sudo systemctl enable sensu-api % systemctl list-unit-files -t service | egrep '(UNIT|sensu)' UNIT FILE STATE sensu-api.service enabled sensu-client.service enabled sensu-server.service enabled % systemctl -l status sensu-server ● sensu-server.service - sensu server Loaded: loaded (/lib/systemd/system/sensu-server.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-12-30 17:15:54 JST; 2s ago Main PID: 22416 (sensu-server) Tasks: 2 (limit: 4915) CGroup: /system.slice/sensu-server.service └─22416 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-server -c /etc/sensu/config.jso 12月 30 17:15:54 zero systemd[1]: Started sensu server. % systemctl -l status sensu-client ● sensu-client.service - sensu client Loaded: loaded (/lib/systemd/system/sensu-client.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2018-12-30 17:16:04 JST; 4s ago Main PID: 7474 (sensu-client) Tasks: 2 (limit: 4915) CGroup: /system.slice/sensu-client.service └─7474 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -c /etc/sensu/config.json -d /etc/sensu/conf.d -e /etc/sensu/extensions -p /var/run/sensu/sensu-client.pid -l /var/log/sensu/sensu-client.log -L info 12月 30 17:15:58 zero systemd[1]: Started sensu client. % systemctl -l status sensu-api ● sensu-api.service - sensu api Loaded: loaded (/lib/systemd/system/sensu-api.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-12-30 17:16:37 JST; 1min 7s ago Main PID: 22545 (sensu-api) Tasks: 2 (limit: 4915) CGroup: /system.slice/sensu-api.service └─22545 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-api -c /etc/sensu/config.json - 12月 30 17:16:01 zero systemd[1]: Started sensu api.
Uchiwaインストール
SensuがインストールできたらフロントエンドのUchiwaをインストールする。
% sudo apt install uchiwa
設定ファイルに記述する”name”と”host”は動作する環境に合わせる。
% sudo cd /etc/sensu % sudo cp -p uchiwa.json uchiwa.json.org % sudo vi uchiwa.json { "sensu": [ { "name": "zero.local", "host": "192.168.0.8", "port": 4567, "timeout": 10 } ], "uchiwa": { "host": "0.0.0.0", "port": 3000, "refresh": 10 } }
設定が終わったらサービスを有効化して起動する。
% sudo systemctl enable uchiwa % systemctl list-unit-files -t service | egrep '(UNIT|uchiwa)' UNIT FILE STATE uchiwa.service generated % sudo systemctl start uchiwa % systemctl -l status uchiwa ● uchiwa.service - LSB: Uchiwa, a Sensu dashboard. Loaded: loaded (/etc/init.d/uchiwa; generated) Active: active (exited) since Fri 2018-12-30 17:27:13 JST; 5s ago Docs: man:systemd-sysv-generator(8) Tasks: 0 (limit: 4915) CGroup: /system.slice/uchiwa.service 12月 30 17:27:13 zero systemd[1]: Starting LSB: Uchiwa, a Sensu dashboard.... 12月 30 17:27:13 zero uchiwa[1325]: uchiwa started. 12月 30 17:27:13 zero systemd[1]: Started LSB: Uchiwa, a Sensu dashboard.. 12月 30 17:27:13 zero su[1340]: Successful su for uchiwa by root 12月 30 17:27:13 zero su[1340]: + ??? root:uchiwa 12月 30 17:27:13 zero su[1340]: pam_unix(su:session): session opened for user uchiwa by (uid=0) 12月 30 17:27:14 zero su[1340]: pam_unix(su:session): session closed for user uchiwa
この段階でWebブラウザでlocalhost:3000にアクセスするとUchiwaのダッシュボードが表示される。
以降はSensuクライアントとしての作業となる。
Sensuプラグインインストール
ここでは代表的なプラグインとしてCPU監視、ディスク監視、メモリ監視、プロセス監視のプラグインをインストールする。
⦿ CPU監視
% sudo sensu-install -p cpu-checks
プラグインは以下にインストールされる。
(実行ファイル) /opt/sensu/embedded/bin/check-cpu.rb /opt/sensu/embedded/bin/metrics-cpu-interrupts.rb /opt/sensu/embedded/bin/metrics-cpu-mpstat.rb /opt/sensu/embedded/bin/metrics-cpu-pcnt-usage.rb /opt/sensu/embedded/bin/metrics-cpu-softirqs.rb /opt/sensu/embedded/bin/metrics-cpu.rb /opt/sensu/embedded/bin/metrics-numastat.rb /opt/sensu/embedded/bin/metrics-softnet-stat.rb /opt/sensu/embedded/bin/metrics-user-pct-usage.rb (ライブラリ) /opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugins-cpu-checks-3.0.0/*
プラグインを手動で実行してみる。
% /opt/sensu/embedded/bin/check-cpu.rb CheckCPU TOTAL OK: total=2.79 user=2.23 nice=0.0 system=0.56 idle=96.2 iowait=1.01 irq=0.0 softirq=0.0 steal=0.0 guest=0.0 guest_nice=0.0
プラグインが正常に動作したらプラグインの設定を行う。
ここではCPU使用率80%でWARNING、90%以上でCRITICALの設定にする。
% sudo vi /etc/sensu/conf.d/check-cpu.json { "checks": { "check-cpu": { "command": "check-cpu.rb -w 80 -c 90", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"] } } }
intervalは監視間隔(秒)、refreshは一度アラート状態になったら事象が解決するまでこの間隔でアラート鳴らし続けてくれる。
設定ファイルを作成したらSensuクライアントを再起動する。
% sudo systemctl restart sensu-client
しばらくするとUchiwa上にcheck-cpuが現れる。
同じ要領でディスク監視やメモリ監視なども導入できる。
⦿ ディスク監視
ここではext4ファイルシステムの監視を行う。
% sudo sensu-install -p disk-checks % sudo vi /etc/sensu/conf.d/check-disk-usage.json { "checks": { "check-disk-usage": { "command": "check-disk-usage.rb -t ext4 -w 70 -c 80", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"] } } }
⦿ メモリ監視
ここではメモリ使用率(check-memory-percent)とスワップ使用率(check-swap-percent)を監視する。
% sudo sensu-install -p memory-checks % sudo vi /etc/sensu/conf.d/check-memory-percent.json { "checks": { "check-memory-percent": { "command": "check-memory-percent.rb -w 70 -c 80", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"] } } } % sudo vi /etc/sensu/conf.d/check-swap-percent.json { "checks": { "check-swap-percent": { "command": "check-swap-percent.rb -w 70 -c 80", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"] } } }
⦿ プロセス監視
ここではcronデーモンを監視する。
% sudo vi /etc/sensu/conf.d/check-proc-cron.json { "checks": { "check-proc-cron": { "command": "check-process.rb -p cron", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"] } } }
cronが停止したら再起動することもできる。
まず/etc/sudoersに以下を追加し、
sensu ALL=(ALL:ALL) NOPASSWD: ALL
“hooks”にcron停止時のコマンドを指定する。
% sudo vi /etc/sensu/conf.d/check-proc-cron.json { "checks": { "check-proc-cron": { "command": "check-process.rb -p cron", "interval": 60, "refresh": 180, "subscribers": ["all"], "handlers": ["slack"], "hooks": { "critical": { "command": "sudo systemctl start cron" } } } } }
通知設定
監視の設定ができたら次は通知の設定を行う。
監視結果はHandlerの仕組みを用いて様々な通知先を選択できる。ここではSlackに通知する。
Slackプラグインをインストールし、あらかじめ作成しておいたSlackのIncoming Webhookを指定する。
アイコンのURLはhttps://github.com/sensu-pluginsのSensuロゴを使用する。
% sudo sensu-install -p slack % sudo vi /etc/sensu/conf.d/handler-slack.json { "handlers": { "slack": { "type": "pipe", "command": "handler-slack.rb" } }, "slack": { "webhook_url": "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "icon_url": "https://avatars2.githubusercontent.com/u/10713628" } }
通知条件制御
通知には条件を付けられる。例えば特定の環境のみ通知、特定の時間帯のみ通知などが制御できる。
ここでは以下の2種類について設定する。
⦿ 商用環境(production)のアラートのみ通知する
% sudo vi /etc/sensu/conf.d/filter-prodction.json { "filters": { "production": { "attributes": { "client": { "environment": "production" } } } } }
⦿ メンテナンス時間帯(平日22:00〜翌9:00 および休日)以外通知する
% sudo vi /etc/sensu/conf.d/filter-live.json { "filters": { "live": { "attributes": { "timestamp": "eval: [1,2,3,4,5].include?(Time.at(value).wday) && Time.at(value).hour.between?(9,22)" } } } }
Filterの定義ができたら適用するHandlerに以下のように設定する。
% sudo vi /etc/sensu/conf.d/handler-slack.json { "handlers": { "slack": { "type": "pipe", "command": "handler-slack.rb", "filters": [ "production", "live" ] } }, "slack": { "webhook_url": "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "icon_url": "https://avatars2.githubusercontent.com/u/10713628" } }
このように、Sensuはプラグインを組み合わせて柔軟な監視ができるので、環境に応じて最適な監視システムを構築することができる。
参考サイト
- Sensu技術情報 (Qiita)
- Redis技術情報 (Qiita)
- RabbitMQ技術情報 (Qiita)
- Sensuで始めるクラウド時代のシステム監視 (@IT)
- Sensuで始めるクラウド時代のシステム監視 (gihyo.jp)