Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Rastrear operações com OpenTelemetry

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.

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");

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

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.

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.

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();

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);

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

Disabled

bool

Quando definido para true, este cliente não cria spans. Os ouvintes inscritos em outros clientes não são afetados.

Padrão: false

QueryTextMaxLength

int

Especifica o comprimento máximo do texto de query a incluir nos atributos de extensão. Quando definido para 0, o driver omite o texto da query. O texto da query aparece no atributo db.query.text.

Padrão: 0

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);

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 find, insert ou aggregate. Os intervalos de nível de operação incluem o atributo db.operation.name.

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 db.command.name e estão aninhados sob o intervalo de nível de operação correspondente.

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

O driver .NET/C# segue as convenções semânticas do OpenTelemetry e inclui atributos que fornecem contexto sobre cada operação.

Os spans incluem os seguintes atributos gerais:

  • db.system.name: Sempre definido como mongodb

  • db.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 dados

  • db.collection.name: Nome da collection, quando aplicável

  • db.query.summary: Resumo da query (somente o comando se estende)

As extensões de comando incluem os seguintes atributos de rede:

  • server.address: Host do servidor MongoDB

  • server.port: Porta do servidor MongoDB

  • network.transport: Protocolo de transporte, como tcp ou unix

As extensões de comando incluem os seguintes atributos de conexão:

  • db.mongodb.server_connection_id: ID de conexão atribuída ao servidor

  • db.mongodb.driver_connection_id: ID de conexão atribuída ao driver

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)

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

Quando uma operação falha, o driver registra os detalhes da exceção e inclui os seguintes atributos:

  • exception.type: Tipo da exceção

  • exception.message: Mensagem de exceção

  • exception.stacktrace: Rastreamento de pilha de exceção

  • db.response.status_code: Código de erro do MongoDB (somente o comando se estende)

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, copyDbSaslStart e copyDb. O driver também ignora o comando hello quando inclui o campospeculativeAuthenticate .

  • O driver desabilita o atributo db.query.text por padrão. Ative este atributo somente quando necessário.

  • Quando o driver captura o texto da query, ele remove os campos lsid, $db, $clusterTime e signature do 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.

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.

Considere as seguintes implicações de desempenho ao usar o rastreamento OpenTelemetry:

  • A captura do atributo db.query.text adiciona sobrecarga. Capture o texto de comando somente quando necessário ou defina QueryTextMaxLength como 0 para desativá-lo.

  • Quando nenhum ouvinte está inscrito no ActivitySource do driver, o rastreamento tem um impacto insignificante no desempenho porque o driver ignora todo o trabalho de rastreamento.

Para saber mais sobre o rastreamento do OpenTelemetry, consulte a documentação do OpenTelemetry .NET .

Para saber mais sobre as classes usadas para rastrear operações no driver, consulte a seguinte documentação da API: