Logstash: Renomear campos aninhados com base em alguma condição

votos
0

Eu estou tentando renomear os campos aninhados de ElasticSearch durante a migração para Amazonelasticsearch

No documento, eu quero mudar a 1) Alterar o valor campo para o valor-chave se o campo de valor tem o tipo de JSON de dados 2) Alterar o valor campo para valorizar-padrão se o campo de valor tem o tamanho de mais de 15

 _source: {
          applicationid : appid,
          interactionId: 716bf006-7280-44ea-a52f-c79da36af1c5,
          interactionInfo: [
            {
              value: {edited:false},
              title: msgMeta
            },
            {
              title: msg,
              value: hello testing,
            },
            {
              title: testing,
              value: I have a text that can be done and changed only the size exist more than 20 so we applied value-standard ,
            }
          ],
          uniqueIdentifier: a21ed89c-b634-4c7f-ca2c-8be6f31ae7b3,
        }
      }

o resultado final deve ser

 _source: {
          applicationid : appid,
          interactionId: 716bf006-7280-44ea-a52f-c79da36af1c5,
          interactionInfo: [
            {
              value-keyword: {edited:false},
              title: msgMeta
            },
            {
              title: msg,
              value: hello testing,
            },
            {
              title: testing,
              value-standard: I have a text that can be done and changed only the size exist more than 20 and so we applied value-standard  ,
            }
          ],
          uniqueIdentifier: a21ed89c-b634-4c7f-ca2c-8be6f31ae7b3,
        }
      }
Publicado 24/10/2019 em 12:02
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Para 2), você pode fazê-lo como este:

filter {
    if [_source][interactionInfo][2][value] =~ /.{15,15}/ {

        mutate {
            rename => ["[_source][interactionInfo][2][value]","[_source][interactionInfo][2][value-standard]"]
        }
    }
}

A regex .{15,15}corresponde a qualquer cadeia de 15 caracteres. Se o campo é menor do que 15 caracteres, o regex não corresponder ea mutate#renamenão é aplicado.

Para 1), uma solução possível seria tentar analisar o campo com o filtro de JSON e se não há _jsonparsefailuretag, renomear o campo.

Respondeu 24/10/2019 em 17:14
fonte usuário

votos
0

Fundada a solução para este. Eu tenho usado um filtro de rubi em Logstash para verificar cada documento, bem como documento aninhada Aqui está o código ruby

require 'json'

def register(param)
end

def filter(event)
  infoarray = event.get("interactionInfo")
  infoarray.each {  |x|
      if x.include?"value"
         value = x["value"]
         if value.length > 15
           apply_only_keyword(x)
         end
       end
      if x.include?"value"
        value = x["value"]
         if validate_json(value)
           apply_only_keyword(x)
         end
       end
  }
event.set("interactionInfo",infoarray)
return [event]
end


def validate_json(value)
  if value.nil?
    return false
  end
  JSON.parse(value)
  return true
rescue JSON::ParserError => e
  return false
end

def apply_only_keyword(x)
  x["value-keyword"] = x["value"]
  x.delete("value")
  if x.include?"value-standard"
    x.delete("value-standard")
  end
  if x.include?"value-whitespace"
    x.delete("value-whitespace")
  end
end
Respondeu 14/11/2019 em 11:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more