Udostępnij za pośrednictwem


Rozwiązywanie problemów z zaawansowanymi zapytaniami diagnostycznymi w usłudze Azure Cosmos DB dla bazy danych Apache Cassandra

DOTYCZY: NoSQL MongoDB Kasandra Gremlin

W tym artykule omówimy sposób pisania bardziej zaawansowanych zapytań, aby ułatwić rozwiązywanie problemów z kontem usługi Azure Cosmos DB dla bazy danych Cassandra przy użyciu dzienników diagnostycznych wysyłanych do tabel specyficznych dla zasobów.

W przypadku tabel Diagnostyka Azure wszystkie dane są zapisywane w jednej tabeli. Użytkownicy określają kategorię, którą mają wykonywać zapytania. Jeśli chcesz wyświetlić zapytanie pełnotekstowe żądania, zobacz Monitorowanie danych usługi Azure Cosmos DB przy użyciu ustawień diagnostycznych na platformie Azure , aby dowiedzieć się, jak włączyć tę funkcję.

W przypadku tabel specyficznych dla zasobów dane są zapisywane w poszczególnych tabelach dla każdej kategorii zasobu. Zalecamy ten tryb, ponieważ:

  • Ułatwia pracę z danymi.
  • Zapewnia lepszą możliwość odnajdywania schematów.
  • Zwiększa wydajność zarówno opóźnienia pozyskiwania, jak i czasu wykonywania zapytań.

Wymagania wstępne

Ostrzeżenie

Podczas tworzenia ustawienia diagnostycznego dla interfejsu API dla konta Cassandra upewnij się, że "DataPlaneRequests" pozostaje niezaznaczone. Ponadto w przypadku tabeli Destination (Miejsce docelowe) upewnij się, że wybrano opcję "Zasób specyficzny", ponieważ oferuje znaczne oszczędności kosztów w przypadku "diagnostyki platformy Azure".

Uwaga

Należy pamiętać, że włączenie diagnostyki pełnotekstowej spowoduje, że zwrócone zapytania będą zawierać dane osobowe. Ta funkcja nie tylko rejestruje szkielet zapytania z zaciemnionymi parametrami, ale rejestruje same wartości parametrów. Może to pomóc w diagnozowaniu, czy zapytania dotyczące określonego klucza podstawowego (lub zestawu kluczy podstawowych) zużywają znacznie więcej jednostek RU niż zapytania dotyczące innych kluczy podstawowych.

Zapytania usługi Log Analytics z różnymi scenariuszami

Obraz przedstawiający mapę wyrazów bąbelkowych z możliwymi pytaniami dotyczącymi sposobu wykorzystania usługi Log Analytics w usłudze Azure Cosmos DB

Użycie jednostek RU

  • Operacje cassandra korzystające z dużej liczby jednostek 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;
    
  • Monitorowanie użycia jednostek RU na operację na kluczach partycji logicznych.

    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;
    
  • Jakie są najważniejsze zapytania wpływające na użycie jednostek 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;
    
  • Użycie jednostek RU na podstawie odmian rozmiarów ładunków dla operacji odczytu i zapisu.

    // 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;
    
  • Użycie jednostek RU na podstawie operacji odczytu i zapisu według partycji logicznej.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where OperationName in ("Delete", "Read", "Upsert")
    | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
    
  • Użycie jednostek RU przez partycję fizyczną i logiczną.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
    
  • Czy gorąca partycja prowadzi do wysokiego użycia jednostek RU?

    CDBPartitionKeyStatistics
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where  TimeGenerated > now(-8h)
    | summarize StorageUsed = sum(SizeKb) by PartitionKey
    | order by StorageUsed desc
    
  • Jak klucz partycji wpływa na użycie jednostek 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;
    

Opóźnienie

  • Liczba limitów czasu po stronie serwera (kod stanu — 408) widocznych w przedziale czasu.

    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;
    
  • Czy obserwujemy wzrost opóźnień po stronie serwera w określonym przedziale czasu?

    CDBCassandraRequests
    | where TimeGenerated > now(-6h)
    | DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize max(DurationMs) by bin(TimeGenerated, 10m)
    | render timechart;
    
  • Operacje, które są ograniczane.

    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;
    

Ograniczanie przepływności

  • Czy twoja aplikacja ma jakiekolwiek ograniczenia?

    CDBCassandraRequests
    | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
    
  • Zapytania, które powodują ograniczanie przepustowości aplikacji z określonym okresem, w szczególności 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;
    

Następne kroki