asp.net-core - 异常后 Application Insights RequestTelemetry 未显示在请求中
问题描述
我花了一段时间尝试 RequestTelemetry 工作。当我第一次玩它时确实如此,但奇怪的是,只要抛出异常就会停止工作。我已阅读有关自定义事件和指标以及自定义操作跟踪的 Application Insights 文档,并尝试添加所有最佳实践以查看是否可以再次显示结果。我正在使用 .NET Core 3.1 和 Microsoft.ApplicationInsights.AspNetCore 2.14.0。
Webapp 的设置在 Startup.cs 中如下所示
services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions {
EnableAdaptiveSampling = false
});
我在控制器发布操作中有遥测。我意识到 Application Insights 已经在跟踪它的发布操作,但我想看看我是否可以跟踪内部方法。这是我的控制器中的代码:
public MyController(IMyService myService, TelemetryClient telemetryClient, ILogger<MyController> logger) {
_myService = myService;
_telemetryClient = telemetryClient;
_logger = logger;
}
[HttpPost]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> PostAsync([FromBody] MyModel model) {
using var scope = _logger.BeginScope(new Dictionary<string, object> {
{ $"{nameof(PostAsync)}.Scope", Guid.NewGuid() },
{ nameof(model.Name), model.Name }
});
model.AuthenticatedUserId = User.GetUserIdFromClaims();
var requestTelemetry = new RequestTelemetry { Name = nameof( _myService.MyFunctionAsync) };
var operation = _telemetryClient.StartOperation(requestTelemetry);
operation.Telemetry.Properties.Add("User", model.AuthenticatedUserId);
try {
await _myService.MyFunctionAsync(model).ConfigureAwait(false); // <-- throws exception
operation.Telemetry.Success = true;
return NoContent();
} catch (Exception e) {
operation.Telemetry.Success = false;
throw;
} finally {
_telemetryClient.StopOperation(operation);
}
}
我可以在 Visual Studio 控制台输出中看到代码执行,因为我得到以下日志,但它从未出现在 Application InsightsRequests
中。
Application Insights Telemetry: {
"name": "AppRequests",
"time": "2020-06-21T14:29:08.7469588Z",
"iKey": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"tags": {
"ai.application.ver": "1.0.0.0",
"ai.cloud.roleInstance": "DESKTOP-K74PNCU",
"ai.operation.id": "0443259d660125498cf28f8f7a275dab",
"ai.operation.parentId": "1dea6f9b27220c4c",
"ai.operation.name": "POST EventEmitter/Post",
"ai.location.ip": "::1",
"ai.internal.sdkVersion": "dotnetc:2.14.0-17971",
"ai.internal.nodeName": "DESKTOP-K74PNCU"
},
"data": {
"baseType": "RequestData",
"baseData": {
"ver": 2,
"id": "2b7900eedfb7c34d",
"name": "MyFunctionAsync",
"duration": "00:00:00.3766937",
"success": false,
"properties": {
"DeveloperMode": "true",
"User": "pobl-dev",
"_MS.ProcessedByMetricExtractors": "(Name:'Requests', Ver:'1.1')",
"AspNetCoreEnvironment": "Development"
}
}
}
}
解决方案
有一个简单的解决方案,但由于缺少文档或错误,我不确定为什么需要它。我发现一旦responseCode
提供了一切正常。responseCode
成功呼叫时200
会显示默认值。一旦我设置了失败的值,一切正常。
public MyController(IMyService myService, TelemetryClient telemetryClient, ILogger<MyController> logger) {
_myService = myService;
_telemetryClient = telemetryClient;
_logger = logger;
}
[HttpPost]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> PostAsync([FromBody] MyModel model) {
using var scope = _logger.BeginScope(new Dictionary<string, object> {
{ $"{nameof(PostAsync)}.Scope", Guid.NewGuid() },
{ nameof(model.Name), model.Name }
});
model.AuthenticatedUserId = User.GetUserIdFromClaims();
var requestTelemetry = new RequestTelemetry { Name = nameof( _myService.MyFunctionAsync) };
var operation = _telemetryClient.StartOperation(requestTelemetry);
operation.Telemetry.Properties.Add("User", model.AuthenticatedUserId);
try {
await _myService.MyFunctionAsync(model).ConfigureAwait(false); // <-- throws exception
operation.Telemetry.Success = true;
operation.Telemetry.ResponseCode = "Roses";
return NoContent();
} catch (Exception e) {
operation.Telemetry.Success = false;
operation.Telemetry.ResponseCode = "Funky"; // <-- seems to be required on a failure
throw;
} finally {
_telemetryClient.StopOperation(operation);
}
}
推荐阅读
- lua - 尝试索引 nil
- python - 使用带有 Python 的 Azure Function App 更新 Azure 表
- node.js - 了解 Node 中的 TypeError“不是功能”
- sql - SQL LEFT JOIN 与 WHERE 子句语法错误(MS 访问)
- php - 使用PHP过滤键值等于字符串的数组
- java - Java - 如何使用大型证书吊销列表 (CRL) 文件?
- python - 在 ubuntu 20.04 上安装 pygame 时出现 sdl 配置错误
- azure-machine-learning-service - 允许的失败 Hyperdrive 运行数量的阈值
- r - 如何根据另一列的值替换 R 中的 NA 值?
- python - ModuleNotFoundError:更改“sys.path”后没有名为“cv2.cv2”的模块