Felsöka problem med avancerade diagnostikfrågor med Azure Cosmos DB för Apache Cassandra
GÄLLER FÖR: NoSQL MongoDB Kassandra Gremlin
I den här artikeln går vi igenom hur du skriver mer avancerade frågor för att felsöka problem med ditt Azure Cosmos DB för Cassandra-konto med hjälp av diagnostikloggar som skickas till resursspecifika tabeller.
För Azure Diagnostics-tabeller skrivs alla data till en enda tabell. Användare anger vilken kategori de vill fråga efter. Om du vill visa frågan i fulltext i din begäran kan du läsa Övervaka Azure Cosmos DB-data med hjälp av diagnostikinställningar i Azure för att lära dig hur du aktiverar den här funktionen.
För resursspecifika tabeller skrivs data till enskilda tabeller för varje kategori av resursen. Vi rekommenderar det här läget eftersom det:
- Gör det mycket enklare att arbeta med data.
- Ger bättre identifiering av scheman.
- Förbättrar prestanda för både svarstid för inmatning och frågetider.
Förutsättningar
- Skapa API för Cassandra-konto
- Skapa en Log Analytics-arbetsyta.
- Skapa diagnostikinställningar.
Varning
När du skapar en diagnostikinställning för API:et för Cassandra-kontot kontrollerar du att "DataPlaneRequests" förblir omarkerad. För måltabellen ser du dessutom till att "Resursspecifik" väljs eftersom den ger betydande kostnadsbesparingar jämfört med "Azure-diagnostik.
Kommentar
Observera att om du aktiverar fulltextdiagnostik innehåller frågorna som returneras PII-data. Den här funktionen loggar inte bara frågans skelett med fördunklade parametrar utan loggar själva parametrarnas värden. Detta kan hjälpa dig att diagnostisera om frågor på en specifik primärnyckel (eller uppsättning primära nycklar) förbrukar mycket fler RU:er än frågor på andra primära nycklar.
Log Analytics-frågor med olika scenarier
RU-förbrukning
Cassandra-åtgärder som förbrukar hög 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;
Övervaka RU-förbrukning per åtgärd på logiska partitionsnycklar.
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;
Vilka är de viktigaste frågorna som påverkar RU-förbrukningen?
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;
RU-förbrukning baserat på variationer i nyttolaststorlekar för läs- och skrivåtgärder.
// 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;
RU-förbrukning baserat på läs- och skrivåtgärder efter logisk partition.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where OperationName in ("Delete", "Read", "Upsert") | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
RU-förbrukning efter fysisk och logisk partition.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
Leder en frekvent partition till hög RU-förbrukning?
CDBPartitionKeyStatistics | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > now(-8h) | summarize StorageUsed = sum(SizeKb) by PartitionKey | order by StorageUsed desc
Hur påverkar partitionsnyckeln RU-förbrukningen?
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;
Svarstid
Antal tidsgränser på serversidan (statuskod - 408) som visas i tidsfönstret.
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;
Observerar vi toppar i svarstider på serversidan i det angivna tidsfönstret?
CDBCassandraRequests | where TimeGenerated > now(-6h) | DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize max(DurationMs) by bin(TimeGenerated, 10m) | render timechart;
Åtgärder som begränsas.
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;
Begränsning
Har ditt program någon begränsning?
CDBCassandraRequests | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
Vilka frågor som gör att ditt program begränsas med en angiven tidsperiod och tittar specifikt på 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;
Nästa steg
- Aktivera logganalys på ditt API för Cassandra-kontot.
- Översikt över felkodsdefinition.