API Application Insights 使用的最佳实践
API Application Insights good practice to use
我阅读了这份文档: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 捕获,然后 return 某些 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);
我只是 "log" 客户端事件,即调用了该方法。仅供统计。
在每个 "catch" 块中,我尝试使用不同的参数编写跟踪并写入异常:
telemetryClient.TrackTrace("trace name", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
....
});
telemetryClient.TrackException(ex);
有必要吗?或者只需要跟踪异常?然后我丢失了不同的信息,例如谁尝试添加这些更改等...何时应该使用这些方法?
您可以独立跟踪所有 metrics/exceptions/traces/events。要使信息事件相互关联,请使用 TelemetryContext
Is it necessary? Or just need to track only exception? Then I lose
different info, like who try to add these changes etc... When each of
these methods should be used?
这仅取决于您的需求。如果您需要该信息 - 请发送。
这是2.5.1 AI SDK的最佳实践。将突出显示即将发布的 AI SDK 版本中可能不需要的部分。
进行 end-to-end 跟踪的正确方法是依赖 .NET 框架中的新 Activity class。直到 AI 支持 Activity.Tags (https://github.com/Microsoft/ApplicationInsights-dotnet/issues/562) you need to propagate them manually using TelemetryInitializer:
public class ActvityTagsTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
Activity current = Activity.Current;
if (current == null)
{
current = (Activity)HttpContext.Current?.Items["__AspnetActivity__"];
}
while (current != null)
{
foreach (var tag in current.Tags)
{
if (!telemetry.Context.Properties.ContainsKey(tag.Key))
{
telemetry.Context.Properties.Add(tag.Key, tag.Value);
}
}
current = current.Parent;
}
}
}
然后在ApplicationInsights.config中注册:
<TelemetryInitializers>
...
<Add Type="<namespace>.ActvityTagsTelemetryInitializer, <assemblyname>"/>
</TelemetryInitializers>
然后您可以填充适当的标签:
[AjaxErrorHandling]
[HttpPost]
public async Task SyncDriverToVistracks(int DriverID)
{
Activity.Current.AddTag("DriverID", DriverID.ToString());
Activity.Current.AddTag("UserID", User.Identity.Name);
try
{
if ([condition])
{
// some actions here
try
{
// If below call is HTTP then no need to use StartOperation
using (telemetryClient.StartOperation<DependencyTelemetry>("AddNewDriverToVistrackAsync"))
{
driver.VistrackId = await _vistracksService.AddNewDriverToVistrackAsync(domain);
}
// If below call is HTTP then no need to use StartOperation
using (telemetryClient.StartOperation<DependencyTelemetry>("SaveChanges"))
{
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");
}
}
catch (Exception ex)
{
// Upcoming 2.6 AI SDK will track exceptions for MVC apps automatically.
telemetryClient.TrackException(ex);
throw;
}
}
您应该拥有以下遥测数据:
- 传入请求
- 传出请求(依赖项)
- 失败请求的例外情况
所有遥测数据都将使用 ChangedBy 和 DriverID 进行标记
我阅读了这份文档: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 捕获,然后 return 某些 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);
我只是 "log" 客户端事件,即调用了该方法。仅供统计。
在每个 "catch" 块中,我尝试使用不同的参数编写跟踪并写入异常:
telemetryClient.TrackTrace("trace name", new Dictionary<string, string> {
{ "ChangedBy", User.Identity.Name },
....
});
telemetryClient.TrackException(ex);
有必要吗?或者只需要跟踪异常?然后我丢失了不同的信息,例如谁尝试添加这些更改等...何时应该使用这些方法?
您可以独立跟踪所有 metrics/exceptions/traces/events。要使信息事件相互关联,请使用 TelemetryContext
Is it necessary? Or just need to track only exception? Then I lose different info, like who try to add these changes etc... When each of these methods should be used?
这仅取决于您的需求。如果您需要该信息 - 请发送。
这是2.5.1 AI SDK的最佳实践。将突出显示即将发布的 AI SDK 版本中可能不需要的部分。
进行 end-to-end 跟踪的正确方法是依赖 .NET 框架中的新 Activity class。直到 AI 支持 Activity.Tags (https://github.com/Microsoft/ApplicationInsights-dotnet/issues/562) you need to propagate them manually using TelemetryInitializer:
public class ActvityTagsTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
Activity current = Activity.Current;
if (current == null)
{
current = (Activity)HttpContext.Current?.Items["__AspnetActivity__"];
}
while (current != null)
{
foreach (var tag in current.Tags)
{
if (!telemetry.Context.Properties.ContainsKey(tag.Key))
{
telemetry.Context.Properties.Add(tag.Key, tag.Value);
}
}
current = current.Parent;
}
}
}
然后在ApplicationInsights.config中注册:
<TelemetryInitializers>
...
<Add Type="<namespace>.ActvityTagsTelemetryInitializer, <assemblyname>"/>
</TelemetryInitializers>
然后您可以填充适当的标签:
[AjaxErrorHandling]
[HttpPost]
public async Task SyncDriverToVistracks(int DriverID)
{
Activity.Current.AddTag("DriverID", DriverID.ToString());
Activity.Current.AddTag("UserID", User.Identity.Name);
try
{
if ([condition])
{
// some actions here
try
{
// If below call is HTTP then no need to use StartOperation
using (telemetryClient.StartOperation<DependencyTelemetry>("AddNewDriverToVistrackAsync"))
{
driver.VistrackId = await _vistracksService.AddNewDriverToVistrackAsync(domain);
}
// If below call is HTTP then no need to use StartOperation
using (telemetryClient.StartOperation<DependencyTelemetry>("SaveChanges"))
{
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");
}
}
catch (Exception ex)
{
// Upcoming 2.6 AI SDK will track exceptions for MVC apps automatically.
telemetryClient.TrackException(ex);
throw;
}
}
您应该拥有以下遥测数据:
- 传入请求
- 传出请求(依赖项)
- 失败请求的例外情况
所有遥测数据都将使用 ChangedBy 和 DriverID 进行标记