Como posso analisar uma contagem de bytes legível no Logstash?

1

Estou lidando com arquivos de log contendo partes como:

538,486K of 1,048,576K

Representam o uso de memória (espaço de heap Java) renderizado em um formato legível por humanos. Eu gostaria de rastrear esses números em gráficos em Kibana. Para fazer isso, eu gostaria de usar o filtro grok do Logstash para analisar esses números, mas não sei como manipular (ou seja, ignorar) o separador de milhares.

Idealmente, eu teria algo que também pudesse lidar com o "K" e multiplicar por mil. Neste momento, não estou ciente de que qualquer sistema faça o login em uma unidade diferente de kilobyte, mas prefiro não fazer essa suposição.

    
por Peter Becker 05.03.2015 / 00:48

2 respostas

1

O filtro mutate permite a substituição de texto pelo gsub .

gsub usa uma matriz, em que cada trio de valores indica:

  • Nome do campo de destino
  • Padrão de pesquisa
  • Substituir padrão

Tecnicamente, suporta expressões regulares, mas não precisamos disso neste caso.

Primeiro, tiramos vírgulas. Bastante simples.

Em segundo lugar, nós multiplicamos. K deve multiplicar por 1000? Se assim for, parece-me que podemos simplesmente substituir K por 000 .

Colocando os dois juntos:

filter {
    mutate {
        gsub {[
            "some_field", ",", "",
            "some_field", "K", "000"
        ]}
    }
}

Você pode adicionar outras opções de substituição conforme necessário.

Dependendo de suas circunstâncias, K pode multiplicar por 1024, o que será um pouco mais complicado. Não vejo nenhuma solução pronta, mas você pode usar o filtro ruby para executar alguma aritmética.

    
por 05.03.2015 / 18:58
1

Acho que a resposta do rutter deve funcionar no meu caso. Aqui está o que acabei fazendo antes de lê-lo:

filter {
  grep {
    match => { "message" => "...something identifying the message..." }
    drop => false
    add_tag => [ "MyMarker" ] 
  }
  if "MyMarker" in [tags] {
    grok {
      match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
      break_on_match => false
    }
    if "_grokparsefailure" not in [tags] {
      ruby {
        code => "
           if(event['rawCurValue'])
             event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
           end
           if(event['rawMaxValue'])
             event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
           end
        "
      }
    }
  }
}

Eu suspeito que isso poderia ser mais conciso, mas parece funcionar.

    
por 06.03.2015 / 00:57