如何测量每个Web请求的Azure CosmosDB请求单位?

时间:2019-03-14 08:22:33

标签: c# asp.net-core azure-cosmosdb azure-application-insights

在ASP.NET Core Web应用程序中,我想测量单个Web请求中已花费了多少个请求单位。有了这些信息,我就可以识别“昂贵”的通话并寻求对其进行优化。

我知道如何从单个CosmosDB Rest调用中选择请求单位计数。但这是一个分层的应用程序,其中与ComosDB交互的持久性级别无法访问ASP.NET Core中的请求对象。

是否可以通过某种方式获取某种请求ID?我不知道Application Insights如何跟踪特定Web请求的相关内部调用。

或者是否有办法在Application Insights中获取此信息?

2 个答案:

答案 0 :(得分:2)

这取决于多种因素,包括您所使用的SDK。

如果您使用默认的Cosmos DB SDK(也称为v2 SDK),那么(假设您启用了Application Insights支持)Cosmos DB仅在您using HTTP/HTTPS connection时才记录其依赖项调用。 Application Insights不会捕获TCP模式。这意味着您将不得不使用性能不好的HTTPS或编写一些自定义代码。

如果您使用的是Cosmonaut,那么它就带有通用的EventSource,无论连接类型如何,它都会将每个呼叫作为依赖项进行跟踪,并且还会收集多个指标,例如RU和更多信息。您需要引用Cosmonaut.ApplicationInsights nuget包并像这样初始化AppInsightsTelemetryModule

AppInsightsTelemetryModule.Instance.Initialize(TelemetryConfiguration.Active);

或使用IoC替代:

services.AddSingleton(AppInsightsTelemetryModule.Instance);

这将为您记录每个操作的详细指标,例如以下内容(包括请求费用):

enter image description here

然后您可以使用类似这样的查询来查看峰值并进一步调查,或者仅查询Cosmos依赖项超过阈值的请求。

dependencies
| where type contains "Cosmos" and customDimensions.RequestCharge != ""
| summarize sum(toint(customDimensions.RequestCharge)) by bin(timestamp, 1m) 

PS:如果不需要,您不必使用CosmosStore。使用CosmonautClient代替DocumentClient也会完成日志记录工作。

答案 1 :(得分:0)

这在CosmosDB REST API响应的标头中可用。您将需要在Web调用与CosmosDB操作之间创建关联,然后进行聚合。

From the docs

  

x-ms-request-charge这是规范化请求的数量。   操作的请求单位(RU)。有关更多信息,请参见   在Azure Cosmos DB中请求单位。