Подтвердить что ты не робот

Агент Logstash больше не индексирует

У меня есть экземпляр Logstash, работающий как служба, которая читает из Redis и выводит на Elasticsearch. Я только заметил, что в последние несколько дней в Elasticsearch ничего нового не было, но списки Redis увеличивались.

Журнал Logstash был заполнен двумя ошибками, повторяющимися для тысяч строк:

:message=>"Got error to send bulk of actions"
:message=>"Failed to flush outgoing items"

Причина:

{"error":"IllegalArgumentException[Malformed action/metadata line [107], expected a simple value for field [_type] but found [START_ARRAY]]","status":500}, 

Кроме того, попытка остановить службу несколько раз подряд, я должен был ее убить. Перезапуск он опустошил списки Redis и импортировал все в Elasticsearch. Кажется, сейчас все работает нормально.

Но я не знаю, как предотвратить это снова. Указанное поле type задается как строка для каждой директивы ввода, поэтому я не понимаю, как это могло стать массивом.
Что мне не хватает?

Я использую Elasticsearch 1.7.1 и Logstash 1.5.3. Файл logstash.conf выглядит следующим образом:

input {
  redis {
    host => "127.0.0.1"
    port => 6381
    data_type => "list"
    key => "b2c-web"
    type => "b2c-web"
    codec => "json"
  }
  redis {
    host => "127.0.0.1"
    port => 6381
    data_type => "list"
    key => "b2c-web-staging"
    type => "b2c-web-staging"
    codec => "json"
  }

    /* other redis inputs, only key/type variations */
}
filter {
  grok {
    match => ["msg", "Cache hit %{WORD:query} in %{NUMBER:hit_total:int}ms. Network: %{NUMBER:hit_network:int} ms.     Deserialization %{NUMBER:hit_deserial:int}"]
    add_tag => ["cache_hit"]
    tag_on_failure => []
  }
  /* other groks, not related to type field */
}
output {
  elasticsearch {
    host => "[IP]"
    port => "9200"
    protocol=> "http"
    cluster => "logstash-prod-2"
  }
}
4b9b3361

Ответ 1

В соответствии с вашим сообщением журнала:

{ "error": "IllegalArgumentException [Строка искаженного действия/метаданных [107], ожидаемое простое значение для поля [_type], но найдено [START_ARRAY]]", "status": 500},

Кажется, вы пытаетесь индексировать документ с полем type, в котором вместо строки указывается массив.

Я не могу помочь вам без файла logstash.conf. Но проверьте следующее:

  • Когда вы используете add_field для изменения type, вы фактически превращаете type в array с несколькими значениями, о чем жалуется Elasticsearch.

  • Вы можете использовать mutate join для преобразования массивов в строки: ссылка api

    filter {
        mutate {
            join => { "fieldname" => "," }
        }
    }