Delen via


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

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

Afbeelding van een bellenwoordkaart met mogelijke vragen over het gebruik van Log Analytics in Azure Cosmos DB

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