【问题标题】:Determining DocumentDB Request Charge per query via .NET通过 .NET 确定每个查询的 DocumentDB 请求费用
【发布时间】:2015-12-03 11:10:55
【问题描述】:

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

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

更新:

添加了关于我在执行查询而不是其他操作时收取请求费用的说明。

【问题讨论】:

    标签: c# azure azure-cosmosdb


    【解决方案1】:

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

    更新

    所以我检查了查询结果,你是正确的,这没有直接暴露在 .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"];
    

    而不是在 Fiddler 中检查它。

    注意

    ExecuteNextAsync 可能会返回带有延续标记的结果子集。如果您想要所有结果,则必须迭代直到文档数据库不向 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;
    

    【讨论】:

    • 啊,也许我应该更清楚一点。我专门讨论的不是“CreateXYZ”等查询。我的错,会修改我原来的问题。
    • 对不起!实际上这是我的错:)。您确实在原始问题中提到了查询。无论如何,用解决方法更新了我的答案。 HTH。
    • 我根本没看到。这是通过 DocumentClient.CreateDocumentQuery() 调用。你在尝试别的东西吗?
    • 这就是我执行查询的方式: FeedResponse queryResult = await documentClient.CreateDocumentQuery(collection.SelfLink, filterExpression, options ).AsDocumentQuery().ExecuteNextAsync();
    • 哇,这比我正在做的要复杂得多。但是,嘿,如果它给出了我愿意改变的统计数据。将进行试验,看看它是否适合我。如果是这样,将相应地标记它。干杯!
    【解决方案2】:

    您需要记录每个查询的成本并处理分页:

    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.
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      相关资源
      最近更新 更多