Sdílet prostřednictvím


Ř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

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

Obrázek bublinové mapy slov s možnými dotazy týkajícími se využití Log Analytics ve službě Azure Cosmos DB

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