如何在使用Cosmos DB输入绑定的Azure Function中获取请求费用
解答
直接用输入绑定输出到Recipient这类强类型实体的时候,拿不到请求费用。
绑定底层会自动完成点查、实体映射的流程,原始的SDK响应对象不会透传到你的函数入参里,你拿到的只有映射完成的实体,自然读不到RequestCharge这类响应元数据。
你现在自己new CosmosClient的写法问题很大:一是硬编码连接字符串有泄露风险,二是每次函数触发都新建客户端实例,高并发下很容易把套接字占满触发异常,完全没必要这么写。
正确的做法是让输入绑定直接给你注入已经初始化好的单例CosmosClient,自己做读取操作就能拿到完整响应,既能取到RU消耗,还能复用客户端保证性能,代码如下:
[FunctionName("RecipientRead")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "recipient/{partitionKey}/{id}")] HttpRequest req, [CosmosDB( ConnectionStringSetting = "CosmosDbConnectionString")] CosmosClient cosmosClient, string id, string partitionKey, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); var container = cosmosClient.GetContainer("RecipientDatabase", "RecipientCollection"); ItemResponse<Recipient> response = await container.ReadItemAsync<Recipient>(id, new PartitionKey(partitionKey)); // 这里直接取请求费用 double ruCharge = response.RequestCharge; log.LogInformation($"本次读取消耗{ruCharge} RU"); return new OkObjectResult(response.Resource); }
这种写法你除了能拿到RU消耗,还能拿到ETag、请求延迟、诊断信息等所有原始响应带的元数据,比直接绑定实体灵活很多。
如果你用的是老版本的Cosmos DB绑定(基于Microsoft.Azure.DocumentDB SDK),逻辑是一样的,把入参的CosmosClient换成DocumentClient,读取后从ResourceResponse里取RequestCharge就行。
内容的提问来源于stack exchange,提问作者Muhammad Ahmod
相关产品推荐
相关产品推荐

