Устранение неполадок с расширенными запросами диагностика с помощью Azure Cosmos DB для Apache Cassandra
Область применения: Nosql Mongodb Кассандра Гремлин
В этой статье мы рассмотрим, как создавать более сложные запросы для устранения неполадок с учетной записью Azure Cosmos DB для Cassandra с помощью журналов диагностика, отправленных в таблицы, относящиеся к ресурсу.
Для таблиц Диагностики Azure все данные записываются в одну таблицу. Пользователи указывают, какая категория будет запрашиваться. Если вы хотите просмотреть полнотекстовый запрос своего запроса, см. раздел Мониторинг данных Azure Cosmos DB с помощью параметров диагностики в Azure, чтобы узнать, как включить эту функцию.
Для таблиц конкретных ресурсов данные записываются в отдельные таблицы для каждой категории ресурса. Мы рекомендуем этот режим, потому что он...
- Значительно упрощает работу с данными.
- Обеспечивает более эффективное обнаружение схем.
- Повышает производительность как по задержке приема, так и по времени запросов.
Необходимые компоненты
- Создание API для учетной записи Cassandra
- Создайте рабочую область Log Analytics.
- Создайте параметры диагностики.
Предупреждение
При создании параметра диагностики для учетной записи API для Cassandra убедитесь, что параметр DataPlaneRequests не выбран. Кроме того, убедитесь, что в таблице "Назначение" выбрано значение "Зависит от ресурса", так как это обеспечивает значительное снижение затрат по сравнению с вариантом "Диагностика Azure".
Примечание.
Обратите внимание, что при включении полнотекствой диагностики возвращаемые запросы будут содержать персональные данные. Эта функция не только регистрирует скелет запроса с замаскированными параметрами, но и регистрирует значения самих параметров. Это может помочь в диагностике того, используют ли запросы к определенному первичному ключу (или набору первичных ключей) гораздо больше единиц запросов, чем запросы к другим первичным ключам.
Запросы Log Analytics с различными сценариями
потребление ЕЗ
Операции Cassandra, использующие большое количество единиц запросов в секунду.
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;
Мониторинг потребления на ЕЗ по логическим ключам секций на операцию.
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;
Какие запросы в наибольшей степени влияют на потребление единиц запросов?
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;
Потребление единиц запросов на основе вариаций в размерах полезных данных для операций чтения и записи.
// 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;
Потребление единиц запросов на основе операций чтения и записи по логической секции.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where OperationName in ("Delete", "Read", "Upsert") | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
Потребление ЕЗ по физическим и логическим секциям.
CDBPartitionKeyRUConsumption | where DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
Высокое потребление единиц запросов возникает из-за горячей секции?
CDBPartitionKeyStatistics | where DatabaseName=="azure_cosmos" and CollectionName=="user" | where TimeGenerated > now(-8h) | summarize StorageUsed = sum(SizeKb) by PartitionKey | order by StorageUsed desc
Как ключ секции влияет на потребление единиц запросов?
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;
Задержка
Число истечений времени ожидания на стороне сервера (код состояния — 408) за период времени.
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;
Обратите внимание на пиковые задержки на стороне сервера в заданном временном окне?
CDBCassandraRequests | where TimeGenerated > now(-6h) | DatabaseName=="azure_cosmos" and CollectionName=="user" | summarize max(DurationMs) by bin(TimeGenerated, 10m) | render timechart;
Операции, для которых выполняется регулирование.
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;
Регулирование
В вашем приложении наблюдается регулирование?
CDBCassandraRequests | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
Какие запросы вызывают регулирование приложения с заданным периодом времени в 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;
Следующие шаги
- Включите аналитику журналов в вашей учетной записи Cassandra для API.
- Рассмотрите определения кодов ошибок.