Compartilhar via


Observabilidade do SDK do Azure Cosmos DB

APLICA-SE A: NoSQL

Os SDKs do .NET e Java do Azure Cosmos DB dão suporte ao rastreamento distribuído para ajudá-lo a monitorar seus aplicativos. O rastreamento do fluxo de solicitações é útil na depuração, na análise da latência e do desempenho e na coleta de diagnóstico. O rastreamento de instrumentos para seus aplicativos usando o OpenTelemetry, que é neutro em relação a fornecedores e tem um conjunto de convenções semânticas para garantir um formato de dados padronizado, independentemente do exportador escolhido, ou use o SDK do Application Insights ou o OpenTelemetry Distro do Azure Monitor.

Introdução

O rastreamento distribuído está disponível nos seguintes SDKs:

. Versão compatível Observações
SDK v3 do .NET >= 3.36.0 Esse recurso está disponível nas versões prévias ou não. Para versões não prévias, isto está desativado por padrão. Você pode habilitar o rastreamento definindo DisableDistributedTracing = false em CosmosClientOptions.CosmosClientTelemetryOptions.
Versão prévia do SDK do .NET v3 >= 3.33.0-preview Esse recurso está disponível nas versões prévias ou não. Para versões prévias, isto está ativado por padrão. Você pode desabilitar o rastreamento definindo DisableDistributedTracing = true em CosmosClientOptions.CosmosClientTelemetryOptions.
SDK do Java v4 >= 4.43.0

Atributos de rastreamento

Os rastreamentos do Azure Cosmos DB seguem a Especificação do banco de dados OpenTelemetry e também fornecem vários atributos personalizados. Você pode ver atributos diferentes dependendo da operação de sua solicitação e esses atributos são atributos principais para todas as solicitações.

Atributo Tipo Descrição
net.peer.name string Nome do host do Azure Cosmos DB.
db.name string Nome do banco de dados do Azure Cosmos DB.
db.system string Identificador do serviço do banco de dados. cosmosdb é para todas as solicitações.
db.operation string Nome da operação, por exemplo CreateItemAsync.
db.cosmosdb.container string Nome do contêiner do Azure Cosmos DB.
db.cosmosdb.client_id string Identificador que representa uma instância de cliente exclusiva.
db.cosmosdb.operation_type string Tipo de operação, por exemplo Create.
db.cosmosdb.connection_mode string Modo de conexão do cliente. direct ou gateway.
db.cosmosdb.status_code INT O código de status da solicitação.
db.cosmosdb.sub_status_code INT O código de substatus HTTP da solicitação.
db.cosmosdb.request_charge double RUs consumidas para a operação.
db.cosmosdb.regions_contacted string Lista de regiões contatadas na conta do Azure Cosmos DB.
user_agent.original string Cadeia de caracteres completa do agente do usuário gerada pelo SDK do Azure Cosmos DB.

Coletar diagnóstico

Se você configurou logs em seu provedor de rastreamento, poderá obter automaticamente diagnósticos para solicitações do Azure Cosmos DB que falharam ou tiveram alta latência. Esses logs podem ajudá-lo a diagnosticar solicitações com falha e lentas sem exigir código personalizado para capturá-las.

Além de obter logs de diagnóstico para solicitações com falha, você pode configurar diferentes limites de latência para quando coletar diagnóstico de solicitações bem-sucedidas. Os valores padrão são 100 ms para operações de ponto e 500 ms para operações não de ponto. Esses limites podem ser ajustados por meio de opções de cliente.

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

Você pode configurar o nível de log para controlar quais logs de diagnóstico você recebe.

Nível de log Descrição
Erro Logs somente para erros.
Aviso Logs de erros e solicitações de alta latência com base nos limites configurados.
Informações Não há logs de nível de informação específicos. Os logs nesse nível são iguais ao uso de Aviso.

Dependendo do ambiente do aplicativo, há diferentes maneiras de configurar o nível de log. Veja uma configuração de exemplo em appSettings.json:

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

Configurar o OpenTelemetry

Para usar o OpenTelemetry com os SDKs do Azure Cosmos DB, adicione a fonte Azure.Cosmos.Operation ao provedor de rastreamento. O OpenTelemetry é compatível com muitos exportadores que podem ingerir seus dados. O exemplo a seguir usa o Azure Monitor OpenTelemetry Exporter, mas você pode optar por configurar qualquer exportador desejado. Dependendo do exportador escolhido, você poderá ver um atraso na ingestão de dados de até alguns minutos.

Dica

Se você usar o pacote Azure.Monitor.OpenTelemetry.Exporter, verifique se está usando a versão >= 1.0.0-beta.11. Se você estiver usando ASP.NET Core e o Azure Monitor, recomendamos usar o OpenTelemetry Distro do Azure Monitor.

Este exemplo mostra como configurar o OpenTelemetry para um aplicativo de console .NET. Confira o exemplo completo no 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();

Configurar o SDK do Application Insights

Há várias maneiras diferentes de configurar o Application Insights, dependendo da linguagem em que seu aplicativo é gravado e do ambiente de computação. Para obter mais informações, consulte a documentação do Application Insights. A ingestão de dados no Application Insights pode levar até alguns minutos.

Observação

Use a versão >= 2.22.0-beta2 do pacote do Application Insights para seu ambiente .NET de destino.

O exemplo a seguir mostra como configurar o Application Insights para um aplicativo de console do .NET. Confira o exemplo completo no GitHub.

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

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

Depois que os dados de rastreamento forem ingeridos no Application Insights, você poderá visualizá-los no portal do Azure para entender o fluxo de solicitação em seu aplicativo. Aqui está um exemplo de dados de rastreamento de uma consulta de partição cruzada na pesquisa de transações na navegação à esquerda do portal do Azure.

Captura de tela do rastreamento distribuído de uma consulta entre partições do Azure Cosmos DB na pesquisa de transação do Application Insights.

Próximas etapas