Graylogのgeolocationをgeo_pointに変更する
- 2019.06.27
- Graylog

GraylogからElasticsearchでGeoHash grid Aggrigation を取得しようとしたところ、Graylogによって作られた geolocation は Type が Keyword であることが分かりました。これでは、次のエラーが発生してしまいます。
RequestError: RequestError(400, 'search_phase_execution_exception', 'Expected geo_point type on field [DestinationIP_geolocation], but got [keyword]')
これではいけないと、Graylogのgeolocationをgeo_pointに変更することにしました。その手順の覚書です。
追記
ただし、この設定を実施するとGraylogのWorld Mapが使えなくなることを確認しています。
この問題はpiplineを使うことで応急対応できます。
設定手順については後述します。
環境情報
Graylog v3.0.1
ElasticSearch 5.5.2-1
CentOS7
graylog custom mappingの登録
まずは、現在のmappingを取得し、geo_pointに変更したいfieldをチェックします。
curl -XGET 'http://hostname:9200/indexname/_mapping/?pretty=true
次に変更したいfieldを全て次のgraylog-custom-mapping.json に追加します。
{
"template": "graylog_*",
"mappings" : {
"message" : {
"properties" : {
"DestinationIP_geolocation" : {
"type" : "geo_point"
},
"ClientGeo_geolocation" : {
"type" : "geo_point"
},
"ClientGeo_ip_geolocation" : {
"type" : "geo_point"
},
"Origin_SourceIP_geolocation" : {
"type" : "geo_point"
},
"clientip_geolocation" : {
"type" : "geo_point"
}
}
}
}
}
このjsonファイルを使ってcustom-mappingを登録します。
curl -X PUT -d @'graylog-custom-mapping.json' -H 'Content-Type: application/json' 'http://hostname:9200/_template/graylog-custom-mapping?pretty'
念の為、登録されていることを確認しておきます。
curl -XGET 'http://192.168.1.83:9200/_template/graylog-custom-mapping?pretty'
index のローテーション
これで、次回からの新しいindexはgeo_pointになった新しいfieldでデータが作られます。ただ、次のindexが作られるまで待たないといけないので、強制的にローテーションさせます。

[System] – [Indices] から

[Default index set]を開き

[Rotate active write index]を選択すると、新しいindexが作成されます。
これで、geo_pointに変更されます。
追記 2019-07-02
GraylogのWorld Mapが使えなくなったら
geolocationの Type が geo_pointになると、Graylog自体にある World Map を使おうとするとエラーとなります。
どうやらWold Mapは、Type が keyword じゃないと使えないようです。
そこで、World Mapを使いたいItemのみ pipeline でkeywordタイプのItemを新しく作成してやります。
GeoIP Resolverの順番の設定
geolocation は GeoIP Resolver によって作り出されますが、その前にpipelineが動いてしまうと、せっかくpipelineを作成しても動作してくれません。そこで、GeoIP Resolver が動く順番を設定しておきます。

[System] – [Configurations] を開きます。

Message Processors Configuration の [Update] をクリックします。

Pipeline Processor の上に GeoIP Resolver が来るように設定します。
ドラッグによって上下に動かせます。
設定したら、[Save] をクリックします。
Copy用の Pipelineの作成

[System/Configurations] – [Pipelines] を開き

[Manage rules]をクリック

[Create Rule]をクリック

ここでは、DestinationIP_geolocation という geo_point タイプのフィールドから、Destination_geolocationというフィールドにコピーしています。Graylogは新しいフィールドは keyword タイプで作成する仕様のようですので、この場合もkeywordタイプとなります。

[Manage pipelines] を開きます。先ほど作成したルールと Stream を紐づけます。

[Add new pipeline]をクリック。

[Edit connection]で結びつけたいStreamを選んで、new stage で先ほど作成したルールを紐づけることで、pipelineは動作するようになります。
ここで作成したItemを使えば、GraylogのWorld Mapは正しく表示されます。
-
前の記事
最近の興味は統計学と機械学習 2019.06.27
-
次の記事
Elasticsearchの検索結果をgeohash gridで集計し地図にプロットする 2019.07.02