Beheben von Problemen mit erweiterten Diagnoseabfragen mit Azure Cosmos DB for Apache Cassandra

GILT FÜR: NoSQL MongoDB Cassandra Gremlin

In diesem Artikel wird erläutert, wie Sie erweiterte Abfragen schreiben, um mithilfe von Diagnoseprotokollen, die an ressourcenspezifische Tabellen gesendet werden, Probleme bei Ihrem Azure Cosmos DB for Apache Cassandra-Konto zu beheben.

Bei Azure-Diagnose-Tabellen werden alle Daten in eine einzige Tabelle geschrieben. Benutzer geben an, welche Kategorie sie abfragen möchten. Wenn Sie die Volltextabfrage Ihrer Anforderung anzeigen möchten, lesen Sie den Artikel Überwachen von Azure Cosmos DB-Daten mithilfe von Diagnoseeinstellungen in Azure. Darin erfahren Sie, wie Sie dieses Feature aktivieren können.

Bei ressourcenspezifischen Tabellen werden Daten in einzelne Tabellen für die jeweilige Kategorie der Ressource geschrieben. Wir empfehlen diesen Modus aus folgenden Gründen:

  • Er vereinfacht die Arbeit mit den Daten erheblich.
  • Er ermöglicht eine bessere Erkennbarkeit der Schemas.
  • Er verbessert die Leistung sowohl im Hinblick auf Erfassungslatenz als auch auf Abfragezeiten.

Voraussetzungen

Warnung

Sorgen Sie beim Erstellen einer Diagnoseeinstellung für das API für Cassandra-Konto dafür, dass DataPlaneRequests deaktiviert bleibt. Stellen Sie außerdem bei der Zieltabelle sicher, dass „Ressourcenspezifisch“ ausgewählt ist, da diese Einstellung gegenüber „Azure-Diagnose“ erhebliche Kosteneinsparungen bietet.

Hinweis

Beachten Sie beim Aktivieren der Volltextdiagnose, dass die zurückgegebenen Abfragen personenbezogene Daten enthalten. Dieses Feature protokolliert nicht nur das Gerüst der Abfrage mit verborgenen Parametern, sondern auch die Werte der Parameter selbst. Dadurch kann besser diagnostiziert werden, ob Abfragen für einen bestimmten Primärschlüssel (oder eine Gruppe von Primärschlüsseln) deutlich mehr RUs verbrauchen als Abfragen für andere Primärschlüssel.

Log Analytics-Abfragen mit unterschiedlichen Szenarien

Abbildung einer Karte mit Sprechblasen mit möglichen Fragen zur Nutzung von Log Analytics in Azure Cosmos DB

Verbrauch von Anforderungseinheiten (RUs)

  • Cassandra-Vorgänge, die eine hohe Anzahl von RU/s verbrauchen.

    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;
    
  • Überwachen des RU-Verbrauchs pro Vorgang für logische Partitionsschlüssel.

    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;
    
  • Welches sind die wichtigsten Abfragen im Zusammenhang mit dem RU-Verbrauch?

    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-Verbrauch auf Basis von Variationen der Nutzlastgrößen für Lese- und Schreibvorgänge.

    // 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-Verbrauch auf Basis von Lese- und Schreibvorgängen nach logischer Partition.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where OperationName in ("Delete", "Read", "Upsert")
    | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
    
  • RU-Verbrauch nach physischer und logischer Partition.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
    
  • Führt eine Hot-Partition zu einem hohen RU-Verbrauch?

    CDBPartitionKeyStatistics
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where  TimeGenerated > now(-8h)
    | summarize StorageUsed = sum(SizeKb) by PartitionKey
    | order by StorageUsed desc
    
  • Wie wirkt sich der Partitionsschlüssel auf den RU-Verbrauch aus?

    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;
    

Latenz

  • Anzahl der serverseitigen Timeouts (Statuscode 408), die im Zeitfenster angezeigt werden.

    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;
    
  • Können Sie Spitzen bei serverseitigen Latenzen im angegebenen Zeitfenster feststellen?

    CDBCassandraRequests
    | where TimeGenerated > now(-6h)
    | DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize max(DurationMs) by bin(TimeGenerated, 10m)
    | render timechart;
    
  • Vorgänge, die gedrosselt werden.

    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;
    

Drosselung

  • Wird Ihre Anwendung in irgendeiner Weise gedrosselt?

    CDBCassandraRequests
    | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
    
  • Welche Abfragen führen zu einer Drosselung Ihrer Anwendung in einem bestimmten Zeitraum (besonders in Hinblick auf Fehler 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ächste Schritte