システムの監視を行うために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]Sensuインストール手順