hidemium's blog

日々学んだことをアウトプットする。

ChefからSensuの監視定義を設定する

前回、ChefからDockerコンテナにSensu Serverをインストールすることができました。そこで、今回はSensuの監視定義として、CPU使用率監視、メモリ使用率監視、ログ監視、プロセス監視を設定してみました。

構成

Ubuntu 12.04: サーバ構築対象
Ubuntu 12.04はDocker 1.0.0上で動作しています。

Dockerコンテナ

前回作成したDockerコンテナを使用します。

Sensu ServerのChefレシピ

それでは、Sensuの監視定義をインストールするレシピについて見ていきます。

cookbookの構成

cookbookの構成は以下の通りです。

site-cookbook
└──sensu-server
      └──recipes
      │    └──default.rb
      └──templates
            └──default
                  ├──check_cpu.json.erb ... 監視動作定義ファイル(CPU使用率監視)
                  ├──check_memory_pcnt.json.erb ... 監視動作定義ファイル(メモリ使用率監視)
                  ├──check_log.json.erb ... 監視動作定義ファイル(ログ監視監視)
                  ├──checks_proc.json.erb ... 監視動作定義ファイル(プロセス監視)
                  ├──client.json.erb ... Sensu Clientの監視定義ファイル
                  ├──config.json.erb ... Sensu Serverの定義ファイル
                  ├──sensu.list.erb  ... リポジトリの定義ファイル
                  └──sensu-server.conf.erb ... supervisorの定義ファイル

recipesファイル

recipesファイルは以下の通りです。

$ vi site-cookbooks/sensu-server/recipes/default.rb
template "check_cpu.json" do
    path "/etc/sensu/conf.d/check_cpu.json"
    owner "root"
    group "root"
    mode "0644"
    source "check_cpu.json.erb"
end

template "check_memory_pcnt.json" do
    path "/etc/sensu/conf.d/check_memory_pcnt.json"
    owner "root"
    group "root"
    mode "0644"
    source "check_memory_pcnt.json.erb"
end

template "check_log.json" do
    path "/etc/sensu/conf.d/check_log.json"
    owner "root"
    group "root"
    mode "0644"
    source "check_log.json.erb"
end

template "checks_proc.json" do
    path "/etc/sensu/conf.d/checks_proc.json"
    owner "root"
    group "root"
    mode "0644"
    source "checks_proc.json.erb"
end

bash "sensu server restart" do
    code   "service sensu-server stop"
    action :run
end
  • Sensuの監視定義を有効にするため、Sensu Serverの再起動が必要となります。supervisorでSensu Serverプロセスのautorestartをオンにしているため、service sensu-server stopコマンドだけ実行しています。

templateファイル

templateファイルは以下の通りです。(監視定義のみ説明します。)*1

check_cpu.json

CPU使用率監視は、SensuのCommunity Pluginのcheck-cpu.rbを利用します。
上限警告値は-w、上限異常値は-cで設定します。
※bcコマンドを内部で使用しているため、予めインストールしておきます。

{
  "checks": {
    "check_cpu": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/system/check-cpu.rb -w 90 -c 100",
      "interval": 60,
      "occurrences": 5,
      "subscribers": ["default","sensu"]
    }
  }
}
check_memory_pcnt.json

メモリ使用率監視は、SensuのCommunity Pluginのcheck-memory-pcnt.shを利用します。
上限警告値は-w、上限異常値は-cで設定します。

{
  "checks": {
    "check_memory_pcnt": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/system/check-memory-pcnt.sh -w 90 -c 100",
      "interval": 60,
      "occurrences": 5,
      "subscribers": ["default","sensu"]
    }
  }
}
check_log.json

ログ監視は、SensuのCommunity Pluginのcheck-log.rb を利用します。
監視対象のログファイルは-f、監視文字列は-qで設定します。

{
  "checks": {
    "check_log": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/logging/check-log.rb -f /var/log/syslog -q test",
      "interval": 60,
      "occurrences": 5,
      "subscribers": ["default","sensu"]
    }
  }
}
checks_proc.json

プロセス監視は、SensuのCommunity Pluginのcheck-procs.rbを利用します。
監視対象のプロセスは-p、プロセス数の上限異常値/下限異常値は-C/-cで設定します。
プロセス数の上限警告値/下限警告値は-W/-wで設定します。

$ vi site-cookbooks/sensu-server/templates/default/checks_proc.json.erb
{
  "checks": {
    "sensu-rabbitmq-beam": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/processes/check-procs.rb -p beam -C 1 -w 4 -c 5",
      "interval": 60,
      "occurrences": 2,
      "refresh": 300,
      "subscribers": [ "sensu" ]
    },
    "sensu-rabbitmq-epmd": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/processes/check-procs.rb -p epmd -C 1 -w 1 -c 1",
      "interval": 60,
      "occurrences": 2,
      "refresh": 300,
      "subscribers": [ "sensu" ]
    },
    "sensu-redis": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/processes/check-procs.rb -p redis-server -C 1 -w 4 -c 5",
      "interval": 60,
      "occurrences": 2,
      "refresh": 300,
      "subscribers": [ "sensu" ]
    },
    "sensu-api": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/processes/check-procs.rb -p sensu-api -C 1 -w 4 -c 5",
      "interval": 60,
      "occurrences": 2,
      "refresh": 300,
      "subscribers": [ "sensu" ]
    },
    "sensu-dashboard": {
      "handlers": [
        "default"
      ],
      "command": "/etc/sensu/plugins/processes/check-procs.rb -p sensu-dashboard -C 1 -w 1 -c 1",
      "interval": 60,
      "occurrences": 2,
      "refresh": 300,
      "subscribers": [ "sensu" ]
    }
  }
}

Chefレシピの実行

Dockerコンテナのポート番号を確認します。

$ sudo docker ps -a
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS                    PORTS                                                                                                                        NAMES
b245647afb46        ubuntu-supervisor:12.04               supervisord -n         27 minutes ago      Up 27 minutes             0.0.0.0:4567->4567/tcp, 0.0.0.0:5672->5672/tcp, 0.0.0.0:15672->15672/tcp, 0.0.0.0:[ポート番号]->22/tcp, 0.0.0.0:8080->8080/tcp     drunk_mayer

Sensu ServerのChefレシピを流します。
Chefを実行する時は、22番ポートにフォワードされているポート番号を指定します。

$ vi nodes/<IPアドレス>.json
{
  "run_list": [
    "recipe[sensu-server]"
  ]
}
$ knife solo bootstrap root@<IPアドレス> -p [ポート番号]

Sensu Serverの管理画面

Sensu Serverの監視定義が反映されていることを確認するため、「http://<サーバのIPアドレス>:8080」にアクセスし、Sensuのダッシュボードに接続します。ダッシュボードの「Checks」をクリックし、監視定義が表示されることを確認します。

f:id:hidemium:20140708024238p:plain

おわりに

Sensu Serverに監視定義を設定することができました。基本的な監視定義ができたので、今後SensuのCommunity Pluginでどのような監視が可能か見てみようかと思います。

*1:SensuのCommunity Pluginの使用方法について、ドキュメントがあまり見つからなかったため、コード内に書かれた説明を参考にしました。