雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

sensuのおれおれベストプラクティス

sensuを導入してみました。 で、その導入時に困ったのが、subscriptionsのグルーピング設計や設定ファイルの置き方なんですね。 ネットの情報を見ててもインストールしてみたーや他のサービスとの連携だったりがまとまっていて、実際にどのように設定しているのかは全然まとめられてなかったわけです。

なので自分なりに考えて試行錯誤しながらまとめたわけですが、せっかくなので公開してみたいと思います。

ただし、これが正解とは思ってなくて、環境毎に最適解があると思うので、あくまで参考程度としてくださいねw

環境

  • EC2上でsensu-server、sensu-clientともに構築
  • OSはsensu-serverがAMI、sensu-clientoはAMI、CentOSUbuntuが混在
  • sensuのバージョンは0.14

ディレクトリ/ファイル構成

/etc/sensu/
├── conf.d
│   ├── checks ※checksの設定ファイルの設置ディレクトリ
│   │   ├── mysql ※subscriptions毎にディレクトリを切っている
│   │   │   ├── check_status_mysql.json ※「check_」で始まるファイルは監視用設定ファイル
│   │   │   └── metrics_mysql.json ※「metrics_」で始まるファイルはメトリック収集用の設定ファイル
│   │   ├── nginx
│   │   │   └── check_proc_nginx.json
│   │   └── resource
│   │       ├── check_disk.json
│   │       ├── check_load.json
│   │       ├── check_swap.json
│   │       ├── check_users.json
│   │       ├── metrics_cpu.json
│   │       ├── metrics_disk_usage.json
│   │       ├── metrics_load.json
│   │       ├── metrics_memory.json
│   │       └── metrics_network.json
│   ├── extensions ※extensionsの設定ファイルの設置ディレクトリ
│   ├── handlers ※handlersの設定ファイルの設置ディレクトリ
│   │   ├── default.json
│   │   ├── graphite.json
│   │   └── mailer.json
│   └── mutators ※mutatorsの設定ファイルの設置ディレクトリ
│       └── graphite.json
├── config.json
├── extensions ※extensionsで利用するスクリプトの設置ディレクトリ
├── handlers ※handlersで利用するスクリプトの設置ディレクトリ
│   └── mailer.rb
├── mutators ※mutatorsで利用するスクリプトの設置ディレクトリ
│   └── graphite.rb
├── plugins ※checksで利用するスクリプトの設置ディレクトリ
│   ├── check-disk.rb
│   ├── check-load.rb
│   ├── check-procs.rb
│   ├── check-swap-percentage.sh
│   ├── check-users.sh
│   ├── cpu-pcnt-usage-metrics.rb
│   ├── disk-usage-metrics.rb
│   ├── load-metrics.rb
│   ├── memory-metrics.rb
│   ├── mysql-alive.rb
│   ├── mysql-graphite.rb
│   └── netif-metrics.rb
└── ssl ※rabbitmqとの通信用SSLファイル
    ├── cert.pem
    └── key.pem

subscriptionsの構成

サービス毎にグルーピングするようにしています。 例えば、nginxに関することは全てnginxに含めます。監視もメトリクスもです。

設定ファイルはsubscription名ごとにchecks以下にディレクトリを作成してまとめます。

  • 例) nginxの場合
/etc/sensu/conf.d/checks/nginx/ 以下

ちなみにディレクトリを分けた目的は、視認性をよくするためです。 最初は分けずに全てのchecks以下にまとまて置いていましたが、設定ファイルが多くなると、設定ファイル編集時に対象のファイルを探すのが手間になってきまして。名前も似たようなのがあってわかりづらいですし。

plugins

こちらは全て「/etc/sensu/plugins/」以下に置いています。こちらもchecks以下と同様にディレクトリを分けることも考えたのですが、

  • 複数のsubscriptionsで使うpluginも存在する(例えばポートチェック)
  • checks設定時に実行するプライングのパスをcommandで指定するのですが、pluginsをパスの起点としているので、ディレクトリを掘るとそのディレクトリも設定に書く必要があるため
  • そもそもディレクトリを分けるメリットがあまりない(checksをファイルを編集する可能性がありますが、plugins以下に置くファイルは頻繁に編集することは考えづらいため)

といった理由から一括でまとめて置いています。

clientsを追加するとき

clientsを追加するときは、以下の作業をします。

  1. sensuをインストールする
  2. /etc/sensu/plugins/ 以下にプラグインを設置する(自分の場合はsensu-serverに置いてあるpluginsを全てclientsにそのまま同期するようにしています。本来であればそのclientで利用する監視のプラグインが置いてあればよいですが、わざわざ選別するのも手間ですし、全て置くことのデメリットも見当たらなかったためです。)
  3. config.jsonを設置する(詳細は後述)
  4. sensuを起動する

上記を実施すればよいだけです。ただ、いくら手順がそれほどないとはいえ毎回クライアント追加時に手動で実行するのは手間なので、自分の場合はAnsibleで自動化しています。 (余談ですが、sensuの素敵なところは、AnsibleやChefといった自動構成ツールとの相性がよいことだと思います)

config.jsonの設定項目

config.jsonについては環境毎にどのような監視をするか異なる場合があるため、使い回すことができないかと思います(スケールアウトするときはそのまま使いませますが)

とはいえそれほど設定項目はありません。以下のconfig.jsonの以下の値を調整すればOKです。

  • name
    • サーバの名前を設定します
  • address
  • subscriptions
    • サーバの監視項目を設定します

閾値の設定について

閾値は環境によって変更する可能性があることを考慮して、全てconfig.jsonによって環境別の設定をできるようにしています。 例えば、config.jsonには以下の設定をしています。

    "resource": {
      "load_warn": "5,3,3",
      "load_crit": "10,6,6",
      "disk_warn": 70,
      "disk_crit": 80,
      "swap_warn": 90,
      "swap_crit": 70,
      "users_warn": 20,
      "users_crit": 50
    }

上記はresource subscriptionで設定している監視の閾値設定となります。例として、「load_warn」はロードアベレージのワーニングの閾値設定、「disk_crit」はディスク使用率のクリティカル閾値設定を意味します。

環境によって異なる設定について

閾値と同様に環境によって異なる設定も各クライアントのconfig.jsonで設定するようにしています。MySQLの接続情報などはそうですね。

    "mysql": {
      "host": "localhost",
      "user": "example",
      "password": "example",
      "port": "3306",
      "database": "exampledb"
    },

さいごに

言葉だけだとうまくまとめられている自信がないので、Githubにサンプルをおいておきます。設定ファイルの中身は実際に見てもらえればと。

なお、格納されているプラグインsensu-community-pluginsから一部拝借しているものです。

近いうちにAnsibleのplaybookもあげようかと思ってます。