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

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