fluentdでshadow proxy

fluentdでshadow proxy


shadow proxyを実現したい。いろんな方法があるみたいで、nginxなんかはモジュールでshadow proxyができる。

nginx.org

この他にもあるんですが、現状の構成を変えずに実現したいと調べたところ、fluentdでログを読んでリクエストを再生成する方法があるようで、これをやってみる。
qiita.com

shadow proxyって

何だって話を。普通HTTPでproxyっていうと、受け取ったリクエストをそのままだったり、ちょっと加工したりして、バックエンドの別のHTTPサーバへ流す機能のこと。
バックエンドが返したレスポンスをもともとリクエストをだしたところへ返す役割もある。shadow proxyでは、受け取ったリクエストを稼働しているバックエンドに流してレスポンスを受け取るのと別に、テスト機にリクエストを流す。レスポンスは受け取らない(受け取ってるだろうけど無視)。アプリケーションの試験に利用したりするみたい。

rubyをインストール

fluentdはruby上で動作していて、ruby2.1以上が必要。ところが、RHELyumでインストールされるrubyは1.9。使えません。まずはrubyをソースからインストール。
ソースはここ。

www.ruby-lang.org

tarballを展開して、configure,make,make install.

fluentdをインストール

gemでインストールできます。

# gem install fluentd

fluentdのプラグイン fluentd-plugin-http_shadow をインストール

これもgemでインストール。

# gem install fluentd-plugin-http_shadow 

fluentd の初期セットアップ

ディレクトリはどこでもいいんですが、以下を実行。

# fluentd --setup ./fluent

そうすると、指定したディレクトリが作成されて、そのディレクトリ以下にfluentd.confが作成されます。

設定

作成されたfuentd.confを編集。まずはsource(入力ソース)を指定。本エントリの場合はapacheのログです。

まず入力を指定
<source>
  @type tail
  format apache2
  time_key log_time
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/httpd/httpd_access_%Y%m%d.log
  pos_file /var/log/td-agent/access.pos
  tag http_shadow
</source>

"path"にログのパスを記述。ファイル名が日毎に違うので、上記のように日付と時間が展開されるように指定。
"tag"がこのsourceから入ってきたデータですよーってこと。

出力を指定

出力はさっきいれたプラグインのshdow proxy。
こんな感じ。

<match http_shadow>
  @type http_shadow
  host "172.18.12.71"
  host_key host
  path_format ${path}
  method_key method
  max_concurrency 10
  retry_limit 1
  timeout 10
  rate 100
</match>

"host"がリクエストを投げる先。

フィルタを設定

どうもrequest methodに"-"が入っていると止まっちゃうみたい。
フィルタを書きます。このフィルタを通り抜けたのもだけ、match(出力)に流れます。

<filter http_shadow.example>
  @type grep
  <regexp>
    key method
    pattern /(GET|PUT|POST|HEAD|OPTIONS)/
  </regexp>
</filter>

これでなんとなく動作しているんだけど、全部リクエストが行っているような気がしない。ちょっと(いや、だいぶ)端折られているような。
まだ調整が必要