2016-02-06 3 views
1

Учитывая, что Azure DocumentDB использует Requests Units в качестве измерения пропускной способности, я хотел бы убедиться, что мои запросы используют наименьшее количество RU, насколько это возможно, чтобы увеличить пропускную способность. Есть ли инструмент, который расскажет мне, сколько запросов будет выполняться RU, и если запрос действительно использует индекс или нет?Как измерить RU в DocumentDB?

ответ

0

Я нашел DocumentDb Studio, который показывает заголовок ответа, который предоставляет RU для каждого запроса.

enter image description here

+0

Рад, что вы нашли решение! Имейте в виду, что если ваш запрос имеет более одной страницы (с помощью 'executeNext()'), то RU находятся на каждом вызове, поэтому вам нужно суммировать их для учета всех RU. Мой documentdb-utils обертывает предоставленный Azure node.js SDK, чтобы делать такие вещи, как подведение итогов всех RU, предоставление статистики задержек и автоматическое повторное выполнение операций, когда они вышли из строя или попали в ваш бюджет RU. Я рассмотрел перенос библиотеки в .NET. –

+1

@ LarryMaccherone вы можете предоставить нам ссылку на ваш SDK? Почему бы не вносить эти решения в SDK Microsoft или не сидеть над этим SDK? –

+0

Я вношу исправления и исправления документов в SDK DocumentDB node.js.В настоящее время я на седьмом месте, а 5 из 6 с большим количеством вкладов - все заняты Лазуром. Причина, по которой я создал дополнительные инструменты, а не подавать запросы на тягу к базе данных Azure, заключается в том, что эти инструменты могут быть не чашкой чая каждого. Кроме того, SDK node.js является относительно тонкой оболочкой вокруг REST API, соответствующей всей его семантике. Если бы я должен был создавать documentdb-utils с нуля, чтобы напрямую использовать REST API, я бы, вероятно, построил что-то подобное, как это делал Azure. Это хорошо сделано –

2

Как вы обнаружили, некоторые инструменты обеспечения RU-х после завершения запроса. Это также доступно программно, поскольку заголовок x-ms-request-charge возвращается в ответ и легко извлекается через SDK DocumentDB.

Например, вот фрагмент кода, показывающий извлечение RU с помощью JS/узел:

var queryIterator = client.queryDocuments(collLink, querySpec); 
queryIterator.executeNext(function (err, results, headers) { 
    if (err) { 
    // deal with error... 
    } else { 
    // deal with payload... 
    var ruConsumed = headers['x-ms-request-charge']; 
    } 
}); 

Насколько ваш вопрос относительно индексации и определения, является ли свойство проиндексировано (который должен затем ответить на ваш вопрос о запросе используя или не используя индекс): вы можете запросить коллекцию, которая возвращает данные индексации в заголовке ответа.

Например: учитывая некоторый путь dbs/<databaseId>/colls/<collectionId>:

var collLink = 'dbs/' + databaseId+ '/colls/'+ collectionId; 

client.readCollection(collLink, function (err, coll) { 
    if (err) { 
     // deal with error 

    } else { 
     // compare indexingPolicy with your property, to see if it's included or excluded 
     // this just shows you what these properties look like 
     console.log("Included: " + JSON.stringify(coll.indexingPolicy.includedPaths)) 
     console.log("Excluded: " + JSON.stringify(coll.indexingPolicy.excludedPaths)) 
    } 
}); 

Вы увидите includedPaths и excludedPaths ищет что-то вроде этого, и вы можете искать для данного свойства в любом случае вы посчитаете нужным:

Included: [{"path":"/*","indexes":[{"kind":"Range","dataType":"Number","precision":-1},{"kind":"Hash","dataType":"String","precision":3}]}] 
Excluded: [] 
+0

отличный ответ! Я поддержал его, но выбрал мой в качестве ответа, поскольку я специально просил инструмент. –

+0

только сторона записки; Исследователь запросов портала Azure Management Portal также сообщает вам RU для запроса. –

0

Другой вариант - использовать эмулятор с включенной опцией сбора трассировки. https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator

Я пытался обработать агрегированные запросы LINQ, что в настоящее время представляется невозможным с помощью C# SDK.

Используя вывод трассировки из эмулятора, я смог идентифицировать плату за запрос и множество других показателей. Есть много данных, чтобы пробраться сквозь них. я нашел запрос зар да, хранимый в соответствии с этим событием ключа DocDBServer/Transport_Channel_Processortask/Genericoperation

Пример вывод:
ThreadID="141,928" FormattedMessage="EndRequest DocumentServiceId localhost, ResourceType 2, OperationType 15, ResourceId 91M7AL+QPQA=, StatusCode 200, HRESULTHex 0, ResponseLength 61, Duration 70,546, HasQuery 1, PartitionId a4cb495b-38c8-11e6-8106-8cdcd42c33be, ReplicaId 1, ConsistencyLevel 3, RequestSessionToken 0:594, ResponseSessionToken 594, HasContinuation 0, HasPreTrigger 0, HasPostTrigger 0, IsFeedUnfiltered 0, IndexingDirective 5, XDate Fri, 09 Jun 2017 08:49:03 GMT, RetryAfterMilliseconds 0, MaxItemCount -1, ActualItemCount 1, ClientVersion 2017-02-22, UserAgent Microsoft.Azure.Documents.Common/1.13.58.2, RequestLength 131, NetworkBucket 2, SubscriptionId 00000000-0000-0000-0000-000000000000, Region South Central US, IpAddress 192.168.56.0, ChannelProtocol RNTBD, RequestCharge 51.424, etc...

Это может быть затем соотнесен с данными из другого события, которое содержит данные запроса: DocDBServer/ServiceModuletask/Genericoperation

Примечания для просмотра файлов журнала ETL вам требуется перфрукт. См. Здесь для получения дополнительной информации: https://github.com/Azure/azure-documentdb-dotnet/blob/master/docs/documentdb-sdk_capture_etl.md