Visão geral
Neste guia, você pode aprender a usar o rastreamento OpenTelemetry com o driver .NET/C#. OpenTelemetria é uma estrutura de observabilidade de código aberto que fornece uma maneira padronizada de instrumentar, gerar, coletar e exportar dados de telemetria.
O driver .NET/C# emite dados de rastreamento por meio do System.Diagnóstica.ActivitySource API. Quando você inscreve um ouvinte no ActivitySource do driver, o driver cria spans que representam suas operações do MongoDB , como queries e transações. Essas extensões incluem atributos que seguem as convenções semânticas do OpenTelemetry.
Observação
O rastreamento OpenTelemetry está disponível no .NET/C# Driver 3.7 ou posterior.
Dados de amostra
Os exemplos neste guia usam a collection sample_mflix.movies dos conjuntos de dados de amostra do Atlas . Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte Introdução ao driver .NET/C#.
O seguinte código cria um MongoClient e acessa a coleção de amostra:
var connectionString = "<connection string>"; var client = new MongoClient(connectionString); var collection = client.GetDatabase("sample_mflix").GetCollection<BsonDocument>("movies");
Dependencies
O driver não depende do SDK do OpenTelemetry. Ele emite trechos até ActivitySource, para que qualquer ouvinte possa coletá-los, incluindo um objetoSystem.Diagnostics.ActivityListener.
Para usar o SDK do OpenTelemetry para coletar os vãos do driver, adicione o SDK e um exportador à sua aplicação. Os exemplos nesta página usam o exportador in-memory para que você possa inspecionar as extensões que o driver produz. Execute os seguintes comandos a partir do diretório do projeto :
dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Exporter.InMemory
Habilitar rastreamento OpenTelemetry
O driver cria spans quando um ouvinte está inscrito no ActivitySource do driver e o cliente tem o rastreamento ativado. Para desabilitar o rastreamento para um cliente, defina a propriedade TracingOptions.Disabled como true.
Se nenhum ouvinte estiver inscrito, o driver pulará todo o trabalho de rastreamento e o impacto no desempenho será insignificante.
O driver registra seus spans em um ActivitySource chamado MongoDB.Driver. Para coletar os intervalos do driver, passe a constante MongoTelemetry.ActivitySourceName para o método AddSource() ao configurar o OpenTelemetry.
Inscrever-se em um aplicativo com um host
Para configurar o OpenTelemetry em um aplicativo que usa o modelo de hospedagem .NET , como ASP .NET Core ou um serviço de trabalhador, adicione o seguinte pacote:
dotnet add package OpenTelemetry.Extensions.Hosting
Se a sua aplicação já tiver um host, adicione o ActivitySource do driver à configuração OpenTelemetry, como mostrado no exemplo a seguir:
// Register the driver's ActivitySource with an OpenTelemetry // TracerProvider in a generic host. var exportedSpans = new List<Activity>(); var builder = Host.CreateApplicationBuilder(); builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddSource(MongoTelemetry.ActivitySourceName) .AddInMemoryExporter(exportedSpans)); var host = builder.Build();
O exemplo anterior utiliza o pacote OpenTelemetry.Exporter.InMemory para coletar os spans. Em seu aplicativo, substitua-o pelo export para seu backend de rastreamento.
Assine com um TracerProvider
Se a sua aplicação não tiver um host, crie um TracerProvider, como mostrado no exemplo a seguir :
// Register the driver's ActivitySource with an OpenTelemetry // TracerProvider. var exportedSpans = new List<Activity>(); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(MongoTelemetry.ActivitySourceName) .AddInMemoryExporter(exportedSpans) .Build();
O exemplo anterior utiliza o pacote OpenTelemetry.Exporter.InMemory para coletar os spans. Em seu aplicativo, substitua-o pelo exportador do backend de rastreamento, como o exportador do Protocolo OpenTelemetry (OTLP).
Depois de assinar o ActivitySource, o driver emite spans para as operações que seu aplicação executa, conforme mostrado no exemplo a seguir:
var filter = Builders<BsonDocument>.Filter.Eq("title", "Back to the Future"); var movie = collection.Find(filter).First();
Inscrever-se com um ActivityListener
Se não quiser depender do SDK do OpenTelemetry, você pode se inscrever no ActivitySource do driver usando um objeto System.Diagnóstica.ActivityListener. O exemplo a seguir registra um ouvinte que recebe cada span que o driver emite:
// Subscribe to the driver's ActivitySource by using an ActivityListener. // This approach avoids a dependency on the OpenTelemetry SDK. var exportedSpans = new List<Activity>(); using var listener = new ActivityListener { ShouldListenTo = source => source.Name == MongoTelemetry.ActivitySourceName, Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllDataAndRecorded, ActivityStopped = exportedSpans.Add }; ActivitySource.AddActivityListener(listener);
Configurar opções de rastreamento
Para configurar o rastreamento para um cliente individual, defina a propriedade MongoClientSettings.TracingOptions para uma instância TracingOptions. A classe TracingOptions tem as seguintes propriedades:
Propriedade | Tipo | Descrição |
|---|---|---|
|
| Quando definido para Padrão: |
|
| Especifica o comprimento máximo do texto de query a incluir nos atributos de extensão. Quando definido para Padrão: |
O exemplo a seguir define QueryTextMaxLength como 1024, que captura até 1024 caracteres do texto do comando:
var settings = MongoClientSettings.FromConnectionString(connectionString); settings.TracingOptions = new TracingOptions { Disabled = false, QueryTextMaxLength = 1024 }; var client = new MongoClient(settings);
Rastreamento de operações
O driver .NET/C# cria os seguintes tipos de vãos:
Tipo de extensão | Descrição |
|---|---|
Intervalos de nível de operação | Períodos que representam operações de driver de alto nível, como |
Intervalos de nível de comando | Períodos que representam comandos individuais que o driver envia ao servidor. Os intervalos de nível de comando incluem o atributo |
Períodos de transação | Períodos que abrangem todas as operações executadas dentro de uma transação explícita. |
Por exemplo, uma operação find cria uma extensão de nível de operação que contém uma extensão de nível de comando aninhada, como mostrado na seguinte hierarquia:
find sample_mflix.movies └── find
Atributos de extensão
O driver .NET/C# segue as convenções semânticas do OpenTelemetry e inclui atributos que fornecem contexto sobre cada operação.
Atributos gerais
Os spans incluem os seguintes atributos gerais:
db.system.name: Sempre definido comomongodbdb.operation.name: Nome da operação de alto nível (somente a operação abrange)db.operation.summary: Resumo da operação de alto nível (a operação abrange apenas)db.command.name: Nome do comando MongoDB (somente o comando se estende)db.namespace: Nome do banco de dadosdb.collection.name: Nome da collection, quando aplicáveldb.query.summary: Resumo da query (somente o comando se estende)
Atributos de rede
As extensões de comando incluem os seguintes atributos de rede:
server.address: Host do servidor MongoDBserver.port: Porta do servidor MongoDBnetwork.transport: Protocolo de transporte, comotcpouunix
Atributos de conexão
As extensões de comando incluem os seguintes atributos de conexão:
db.mongodb.server_connection_id: ID de conexão atribuída ao servidordb.mongodb.driver_connection_id: ID de conexão atribuída ao driver
Atributos de sessão e transação
Quando você usa sessões ou transações, as extensões de comando incluem os seguintes atributos:
db.mongodb.lsid: ID da sessão lógica (ao usar sessões)db.mongodb.txn_number: Número da transação (quando em uma transação)db.mongodb.cursor_id: ID do cursor (para operações que retornam cursores)
Atributos de query
Quando você configura QueryTextMaxLength com um valor maior que 0, as extensões de comando incluem o seguinte atributo:
db.query.text: O texto de comando, truncado para o comprimento máximo especificado
Atributos de erro
Quando uma operação falha, o driver registra os detalhes da exceção e inclui os seguintes atributos:
exception.type: Tipo da exceçãoexception.message: Mensagem de exceçãoexception.stacktrace: Rastreamento de pilha de exceçãodb.response.status_code: Código de erro do MongoDB (somente o comando se estende)
Segurança e redação
O motorista aplica as seguintes medidas de segurança para proteger informações confidenciais:
O driver não cria períodos para comandos confidenciais, como comandos de autenticação. Estes comandos incluem
authenticate,saslStart,saslContinue,getNonce,createUser,updateUser,copyDbSaslStartecopyDb. O driver também ignora o comandohelloquando inclui o campospeculativeAuthenticate.O driver desabilita o atributo
db.query.textpor padrão. Ative este atributo somente quando necessário.Quando o driver captura o texto da query, ele remove os campos
lsid,$db,$clusterTimeesignaturedo comando.
Aviso
Quando você habilita o atributo db.query.text, o driver inclui o texto de comando em atributos de extensão, e seu exportador envia as extensões para o backend de rastreamento. O driver remove apenas metadados de sessão e cluster. O backend de rastreamento ainda registra valores de filtro, operadores de query e o conteúdo de documentos inseridos ou atualizados.
Error Handling
Quando as operações falham, o driver registra os detalhes da exceção como atributos de extensão que seguem as convenções semânticas do OpenTelemetry e define o status da extensão como Error.
Para falhas de comando do MongoDB , o driver define o status da extensão de operação e de sua extensão de comando para Error. O driver registra o código de erro no atributo db.response.status_code na extensão de comando.
Erros de gravação que o servidor retorna em uma resposta de comando bem-sucedida, como um erro de chave duplicada, não definam db.response.status_code. O driver registra esses erros como atributos de exceção na extensão de operação.
Os erros não impedem que o driver aumente a exceção para o seu aplicativo.
Considerações de desempenho
Considere as seguintes implicações de desempenho ao usar o rastreamento OpenTelemetry:
A captura do atributo
db.query.textadiciona sobrecarga. Capture o texto de comando somente quando necessário ou definaQueryTextMaxLengthcomo0para desativá-lo.Quando nenhum ouvinte está inscrito no
ActivitySourcedo driver, o rastreamento tem um impacto insignificante no desempenho porque o driver ignora todo o trabalho de rastreamento.
Informações adicionais
Para saber mais sobre o rastreamento do OpenTelemetry, consulte a documentação do OpenTelemetry .NET .
Documentação da API
Para saber mais sobre as classes usadas para rastrear operações no driver, consulte a seguinte documentação da API: