仕事の関係で、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が無いことが発覚しました。
`
以上、heroku-td-agentを導入するにあたりハマった経緯と対処方法でした。