paint-brush
Dead Letter Queue no Elastic Stackby@altamir-dias
230 reads

Dead Letter Queue no Elastic Stack

by Altamir Dias CassianoJuly 14th, 2020
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

Dead Letter Queue no Elastic Stack ajuda ainda mais na obsevabilidade de dados that não foram entregues para Elasticsearch. DLQ is a componente configurável no Logstash that fará o papel de monitor de falhas sobre algum pipeline dentro do Logstashing. A aa a alteração ficará (simplesmentmente) como abaixo o arquivo de configuração do logstash.
featured image - Dead Letter Queue no Elastic Stack
Altamir Dias Cassiano HackerNoon profile picture

Melhore a obsevabilidade da sua Stack Elastic, baseado em fatos reais

A utilização do Dead Letter Queue ajuda ainda mais na obsevabilidade de dados que não foram entregues para Elasticsearch.

Como cheguei até aqui

Estava realizando testes com um componente de comunicação com o Logstash e por coincidência solicitei a criação de um Indíce no Elasticsearch com caractere em caixa alta (Teste). E adivinha o que o ElasticSearch me retornou?

Could not index event to Elasticsearch. status: 400,

action:

[“index”, {:_id=>nil, :_index=>”
Teste
-2020.07.08", :routing=>nil, :_type=>”_doc”}, #<LogStash::Event:0x5ad6965c>]
,

response:

{“index”=>{“_index”=>”Teste-2020.07.08", “_type”=>”_doc”, “_id”=>nil, “status”=>400, “error”=>{“type”=>”invalid_index_name_exception”, “reason”=>”Invalid index name [Teste-2020.07.08], 
must be lowercase
”, “index_uuid”=>”_na_”, “index”=>”Teste-2020.07.08"}}}

SIM! Isso mesmo, ele não aceitou a criação do indíce e a mensagem não foi entregue.

E agora?

Assim como este erro ocorreu podem ocorrer outros erros que eu nem mesmo tenho conhecimento. Como farei para tratar esta exceções?

Ai que entra em ação a (quase) fantástica funcionalidade do Elastic Stack, Dead Letter Queue (vou tomar a liberade de chamá-lo de DLQ). Na seção ‘Não é bala de prata’ vocês entenderão por que uso o termo (quase) fantástica funcionalidade.

Como funciona?

O DLQ é um componente configurável no Logstash que fará o papel de monitor de falhas sobre algum pipeline dentro do Logstash, uma vez que este pipeline falhar terá outro pipeline que fará uma nova tratativa de envio destes dados.

Como configurei meu ambiente para o DLQ?

Hey, eu utilizo o CentOS Server 7, OK?!

Ativação da funcionalidade DLQ

Editei o arquivo de configuração do Logstash, no meu ambiente ele está em /etc/logstash/logstash.yml. A a alteração ficará (simplesmente) como abaixo

# ------------ Dead-Letter Queue Settings --------------
# Flag to turn on dead-letter queue.
#
dead_letter_queue.enable: true

Criação de novo arquivo que conterá o pipeline do DLQ

Criei o arquivo o arquivo logstash_dlq.conf em /etc/logstash/conf.d/

input{
        dead_letter_queue{
                id => deadletter
                path => "/var/lib/logstash/dead_letter_queue"
                commit_offsets => true
                pipeline_id => "main"
        }
}
filter {
        mutate {
                add_field => {
                        "reason" => "%{[@metadata][dead_letter_queue][reason]}"
                        "plugin_id" => "%{[@metadata][dead_letter_queue][plugin_id]}"
                        "plugin_type" => "%{[@metadata][dead_letter_queue][plugin_type]}"
                        "entry_time" => "%{[@metadata][dead_letter_queue][entry_time]}"
                }
        }
}
output {
        elasticsearch{
                id => cluster1
                hosts => ["serveElasticsearch01", "serveElasticsearch02", "serveElasticsearch03"]
                user => "${ES_USR}"
                password => "${ES_PWD}"
                index => "dead-letter-%{+YYYY.MM.dd}"
        }
}

Apontamento do Logstash para o pipeline

O apontamento dos pipelines ficaram conforme o arquivo de configuração abaixo. Arquivo localizado em /etc/logstash/pipelines.yml

# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: main
  path.config: "/etc/logstash/conf.d/logstash.conf"
- pipeline.id: deadletter
  path.config: "/etc/logstash/conf.d/logstash_dlq.conf"

Por fim basta reiniciar o Logstash. Após isso o Logstash criará índices no ElasticSearch no padrão ‘dead-letter-%{+YYYY.MM.dd}’. [Farei um post futuramente explicando os motivos que me levou esta abordagem e como fazemos para realizar a gestão de falhas no dia a dia]

Não é bala de prata

Mágico não é?!

Vamos devagar pessoal, realmente a funcionalidade é muito válida e interessante, mas vale resaltar alguns pontos que devemos ter conhecimento para não nos surpreendermos depois que estiver com tudo em produção.

  1. DLQ trata erros que são retornos com códigos HTTP 400 e 404.
  2. DLQ faz apenas uma nova tentativa por mensagem, se ocorrer o erro novamente a mensagem não será tratada.
  3. DLQ gera arquivos de controle da fila que não são apagados automaticamente, caso observar grande consumo de disco remova os arquivos de logs antigos, arquivos em /var/lib/logstash/dead_letter_queue.

E por fim…

Esta post foi feito com base em um caso real sobre a versão 7.7.1 da Stack Elastic.Estes links podem apoiar nos estudos sobre o tema:

Caso ainda tenham dúvidas podem contar comigo.