Dead Letter Queue no Elastic Stack

Written by altamir-dias | Published 2020/07/14
Tech Story Tags: elasticsearch | elasticsearch-log-stash | logging | elastic-beanstalk | search | programming | linux | logs

TLDR 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.via the TL;DR App

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.

Written by altamir-dias | System Analist
Published by HackerNoon on 2020/07/14