tjinjin's blog

さらなる高みに1nmずつ近づくブログ

mackerelを使ってあれこれ監視してみた

mackerelを使って、もろもろ監視してみたお話です。実装の話がメインになるので、概要を知りたい方は公式ページをご覧下さい。閾値とかアラートについては一旦無視します。

mackerel-agentの導入

mackerel-agentを導入することで主なリソース情報を取得することが可能です。

mackerel-agentで取得できる情報

そのホストの死活監視及び下記リソースの情報が取得できます。

  • loadavg
  • cpu
  • memory
  • disk
  • interface
  • filesystem

mackerel-pluginでAWSの情報を取得する

公式のpluginが多数用意されています。go言語で書かれていて、ほしいものがなければ自作してPR出すといいみたいです。今回はあるものは使おうという方針です。メリットとしては、とても簡単に導入できることです。mackerel-pluginを導入して設定ファイル内に指定の情報を書くだけですね。デメリットとしては、CloudWatchで取得できる項目を全て取得している訳ではないこと、サービスメトリクスではなくてカスタムメトリクスになってしまい、そのホストの属性と見なされることですね。ELBなどはあるホストに1:1で紐づく情報ではないので、サービス全体の情報として扱いたいところです。fluentdを使うことでサービスメトリクスにすることは可能です。

導入方法

mackerel-agent-pluginsを導入して、設定ファイルを直すだけです。chefだと1行書くだけで導入できます。

include_recipe ""

package 'mackerel-agent-plugins'
.
.
.

pluginで取得できる情報(一部)

RDS

* CPUUtilization
* DatabaseConnections
* FreeStorageSpace
* Freeable Memory
* IOPS
* Latency in second
* Network Throughput
* Replica Lag
* Swap Usage
* Throughput

ELB

* ELB Healthy Host Count
* ELB Unhealthy Host Count
* Whole ELB HTTP Backend Count
* Whole ELB Latency

ElastiCache

* CPUUtilization
* Command
* Connections
* Evicitons
* Freeable Memory
* Hits/Misses
* Items
* Network Traffic
* Swap Usage
* Traffics

設定ファイルは下記のようになります。chefを使っているので、一部erbの形式になっています。サーバに適用される際には、実際の値になっています。

 # Plugin for AWS ELB
[plugin.metrics.aws-elb]
command = "/usr/local/bin/mackerel-plugin-aws-elb"

# Plugin for Amazon RDS
[plugin.metrics.aws-rds]
command = "/usr/local/bin/mackerel-plugin-aws-rds -identifier=<%= @rds_name %>"

# Plugin for Elasticsearch
#   By default, the plugin accesses Elasticsearch on localhost.
[plugin.metrics.elasticache]
command = "/usr/local/bin/mackerel-plugin-aws-elasticache -elasticache-type=redis -cache-cluster-id=<%= @elasticache_name %>"

sensu community-pluginsを利用する

用意されているプラグインでは足りない部分が出てきます。goで作ったり、独自にスクリプトを書くのもいいのですが、時間がない場合は既存の資産をなるべく使いたいものです。mackerelはsensuのプラグインと互換性があるようなので、今回使ってみました。Ruby製なので、goに慣れない方がsensuのプラグインを書いてもいいかもしれません。1点注意があって、メトリクスの取得なのか監視なのかによって定義ファイルの書き方を違うので、注意しましょう(少しハマりました)また、ドキュメントが充実してないので、各pluginの使い方はソースコード見て理解する必要があります。

導入方法

  • 今回使ったのはfluentdとssl証明書の部分だけにしました。unicornとかが使えそうだったのですが、gemがないと怒られて面倒になったので辞めました。chefでgit cloneしてくれば使えます。
git '/opt/sensu-community-plugins' do
  repository 'https://github.com/sensu/sensu-community-plugins'
  action :checkout
end

execute 'cd /ropt/sensu-community-plugins;bundle install --path=vendor/bundle'

directory '/opt/scripts'
fluentd自体の監視

fluentdはmonitを使って自動起動しているのですが、一応監視をしておこうということで監視しています。最初にfluentdでmonitor agentを利用できるようにしておきます。

<source>
  type monitor_agent
  bind 0.0.0.0
  port 24220
</source>

sensuのpluginを使い、td-agentを監視させます。

bundle exec plugins/fluentd/check-fluentd-monitor-agent.rb --m retry_count -w 50 -c 100
[plugin.checks.td-agent]
command = "/opt/scripts/td-agent_check.sh"

生死を監視できればよいので、とりいそぎretry_countを監視させています。(もっといい方法あるはず)

証明書の有効期限

SSL証明書の期限が迫るとアラートが通知されます。ここではチェックプラグインの仕様に合わせて、終了コードが返却されます。

 [plugin.checks.ssl]
command = "/root/scripts/ssl_check.sh"
bundle exec plugins/ssl/check-ssl-host.rb -h <ホスト名> -p 443 -w 60 -c 30

60日を切るとwarning、30日を切るとcriticalとなります。

独自に作成する

自分で作ったシェルスクリプトを使ってみる

sensuのpluginとか使えるかなと試したのですが、うまく行かなかったので、一部自分で作成してみました。今回はnginxのプロセス数を監視しています。

[plugin.metrics.nginx_process]
command = "ruby /opt/ydf-scripts/get_nginx_process.rb"
if ENV['MACKEREL_AGENT_PLUGIN_META'] == '1'
  require 'json'

  meta = {
    graphs: {
      'nginx' => {
        label: 'nginx process',
        unit: 'integer',
        metrics: [
          {
            name: 'process',
            label: 'process'
          }
        ]
      }
    }
  }

  puts '# mackerel-agent-plugin'
  puts meta.to_json
  exit 0
end

process_count = %x(pgrep -fc ^nginx).chomp

puts [ 'nginx.process',  process_count, Time.now.to_i ].join("\t")

最初の部分はmackerelのグラフを定義しています。実際のプロセスを取得している部分はprocess_countの部分だけですね。取得したデータを最後のputsでmackerelのメトリクスにあった形式で出力しています。詳しくはこちらを参照してください。

fluentdを使ってメトリクスを取得する。

公式のドキュメントにもありますが、fluentdを使ってメトリクスを渡してあげることでサービスメトリクスとして、データを扱うことができます。こちらについては、公式ドキュメントをご覧いただだければと思います。