Problemen oplossen met geavanceerde diagnostische query's met Azure Cosmos DB voor Apache Cassandra
VAN TOEPASSING OP: NoSQL MongoDB Cassandra Gremlin
In dit artikel wordt beschreven hoe u geavanceerdere query's schrijft om problemen met uw Azure Cosmos DB voor Cassandra-account op te lossen met behulp van diagnostische logboeken die naar resourcespecifieke tabellen worden verzonden.
Voor Azure Diagnostics-tabellen worden alle gegevens in één tabel geschreven. Gebruikers geven op welke categorie ze een query willen uitvoeren. Als u de volledige-tekstquery van uw aanvraag wilt bekijken, raadpleegt u Azure Cosmos DB-gegevens bewaken met behulp van diagnostische instellingen in Azure voor meer informatie over het inschakelen van deze functie.
Voor resourcespecifieke tabellen worden gegevens voor elke categorie van de resource in afzonderlijke tabellen geschreven. We raden deze modus aan omdat deze:
- Maakt het veel eenvoudiger om met de gegevens te werken.
- Biedt een betere zichtbaarheid van de schema's.
- Verbetert de prestaties voor zowel opnamelatentie als querytijden.
Vereisten
- API maken voor Cassandra-account
- Maak een Log Analytics-werkruimte.
- Diagnostische instellingen maken.
Waarschuwing
Wanneer u een diagnostische instelling voor de API voor Cassandra-account maakt, moet u ervoor zorgen dat DataPlaneRequests niet is geselecteerd. Zorg er bovendien voor de doeltabel voor dat resourcespecifiek wordt gekozen omdat deze aanzienlijke kostenbesparingen biedt ten opzichte van Azure Diagnostics.
Notitie
Houd er rekening mee dat het inschakelen van diagnostische gegevens voor volledige tekst, de geretourneerde query's PII-gegevens bevatten. Met deze functie wordt niet alleen het skelet van de query vastgelegd met verborgen parameters, maar worden de waarden van de parameters zelf vastgelegd. Dit kan helpen bij het diagnosticeren of query's op een specifieke primaire sleutel (of set primaire sleutels) veel meer RU's verbruiken dan query's op andere primaire sleutels.
Log Analytics-query's met verschillende scenario's
RU-verbruik
Cassandra-bewerkingen die hoge RU/s verbruiken.
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;
RU-verbruik per bewerking bewaken op logische partitiesleutels.
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;
Wat zijn de belangrijkste query's die van invloed zijn op ru-verbruik?
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-verbruik op basis van variaties in nettoladinggrootten voor lees- en schrijfbewerkingen.
// 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-verbruik op basis van lees- en schrijfbewerkingen per logische partitie.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where OperationName in ("Delete", "Read", "Upsert") | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
RU-verbruik per fysieke en logische partitie.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
Leidt een dynamische partitie tot hoog RU-verbruik?
CDBPartitionKeyStatistics | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > now(-8h) | summarize StorageUsed = sum(SizeKb) by PartitionKey | order by StorageUsed desc
Hoe is de partitiesleutel van invloed op ru-verbruik?
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;
Latentie
Aantal time-outs aan de serverzijde (statuscode - 408) in het tijdvenster.
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;
Zien we pieken in latenties aan de serverzijde in het opgegeven tijdvenster?
CDBCassandraRequests | where TimeGenerated > now(-6h) | DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize max(DurationMs) by bin(TimeGenerated, 10m) | render timechart;
Bewerkingen die worden beperkt.
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;
Beperking
Ondervindt uw toepassing beperkingen?
CDBCassandraRequests | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
Welke query's ervoor zorgen dat uw toepassing wordt beperkt met een opgegeven periode die specifiek naar 429 kijkt.
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;
Volgende stappen
- Schakel Log Analytics in voor uw API voor Cassandra-account.
- Overzicht van foutcodedefinitie.