Overview
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.
Datos de muestra
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");
Dependencies
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
Habilitar seguimiento de OpenTelemetry
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.
Suscríbete en una aplicación con un anfitrión.
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.
Suscríbase con un TracerProvider
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();
Suscríbete con un ActivityListener
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);
Configurar opciones de rastreo
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 |
|---|---|---|
|
| Cuando se establece en Por defecto: |
|
| Especifica la longitud máxima del texto de consulta que se incluirá en los atributos span. Cuando se establece en Por defecto: |
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);
Rastreo de operaciones
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 |
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 |
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
Atributos Span
El controlador .NET/C# sigue las convenciones semánticas de OpenTelemetry e incluye atributos que proporcionan contexto sobre cada operación.
Atributos generales
Los segmentos incluyen los siguientes atributos generales:
db.system.nameSiempre configurado enmongodbdb.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 datosdb.collection.name: Nombre de la colección, cuando correspondadb.query.summaryResumen de la consulta (solo intervalos de comandos)
Atributos de red
Los intervalos de comandos incluyen los siguientes atributos de red:
server.addressServidor host de MongoDBserver.portPuerto del servidor MongoDBnetwork.transport: Protocolo de transporte, comotcpounix
Atributos de conexión
Los spans de comando incluyen los siguientes atributos de conexión:
db.mongodb.server_connection_idID de conexión asignado por el servidordb.mongodb.driver_connection_idID de conexión asignado por el controlador
Atributos de sesión y transacción
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)
Atributos de query
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.
Atributos de error
Cuando una operación falla, el controlador registra los detalles de la excepción e incluye los siguientes atributos:
exception.type: Tipo de excepciónexception.messageMensaje de excepciónexception.stacktraceRastreo de la pila de excepcionesdb.response.status_code: Código de error de MongoDB (solo para intervalos de comandos)
Seguridad y redacción
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,copyDbSaslStartycopyDb. El controlador también omite el comandohellocuando incluye el campospeculativeAuthenticate.El controlador desactiva el atributo
db.query.textpor defecto. Active este atributo solo cuando sea necesario.Cuando el controlador captura el texto de la consulta, elimina los campos
lsid,$db,$clusterTimeysignaturedel 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.
Error Handling
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.
Consideraciones sobre el rendimiento
Tenga en cuenta las siguientes implicaciones de rendimiento cuando utilice la trazabilidad de OpenTelemetry:
La captura del atributo
db.query.textgenera sobrecarga. Capture el texto del comando solo cuando sea necesario, o establezcaQueryTextMaxLengthen0para deshabilitarlo.Cuando ningún oyente está suscrito al
ActivitySourcedel controlador, el rastreo tiene un impacto insignificante en el rendimiento porque el controlador omite todo el trabajo de rastreo.
Información Adicional
Para obtener más información sobre el rastreo de OpenTelemetry, consulte la documentación de OpenTelemetry.NET.
Documentación de la API
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: