[小ネタ]fluent-plugin-aws-elasticsearch-serviceにて、重複行を登録させない設定

fluentd

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

fluent-plugin-aws-elasticsearch-serviceを利用してAmazon Elasticsearch Serviceへログを登録している環境があります。この環境でログを再送した時に同じログが数十件登録されました。具体的には、2万件ほどリダイレクトでログを書き込んでみたところ、同じログが10行から15行程登録されていました。これは困った。

ということで、ログを重複させない方法を調査してみました。

どうやるの?

まず前提として、Elasticsearchには_idというフィールドが有り、ドキュメントの一意なIDとなります。このフィールドに一意なIDを指定することで重複を避けられそうです。(同じIDが送信された場合上書きされます) そしてログに一意なID、request_idを追加しておきます。この一意なrequest_idを、ドキュメントのID_idに指定することで、同じrequest_idが送信された場合、上書きされるので、結果重複行をなくすことができそうです。

ログの例

{"timestamp":"2016-07-31T09:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-111","msg":"test1"}
{"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-222","msg":"test2"}
{"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-333","msg":"test3"}

設定

fluent-plugin-aws-elasticsearch-serviceにはid_keyというパラメータが有ります。ここに、ESのフィールドを指定できるので、今回の例のログで一意なrequest_idを指定します。

<source>
  type tail
  path xxx.log
  pos_file xxx.pos
  format json
  tag aws-es
</source>

<match aws-es>
  type "aws-elasticsearch-service"
  type_name "xxx"
  index_name xxx
  id_key request_id
  flush_interval 60s
  resurrect_after 5s
  reload_connections false

  <endpoint>
    url https://xxxx.ap-northeast-1.es.amazonaws.com
    region ap-northeast-1
  </endpoint>
</match>

ログをputしてみる

20160831-fluentd-es-key-1

request_id_idとして登録されていることが確認できました!

最後に

これで重複登録が避けられそうです。基本的なことかもしれませんが、ログに一意なIDがある場合は、id_keyを指定したほうがよさそうです。 それでは、また。

参考

https://github.com/uken/fluent-plugin-elasticsearch