Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

IPアドレスを元に位置情報をリアルタイムに付与する fluent-plugin-geoip v0.0.1をリリースしました #fluentd

FluentdのレコードにあるIPアドレスを元に位置情報を付与するプラグインをリリースしました!
これを使えば、Maxmind社の提供するGeoIPというデータベースを利用してリアルタイムに位置情報を付与できます。

パフォーマンスを重視するため、BufferedOutputをベースに、GeoIPのC拡張を利用した設計としました。

y-ken/fluent-plugin-geoip

それでは早速使い方の紹介を行います。

使い方

インストール方法

# fluentdをシステム側に入れている場合
$ gem install fluent-plugin-geoip

# td-agentを使っている場合
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-geoip

設定例

<source>
  type forward
</source>

<match test.geoip>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type geoip

    # IPアドレス判定に使うキーの名前を指定
    geoip_lookup_key     host

    # 判定結果を何というキーでハッシュにマージするか指定
    enable_key_city      city
    enable_key_latitude  lat
    enable_key_longitude lon

    # マージ後のタグの付け替え指定
    remove_tag_prefix    test.
    add_tag_prefix       debug.

    # 何秒おきにバッファしたレコードを処理するか指定
    flush_interval       5s
  </store>
</match>

<match debug.**>
  type stdout
</match>

動作テスト

echo '{"host":"66.102.9.80","message":"test"}' | fluent-cat test.geoip

以下のように位置情報が付与されます。

debug.geoip: {"host":"66.102.9.80","message":"test","city":"Mountain View","lat":37.4192008972168,"lon":-122.05740356445312}

いきさつ

良くありそうな質問

どのような位置情報をサポートしているの?

geoip-cで扱えるものは使えるようにしています。
https://github.com/mtodd/geoip

また、より詳細な利用例に関しては、本プラグインのリポジトリをご参照ください。
https://github.com/y-ken/fluent-plugin-geoip

データが取れなかった場合の値は?

nil です。

同封されている GeoIPデータベースの出所は?

CCライセンスに基づき、GeoLite Cityの無料ダウンロード版を同封しています。
http://dev.maxmind.com/geoip/legacy/geolite/

有料版のGeoIP City Databaseを使うとより高精度になるってホント?

はい。geoip_databaseというオプションで次のように指定することでより高精度な位置情報検出が利用できます。 geoip_database /path/to/GeoIPCityjpw.dat

設定ファイルの記述方法

enable_key_○○ という設定は改善の余地はあると思います。
良いアイディア有れば是非、例と共にご指摘ください。

今後

欲しい機能・不具合等がございましたら、お気軽にフィードバックをお寄せ下さい。
pull-req大歓迎です。