こんちわ、パッションの伝道師、鰯です。 本日は、弊社でも導入が進んできた、fluentd を、ちゃんと監視しましょうということで、monitor_agentプラグインで、取得できるメトリクスを、ちゃんと監視サーバへ送るためのTipsを紹介。

1. monitor_agent プラグインを設定

monitor_agentプラグインの設定はドキュメントを参考にして、一応、ローカルのみのアクセスにして設定

2. monitor_agent プラグインのメトリクスを取得

まずは、どんな項目が取得できるのか確認してみましょう

上記のような感じで、アウトプットバッファなプラグインには、以下のような項目があり、これを監視対象として追加します “retry_count”: 0 “buffer_total_queued_size”: 0 “buffer_queue_length”: 0 弊社では、AWS環境でCloudWatchを利用しているので、CloudWatchへ定期的に取得した値をカスタムメトリクスとして追加しようと思います。

3. CloudWatchへカスタムメトリクスを追加

すでにカスタムメトリクスとしては、Amazon CloudWatch Monitoring Scripts for Linux を利用していたので、ゼロから CloudWatch に追加するものを作るのは、面倒なので、このスクリプト自体を拡張して、fluentdのメトリクスも送れるようにしましたので、そのパッチを公開しておきます。 Amazon CloudWatch Monitoring Scripts for Linux を入れると、こんな感じなので、定期的にメトリクスを送る、mon-put-instance-data.pl にパッチを適用します。

解凍した CloudWatch Monitoring Scripts へ、gist から直接パッチを当てちゃいます、こんな感じで

内容は以下、それと monitor_agent のjsonレスポンスをパースするため、JSON のモジュールを入れているので、CPANからなど入れておいてください、AmazonLinuxだとperl-JSONのrpmがあったので、yumから入れてました。

--- mon-put-instance-data.pl.orig	2014-03-09 20:42:45.106610966 +0900
+++ mon-put-instance-data.pl	2014-03-09 23:26:34.075877884 +0900
@@ -31,6 +31,7 @@
   --disk-space-util   Reports disk space utilization in percentages.  
   --disk-space-used   Reports allocated disk space in gigabytes.
   --disk-space-avail  Reports available disk space in gigabytes.
+  --fluentd=HOST:PORT Reports output buffer_queue_length, buffer_total_queued_size, retry_count.
   
   --aggregated[=only]    Adds aggregated metrics for instance type, AMI id, and overall.
   --auto-scaling[=only]  Adds aggregated metrics for Auto Scaling group.
@@ -104,6 +105,7 @@
 my $report_disk_util;
 my $report_disk_used;
 my $report_disk_avail;
+my $report_fluentd;
 my $mem_used_incl_cache_buff;
 my @mount_path;
 my $mem_units;
@@ -142,6 +144,7 @@
     'disk-space-util' => \$report_disk_util,
     'disk-space-used' => \$report_disk_used,
     'disk-space-avail' => \$report_disk_avail,
+    'fluentd:s' => \$report_fluentd,
     'auto-scaling:s' => \$auto_scaling,
     'aggregated:s' => \$aggregated,
     'memory-units:s' => \$mem_units,
@@ -446,6 +449,31 @@
   }
 }
 
+# collect fluentd metrics
+
+if ($report_fluentd)
+{
+  use JSON;
+  my $fluent_plugins = `curl -s http://$report_fluentd/api/plugins.json`;
+  $fluent_plugins = decode_json($fluent_plugins);
+
+  foreach my $plugin (@{ $fluent_plugins->{'plugins'} }) {
+    next if !exists($plugin->{'buffer_queue_length'});
+
+    add_metric(
+      'BufferQueueLength', 'Count', $plugin->{'buffer_queue_length'}, '', '', $plugin->{'type'}
+    );
+    add_metric(
+      'RetryCount', 'Count', $plugin->{'retry_count'}, '', '', $plugin->{'type'}
+    );
+    add_metric(
+      'BufferTotalQueuedSize', 'Megabytes', $plugin->{'buffer_total_queued_size'} / MEGA, '', '', $plugin->{'type'}
+    );
+  }
+
+}
+
+
 # send metrics over to CloudWatch if any
 
 if ($mcount > 0)
@@ -561,12 +589,14 @@
   my $value = shift;
   my $filesystem = shift;
   my $mount = shift;
+  my $plugin = shift;
   my $dcount = 0;
 
   my %dims = ();
   my %xdims = ();
   $xdims{'MountPath'} = $mount if $mount;
   $xdims{'Filesystem'} = $filesystem if $filesystem;
+  $xdims{'Plugin'} = $plugin if $plugin;
 
   my $auto_scaling_only = defined($auto_scaling) && $auto_scaling == 2;
   my $aggregated_only = defined($aggregated) && $aggregated == 2;

4. CloudWatchで監視する

使い方としては、--fluentd のオプションに、fluentdのホストとポートを指定すればOKです、これをCronとかに仕込んでおけば、あとは追加されたメトリクスをCloud Watchで確認するだけです

CloudWatchではこんな感じで、各プラグインごとに、RetryCount, BufferTotalQueuedSize, BufferQueueLength を取得できるようにしてます、ここからアラートやAutoScalingの設定すればいい感じですね! cloud-watch-fluentd-monitor_agent それでは良いfluentdライフを!! 参考:『fluentd の監視エージェントを動かしてみた

あわせて読みたい記事