仕事の関係で、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を導入するにあたりハマった経緯と対処方法でした。