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.
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.
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.
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.
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]
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.
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.