Устранение проблем с помощью диагностических запросов

ОБЛАСТЬ ПРИМЕНЕНИЯ: API SQL API Cassandra API Gremlin API таблиц API Azure Cosmos DB для MongoDB

Эта статья описывает, как создать простые запросы для устранения неполадок с учетной записью Azure Cosmos DB, используя журналы диагностики, отправленные в таблицы AzureDiagnostics (устаревшая) и конкретных ресурсов (предварительная версия) .

Для таблиц Диагностики Azure все данные записываются в одну таблицу, и пользователям потребуется указать, для какой категории нужно выполнить запрос.

Для таблиц определенных ресурсов данные записываются в отдельные таблицы для каждой категории ресурса. Рекомендуется использовать этот режим, так как он значительно упрощает работу с данными, улучшает возможность обнаружения схем и повышает производительность с точки зрения как задержки приема, так и времени выполнения запросов.

Запросы AzureDiagnostics

  • Запрос операций, для выполнения которых требуется больше 3 миллисекунд:

    AzureDiagnostics 
    | where toint(duration_s) > 3 and ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests" 
    | summarize count() by clientIpAddress_s, TimeGenerated
    
  • Запрос агента пользователя, выполняющего эти операции:

    AzureDiagnostics 
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests" 
    | summarize count() by OperationName, userAgent_s
    
  • Запрос длительных операций:

    AzureDiagnostics 
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests" 
    | project TimeGenerated , duration_s 
    | summarize count() by bin(TimeGenerated, 5s)
    | render timechart
    
  • Получение статистики ключей секции для оценки неравномерного распределения для трех основных секций для учетной записи базы данных:

    AzureDiagnostics 
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="PartitionKeyStatistics" 
    | project SubscriptionId, regionName_s, databaseName_s, collectionName_s, partitionKey_s, sizeKb_d, ResourceId 
    
  • Получение оплаты за запросы для ресурсоемких запросов:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests" and todouble(requestCharge_s) > 10.0
    | project activityId_g, requestCharge_s
    | join kind= inner (
    AzureDiagnostics
    | where ResourceProvider =="MICROSOFT.DOCUMENTDB" and Category == "QueryRuntimeStatistics"
    | project activityId_g, querytext_s
    ) on $left.activityId_g == $right.activityId_g
    | order by requestCharge_s desc
    | limit 100
    
  • Определение того, какие операции используют больше всего единиц запроса в секунду:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests"
    | where TimeGenerated >= ago(2h) 
    | summarize max(responseLength_s), max(requestLength_s), max(requestCharge_s), count = count() by OperationName, requestResourceType_s, userAgent_s, collectionRid_s, bin(TimeGenerated, 1h)
    
  • Получение всех запросов, использующих более 100 единиц запроса в секунду, вместе с данными из DataPlaneRequests и QueryRunTimeStatistics:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests" and todouble(requestCharge_s) > 100.0
    | project activityId_g, requestCharge_s
    | join kind= inner (
             AzureDiagnostics
             | where ResourceProvider =="MICROSOFT.DOCUMENTDB" and Category == "QueryRuntimeStatistics"
             | project activityId_g, querytext_s
    ) on $left.activityId_g == $right.activityId_g
    | order by requestCharge_s desc
    | limit 100
    
  • Получение платы за запросы и длительность выполнения запроса:

    AzureDiagnostics
    | where TimeGenerated >= ago(24hr)
    | where Category == "QueryRuntimeStatistics"
    | join (
    AzureDiagnostics
    | where TimeGenerated >= ago(24hr)
    | where Category == "DataPlaneRequests"
    ) on $left.activityId_g == $right.activityId_g
    | project databasename_s, collectionname_s, OperationName1 , querytext_s,requestCharge_s1, duration_s1, bin(TimeGenerated, 1min)
    
  • Получение распределения для различных операций:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests"
    | where TimeGenerated >= ago(2h) 
    | summarize count = count()  by OperationName, requestResourceType_s, bin(TimeGenerated, 1h) 
    
  • Определение максимальной пропускной способности, потребляемой секцией:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests"
    | where TimeGenerated >= ago(2h) 
    | summarize max(requestCharge_s) by bin(TimeGenerated, 1h), partitionId_g
    
  • Получение сведений о потребляемых единицах запроса в секунду для ключей секций:

    AzureDiagnostics 
    | where ResourceProvider == "MICROSOFT.DOCUMENTDB" and Category == "PartitionKeyRUConsumption" 
    | summarize total = sum(todouble(requestCharge_s)) by databaseName_s, collectionName_s, partitionKey_s, TimeGenerated 
    | order by TimeGenerated asc 
    
  • Получение оплаты за запросы для определенного ключа секции:

    AzureDiagnostics 
    | where ResourceProvider == "MICROSOFT.DOCUMENTDB" and Category == "PartitionKeyRUConsumption" 
    | where parse_json(partitionKey_s)[0] == "2" 
    
  • Получение основных ключей секций с наибольшим количеством единиц запроса в секунду, потребленных в определенный период:

    AzureDiagnostics 
    | where ResourceProvider == "MICROSOFT.DOCUMENTDB" and Category == "PartitionKeyRUConsumption" 
    | where TimeGenerated >= datetime("11/26/2019, 11:20:00.000 PM") and TimeGenerated <= datetime("11/26/2019, 11:30:00.000 PM") 
    | summarize total = sum(todouble(requestCharge_s)) by databaseName_s, collectionName_s, partitionKey_s 
    | order by total desc
    
  • Получение журналов для ключей секций, у которых размер хранилища превышает 8 ГБ:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="PartitionKeyStatistics"
    | where todouble(sizeKb_d) > 800000
    
  • Получение задержек репликации P99 или P50 для операций, оплаты запросов или длины ответа:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="DataPlaneRequests"
    | where TimeGenerated >= ago(2d)
    | summarize percentile(todouble(responseLength_s), 50), percentile(todouble(responseLength_s), 99), max(responseLength_s), percentile(todouble(requestCharge_s), 50), percentile(todouble(requestCharge_s), 99), max(requestCharge_s), percentile(todouble(duration_s), 50), percentile(todouble(duration_s), 99), max(duration_s), count() by OperationName, requestResourceType_s, userAgent_s, collectionRid_s, bin(TimeGenerated, 1h)
    
  • Получение журналов ControlPlane:

    Обязательно включите флаг, как описано в статье Отключение доступа на запись к метаданным на основе ключей, и выполните операции с помощью Azure PowerShell, Azure CLI или Azure Resource Manager.

    AzureDiagnostics 
    | where Category =="ControlPlaneRequests"
    | summarize by OperationName 
    

Запросы для конкретных ресурсов

  • Запрос операций, для выполнения которых требуется больше 3 миллисекунд:

    CDBDataPlaneRequests 
    | where toint(DurationMs) > 3
    | summarize count() by ClientIpAddress, TimeGenerated
    
  • Запрос агента пользователя, выполняющего эти операции:

      CDBDataPlaneRequests
      | summarize count() by OperationName, UserAgent
    
  • Запрос длительных операций:

      CDBDataPlaneRequests
      | project TimeGenerated , DurationMs 
      | summarize count() by bin(TimeGenerated, 5s)
      | render timechart
    
  • Получение статистики ключей секции для оценки неравномерного распределения для трех основных секций для учетной записи базы данных:

      CDBPartitionKeyStatistics
      | project RegionName, DatabaseName, CollectionName, PartitionKey, SizeKb
    
  • Получение оплаты за запросы для ресурсоемких запросов:

      CDBDataPlaneRequests
      | where todouble(RequestCharge) > 10.0
      | project ActivityId, RequestCharge
      | join kind= inner (
      CDBQueryRuntimeStatistics
      | project ActivityId, QueryText
      ) on $left.ActivityId == $right.ActivityId
      | order by RequestCharge desc
      | limit 100
    
  • Определение того, какие операции используют больше всего единиц запроса в секунду:

    CDBDataPlaneRequests
    | where TimeGenerated >= ago(2h) 
    | summarize max(ResponseLength), max(RequestLength), max(RequestCharge), count = count() by OperationName, RequestResourceType, UserAgent, CollectionName, bin(TimeGenerated, 1h)
    
  • Получение всех запросов, использующих более 100 единиц запроса в секунду, вместе с данными из DataPlaneRequests и QueryRunTimeStatistics:

      CDBDataPlaneRequests
      | where todouble(RequestCharge) > 100.0
      | project ActivityId, RequestCharge
      | join kind= inner (
      CDBQueryRuntimeStatistics
      | project ActivityId, QueryText
      ) on $left.ActivityId == $right.ActivityId
      | order by RequestCharge desc
      | limit 100
    
  • Получение платы за запросы и длительность выполнения запроса:

      CDBQueryRuntimeStatistics
      | join kind= inner (
      CDBDataPlaneRequests
      ) on $left.ActivityId == $right.ActivityId
      | project DatabaseName, CollectionName, OperationName , QueryText, RequestCharge, DurationMs, bin(TimeGenerated, 1min)
    
  • Получение распределения для различных операций:

      CDBDataPlaneRequests
      | where TimeGenerated >= ago(2h) 
      | summarize count = count()  by OperationName, RequestResourceType, bin(TimeGenerated, 1h)
    
  • Определение максимальной пропускной способности, потребляемой секцией:

    CDBDataPlaneRequests
    | where TimeGenerated >= ago(2h) 
    | summarize max(RequestCharge) by bin(TimeGenerated, 1h), PartitionId
    
  • Получение сведений о потребляемых единицах запроса в секунду для ключей секций:

    CDBPartitionKeyRUConsumption 
    | summarize total = sum(todouble(RequestCharge)) by DatabaseName, CollectionName, PartitionKey, TimeGenerated 
    | order by TimeGenerated asc 
    
  • Получение оплаты за запросы для определенного ключа секции:

    CDBPartitionKeyRUConsumption  
    | where parse_json(PartitionKey)[0] == "2" 
    
  • Получение основных ключей секций с наибольшим количеством единиц запроса в секунду, потребленных в определенный период:

    CDBPartitionKeyRUConsumption
    | where TimeGenerated >= datetime("02/12/2021, 11:20:00.000 PM") and TimeGenerated <= datetime("05/12/2021, 11:30:00.000 PM") 
    | summarize total = sum(todouble(RequestCharge)) by DatabaseName, CollectionName, PartitionKey 
    | order by total desc
    
  • Получение журналов для ключей секций, у которых размер хранилища превышает 8 ГБ:

    CDBPartitionKeyStatistics
    | where todouble(SizeKb) > 800000
    
  • Получение задержек репликации P99 или P50 для операций, оплаты запросов или длины ответа:

    CDBDataPlaneRequests
    | where TimeGenerated >= ago(2d)
    | summarize percentile(todouble(ResponseLength), 50), percentile(todouble(ResponseLength), 99), max(ResponseLength), percentile(todouble(RequestCharge), 50), percentile(todouble(RequestCharge), 99), max(RequestCharge), percentile(todouble(DurationMs), 50), percentile(todouble(DurationMs), 99), max(DurationMs),count() by OperationName, RequestResourceType, UserAgent, CollectionName, bin(TimeGenerated, 1h)
    
  • Получение журналов ControlPlane:

    Обязательно включите флаг, как описано в статье Отключение доступа на запись к метаданным на основе ключей, и выполните операции с помощью Azure PowerShell, Azure CLI или Azure Resource Manager.

    CDBControlPlaneRequests
    | summarize by OperationName 
    

Дальнейшие действия