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.
- DLQ trata erros que são retornos com códigos HTTP 400 e 404.
- DLQ faz apenas uma nova tentativa por mensagem, se ocorrer o erro novamente a mensagem não será tratada.
- 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:
- https://www.elastic.co/guide/en/logstash/current/dead-letter-queues.html
- https://discuss.elastic.co/t/full-pipeline-logstash-with-dead-letter-queue/239855/3
- https://www.hostinger.com.br/tutoriais/o-que-e-http-error-e-principais-codigos-http/
Caso ainda tenham dúvidas podem contar comigo.