Application Insights - 如何将自定义指标添加到您的请求信息中?
Application Insights - How to add custom metric to your request information?
这个question和我想知道的很相似。我在 Azure 云服务上有一个 Web api 服务,并配置了 Application Insights。在自动生成的请求信息门户上,我想将作为请求一部分的自定义 http header 添加到随每个请求记录的信息中。问题是我该怎么做?
我试过使用如下所示的遥测初始化器,但失败了(因为我没有在门户网站上看到信息)。我还在 global.asax 中添加了这个
TelemetryConfiguration.Active.TelemetryInitializers.Add(propertyTelemetryInitializer);
public class PropertyTelemetryInitializer : ITelemetryInitializer
{
private readonly HttpContext httpContext;
public PropertyTelemetryInitializer(HttpContext httpContext)
{
this.httpContext = httpContext;
}
public void Initialize(ITelemetry telemetry)
{
this.AddTelemetryContextPropertFromContextHeader(telemetry, "xyz");
this.AddTelemetryContextPropertFromContextHeader(telemetry, "abc");
this.AddTelemetryContextPropertFromContextHeader(telemetry, "123");
}
private void AddTelemetryContextPropertFromContextHeader(ITelemetry telemetry, string headerKey)
{
var requestTelemetry = telemetry as RequestTelemetry;
telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
}
}
还有没有办法从控制器方法本身做到这一点?类似于下面的东西(注意:下面不起作用)?
[Route("api/Something")]
[HttpGet]
[ResponseType(typeof(Something))]
public async Task<Something> GetSomething()
{
var requestTelemetry = new RequestTelemetry();
this.AddCustomHeadersToRequestTelemetry(requestTelemetry);
var result = await this.Service.GetSomethingAsync();
requestTelemetry.Properties["result"] = result.ToString();
return TypeMapper.Map<Model.Something, Something>(result);
}
/// <summary>
/// Adds the custom headers to request telemetry.
/// </summary>
/// <param name="controller">The controller.</param>
/// <param name="requestTelemetry">The request telemetry.</param>
public static void AddCustomHeadersToRequestTelemetry(this ApiController controller, RequestTelemetry requestTelemetry)
{
if (controller == null)
{
throw new ArgumentNullException("controller");
}
if (requestTelemetry == null)
{
throw new ArgumentNullException("requestTelemetry");
}
requestTelemetry.Context.Properties["abc"] = controller.Request.GetABCFromHeader();
requestTelemetry.Context.Properties["xyz"] = controller.Request.GetXYZFromHeader();
requestTelemetry.Context.Properties["123"] = controller.Request.Get123FromHeader();
}
使用 TelemetryInitializers 是正确的解决方案。一些评论:
var requestTelemetry = telemetry as RequestTelemetry;
:之后您不使用 requestTelemetry。我猜你想检查是否为空。
- 在活动配置中添加遥测初始化程序应该没问题。您也可以考虑将其移动到 applicationinsights.config
- 自定义属性不会立即显示在门户中。您是否尝试过一段时间后重新打开 IE 并再次检查您的请求?
- 你会调试吗?你看到你进入了温度测量初始化器了吗?你在搜索中看到任何 AI 特定的痕迹吗?
关于你的第二个问题。现在,遥测初始化程序是获取自动生成的 RequestTelemetry(实际上在 HttpContext 中)的唯一(官方)方式。有计划在 web public 中制作大部分 类 并最终将其开源。但是还没有预计到达时间。如果您自己创建和跟踪请求,您可以按照您提到的那样添加自定义属性。
更新:从 2.0.0-beta3 开始,可以通过 HttpContext 扩展方法访问自动生成的请求遥测:System.Web.HttpContextExtension.GetRequestTelemetry
这个question和我想知道的很相似。我在 Azure 云服务上有一个 Web api 服务,并配置了 Application Insights。在自动生成的请求信息门户上,我想将作为请求一部分的自定义 http header 添加到随每个请求记录的信息中。问题是我该怎么做?
我试过使用如下所示的遥测初始化器,但失败了(因为我没有在门户网站上看到信息)。我还在 global.asax 中添加了这个
TelemetryConfiguration.Active.TelemetryInitializers.Add(propertyTelemetryInitializer);
public class PropertyTelemetryInitializer : ITelemetryInitializer
{
private readonly HttpContext httpContext;
public PropertyTelemetryInitializer(HttpContext httpContext)
{
this.httpContext = httpContext;
}
public void Initialize(ITelemetry telemetry)
{
this.AddTelemetryContextPropertFromContextHeader(telemetry, "xyz");
this.AddTelemetryContextPropertFromContextHeader(telemetry, "abc");
this.AddTelemetryContextPropertFromContextHeader(telemetry, "123");
}
private void AddTelemetryContextPropertFromContextHeader(ITelemetry telemetry, string headerKey)
{
var requestTelemetry = telemetry as RequestTelemetry;
telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
}
}
还有没有办法从控制器方法本身做到这一点?类似于下面的东西(注意:下面不起作用)?
[Route("api/Something")]
[HttpGet]
[ResponseType(typeof(Something))]
public async Task<Something> GetSomething()
{
var requestTelemetry = new RequestTelemetry();
this.AddCustomHeadersToRequestTelemetry(requestTelemetry);
var result = await this.Service.GetSomethingAsync();
requestTelemetry.Properties["result"] = result.ToString();
return TypeMapper.Map<Model.Something, Something>(result);
}
/// <summary>
/// Adds the custom headers to request telemetry.
/// </summary>
/// <param name="controller">The controller.</param>
/// <param name="requestTelemetry">The request telemetry.</param>
public static void AddCustomHeadersToRequestTelemetry(this ApiController controller, RequestTelemetry requestTelemetry)
{
if (controller == null)
{
throw new ArgumentNullException("controller");
}
if (requestTelemetry == null)
{
throw new ArgumentNullException("requestTelemetry");
}
requestTelemetry.Context.Properties["abc"] = controller.Request.GetABCFromHeader();
requestTelemetry.Context.Properties["xyz"] = controller.Request.GetXYZFromHeader();
requestTelemetry.Context.Properties["123"] = controller.Request.Get123FromHeader();
}
使用 TelemetryInitializers 是正确的解决方案。一些评论:
var requestTelemetry = telemetry as RequestTelemetry;
:之后您不使用 requestTelemetry。我猜你想检查是否为空。- 在活动配置中添加遥测初始化程序应该没问题。您也可以考虑将其移动到 applicationinsights.config
- 自定义属性不会立即显示在门户中。您是否尝试过一段时间后重新打开 IE 并再次检查您的请求?
- 你会调试吗?你看到你进入了温度测量初始化器了吗?你在搜索中看到任何 AI 特定的痕迹吗?
关于你的第二个问题。现在,遥测初始化程序是获取自动生成的 RequestTelemetry(实际上在 HttpContext 中)的唯一(官方)方式。有计划在 web public 中制作大部分 类 并最终将其开源。但是还没有预计到达时间。如果您自己创建和跟踪请求,您可以按照您提到的那样添加自定义属性。
更新:从 2.0.0-beta3 开始,可以通过 HttpContext 扩展方法访问自动生成的请求遥测:System.Web.HttpContextExtension.GetRequestTelemetry