Nesta terceira parte, aprenderemos como configurar e utilizar a pesquisa de dados do Elasticsearch em aplicações .NET utilizando o package NEST.
Este artigo faz parte da série:
- Centralizando logs com Elastic Stack e .NET – Parte 1 (Docker)
- Centralizando logs com Elastic Stack e .NET – Parte 2 (Serilog)
- Centralizando logs com Elastic Stack e .NET – Parte 3 (Elasticsearch)
- Centralizando logs com Elastic Stack e .NET – Parte 4 (Kibana)
- Centralizando logs com Elastic Stack e .NET – Parte 5 (Elastic APM) – em produção
Para entender melhor quais os benefícios e configurações do Elasticsearch no .NET, acesse este artigo.
Pré-requisitos
- Visual Studio 2022 (.NET 6.0)
- Packages:
Web API
O primeiro passo é criar uma classe (objeto) que representa o registro de logs no Elasticsearch. Para isso, acesse o link abaixo para visualizar os mapeamentos do índice indexlogs criado pelo Serilog:
Dica: Instale a extensão JSONVue no seu navegador Chrome para visualizar as informações do JSON formatadas.
Na guia properties desta URL, vamos pegar apenas alguns campos para representar a classe em C#. Utilize o atributo PropertyName do NEST para informar os nomes das propriedades, conforme o exemplo abaixo:
A classe MetadataViewModel e ProcessViewModel são a representação de algumas propriedades do nó metadata e process do índice:
Em seguida, configure a injeção de dependência do Elasticsearch utilizando o NEST:
Alguns pontos importantes desta configuração:
- ElasticsearchSettings = Informações de acesso ao Elasticsearch configurados no appsettings.json.
- DefaultIndex() = Configura o índice padrão para operações com o Elasticsearch (Se nenhum índice for informado em alguma operação, o NEST utiliza o índice default para realizar as ações).
- BasicAuthentication() = Configura as credenciais de acesso ao Elasticsearch com os dados fornecidos no appsettings.json.
- EnableApiVersioningHeader() = Para versões do Elasticsearch 8 em diante, é necessário utilizar este método para habilitar o envio de informações sobre a versão do header nas requisições.
- AddSingleton(client) = Registra a injeção de dependência do Elasticsearch como singleton.
É necessário registrar a configuração do Elasticsearch na API. Para isso, registre o trecho abaixo na classe program.cs:
Em seguida, crie um novo controller com o nome LogController injetando a interface de acesso ao Elasticsearch (IElasticClient) e configure a consulta ao índice conforme o método GetAllLogs() e GetLogsByDate():
Existem muitos outros tipos de consultas, funcionalidades e filtros no Elasticsearch que você pode utilizar com o NEST. Boa parte dessas consultas são abordadas neste repositório genérico.
Esta mesma consulta (GetAllLogs) também pode ser interpretada diretamente no seu navegador, utilizando o conceito de Query DSL (Domain Specific Language) do Elasticsearch:
Testando
Para realizar os testes, execute os dois endpoints GET do controller Log no Swagger e verifique os logs gerados no Elasticsearch:
Caso algum erro ocorra ao consultar a base, uma exceção será gerada para o cliente e este mesmo erro será salvo na base para futuras análises. Por exemplo, foi forçado um erro realizando a consulta em um índice inexistente (conforme a imagem abaixo) e toda informação detalhada capturada no middleware ErrorHandlingMiddleware encontram-se no Elasticsearch:
Finalizando
Consultar registros no Elasticsearch ficou muito mais simples utilizando o package NEST, que desempenha um grande papel em fornecer acesso a pesquisa e recuperação de dados de forma rápida e precisa. Utilizar o Elastic como repositório de logs das aplicações é um ótimo caminho para praticar a observabilidade das aplicações e infraestrutura.
Os detalhes completo desta série você encontra no meu GitHub: https://github.com/hgmauri/sample-observability
[…] Centralizando logs com Elastic Stack e .NET – Parte 3 (Elasticsearch) […]
[…] Centralizando logs com Elastic Stack e .NET – Parte 3 (Elasticsearch) […]
[…] Centralizando logs com Elastic Stack e .NET – Parte 3 (Elasticsearch) […]