Řešení potíží s pokročilými diagnostickými dotazy ve službě Azure Cosmos DB pro Apache Cassandra
PLATÍ PRO: NoSQL MongoDB Cassandra Skřítek
V tomto článku se budeme zabývat tím, jak psát pokročilejší dotazy, které vám pomůžou řešit problémy s účtem Azure Cosmos DB for Cassandra pomocí diagnostických protokolů odeslaných do tabulek specifických pro prostředky.
V případě tabulek Azure Diagnostics se všechna data zapisuje do jedné tabulky. Uživatelé určují, do které kategorie se mají dotazovat. Pokud chcete zobrazit fulltextový dotaz požadavku, přečtěte si téma Monitorování dat služby Azure Cosmos DB pomocí nastavení diagnostiky v Azure a zjistěte, jak tuto funkci povolit.
U tabulek specifických pro prostředky se data zapisují do jednotlivých tabulek pro každou kategorii prostředku. Tento režim doporučujeme, protože:
- Usnadňuje práci s daty.
- Poskytuje lepší zjistitelnost schémat.
- Zlepšuje výkon v době latence příjmu dat i dotazů.
Požadavky
- Vytvoření rozhraní API pro účet Cassandra
- Vytvořte pracovní prostor služby Log Analytics.
- Vytvoření nastavení diagnostiky
Upozorňující
Při vytváření nastavení diagnostiky pro účet ROZHRANÍ API pro Cassandra se ujistěte, že možnost DataPlaneRequests zůstane nevybraná. Kromě toho pro cílovou tabulku zajistěte, aby byla zvolena možnost Konkrétní prostředek, protože nabízí výrazné úspory nákladů oproti diagnostice Azure.
Poznámka:
Všimněte si, že po povolení diagnostiky fulltextu budou vrácené dotazy obsahovat data PII. Tato funkce nejen protokoluje kostru dotazu s obfuskovanými parametry, ale protokoluje hodnoty samotných parametrů. To může pomoct s diagnostikou, jestli dotazy na konkrétní primární klíč (nebo sadu primárních klíčů) využívají mnohem více RU než dotazy na jiné primární klíče.
Dotazy Log Analytics s různými scénáři
Spotřeba RU
Operace Cassandra, které spotřebovávají vysoké 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;
Monitorování spotřeby RU na operaci u klíčů logického oddílu
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;
Jaké jsou hlavní dotazy, které mají vliv na spotřebu 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;
Spotřeba RU založená na variantách velikostí datových částí pro operace čtení a zápisu
// 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;
Spotřeba RU založená na operacích čtení a zápisu podle logického oddílu
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where OperationName in ("Delete", "Read", "Upsert") | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
Spotřeba RU podle fyzického a logického oddílu
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
Vede horký oddíl k vysoké spotřebě RU?
CDBPartitionKeyStatistics | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > now(-8h) | summarize StorageUsed = sum(SizeKb) by PartitionKey | order by StorageUsed desc
Jaký vliv má klíč oddílu na spotřebu 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;
Latence
Počet časových limitů na straně serveru (stavový kód – 408) v časovém intervalu
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;
Pozorujeme špičky v latencích na straně serveru v zadaném časovém intervalu?
CDBCassandraRequests | where TimeGenerated > now(-6h) | DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize max(DurationMs) by bin(TimeGenerated, 10m) | render timechart;
Dochází k omezování operací.
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;
Omezování
Dochází u vaší aplikace k omezování?
CDBCassandraRequests | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
Jaké dotazy způsobují omezování aplikace pomocí zadaného časového období, které se konkrétně dívá na 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;
Další kroky
- Povolte pro účet Cassandra analýzu protokolů ve vašem rozhraní API.
- Přehled definice kódu chyby