Registro em log com o Elastic Stack
Gorjeta
Este conteúdo é um excerto do eBook, Architecting Cloud Native .NET Applications for Azure, disponível no .NET Docs ou como um PDF transferível gratuito que pode ser lido offline.
Existem muitas boas ferramentas de registro centralizado e elas variam em custo, desde ferramentas gratuitas e de código aberto até opções mais caras. Em muitos casos, as ferramentas gratuitas são tão boas ou melhores do que as ofertas pagas. Uma dessas ferramentas é uma combinação de três componentes de código aberto: Elasticsearch, Logstash e Kibana.
Coletivamente, essas ferramentas são conhecidas como Elastic Stack ou ELK stack.
Pilha elástica
O Elastic Stack é uma opção poderosa para coletar informações de um cluster do Kubernetes. O Kubernetes suporta o envio de logs para um endpoint do Elasticsearch e, na maioria das vezes, tudo o que você precisa para começar é definir as variáveis de ambiente, conforme mostrado na Figura 7-5:
KUBE_LOGGING_DESTINATION=elasticsearch
KUBE_ENABLE_NODE_LOGGING=true
Figura 7-5. Variáveis de configuração para Kubernetes
Esta etapa instalará o Elasticsearch no cluster e enviará de destino todos os logs do cluster para ele.
Figura 7-6. Um exemplo de um painel do Kibana mostrando os resultados de uma consulta em logs que são ingeridos do Kubernetes
Quais são as vantagens do Elastic Stack?
O Elastic Stack fornece registro centralizado de baixo custo, escalável e amigável à nuvem. Sua interface de usuário simplifica a análise de dados para que você possa gastar seu tempo coletando insights de seus dados em vez de lutar com uma interface desajeitada. Ele suporta uma ampla variedade de entradas, portanto, à medida que seu aplicativo distribuído abrange mais e diferentes tipos de serviços, você pode esperar continuar a ser capaz de alimentar dados de log e métricas no sistema. O Elastic Stack também suporta pesquisas rápidas, mesmo em grandes conjuntos de dados, tornando possível, mesmo para aplicativos grandes, registrar dados detalhados e ainda ser capaz de ter visibilidade sobre eles de forma eficiente.
Logstash
O primeiro componente é o Logstash. Esta ferramenta é usada para reunir informações de log de uma grande variedade de fontes diferentes. Por exemplo, o Logstash pode ler logs do disco e também receber mensagens de bibliotecas de registro como o Serilog. O Logstash pode fazer algumas filtragens básicas e expansão nos logs à medida que eles chegam. Por exemplo, se seus logs contiverem endereços IP, o Logstash pode ser configurado para fazer uma pesquisa geográfica e obter um país/região ou até mesmo uma cidade de origem para essa mensagem.
Serilog é uma biblioteca de log para linguagens .NET, que permite o registro parametrizado. Em vez de gerar uma mensagem de log textual que incorpora campos, os parâmetros são mantidos separados. Esta biblioteca permite uma filtragem e pesquisa mais inteligentes. Um exemplo de configuração Serilog para gravação no Logstash aparece na Figura 7-7.
var log = new LoggerConfiguration()
.WriteTo.Http("http://localhost:8080")
.CreateLogger();
Figura 7-7. Configuração Serilog para gravar informações de log diretamente no logstash sobre HTTP
O Logstash usaria uma configuração como a mostrada na Figura 7-8.
input {
http {
#default host 0.0.0.0:8080
codec => json
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index=>"sales-%{+xxxx.ww}"
}
}
Figura 7-8. Uma configuração do Logstash para consumir logs do Serilog
Para cenários em que a manipulação extensiva de logs não é necessária, há uma alternativa ao Logstash conhecida como Beats. O Beats é uma família de ferramentas que pode reunir uma grande variedade de dados, de logs a dados de rede e informações de tempo de atividade. Muitos aplicativos usarão Logstash e Beats.
Uma vez que os logs tenham sido reunidos pelo Logstash, ele precisa de algum lugar para colocá-los. Embora o Logstash suporte muitas saídas diferentes, uma das mais interessantes é o Elasticsearch.
Elasticsearch
O Elasticsearch é um poderoso mecanismo de pesquisa que pode indexar logs à medida que eles chegam. Ele torna rápida a execução de consultas nos logs. O Elasticsearch pode lidar com grandes quantidades de logs e, em casos extremos, pode ser expandido em muitos nós.
As mensagens de log que foram criadas para conter parâmetros ou que tiveram parâmetros divididos deles por meio do processamento do Logstash podem ser consultadas diretamente à medida que o Elasticsearch preserva essas informações.
Uma consulta que pesquisa as 10 principais páginas visitadas pelo jill@example.com
, aparece na Figura 7-9.
"query": {
"match": {
"user": "jill@example.com"
}
},
"aggregations": {
"top_10_pages": {
"terms": {
"field": "page",
"size": 10
}
}
}
Figura 7-9. Uma consulta do Elasticsearch para encontrar as 10 principais páginas visitadas por um usuário
Visualizando informações com painéis da web do Kibana
O componente final da pilha é o Kibana. Esta ferramenta é usada para fornecer visualizações interativas em um painel da web. Os painéis podem ser criados até mesmo por usuários que não são técnicos. A maioria dos dados residentes no índice Elasticsearch pode ser incluída nos painéis do Kibana. Os usuários individuais podem ter diferentes desejos de painel e o Kibana permite essa personalização permitindo painéis específicos do usuário.
Instalando o Elastic Stack no Azure
A pilha elástica pode ser instalada no Azure de várias maneiras. Como sempre, é possível provisionar máquinas virtuais e instalar o Elastic Stack nelas diretamente. Esta opção é preferida por alguns usuários experientes, pois oferece o mais alto grau de personalização. A implantação na infraestrutura como serviço introduz uma sobrecarga de gerenciamento significativa, forçando aqueles que seguem esse caminho a se apropriarem de todas as tarefas associadas à infraestrutura como serviço, como proteger as máquinas e manter-se atualizado com os patches.
Uma opção com menos sobrecarga é usar um dos muitos contêineres do Docker nos quais o Elastic Stack já foi configurado. Esses contêineres podem ser descartados em um cluster Kubernetes existente e executados junto com o código do aplicativo. O contêiner sebp/elk é um contêiner Elastic Stack bem documentado e testado.
Outra opção é uma oferta ELK-as-a-service recentemente anunciada.