Quando necessário realizar drop de eventos baseado em algum critério de filtragem, é altamente recomendado efetuar essa ação no top level do filter. Essa abordagem tem por objetivo performar as operações de filtragem e diminuir o desperdício de recursos computacionais como tempo de CPU e uso de RAM…
Ao utilizar os Beats, sempre que possível é recomendado efetuar o drop de eventos simples ainda no seu escopo interno. Por exemplo: registros/linhas em branco ou de comentários.
O exemplo abaixo pode ser encontrado em: https://github.com/fabiojaniolima/go-ELK/blob/master/artifacts/logstash/pipeline-files/applying_multiple_filters.conf
Exemplo:
//… trecho omitido
filter {
if [message] =~ /^#/ or [message] =~ /^\s*$/ {
drop {}
}
grok {
# Exemplo que casa com o match: 2020-05-11 22:01:20 [ERROR] 90 Mensagem de erro de exemplo
match => {
"message" => "%{TIMESTAMP_ISO8601:datetime} \[%{WORD:status}\] %{NUMBER:speed} %{GREEDYDATA:output}"
}
}
if "_grokparsefailure" in [tags] {
drop {}
}
//… trecho omitido
A primeira condicional remove linhas de comentário e linhas em branco em um cenário de coleta de log de um IIS customizado, na sequência vem o Grok e por fim removemos eventos de erro do parse Grok, tais como não conseguir encontrar a correspondência informada. Na realidade onde essa pipeline foi aplicada a mesma executa em 43ms, caso retire o primeiro if essa execução sobe para até 320ms considerando o mesmo nível de carga na máquina e eventos entrantes.
Resumidamente, a depender do cenário é computacionalmente mais barato você fazer o drop de eventos desnecessários no top level por meio de um if + regex do que deixar o Grok lidar com eles, ou seja, se o evento é desnecessário não efetue tratamento pesado sobre ele, descarte o mais breve possível.
Somente para deixar claro, o segundo if tem por objetivo descartar eventos onde não ocorreu match uma vez que em nosso contexto esses são desnecessários. Em meu ambiente essa abordagem foi positivamente mais impactante ao considerar que tenho 1 linha em branco e 1 linha de comentário para cada registro passível de match.