【发布时间】:2018-08-27 11:10:32
【问题描述】:
我阅读了这份文档:https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-custom-events-metrics
有许多不同的 API 方法来跟踪异常、跟踪跟踪等。
我有一个 ASP.NET MVC 5 应用程序。 例如,我有以下控制器方法(由 ajax 调用):
[AjaxErrorHandling]
[HttpPost]
public async Task SyncDriverToVistracks(int DriverID)
{
if ([condition])
{
// some actions here
try
{
driver.VistrackId = await _vistracksService.AddNewDriverToVistrackAsync(domain);
await db.SaveChangesAsync();
}
catch (VistracksApiException api_ex)
{
// external service throws exception type VistracksApiException
throw new AjaxException("vistracksApiClient", api_ex.Response.Message);
}
catch (VistracksApiCommonException common_ex)
{
// external service throws exception type VistracksApiCommonException
throw new AjaxException("vistracksApiServer", "3MD HOS server is not available");
}
catch (Exception ex)
{
// something wrong at all
throw new AjaxException("General", ex.Message);
}
}
else
{
// condition is not valid
throw new AjaxException("General", "AccountId is not found");
}
}
如果出现问题,此方法会抛出 AjaxException(由 AjaxErrorHandling 捕获,然后返回一些 json 响应给客户端)。
现在我想添加遥测以记录、分析异常和观察客户端事件。
所以,我添加了以下内容:
[AjaxErrorHandling]
[HttpPost]
public async Task SyncDriverToVistracks(int DriverID)
{
telemetryClient.TrackEvent("Sync driver", new Dictionary<string, string> { { "ChangedBy", User.Identity.Name }, { "DriverID", DriverID.ToString() } }, null);
if ([condition])
{
// some actions here
try
{
driver.VistrackId = await _vistracksService.AddNewDriverToVistrackAsync(domain);
await db.SaveChangesAsync();
}
catch (VistracksApiException api_ex)
{
// external service throws exception type VistracksApiException
telemetryClient.TrackTrace("VistracksApiException", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
{ "DriverID", DriverID.ToString() },
{ "ResponseCode", api_ex.Response.Code.ToString() },
{ "ResponseMessage", api_ex.Response.Message },
{ "ResponseDescription", api_ex.Response.Description }
});
telemetryClient.TrackException(api_ex);
throw new AjaxException("vistracksApiClient", api_ex.Response.Message);
}
catch (VistracksApiCommonException common_ex)
{
// external service throws exception type VistracksApiCommonException
telemetryClient.TrackTrace("VistracksApiCommonException", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
{ "DriverID", DriverID.ToString() },
{ "Message", common_ex.Message },
});
telemetryClient.TrackException(common_ex);
throw new AjaxException("vistracksApiServer", "3MD HOS server is not available");
}
catch (Exception ex)
{
// something wrong at all
telemetryClient.TrackTrace("Exception", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
{ "DriverID", DriverID.ToString() },
{ "Message", ex.Message },
});
telemetryClient.TrackException(ex);
throw new AjaxException("General", ex.Message);
}
}
else
{
telemetryClient.TrackTrace("ConditionWrong", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
{ "DriverID", DriverID.ToString() },
{ "Message", "AccountId is not found" },
});
// condition is not valid
throw new AjaxException("General", "AccountId is not found");
}
}
通过以下行:
telemetryClient.TrackEvent("Sync driver", new Dictionary<string, string> { { "ChangedBy", User.Identity.Name }, { "DriverID", DriverID.ToString() } }, null);
我只是“记录”客户端事件,即调用该方法。仅用于统计。
在每个“catch”块中,我尝试使用不同的参数编写跟踪并写入异常:
telemetryClient.TrackTrace("trace name", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
....
});
telemetryClient.TrackException(ex);
有必要吗?还是只需要跟踪异常?然后我会丢失不同的信息,比如谁尝试添加这些更改等...什么时候应该使用这些方法?
【问题讨论】:
-
您也可以跟踪自定义属性是否存在异常。因此,无需同时跟踪两者(除非您愿意)。
-
另外 Activity.Current.Tags 应该可以解决问题,但由于某种原因,它们对我不起作用。已打开github.com/Microsoft/ApplicationInsights-dotnet-server/issues/…
-
如果您的外部调用不是基于 HTTP 的,那么您可能希望将其包装在 this.telemetryClient.StartOperation
("MyDependencyCall") 中使用。然后将收集“依赖项”。对于 HTTP AI SDK 会自动收集依赖项。 -
@ZakiMa 哪个更好(同时跟踪或分别跟踪异常和事件)?如果跟踪异常,跟踪错误事件是否有意义?
-
建议依赖Requests(传入请求)、Dependencies(传出请求)和Exceptions。自定义事件通常用于无法由请求表示的业务遥测。
标签: c# azure asp.net-mvc-5 azure-application-insights telemetry