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
- Tworzenie interfejsu API dla konta Cassandra
- Utwórz obszar roboczy usługi Log Analytics.
- Utwórz ustawienia diagnostyczne.
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
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
- Włącz analizę dzienników w interfejsie API dla konta Cassandra.
- Omówienie definicji kodu błędu.