应用洞察 - 如何在您的请求信息中添加自定义指标?

时间:2015-06-22 12:48:54

标签: c# azure-web-sites azure-webjobs azure-application-insights azure-web-roles

question与我想知道的非常相似。我在配置了Application Insights的azure云服务上获得了一个web api服务。在自动生成的请求信息门户上,我想将一个自定义http标头添加到每个请求记录的信息中,该标头是请求的一部分。问题是我该怎么做?

我尝试使用如下所示的遥测初始化程序,但这失败了(因为我没有看到门户网站上的信息)。我还在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();
    }

1 个答案:

答案 0 :(得分:4)

使用TelemetryInitializers是正确的解决方案。一些评论:

  • C:\blah>ruby -v ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32] C:\blah> :之后你不使用requestTelemetry。我想你想要检查是否为null。
  • 在Active配置中添加遥测初始化器应该没问题。您还可以考虑将其移至applicationinsights.config
  • 自定义属性不会立即显示在门户中。您是否尝试过一段时间后重新打开IE并再次检查您的请求?
  • 你可以调试吗?你看到你进入你的tememetry初始化器吗?你在搜索中看到任何AI特定的痕迹吗?

关于你的第二个问题。现在遥测初始化器是获得自动生成的RequestTelemetry(实际上在HttpContext中)的唯一(官方)方式。有计划将大部分课程公开在网络上并最终开源。但是还没有ETA。如果您自己创建并跟踪请求,则可以添加自己提到的自定义属性。

更新:从2.0.0-beta3自动生成的请求开始,可通过HttpContext扩展方法访问遥测:System.Web.HttpContextExtension.GetRequestTelemetry