実際にfluentdを使う場合には、ここまで紹介してきたようなfluentdの内部仕様を正しく理解した上で、ログをロストせず、確実にログ管理ができるよう運用していかなければなりません。そのためには、fluentdの稼働状況を把握することが非常に重要です。
「fluentdのプロセスが正常に稼働しているか」「fluentd自体のログにエラーログが出力されていないか」といった基本的な状態監視に加え、fluentdの内部状態を把握することも有効です。
fluentdには「in_monitor_agent」というfluentdの内部状態を監視するための標準組み込みインプットプラグインがあります。この章ではin_monitor_agentプラグインを使ってfluentdの内部状態を監視する方法について紹介します。
in_monitor_agentを使うには、設定ファイルに以下の設定を加えます。
・設定例
<source> type monitor_agent bind 0.0.0.0 port 24220 </source>
この設定を記述することで、指定したIPアドレスとポートでWebサーバーが稼働し、fluentdの内部情報を参照できるようになります。後は以下のURLにアクセスすることで内部情報が取得できます。
フォーマット | URL |
---|---|
テキストフォーマット | http://fluentd稼働サーバーのIP:24220/api/plugins |
JSONフォーマット | http://fluentd稼働サーバーのIP:24220/api/plugins.json |
また、URLのGETパラメーターとして「tag」や「type」を指定し、必要な情報だけを取得することも可能です。具体的には以下のような情報を得ることができます。
{ "plugins": [ { "config": { "port": "24220", "type": "monitor_agent" }, "output_plugin": false, "plugin_id": "object:3fad2a73a00c", "type": "monitor_agent" }, { "config": { "format": "apache", "path": "/var/log/httpd/access_log", "pos_file": "/var/log/td-agent/tmp/access.log.pos", "tag": "apache.access", "type": "tail" }, "output_plugin": false, "plugin_id": "object:3fad2c7e35ec", "type": "tail" }, { "buffer_queue_length": 3, "buffer_total_queued_size": 12059, "config": { "buffer_chunk_limit": "1m", "buffer_path": "/tmp/fluent.*.buffer", "buffer_queue_limit": "3", "retry_limit": "5", "retry_wait": "30s", "type": "forward" }, "output_plugin": true, "plugin_id": "object:3fad2c7e24a8", "retry_count": 4, "type": "forward" } ] }
この例の場合、fluentdは2つのインプットプラグインと1つのアウトプットプラグインと共に稼働していて、バッファーにログデータが蓄積されていることが分かります。
バッファーの状況については、以下の表の3つの値が取得できます。ログをロストしないよう、バッファプラグインの設定に合わせてそれぞれチェックが必要です。
メトリクス | 概要 | チェックすべき項目 |
---|---|---|
buffer_queue_length | バッファーに蓄積されているキューの数 | buffer_queue_limitで設定した値を超えるとログデータがロストするので注意 |
buffer_total_queued_size | バッファーに蓄積されている合計サイズ | buffer_queue_limit×buffer_chunk_limitの値を超えるとログデータがロストするので注意 |
retry_count | 再送を試みた回数 | retry_limitで設定した回数を超えるとバッファーがリセットされるので注意 |
in_monitor_agentで監視できるバッファーに関するメトリクス |
以下は、OSSの監視ツールである「Zabbix」でバッファーの内部情報を監視した例です。
この例では、Zabbixによって以下のRubyスクリプトを定期実行し、fluentdの内部情報をそれぞれ取得しています。
#!/bin/env ruby require 'net/http' require 'rubygems' require 'json' host, port, type, tag, metric = ARGV response = Net::HTTP.start(host, port) do |http| http.get("/api/plugins.json?tag=#{tag}&type=#{type}") end body = JSON.parse(response.body) body['plugins'].each do |plugin| if plugin['output_plugin'] p plugin[metric] break end end
これにより、「ログの転送が不安定で、送信できなかったログデータがバッファーに蓄積されてしまっている」などの傾向を監視することができます。
ここまで3回に渡って、fluentdの基本から活用例まで紹介してきました。その柔軟さ故に、システムの安定稼働を実現するために便利に活用できることがお分かりいただけたでしょうか。
fluentdでは、さまざまな用途向けのプラグインが多数公開され、その組み合わせにより幅広い環境で適用できます。逆にいうと、fluentdを有効に使うには、ログ管理の要件に応じてどのようにプラグインを活用するかの設計が重要ポイントとなります。
柔軟性に富んでいるだけでなく、fluentdのコアでは、ログデータをロストすることなく安定して管理するための仕組みも充実しています。こういった側面からも利用できるシーンが多いのではないかと思います。
ご存じの通り、「ログ」には非常に重要な情報が数多く含まれています。その管理をこれまでのように人力で頑張る代わりに、fluentdを用いてプログラム化し、高機能な管理を実現してみてはいかがでしょうか。
池田大輔
Twitter : @ike_dai
TIS株式会社戦略技術センター所属。社内向けシステムの保守運用業務を経験後、クラウド時代の効率的な統合運用管理をテーマに活動中。特に、OSSを駆使した運用のエコシステム実現を目指し、fluentdなどの導入や検証に取り組む。TIS戦略技術センターでは、技術検証成果などを技術ブログ『Tech-Sketch』にて発信中。著書:『Zabbix統合監視徹底活用 - 複雑化・大規模化するインフラの一元管理』
Copyright © ITmedia, Inc. All Rights Reserved.