LoginSignup
0
1

More than 3 years have passed since last update.

herokuからlogをtd-agentで取得しようとしたときハマった時の記録

Posted at

仕事の関係で、herokuで稼働しているアプリのログデータをheroku-td-agentを使って収集する必要があった時にハマったことや、どうやって凌いだかを記録として残します。

概要

仕事の内容上、詳細は省くが、概要は以下の様である。
・heroku上で稼働中のAPIのログをheroku drainでtd-agentに送信させる。
・td-agentで受け取ったログをフイルタリングしてログの取捨選択をする。
・選択したログからパーサーを使って整形を行う。
・整形したログをTreasuredataのデータベースに書き込む。

問題の始まり

ここで問題になったのが、まずherokuからのログ取得時のdrain。
heroku-td-agentがheroku上ではアプリとして稼働するためsyslogで取得ができない。
何せ、ポート番号がherokuから自動設定されるためtd-agent(Fluentd)で定番の24224など設定できない。
そこで、heroku drainで設定する場合

$ heroku drains:add https://heroku-td-agentのアプリ名のURL -a ログを取得したいheroku上のアプリ名

とhttps経由で送信できる様にする。

バージョン問題

次に、問題になったのがheroku-td-agent。
実は、そのままherokuにデプロイすると、heroku-td-agentのGemfileで設定してあるRubyのバージョンが問題になってデプロイが失敗する。
解決方法はGemfileに記載されているRubyのバージョンをできるだけ新しいバージョンに書き換えること。
私の場合、2.6.5にしました。(ローカルで使っているMacの環境が2.6.5でしたので)

td-agentの問題

herokuからhttps経由でログを取得するにあたり、"heroku-syslog-http"というinput用のプラグインを入れることにしました。
これは、herokuからsyslogを取得する方法色々と調べているうちに知り得た知識でした。
因みに、in_httpプラグインでログの取得もしましたが、不必要なログも大量に表示される羽目になったため、上記プラグインを使うことを決めました。が、ここで問題がまた発生。
heroku-td-agentで使用されているfluentdのバージョンが古くてプラグインが利用できないことが発覚。
そこで、今度はGemfileで記述されているfluentdのバージョンを新しいものに変更。
もうこの時点で安定版(td-agent)という謳い文句捨てました、はい。

tagが無い

デプロイもできた、ローカルへのデータ送信も可能になったと喜んでいましたが、一つ問題が。
tagが無いことが発覚しました。

<source>
@type tail
port 80
bind 0.0.0.0
tag foo
</source>

など設定するとログにtag情報が載るものですが、"heroku_syslog_http"を使うとtagが設定できないという問題が発生しました。
tagなくても問題は無い様ではありますが、この後のパースなどの処理に支障をきたすのは必至です。
そこで、今度は"rewrite-tag-filter"をインストールすることになりました。

tag無き者はtagにあらずか!?


<match **>
@type rewrite_tag_filter
<rule>
key message
pattern [tagを付加するターゲットのログを指摘する正規表現]
tag td.foo.bar
</rule>
</match>

当初、どんなタグにも反応する様にとmatchの設定を"**"にしておりましたすが、これが一向に反応しません。
ログデータには、
 [time]\t[ここにtagが入るスペース]\t{・・・}
という形式で、tagが無いだけのフォーマットだったんですが、tag情報が無いためかmatchが反応しません。

打開策

TDに問い合わせたところ次の様な回答をいただきました。

<match *>

これは気が付きませんでした。ついでに言うと何処のページにもこの策の記載が見当たりませんでした。

<match *>
@type rewrite_tag_filter
<rule>
key message
pattern [tagを付加するターゲットのログを指摘する正規表現]
tag td.foo.bar
</rule>
</match>

上記の様に書き直したところ、ログデータにtd.foo.barと言うtag情報が載る様になりました。
ここまで来れば他の方が書かれている様にデータの取捨選択や編成が可能になります。

以上、heroku-td-agentを導入するにあたりハマった経緯と対処方法でした。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1