Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Operaciones de seguimiento con OpenTelemetry

En esta guía, aprenderá a usar el rastreo de OpenTelemetry con el controlador .NET/C#. OpenTelemetry es un marco de observabilidad de código abierto que proporciona una forma estandarizada de instrumentar, generar, recopilar y exportar datos de telemetría.

El controlador .NET/C# emite datos de seguimiento a través de la API System.Diagnostics.ActivitySource. Al suscribir un oyente al ActivitySource del controlador, este crea segmentos que representan las operaciones de MongoDB, como consultas y transacciones. Estos segmentos incluyen atributos que siguen las convenciones semánticas de OpenTelemetry.

Nota

El rastreo de OpenTelemetry está disponible en el controlador .NET/C# 3.7 o posterior.

Los ejemplos de esta guía utilizan la colección sample_mflix.movies de los conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte la guía de introducción al controlador .NET/C#.

El siguiente código crea un MongoClient y accede a la colección de muestras:

var connectionString = "<connection string>";
var client = new MongoClient(connectionString);
var collection = client.GetDatabase("sample_mflix").GetCollection<BsonDocument>("movies");

El controlador no depende del SDK de OpenTelemetry. Emite segmentos a través de ActivitySource, por lo que cualquier oyente puede recopilarlos, incluido un objeto System.Diagnostics.ActivityListener.

Para usar el SDK de OpenTelemetry y recopilar los segmentos del controlador, agregue el SDK y un exportador a su aplicación. Los ejemplos de esta página usan el exportador en memoria para que pueda inspeccionar los segmentos que produce el controlador. Ejecute los siguientes comandos desde el directorio de su proyecto:

dotnet add package OpenTelemetry
dotnet add package OpenTelemetry.Exporter.InMemory

El controlador crea tramos cuando un oyente está suscrito al ActivitySource del controlador y el cliente tiene habilitado el rastreo. Para deshabilitar el rastreo para un cliente, establezca la propiedad TracingOptions.Disabled en true.

Si ningún oyente está suscrito, el controlador omite todo el trabajo de rastreo y el impacto en el rendimiento es insignificante.

El controlador registra sus segmentos en un ActivitySource llamado MongoDB.Driver. Para recopilar los segmentos del controlador, pase la constante MongoTelemetry.ActivitySourceName al método AddSource() cuando configure OpenTelemetry.

Para configurar OpenTelemetry en una aplicación que utiliza el modelo de alojamiento .NET, como ASP.NET Core o un servicio de trabajador, agregue el siguiente paquete:

dotnet add package OpenTelemetry.Extensions.Hosting

Si su aplicación ya tiene un host, agregue el ActivitySource del controlador a su configuración de OpenTelemetry, como se muestra en el siguiente ejemplo:

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

El ejemplo anterior utiliza el paquete OpenTelemetry.Exporter.InMemory para recopilar los segmentos. En tu aplicación, reemplázalo con el exportador de tu backend de seguimiento.

Si tu aplicación no tiene un host, crea un TracerProvider, como se muestra en el siguiente ejemplo:

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

El ejemplo anterior utiliza el paquete OpenTelemetry.Exporter.InMemory para recopilar los segmentos. En tu aplicación, reemplázalo con el exportador de tu sistema de seguimiento, como el exportador del Protocolo de Telemetría Abierta (OTLP).

Después de suscribirse a ActivitySource, el controlador emite intervalos para las operaciones que ejecuta su aplicación, como se muestra en el siguiente ejemplo:

var filter = Builders<BsonDocument>.Filter.Eq("title", "Back to the Future");
var movie = collection.Find(filter).First();

Si no desea depender del SDK de OpenTelemetry, puede suscribirse al ActivitySource del controlador mediante un objeto System.Diagnostics.ActivityListener. El siguiente ejemplo registra un oyente que recibe cada segmento que emite el controlador:

// 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 el rastreo para un cliente individual, establezca la propiedad MongoClientSettings.TracingOptions en una instancia de TracingOptions. La clase TracingOptions tiene las siguientes propiedades:

Propiedad
Tipo
Descripción

Disabled

bool

Cuando se establece en true, este cliente no crea tramos. Los oyentes que están suscritos a otros clientes no se ven afectados.

Por defecto: false

QueryTextMaxLength

int

Especifica la longitud máxima del texto de consulta que se incluirá en los atributos span. Cuando se establece en 0, el controlador omite el texto de consulta. El texto de consulta aparece en el atributo db.query.text.

Por defecto: 0

El siguiente ejemplo establece QueryTextMaxLength a 1024, lo que captura hasta 1024 caracteres del texto del comando:

var settings = MongoClientSettings.FromConnectionString(connectionString);
settings.TracingOptions = new TracingOptions
{
Disabled = false,
QueryTextMaxLength = 1024
};
var client = new MongoClient(settings);

El controlador .NET/C# crea los siguientes tipos de tramos:

Tipo de tramo
Descripción

Alcances a nivel operativo

Los rangos que representan operaciones de controlador de alto nivel, como find, insert o aggregate. Los rangos de nivel de operación incluyen el atributo db.operation.name.

Alcances a nivel de comando

Los segmentos representan comandos individuales que el controlador envía al servidor. Los segmentos a nivel de comando incluyen el atributo db.command.name y están anidados bajo su segmento correspondiente a nivel de operación.

Transacciones abarcan

Segmentos que engloban todas las operaciones que se ejecutan dentro de una transacción explícita.

Por ejemplo, una operación find crea un segmento a nivel de operación que contiene un segmento anidado a nivel de comando, como se muestra en la siguiente jerarquía:

find sample_mflix.movies
└── find

El controlador .NET/C# sigue las convenciones semánticas de OpenTelemetry e incluye atributos que proporcionan contexto sobre cada operación.

Los segmentos incluyen los siguientes atributos generales:

  • db.system.nameSiempre configurado en mongodb

  • db.operation.name: Nombre de la operación de alto nivel (solo abarca operaciones)

  • db.operation.summaryResumen de la operación de alto nivel (solo abarca los tramos de operación)

  • db.command.name: Nombre del comando de MongoDB (solo se admiten rangos de comandos)

  • db.namespace: Nombre de la base de datos

  • db.collection.name: Nombre de la colección, cuando corresponda

  • db.query.summaryResumen de la consulta (solo intervalos de comandos)

Los intervalos de comandos incluyen los siguientes atributos de red:

  • server.addressServidor host de MongoDB

  • server.portPuerto del servidor MongoDB

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

Los spans de comando incluyen los siguientes atributos de conexión:

  • db.mongodb.server_connection_idID de conexión asignado por el servidor

  • db.mongodb.driver_connection_idID de conexión asignado por el controlador

Cuando se utilizan sesiones o transacciones, los rangos de comandos incluyen los siguientes atributos:

  • db.mongodb.lsid: ID de sesión lógica (cuando se usan sesiones)

  • db.mongodb.txn_number: Número de transacción (cuando esté en una transacción)

  • db.mongodb.cursor_idID del cursor (para operaciones que devuelven cursores)

Cuando se configura QueryTextMaxLength con un valor mayor que 0, los rangos de comandos incluyen el siguiente atributo:

  • db.query.text: El texto del comando, truncado a la longitud máxima especificada.

Cuando una operación falla, el controlador registra los detalles de la excepción e incluye los siguientes atributos:

  • exception.type: Tipo de excepción

  • exception.messageMensaje de excepción

  • exception.stacktraceRastreo de la pila de excepciones

  • db.response.status_code: Código de error de MongoDB (solo para intervalos de comandos)

El conductor aplica las siguientes medidas de seguridad para proteger la información confidencial:

  • El controlador no crea segmentos para comandos confidenciales, como los comandos de autenticación. Estos comandos incluyen authenticate, saslStart, saslContinue, getNonce, createUser, updateUser, copyDbSaslStart y copyDb. El controlador también omite el comando hello cuando incluye el campo speculativeAuthenticate.

  • El controlador desactiva el atributo db.query.text por defecto. Active este atributo solo cuando sea necesario.

  • Cuando el controlador captura el texto de la consulta, elimina los campos lsid, $db, $clusterTime y signature del comando.

Advertencia

Al habilitar el atributo db.query.text, el controlador incluye el texto del comando en los atributos de segmento, y el exportador envía los segmentos al sistema de seguimiento. El controlador elimina únicamente los metadatos de sesión y clúster. El sistema de seguimiento sigue registrando los valores de filtro, los operadores de consulta y el contenido de los documentos insertados o actualizados.

Cuando las operaciones fallan, el controlador registra los detalles de la excepción como atributos de span que siguen las convenciones semánticas de OpenTelemetry y establece el estado del span en Error.

En caso de fallos en los comandos de MongoDB, el controlador establece el estado tanto del segmento de operación como de su segmento de comando en Error. El controlador registra el código de error en el atributo db.response.status_code del segmento de comando.

Los errores que el servidor devuelve en una respuesta de comando exitosa, como un error de clave duplicada, no se establecen en db.response.status_code. El controlador registra estos errores como atributos de excepción en el segmento de operación.

Los errores no impiden que el controlador lance la excepción a su aplicación.

Tenga en cuenta las siguientes implicaciones de rendimiento cuando utilice la trazabilidad de OpenTelemetry:

  • La captura del atributo db.query.text genera sobrecarga. Capture el texto del comando solo cuando sea necesario, o establezca QueryTextMaxLength en 0 para deshabilitarlo.

  • Cuando ningún oyente está suscrito al ActivitySource del controlador, el rastreo tiene un impacto insignificante en el rendimiento porque el controlador omite todo el trabajo de rastreo.

Para obtener más información sobre el rastreo de OpenTelemetry, consulte la documentación de OpenTelemetry.NET.

Para obtener más información sobre las clases utilizadas para rastrear las operaciones en el controlador, consulte la siguiente documentación de la API: