如何在DocumentDB存储过程中获取各查询的请求费用并输出至Azure控制台?
在DocumentDB存储过程中输出每条查询的请求费用
嘿,这个问题我刚好有经验!在Azure Cosmos DB(也就是之前的DocumentDB)的存储过程里,完全可以实现输出每条查询的请求费用到Azure门户控制台,核心是利用存储过程上下文提供的getLastRequestStatistics()方法。
具体实现方法
每次执行完一条SQL查询后,你可以立即调用getLastRequestStatistics()获取该次请求的统计信息,其中的requestCharge字段就是这条查询消耗的请求单位(RU,也就是你说的请求费用),然后用console.log输出即可。
下面是一个包含3条查询的完整存储过程示例:
function logQueryRequestCharges() { var context = getContext(); var collection = context.getCollection(); var response = context.getResponse(); // 执行第一条查询并获取费用 var query1 = 'SELECT * FROM c WHERE c.type = "electronics"'; collection.queryDocuments(collection.getSelfLink(), query1, {}, function(err, docs) { if (err) throw err; // 获取第一条查询的请求统计 var query1Stats = context.getLastRequestStatistics(); console.log('第一条查询的请求费用: ' + query1Stats.requestCharge + ' RU'); // 执行第二条查询并获取费用 var query2 = 'SELECT VALUE AVG(c.price) FROM c WHERE c.inStock = true'; collection.queryDocuments(collection.getSelfLink(), query2, {}, function(err, docs) { if (err) throw err; var query2Stats = context.getLastRequestStatistics(); console.log('第二条查询的请求费用: ' + query2Stats.requestCharge + ' RU'); // 执行第三条查询并获取费用 var query3 = 'SELECT c.id, c.name FROM c ORDER BY c.createdAt DESC OFFSET 0 LIMIT 10'; collection.queryDocuments(collection.getSelfLink(), query3, {}, function(err, docs) { if (err) throw err; var query3Stats = context.getLastRequestStatistics(); console.log('第三条查询的请求费用: ' + query3Stats.requestCharge + ' RU'); // 可选:返回存储过程执行结果 response.setBody('所有查询的请求费用已输出至控制台'); }); }); }); }
关键注意事项
- 顺序执行查询:因为存储过程的查询是异步的,必须在每条查询的回调函数里执行下一条查询,这样才能保证
getLastRequestStatistics()获取的是当前这条查询的统计数据,不会被后续请求覆盖。 - 查看日志位置:在Azure门户的Cosmos DB资源中,进入「数据资源管理器」,找到对应的存储过程并执行后,切换到「控制台」标签页,就能看到你用
console.log输出的费用信息。 - RU的含义:这里的
requestCharge就是Cosmos DB的请求单位,代表该查询消耗的计算资源,也是计费的核心依据。
内容的提问来源于stack exchange,提问作者tlt
相关产品推荐
相关产品推荐

