通过.NET确定每个查询的DocumentDB请求费用

Ken*_*ner 9 c# azure azure-cosmosdb

我试图弄清楚在通过提供的.NET客户端库执行DocumentDB查询请求时是否可以获得"请求费用".详细信息返回底层的HTTP标题"x-ms-request-charge",我可以通过Fiddler等进行监控,但如果我可以通过.NET直接获取它,则会更喜欢.

有没有人这样做过?或者至少能够确认它是否根本不可能?

更新:

添加说明我在执行查询而不是其他操作时请求收费.

Gau*_*tri 12

你应该能够通过.Net库获得它.例如,请查看下面的屏幕截图,其中显示了Create New User操作的响应.结果是Microsoft.Azure.Client.ResourceResponse<T>具有称为属性的类型RequestCharge.

在此输入图像描述

UPDATE

所以我检查了查询结果,你是正确的,这不是直接在.Net库中公开的.但是这可以在ResponseHeaders属性中找到,您可以使用下面的内容找到它:

FeedResponse<Microsoft.Azure.Documents.Document> queryResult = await documentClient.CreateDocumentQuery<Microsoft.Azure.Documents.Document>(collectio??nSelfLink, query, options).AsDocumentQuery().ExecuteNextAsync<Microsoft.Azure.Documents.Document>(??);
var requestCharge = queryResult.ResponseHeaders["x-ms-request-charge"];
Run Code Online (Sandbox Code Playgroud)

而不是在Fiddler检查它.

注意

ExecuteNextAsync可以使用延续令牌返回结果的子集.如果你想要所有的结果,你必须迭代直到文档db不发送abck一个延续令牌.

var docDbQueryable = documentClient.CreateDocumentQuery<Document>(collectio??nSelfLink, query, options).AsDocumentQuery();
var docDbResults = new List<Document>();
do
{
    var batchResult = await docDbQueryable.ExecuteNextAsync<Document>(??);;
    docDbResults.AddRange(batchResult);
}
while (docDbQueryable.HasMoreResults);
return docDbResults;
Run Code Online (Sandbox Code Playgroud)


Mr.*_*gle 7

以下是记录每个查询的成本以及处理分页所需的内容:

public async Task<IEnumerable<T>> Query<T>(string databaseId, string collectionId, SqlQuerySpec sqlQuery, int take)
where T : Resource
{
    double queryCost = 0;
    const int maxPageSize = 100;

    var query = _client.CreateDocumentQuery<T>(
        UriFactory.CreateDocumentCollectionUri(databaseId, collectionId),
        sqlQuery,
        new FeedOptions() {MaxItemCount = Math.Min(maxPageSize, take)}).AsDocumentQuery();

    var response = await query.ExecuteNextAsync<T>();
    queryCost += response.RequestCharge;
    var entities = response.ToList();

    while (entities.Count < take && query.HasMoreResults)
    {
        var nextResponse = await query.ExecuteNextAsync<T>();
        queryCost += nextResponse.RequestCharge;
        entities.AddRange(nextResponse);
    }

    Debug.WriteLine(
        "Query [{0}] for {1} documents in collection [{2}] cost {3} RUs.",
        sqlQuery.QueryText,
        take,
        collectionId,
        queryCost);

    return entities.Take(take).ToList(); // We may end up with more than the requested number of items.
}
Run Code Online (Sandbox Code Playgroud)