Observabilité du Kit de développement logiciel (SDK) Azure Cosmos DB

S’APPLIQUE À : NoSQL

Les Kits de développement logiciel (SDK) .NET et Java Azure Cosmos DB prennent en charge le suivi distribué pour vous aider à surveiller vos applications. Le suivi du flux de requêtes est utile pour le débogage, l’analyse de la latence et des performances et la collecte de diagnostics. Suivi d’instruments pour vos applications à l’aide d’OpenTelemetry, qui est indépendant du fournisseur et a un ensemble de conventions sémantiques pour garantir un format de données standardisé, quel que soit l’exportateur que vous avez choisi, ou utiliser le Kit de développement logiciel (SDK) Application Insights ou la distribution OpenTelemetry d’Azure Monitor.

Bien démarrer

Le suivi distribué est disponible dans les kits SDK suivants :

Kit SDK Version prise en charge Notes
SDK .NET v3 >= 3.36.0 Cette fonctionnalité est disponible dans les versions préliminaires et non préliminaires. Elle est désactivée par défaut pour les versions non préliminaires. Vous pouvez désactiver le suivi en définissant DisableDistributedTracing = false dans CosmosClientOptions.CosmosClientTelemetryOptions.
Version préliminaire du Kit de développement logiciel (SDK) .NET v3 >= 3.33.0-preview Cette fonctionnalité est disponible dans les versions préliminaires et non préliminaires. Elle est activée par défaut pour les versions préliminaires. Vous pouvez désactiver le suivi en définissant DisableDistributedTracing = true dans CosmosClientOptions.CosmosClientTelemetryOptions.
SDK Java v4 >= 4.43.0

Traces (attributs)

Les traces Azure Cosmos DB suivent la spécification de la base de données OpenTelemetry et fournissent également plusieurs attributs personnalisés. Vous pouvez voir différents attributs en fonction de l’opération de votre demande, et ces attributs sont des attributs principaux pour toutes les requêtes.

Attribut Type Description
net.peer.name string Nom d’hôte Azure Cosmos DB.
db.name string Nom de la base de données Azure Cosmos DB.
db.system string Identificateur pour le service de la base de données. Est cosmosdb pour toutes les requêtes.
db.operation string Nom de l’opération, ex. CreateItemAsync.
db.cosmosdb.container string Nom de conteneur Azure Cosmos DB.
db.cosmosdb.client_id string Identificateur représentant une instance client unique.
db.cosmosdb.operation_type string Type d’opération, ex. Create.
db.cosmosdb.connection_mode string Mode de connexion client. direct ou gateway.
db.cosmosdb.status_code int Le code d'état pour la demande.
db.cosmosdb.sub_status_code int Le code de sous-état pour la demande.
db.cosmosdb.request_charge double Unités de requête consommées pour l’opération.
db.cosmosdb.regions_contacted string Liste des régions contactées dans le compte Azure Cosmos DB.
user_agent.original string Chaîne d’agent utilisateur complète générée par le Kit de développement logiciel (SDK) Azure Cosmos DB.

Collecter des diagnostics

Si vous avez configuré des journaux dans votre fournisseur de trace, vous pouvez obtenir automatiquement des diagnostics pour les requêtes Azure Cosmos DB ayant échoué ou qui ont eu une latence élevée. Ces journaux peuvent vous aider à diagnostiquer les demandes ayant échoué et lentes sans nécessiter de code personnalisé pour les capturer.

En plus d’obtenir des journaux de diagnostic pour les demandes ayant échoué, vous pouvez configurer différents seuils de latence pour le moment auquel collecter des diagnostics à partir des demandes réussies. Les valeurs par défaut sont 100 ms pour les opérations de point et 500 ms pour les opérations non point. Ces seuils peuvent être ajustés via les options du client.

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

Vous pouvez configurer le niveau de journalisation pour contrôler les diagnostics journaux que vous recevez.

Niveau du journal Description
Error Journaux pour les erreurs uniquement.
Avertissement Journaux pour les erreurs et les requêtes à latence élevée en fonction des seuils configurés.
Information Il n’existe aucun journal d’information spécifique. Les journaux de ce niveau sont identiques à l’utilisation d’Avertissement.

Selon votre environnement d’application, il existe différentes façons de configurer le niveau de journalisation. Voici un exemple de configuration dans appSettings.json :

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

Configurer OpenTelemetry

Pour utiliser OpenTelemetry avec les kits SDK Azure Cosmos DB, ajoutez la source Azure.Cosmos.Operation à votre fournisseur de traces. OpenTelemetry est compatible avec de nombreux exportateurs qui peuvent ingérer vos données. L’exemple suivant utilise le Azure Monitor OpenTelemetry Exporter, mais vous pouvez choisir de configurer n’importe quel exportateur de votre choix. En fonction de l’exportateur que vous avez choisi, vous pouvez constater un délai d’ingestion des données pouvant aller jusqu’à quelques minutes.

Conseil

Si vous utilisez le package Azure.Monitor.OpenTelemetry.Exporter, vérifiez que vous utilisez la version >= 1.0.0-beta.11. Si vous utilisez ASP.NET Core et Azure Monitor, nous vous recommandons d’utiliser la distribution OpenTelemetry d’Azure Monitor à la place.

Cet exemple montre comment configurer OpenTelemetry pour une application console .NET. Consultez l’exemple complet sur 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();

Configurer le SDK Application Insights

Il existe de nombreuses façons de configurer Application Insights en fonction de la langue dans laquelle votre application est écrite et de votre environnement de calcul. Pour plus d’informations, consultez la documentation Application Insights. L’ingestion des données dans Application Insights peut prendre jusqu’à quelques minutes.

Remarque

Utilisez la version >= 2.22.0-beta2 du package Application Insights pour votre environnement .NET cible.

L’exemple suivant montre comment configurer Application Insights pour une application console .NET. Consultez l’exemple complet sur GitHub.

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

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

Une fois les données de trace ingérées dans Application Insights, vous pouvez les visualiser dans le portail Azure pour comprendre le flux de demandes dans votre application. Voici un exemple de données de trace provenant d’une requête de partitions croisées dans la recherche de transaction dans la navigation de gauche du portail Azure.

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

Étapes suivantes