首页 > 解决方案 > 如何测量每个 Web 请求的 Azure CosmosDB 请求单位?

问题描述

在 ASP.NET Core Web 应用程序中,我想测量在单个 Web 请求中花费了多少请求单元。有了这些信息,我可以识别“昂贵”的调用并寻找优化它们。

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

有没有办法以某种方式选择某种请求ID?我想知道 Application Insights 如何跟踪特定 Web 请求的相关内部调用。

或者有没有办法在 Application Insights 中获取这些信息?

标签: c#asp.net-coreazure-cosmosdbazure-application-insights

解决方案


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

如果您使用的是默认 Cosmos DB SDK(也称为 v2 SDK),那么(假设您启用了 Application Insights 支持)Cosmos DB 只会在您使用 HTTP/HTTPS 连接时记录它的依赖项调用。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将完成日志记录工作。


推荐阅读