Logstash 5.2.2 - Проблема с изменением значения - Преобразование добавленных полей из строки в целое число

У меня проблема с фильтром logstash 5.2.2. Мне нужно преобразовать строку в целое число, и это не удается. Подход, который я использую, может быть не идеальным. Вот формулировка проблемы: значение JMX MBean сообщает о «metric_value_string» как «XX,X секунд». Я хочу иметь возможность использовать это значение в качестве числа для агрегации Kibana в визуализациях.

Что я пробовал:

Определения: Исходное поле — «metric_value_string». Строка. Значения выглядят как «26,0 с». Желаемое поле назначения — «time_in_seconds». Целое число.

Я попытался создать поле со сценарием. Простое (безболезненное) преобразование «metric_value_string» в число выглядело как число в результатах обнаружения Kibana, было доступно для агрегирования как число в визуализациях. При запуске визуализации возникает ошибка. Это исключение приведения, и оно показывает значения из «metric_value_string», а не моего преобразованного «time_in_seconds». Это Кибана 5.2.2. IDK, если это ошибка, поэтому я попробовал другой подход.

Я попытался создать и преобразовать поле в фильтре logstash.

Я пробовал оба этих подхода:

filter {
    if "TimeSince" in [metric_path] or "Delay" in [metric_path] {
        mutate { add_field => { "time_in_seconds" => "%{metric_value_string}"} }
        mutate { gsub => ["time_in_seconds", ".0 secs", ""] }
        mutate { convert => { "time_in_seconds", "integer" } }          
    }
}

а также

filter {
    if "TimeSince" in [metric_path] or "Delay" in [metric_path] {
        ruby {
            code =>
                "event.set('time_in_seconds', event.get('metric_value_string'))"
        }
        mutate { gsub => ["time_in_seconds", ".0 secs", ""] }
        mutate { convert => { "time_in_seconds", "integer" } }          
    }
}

Условный материал в порядке. Когда я закомментирую

mutate { convert => { "time_in_seconds", "integer" } }

код, на выходе он выглядит так, как ожидалось, и не дает сбоев.

Я не уверен, что вызывает сбой. Ошибка говорит, что это синтаксическая ошибка, но все в порядке, если я просто закомментирую строку преобразования. В качестве проверки работоспособности я добавил дополнительный код после строки gsub, чтобы убедиться, что с этим кодом не возникнет проблем.

Вот STDOUT из logstash:

C:\Elastic\logstash-5.2.2\bin>cls

C:\Elastic\logstash-5.2.2\bin>logstash -f config/logstash.conf --config.reload.automatic 
JAVA_OPTS was set to [ -Dlog4j.configurationFile=C:\Elastic\logstash-5.2.2\config\log4j2.properties     -Xmx1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="C:\Elastic\logstash-5.2.2/heapdump.hprof"]. Logstash will trust these options, and not set any defaults that it might usually set
[2017-09-14T14:14:14,056][ERROR][logstash.agent           ] Cannot load an invalid configuration {:reason=>"Expected one of #, => at line 14, column 42 (byte 355) after filter {\n\tif \"TimeSince\" in [metric_path] or \"Delay\" in [metric_path] {\n\t\tmutate { add_field => { \"time_in_seconds\" => \"%{metric_value_string}\"} }\n\t\tmutate { gsub => [\"time_in_seconds\", \".0 secs\", \"\"] }\n\t\tmutate { convert => { \"time_in_seconds\""}

Вот содержимое файла конфигурации из этой ошибки выше:

input { 
    jmx {
      path => "plugins/jmx"
      polling_frequency => 60
      type => "jmx"
      nb_thread => 4
    }   
}

filter {
    if "TimeSince" in [metric_path] or "Delay" in [metric_path] {
        mutate { add_field => { "time_in_seconds" => "%{metric_value_string}"} }
        mutate { gsub => ["time_in_seconds", ".0 secs", ""] }
        mutate { convert => { "time_in_seconds", "integer" } }
    }
}

output {
   stdout { codec => rubydebug }
}

Нет проблем, если я закомментирую строку преобразования.

Я иду об этом неправильно? Я новичок в этом стеке. Если бы это был С#/SQL, я бы просто заменил + привёл/конвертировал. Я делаю это не в том месте?

Редактировать:

Вот STDOUT, когда я комментирую строку конвертации, чтобы вы могли видеть фактические данные:

C:\Elastic\logstash-5.2.2\bin>cls

C:\Elastic\logstash-5.2.2\bin>logstash -f config/logstash.conf --config.reload.automatic 
JAVA_OPTS was set to [ -Dlog4j.configurationFile=C:\Elastic\logstash-5.2.2\config\log4j2.properties     -Xmx1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="C:\Elastic\logstash-5.2.2/heapdump.hprof"]. Logstash will trust these options, and not set any defaults that it might usually set
[2017-09-14T14:23:13,456][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[2017-09-14T14:23:13,568][INFO ][logstash.inputs.jmx      ] Create queue dispatching JMX requests to threads
[2017-09-14T14:23:13,573][INFO ][logstash.inputs.jmx      ] Compile regexp for group alias object replacement
[2017-09-14T14:23:13,574][INFO ][logstash.pipeline        ] Pipeline main started
[2017-09-14T14:23:13,576][INFO ][logstash.inputs.jmx      ] Initialize 4 threads for JMX metrics collection
[2017-09-14T14:23:13,648][INFO ][logstash.inputs.jmx      ] Loading configuration files in path {:path=>"plugins/jmx"}
[2017-09-14T14:23:13,743][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
{
                   "path" => "plugins/jmx",
            "environment" => "TEST",
             "@timestamp" => 2017-09-14T18:23:14.154Z,
               "@version" => "1",
                   "host" => "MY HOST",
            "metric_path" => "xxStatus",
                   "type" => "jmx",
    "metric_value_string" => "idle"
}
{
                   "path" => "plugins/jmx",
        "time_in_seconds" => "191",
            "environment" => "TEST",
             "@timestamp" => 2017-09-14T18:23:14.200Z,
               "@version" => "1",
                   "host" => "MY HOST",
            "metric_path" => "xxTimeSincexx",
                   "type" => "jmx",
    "metric_value_string" => "191.0 secs"
}

person D-Sect    schedule 14.09.2017    source источник
comment
Опубликовано в обсудить. elastic.co/t/   -  person D-Sect    schedule 18.09.2017


Ответы (1)


Это был плохой синтаксис в CONVERT.

filter {
    if "TimeSince" in [metric_path] or "Delay" in [metric_path] {
        mutate { add_field => { "time_in_seconds" => "%{metric_value_string}"} }
        mutate { gsub => ["time_in_seconds", ".0 secs", ""] }
        mutate { convert => ["time_in_seconds", "integer"] }
    }
}

должно быть

filter {
    if "TimeSince" in [metric_path] or "Delay" in [metric_path] {
        mutate { add_field => { "time_in_seconds" => "%{metric_value_string}"} }
        mutate { gsub => ["time_in_seconds", ".0 secs", ""] }
        mutate { convert => ["time_in_seconds", "integer"] }
    }
}

Неверный синтаксис в документации @ https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-convert

Показан правильный пример @ https://discuss.elastic.co/t/solved-the-filter-plugin-mutate-convert-doesnt-work-in-5-0/65496/3

person D-Sect    schedule 18.09.2017