Учитывая, что Azure DocumentDB использует Requests Units в качестве измерения пропускной способности, я хотел бы убедиться, что мои запросы используют наименьшее количество RU, насколько это возможно, чтобы увеличить пропускную способность. Есть ли инструмент, который расскажет мне, сколько запросов будет выполняться RU, и если запрос действительно использует индекс или нет?Как измерить RU в DocumentDB?
ответ
Я нашел DocumentDb Studio, который показывает заголовок ответа, который предоставляет RU для каждого запроса.
Как вы обнаружили, некоторые инструменты обеспечения 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: []
отличный ответ! Я поддержал его, но выбрал мой в качестве ответа, поскольку я специально просил инструмент. –
только сторона записки; Исследователь запросов портала Azure Management Portal также сообщает вам RU для запроса. –
Другой вариант - использовать эмулятор с включенной опцией сбора трассировки. 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
Рад, что вы нашли решение! Имейте в виду, что если ваш запрос имеет более одной страницы (с помощью 'executeNext()'), то RU находятся на каждом вызове, поэтому вам нужно суммировать их для учета всех RU. Мой documentdb-utils обертывает предоставленный Azure node.js SDK, чтобы делать такие вещи, как подведение итогов всех RU, предоставление статистики задержек и автоматическое повторное выполнение операций, когда они вышли из строя или попали в ваш бюджет RU. Я рассмотрел перенос библиотеки в .NET. –
@ LarryMaccherone вы можете предоставить нам ссылку на ваш SDK? Почему бы не вносить эти решения в SDK Microsoft или не сидеть над этим SDK? –
Я вношу исправления и исправления документов в SDK DocumentDB node.js.В настоящее время я на седьмом месте, а 5 из 6 с большим количеством вкладов - все заняты Лазуром. Причина, по которой я создал дополнительные инструменты, а не подавать запросы на тягу к базе данных Azure, заключается в том, что эти инструменты могут быть не чашкой чая каждого. Кроме того, SDK node.js является относительно тонкой оболочкой вокруг REST API, соответствующей всей его семантике. Если бы я должен был создавать documentdb-utils с нуля, чтобы напрямую использовать REST API, я бы, вероятно, построил что-то подобное, как это делал Azure. Это хорошо сделано –