Guia prático: Configurando a fila Dead Letter Queue no Logstash

Guia prático: Configurando a fila Dead Letter Queue no Logstash

O Logstash é um pipeline de processamento de dados do lado do servidor de código aberto que ingere dados de várias fontes, transforma-os simultaneamente e os envia para seu “stash” favorito, o mais comum é o Elasticsearch.

A coleta de dados é realizada por meio de plugins de entrada configuráveis. Depois que um plugin de entrada coleta dados, ele pode ser processado por plugins de filtro que modificam e anotam os dados do evento. Por fim, o Logstash roteia eventos para plugins de saída que podem encaminhar os eventos para uma variedade de ferramentas, incluindo Elasticsearch.

Arquitetura do Logstash

Qaundo o Logstash encontra um evento que não pode processar (erro de mapeamento ou algum outro problema) a pipeline do Logstash trava ou descarta o evento malsucedido. Para proteger contra perda de dados nessa situação, podemos configurar o Logstash para gravar eventos malsucedidos em uma fila de mensagens em vez de descartá-los. Esta fila é chamada de Dead letter queue (DLQ)

Neste artigo, quero mostrar um exemplo prático de como configurar essa fila!

Laboratório

Crie o diretório:

sudo mkdir -p /opt/dlq
sudo chown -R logstash:logstash /opt/dlq

Edite o arquivo logstash.yml

dead_letter_queue.enable: true
path.dead_letter_queue: /opt/dlq

Crie um arquivo json com o seguinte conteúdo:

sudo vim /opt/dlq/teste-dql.json
{"age":39,"full_name":"Shelley Bangs","gender":"Female"}
{"age":32,"full_name":"Sally Penylton","gender":"Female"}
{"age":39,"full_name":"Janot Maxfield","gender":"Female"}
{"age":28,"full_name":"Isaak Taynton","gender":"Male"}
{"age":36,"full_name":"Pavel Braund","gender":"Male"}
{"age":43,"full_name":"Eleanore Seaton","gender":"Female"}
{"age":46,"full_name":"Ely Fullilove","gender":"Male"}
{"age":23,"full_name":"Deeann Moon","gender":"Female"}
{"age":27,"full_name":"Niels Milam","gender":"Male"}
{"age":23,"full_name":"Lorne Cuxson","gender":"Female"}
{"age":false,"full_name":"Robbyn Narrie","gender":"Female"}
{"age":true,"full_name":"Clyde Marney","gender":"Male"}
{"age":false,"full_name":"Frankie Semble","gender":"Male"}
{"age":true,"full_name":"Aggy Reditt","gender":"Female"}
{"age":true,"full_name":"Fionna Dozdill","gender":"Female"}
{"age":true,"full_name":"Erroll Hallut","gender":"Male"}
{"age":true,"full_name":"Gayle Terrell","gender":"Female"}
{"age":true,"full_name":"Lucita Garthside","gender":"Female"}
{"age":true,"full_name":"Renaud Djurkovic","gender":"Male"}
{"age":false,"full_name":"Joellen Strick","gender":"Female"}

Esse documento json é o que vamos utilizar para simular a perda de dados, é possível observar que as mensagens finais contém o campo age com dado do tipo booleano e não inteiro.

Crie a pipeline:

sudo vim /etc/logstash/conf.d/exemplo-dlq.conf
input {
  file {
    codec => "json"
    start_position => "beginning"
    path => "/opt/dlq/teste-dql.json"

  }
}
output {
  elasticsearch {
    hosts => [ "https://node-master:9200", "https://node-data:9200" ]
    index => "dlq-exemplo-dados"
    user => "sysadmin"
    password => "4linux"
    cacert => "/etc/logstash/certs/elasticsearch-ca.pem"
  }

  stdout {
    codec => "rubydebug"
  }
}

Execute o logstash:

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/exemplo-dlq.conf

A pipeline será executada, o logstash vai retornar o erro que ocorreu ao tentar anexas as ultimas mensagens mas a pipeline não será encerrada. Ao verificar a quantidade de documentos no elasticsearch, pode-se observar que algumas não foram enviadas:

GET /_cat/indices/dlq*?v

Resultado:

health status index             uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   dlq-exemplo-dados 7i3c7U1yRCaGt4_QESE36g   1   1         10            0     31.7kb         19.7kb

Na pasta /opt/dlq, é possível observar que o logstash criou uma pasta com o nome da pipeline:

root@monitoring:/opt/dlq# ls
main  teste-dql.json
root@monitoring:/opt/dlq# ls -lha main/
total 28K
drwxrwxr-x 2 logstash logstash 4.0K Dec  3 11:15 .
drwxr-xr-x 3 logstash logstash 4.0K Dec  3 11:15 ..
-rw-rw-r-- 1 logstash logstash  14K Dec  3 11:15 1.log
-rw-rw-r-- 1 logstash logstash    1 Dec  3 11:15 2.log.tmp
-rw-rw-r-- 1 logstash logstash    0 Dec  3 11:15 .lock

Para recuperar esses dados, vamos criar uma pipeline e utilizar o módulo dead_letter_queue:

sudo vim /etc/logstash/conf.d/dlq.conf
input {
  dead_letter_queue {
    path => "/opt/dlq/"
  }
}
output {
  elasticsearch {
    hosts => [ "https://node-master:9200", "https://node-data:9200" ]
    index => "dlq-dados-perdidos"
    user => "sysadmin"
    password => "4linux"
    cacert => "/etc/logstash/certs/elasticsearch-ca.pem"
  }

  stdout {
    codec => "rubydebug"
  }
}

Execute a pipeline:

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/dlq.conf

Agora temos 2 indices com 10 documentos:

health status index              uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   dlq-dados-perdidos D4rLwdaZTSWXF-ne79DaOw   1   1         10            0       18kb          8.9kb
green  open   dlq-exemplo-dados  uJTSqP5RSHypoxCdZLYHLw   1   1         10            0       18kb            9kb

Neste exemplo eu enviei os dados para outro índice porquê neste caso, não conseguimos converter booleano para inteiro. Mas dependendo do seu tipo de erro, é possível tratá-lo utilizando os plugins de filtro do logstash e enviar para o mesmo índice.

Anterior Crie sua primeira aplicação em Python: Guia passo a passo
Próxima Acesso a dados SQL Server através do PostgreSQL: um guia prático

About author

Thaynara Mendes
Thaynara Mendes 4 posts

Formada em Ciência da Computação. Apaixonada por Linux e café. Atuou na área de desenvolvimento back-end com a linguagem Python e atua como Devops na 4linux, possui a cerficação LPIC-1 e ministra aula do curso de Infraestrutura Ágil com Práticas DevOps e Especialista em Elastic Stack.

View all posts by this author →

Você pode gostar também

Infraestrutura TI

4Linux e Zimbra: Parceria promissora para expansão no mercado brasileiro

Com esta parceria a 4Linux passa a oferecer para o mercado brasileiro a versão Network Edition que oferece funcionalidades não existentes na versão community. A 4Linux – Open Software Specialists

Containers

Descubra como otimizar seu cluster Kubernetes com o plugin de rede Calico

Olá mundo DevOps! Nesse post irei mostrar como se comporta um cluster Kubernetes quando trabalhamos com nós de trabalho divididos em várias instâncias cloud como Amazon Web Services (AWS), Google

Desenvolvimento

Docker: Ferramenta essencial para desenvolvedores e gestão de aplicativos

O que é o Docker O Docker é uma ferramenta de código aberto para conteinerização que agiliza a criação e a implantação de aplicativos por meio do uso de contêineres.