Поле геолокации Tile Map отсутствует в агрегации GeoHash в Kibana 4.0.1

Я пытаюсь заставить визуализацию карты плитки работать в Kibana 4.0.1.

Я вижу данные geoip.location в разделе «Обнаружение», но когда я перехожу к «Визуализировать их как мозаичную карту», ​​я выбираю тип сегмента Geo Coordinates, затем тип агрегации GeoHash, затем, когда я перехожу к Field, он пуст.

  • Кибана 4.0.1
  • Логсташ 1.4.2-1-2c0f5a1
  • Эластичный поиск 1.4.4
  • Работает на Debian 7 64bit

Вот моя конфигурация logstash:

    input {
    udp {
      port => 5514
      type => cisco
    }
}
filter {
  grok {
    match => { "message" => "\<%{NUMBER:num}\>%{NUMBER:seq}: \*%{SYSLOGTIMESTAMP:date}: \%SEC-6-IPACCESSLOGP: list Internet\-In\-%{WORD:acl_ver} denied %{WORD:protocol} %{IP:src}\(%{NUMBER:sport}\) \-\> %{IP:dest}\(%{NUMBER:dport}\), %{INT:hitcnt}" }
    add_tag => ["grok_match", "cisco_acl_message"]
    remove_field => [ "message" ]
  }
  geoip {
   source => "src"
   target => "geoip"
   add_tag => ["geoip"]
   database => "/etc/logstash/GeoLiteCity.dat"
 }
}
output {
  elasticsearch { 
    host => localhost
    index => [ "firewall-%{+YYYY.MM.DD}" ]
  }
}

А это пример записи журнала:

{
  "_index": "firewall-2015.04.105",
  "_type": "cisco",
  "_id": "dJhGF6RtQuGXtlBTRCu2mQ",
  "_score": null,
  "_source": {
    "@version": "1",
    "@timestamp": "2015-04-15T21:06:08.357Z",
    "type": "cisco",
    "host": "172.17.10.1",
    "num": "190",
    "seq": "1872",
    "date": "Apr 15 21:08:05.878",
    "acl_ver": "20150223",
    "protocol": "tcp",
    "src": "94.102.51.96",
    "sport": "26820",
    "dest": "12.34.56.78",
    "dport": "5900",
    "hitcnt": "1",
    "tags": [
      "grok_match",
      "cisco_acl_message",
      "geoip",
      "_grokparsefailure",
      "geoip"
    ],
    "geoip": {
      "ip": "94.102.51.96",
      "country_code2": "NL",
      "country_code3": "NLD",
      "country_name": "Netherlands",
      "continent_code": "EU",
      "region_name": "07",
      "city_name": "Amsterdam",
      "postal_code": "1000",
      "latitude": 52.349999999999994,
      "longitude": 4.916699999999992,
      "timezone": "Europe/Amsterdam",
      "real_region_name": "Noord-Holland",
      "location": [
        4.916699999999992,
        52.349999999999994
      ],
      "coordinates": [
        4.916699999999992,
        52.349999999999994
      ]
    }
  },
  "fields": {
    "@timestamp": [
      1429131968357
    ]
  },
  "sort": [
    1429131968357
  ]
}

Любые идеи, что мне не хватает?

ОТВЕТ

После того, как Ален указал мне правильное направление, я начал изучать карты полей. Вот как я поступил:

Сначала я проверил тип поля geoip (мой индекс называется firewall*)

curl http://localhost:9200/firewall*/_mapping/cisco/field/geoip.location?pretty

Это вернулось с:

{
  "firewall-2015.04.107" : {
    "mappings" : {
      "cisco" : {
        "geoip.location" : {
          "full_name" : "geoip.location",
          "mapping":{"location":{"type":"float"}}
        }
      }
    }
  }
}

Расположение типа float — вот почему я не могу добавить визуализацию тайловой карты. Мне нужно изменить это на geo_point.

После множества копаний я нашел один из способов изменить сопоставление типа location на geo_point — использовать выходной шаблон. Я скопировал файл elasticsearch_templte.json по умолчанию из

/opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json

to

   /etc/logstash/templates/elasticsearch-firewall.json

Отредактируйте его и измените шаблон с logstash* на firewall* (или любой другой шаблон имени вашего индекса) "template" : "firewall*",

Отредактируйте файл конфигурации logstash и измените вывод на это:

output {
  elasticsearch { 
    host => localhost
    index => [ "firewall-%{+YYYY.MM.DD}" ]
    template => "/etc/logstash/templates/elasticsearch-firewall.json"
    template_name => "firewall"

  }
}

Удалите индекс firewall*.

ВНИМАНИЕ! Это удалит все ваши существующие данные для поиска! Если эти данные важны, вам нужно найти способ динамически изменять тип поля без удаления индекса. Я видел упоминания об этом в результатах поиска Google, поэтому знаю, что это возможно.

curl -XDELETE http://localhost:9200/firewall*

После этого я перезапустил logstash и elasticsearch.

Как только я снова начал получать журналы, я снова проверил сопоставление

 curl http://localhost:9200/firewall*/_mapping/cisco/field/geoip.location?pretty
{
  "firewall-2015.04.107" : {
    "mappings" : {
      "cisco" : {
        "geoip.location" : {
          "full_name" : "geoip.location",
          "mapping":{"location":{"type":"geo_point"}}
        }
      }
    }
  }
}

Посмотрите, какой тип локации теперь geo_point :-)

Теперь я могу добавить визуализацию Tile Map.


person discoape    schedule 15.04.2015    source источник


Ответы (2)


Kibana использует сопоставление поля, чтобы определить, является ли оно geo_point и, следовательно, может использоваться на карте.

Итак, вы должны проверить свое отображение и изменить поле на geo_point.

См. документ.

person Alain Collins    schedule 16.04.2015
comment
Он отображал поле как Float, а не как geo_point. Я думаю, это произошло потому, что шаблон elasticsearch_template.json по умолчанию применяется только к logstash* индексам, где мой был назван firewall*. - person discoape; 17.04.2015
comment
Я добавил пользовательский шаблон для firewall* и заново создал индекс, и теперь сопоставление "location":{"type":"geo_point"}. Спасибо за наводку :-) - person discoape; 17.04.2015

просто хочу вынести полезную информацию в отдельный ответ - может кому пригодится.

Эластичный поиск Logstash template соответствует только шаблонам с префиксом "logstash-". Вот почему поле geoip.location двойное, а не geo_point, когда вы используете другое имя индекса (например, брандмауэр*) без вашего собственного шаблона.

проверьте эту проблему, если вам нужна дополнительная информация - https://github.com/elastic/logstash/issues/3137

person Dmitry Khryukin    schedule 20.10.2015