Graylogのgeolocationをgeo_pointに変更する

Graylogのgeolocationをgeo_pointに変更する

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は正しく表示されます。