Observabilidad del SDK de Azure Cosmos DB

SE APLICA A: NoSQL

Los SDK para .NET y Java de Azure Cosmos DB admiten el seguimiento distribuido para ayudarle a supervisar las aplicaciones. El seguimiento del flujo de solicitudes es útil para depurar, analizar la latencia y el rendimiento, y recopilar diagnósticos. Instrumente el seguimiento de las aplicaciones mediante OpenTelemetry, que es independiente del proveedor y tiene un conjunto de convenciones semánticas para garantizar un formato de datos estandarizado independientemente del exportador elegido, o bien use el SDK de Application Insights o la distribución OpenTelemetry de Azure Monitor.

Introducción

El seguimiento distribuido está disponible en los siguientes SDK:

SDK Versión admitida Notas
SDK de .NET v3 >= 3.36.0 Esta característica está disponible en versiones preliminares y no en versión preliminar. En el caso de las versiones que no son de versión preliminar, se desactiva de forma predeterminada. Puede activar el rastreo configurando DisableDistributedTracing = false en CosmosClientOptions.CosmosClientTelemetryOptions.
Vista previa.NET v3 SDK >= 3.33.0-preview Esta característica está disponible en versiones preliminares y no en versión preliminar. Para las versiones preliminares, se activa de forma predeterminada. Puede deshabilitar el seguimiento si establece DisableDistributedTracing = true en CosmosClientOptions.CosmosClientTelemetryOptions.
SDK de Java v4 >= 4.43.0

Seguimiento de atributos

Los seguimientos de Azure Cosmos DB siguen la especificación de la base de datos OpenTelemetry y también proporcionan varios atributos personalizados. Es posible que vea otros atributos según el funcionamiento de la solicitud y estos atributos son atributos principales para todas las solicitudes.

Attribute Tipo Description
net.peer.name string Nombre de host de Azure Cosmos DB.
db.name string Nombre de la base de datos de Azure Cosmos DB.
db.system string Identificador del servicio de base de datos. Es cosmosdb para todas las solicitudes.
db.operation string Nombre de la operación, por ejemplo, CreateItemAsync.
db.cosmosdb.container string Nombre del contenedor de Azure Cosmos DB.
db.cosmosdb.client_id string Identificador que representa una instancia de cliente única.
db.cosmosdb.operation_type string Tipo de operación, por ejemplo, Create.
db.cosmosdb.connection_mode string Modo de conexión del cliente. direct o gateway.
db.cosmosdb.status_code int Código de estado de la solicitud.
db.cosmosdb.sub_status_code int Subcódigo de estado de la solicitud.
db.cosmosdb.request_charge double RU consumidas para la operación.
db.cosmosdb.regions_contacted string Lista de regiones contactadas en la cuenta de Azure Cosmos DB.
user_agent.original string Cadena de agente de usuario completa generada por el SDK de Azure Cosmos DB.

Recopilación de información de diagnóstico

Si ha configurado registros en el proveedor de seguimiento, puede obtener automáticamente diagnósticos para las solicitudes de Azure Cosmos DB con errores o con una latencia alta. Estos registros pueden ayudarle a diagnosticar solicitudes erróneas y lentas sin necesidad de ningún código personalizado para capturarlas.

Además de obtener registros de diagnóstico para las solicitudes con errores, puede configurar otras condiciones para cuándo recopilar diagnósticos de las solicitudes correctas. Los valores predeterminados son 100 ms para las operaciones de punto y 500 ms para las operaciones que no son de punto. Estos umbrales se pueden ajustar a través de las opciones de cliente.

CosmosClientOptions options = new CosmosClientOptions()
{
    CosmosClientTelemetryOptions = new CosmosClientTelemetryOptions()
    {
        DisableDistributedTracing = false,
        CosmosThresholdOptions = new CosmosThresholdOptions()
        {
            PointOperationLatencyThreshold = TimeSpan.FromMilliseconds(100),
            NonPointOperationLatencyThreshold = TimeSpan.FromMilliseconds(500)
        }
    },
};

Puede configurar el nivel de registro para controlar qué registros de diagnóstico recibe.

Nivel de registro Descripción
Error Solo registros de errores.
Advertencia Registra errores y solicitudes de alta latencia en función de los umbrales configurados.
Información No hay registros de nivel de información específicos. Los registros de este nivel son los mismos que el uso de advertencias.

En función del entorno de la aplicación, hay otras maneras de configurar el nivel de registro. Esta es una configuración de ejemplo de appSettings.json:

{ 
    "Logging": {​
        "LogLevel": {​
            "Azure-Cosmos-Operation-Request-Diagnostics": "Information"​
        }​
    }
}

Configuración de OpenTelemetry

Para usar OpenTelemetry con los SDK de Azure Cosmos DB, agregue el origen Azure.Cosmos.Operation al proveedor de seguimiento. OpenTelemetry es compatible con muchos exportadores que pueden ingerir los datos. En el ejemplo siguiente se usa Azure Monitor OpenTelemetry Exporter, pero puede elegir configurar cualquier exportador que quiera. Según el exportador elegido, es posible que vea un retraso en la ingesta de datos de hasta unos minutos.

Sugerencia

Si usa el paquete Azure.Monitor.OpenTelemetry.Exporter, asegúrese de que utiliza la versión >= 1.0.0-beta.11. Si usa ASP.NET Core y Azure Monitor, en su lugar se recomienda utilizar la distribución OpenTelemetry de Azure Monitor.

En este ejemplo se muestra cómo configurar OpenTelemetry para una aplicación de consola de .NET. Vea el ejemplo completo en GitHub.

ResourceBuilder resource = ResourceBuilder.CreateDefault().AddService(
            serviceName: serviceName,
            serviceVersion: "1.0.0");

// Set up logging to forward logs to chosen exporter
using ILoggerFactory loggerFactory
    = LoggerFactory.Create(builder => builder
                                        .AddConfiguration(configuration.GetSection("Logging"))
                                        .AddOpenTelemetry(options =>
                                        {
                                            options.IncludeFormattedMessage = true;
                                            options.SetResourceBuilder(resource);
                                            options.AddAzureMonitorLogExporter(o => o.ConnectionString = aiConnectionString); // Set up exporter of your choice
                                        }));
/*.AddFilter(level => level == LogLevel.Error) // Filter  is irrespective of event type or event name*/

AzureEventSourceLogForwarder logforwader = new AzureEventSourceLogForwarder(loggerFactory);
logforwader.Start();

// Configure OpenTelemetry trace provider
AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);
_traceProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource("Azure.Cosmos.Operation", // Cosmos DB source for operation level telemetry
               "Sample.Application") 
    .AddAzureMonitorTraceExporter(o => o.ConnectionString = aiConnectionString) // Set up exporter of your choice
    .AddHttpClientInstrumentation() // Added to capture HTTP telemetry
    .SetResourceBuilder(resource)
    .Build();

Configuración del SDK de Application Insights

Hay muchas maneras diferentes de configurar Application Insights en función del lenguaje en el que se escriba la aplicación y el entorno de proceso. Para más información, vea la documentación de Application Insights. La ingesta de datos en Application Insights puede tardar varios minutos.

Nota:

Use la version >= 2.22.0-beta2 del paquete de Application Insights para el entorno de .NET de destino.

En el ejemplo siguiente se muestra cómo configurar Application Insights para una aplicación de consola de .NET. Vea el ejemplo completo en GitHub.

IServiceCollection services = new ServiceCollection();
services.AddApplicationInsightsTelemetryWorkerService((ApplicationInsightsServiceOptions options) => options.ConnectionString = aiConnectionString);

IServiceProvider serviceProvider = services.BuildServiceProvider();
telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();

Una vez que los datos de seguimiento se han ingerido en Application Insights, puede visualizarlos en Azure Portal para comprender el flujo de solicitudes en la aplicación. Este es un ejemplo de datos de seguimiento de una consulta entre particiones en la búsqueda de transacciones en el panel de navegación izquierdo de Azure Portal.

Screenshot of distributed tracing of an Azure Cosmos DB cross-partition query in the Application Insights transaction search.

Pasos siguientes