Solucionar problemas com consultas de diagnóstico avançadas para o Azure Cosmos DB for Apache Cassandra
APLICA-SE AO: NoSQL MongoDB Cassandra Gremlin
Neste artigo, veremos como escrever consultas mais avançadas para ajudar a solucionar problemas com a sua conta do Azure Cosmos DB para Cassandra usando os logs de diagnóstico enviados às tabelas específicas dos recursos.
Para as tabelas do Diagnóstico do Azure, todos os dados são gravados em uma única tabela. Os usuários especificam a categoria que desejam consultar. Se você quiser exibir a consulta de texto completo de sua solicitação, consulte Monitore dados do Azure Cosmos DB usando configurações de diagnóstico no Azure para saber como habilitar esse recurso.
Para tabelas específicas dos recursos, os dados são gravados em tabelas individuais para cada categoria do recurso. Recomendamos esse modo porque:
- Facilita o trabalho com os dados.
- Fornece melhor detectabilidade dos esquemas.
- Melhora o desempenho entre a latência de ingestão e os tempos de consulta.
Pré-requisitos
- Criar conta da API para Cassandra
- Criar um Workspace do Log Analytics.
- Criar Configurações de diagnóstico.
Aviso
Ao criar uma Configuração de Diagnóstico para a conta da API do Cassandra, verifique se "DataPlaneRequests" permanece não selecionado. Além disso, para a tabela Destino, certifique-se de que "Específico do recurso" esteja selecionado, pois isso oferece uma economia de custo significativa em relação ao "Diagnóstico do Azure.
Observação
Observe que, habilitando o diagnóstico de texto completo, as consultas retornadas conterão dados PII. Esse recurso não apenas registrará o esqueleto da consulta com parâmetros ofuscados, mas registrará os valores dos próprios parâmetros. Isso pode ajudar a diagnosticar se as consultas em uma chave primária específica (ou conjunto de chaves primárias) estão consumindo muito mais RUs do que as consultas em outras chaves primárias.
Consultas do Log Analytics com cenários diferentes
Consumo de RUs
Operações do Cassandra que estão consumindo uma quantidade elevada de RU/s.
CDBCassandraRequests | where DatabaseName=="azure_comos" and CollectionName=="user" | project TimeGenerated, RequestCharge, OperationName, requestType=split(split(PIICommandText,'"')[3], ' ')[0] | summarize max(RequestCharge) by bin(TimeGenerated, 10m), tostring(requestType), OperationName;
Monitore o consumo de RU por operação em chaves de partição lógicas.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_comos" and CollectionName=="user" | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by PartitionKey, PartitionKeyRangeId | order by TotalRequestCharge; CDBPartitionKeyRUConsumption | where DatabaseName=="azure_comos" and CollectionName=="user" | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by OperationName, PartitionKey | order by TotalRequestCharge; CDBPartitionKeyRUConsumption | where DatabaseName=="azure_comos" and CollectionName=="user" | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by bin(TimeGenerated, 1m), PartitionKey | render timechart;
Quais são as principais consultas que estão afetando o consumo de RU?
CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > ago(24h) | project ActivityId, DatabaseName, CollectionName, queryText=split(split(PIICommandText,'"')[3], ' ')[0], RequestCharge, TimeGenerated | order by RequestCharge desc;
Consumo de RU com base em variações em tamanhos de conteúdo para operações de leitura e gravação.
// This query is looking at read operations CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0] | where cassandraOperationName =="SELECT" | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName) // This query is looking at write operations CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0] | where cassandraOperationName in ("CREATE", "UPDATE", "INSERT", "DELETE", "DROP") | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName) // Write operations over a time period. CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0] | where cassandraOperationName in ("CREATE", "UPDATE", "INSERT", "DELETE", "DROP") | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName) | render timechart; // Read operations over a time period. CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0] | where cassandraOperationName =="SELECT" | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName) | render timechart;
Consumo de RU com base em operações de leitura e gravação por partição lógica.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where OperationName in ("Delete", "Read", "Upsert") | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
Consumo de RU por partição física e lógica.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
Uma partição ativa está levando ao alto consumo de RU?
CDBPartitionKeyStatistics | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > now(-8h) | summarize StorageUsed = sum(SizeKb) by PartitionKey | order by StorageUsed desc
Como a chave de partição afeta o consumo de RU?
let storageUtilizationPerPartitionKey = CDBPartitionKeyStatistics | project AccountName=tolower(AccountName), PartitionKey, SizeKb; CDBCassandraRequests | project AccountName=tolower(AccountName),RequestCharge, ErrorCode, OperationName, ActivityId, DatabaseName, CollectionName, PIICommandText, RegionName | where DatabaseName=="azure_cosmos" and CollectionName=="user" | join kind=inner storageUtilizationPerPartitionKey on $left.AccountName==$right.AccountName | where ErrorCode != -1 //successful | project AccountName, PartitionKey,ErrorCode,RequestCharge,SizeKb, OperationName, ActivityId, DatabaseName, CollectionName, PIICommandText, RegionName;
Latency
Número de tempos limite do lado do servidor (Código de Status – 408) vistos na janela de tempo.
CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where ErrorCode in (4608, 4352) //Corresponding code in Cassandra | summarize max(DurationMs) by bin(TimeGenerated, 10m), ErrorCode | render timechart;
Observamos picos em latências do lado do servidor na janela de tempo especificada?
CDBCassandraRequests | where TimeGenerated > now(-6h) | DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize max(DurationMs) by bin(TimeGenerated, 10m) | render timechart;
Operações que estão sendo limitadas.
CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | project RequestLength, ResponseLength, RequestCharge, DurationMs, TimeGenerated, OperationName, query=split(split(PIICommandText,'"')[3], ' ')[0] | summarize max(DurationMs) by bin(TimeGenerated, 10m), RequestCharge, tostring(query), RequestLength, OperationName | order by RequestLength, RequestCharge;
Limitação
Seu aplicativo está enfrentando limitações?
CDBCassandraRequests | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
Consultas que estão causando a limitação do aplicativo com um período de tempo especificado, marcadamente em 429.
CDBCassandraRequests | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where ErrorCode==4097 // Corresponding error code in Cassandra | project DatabaseName , CollectionName , CassandraCommands=split(split(PIICommandText,'"')[3], ' ')[0] , OperationName, TimeGenerated;
Próximas etapas
- Habilite o Log Analytics em sua conta da API do Cassandra.
- Consulte a visão geral da definição de código de erro.