在ASP.NET Core Web应用程序中,我想测量单个Web请求中已花费了多少个请求单位。有了这些信息,我就可以识别“昂贵”的通话并寻求对其进行优化。
我知道如何从单个CosmosDB Rest调用中选择请求单位计数。但这是一个分层的应用程序,其中与ComosDB交互的持久性级别无法访问ASP.NET Core中的请求对象。
是否可以通过某种方式获取某种请求ID?我不知道Application Insights如何跟踪特定Web请求的相关内部调用。
或者是否有办法在Application Insights中获取此信息?
答案 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);
这将为您记录每个操作的详细指标,例如以下内容(包括请求费用):
然后您可以使用类似这样的查询来查看峰值并进一步调查,或者仅查询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操作之间创建关联,然后进行聚合。
x-ms-request-charge这是规范化请求的数量。 操作的请求单位(RU)。有关更多信息,请参见 在Azure Cosmos DB中请求单位。