Application Insights - как добавить настраиваемую метрику к информации запроса?

Этот вопрос очень похож на то, что я хочу знать. У меня есть служба веб-API в облачной службе Azure с настроенным Application Insights. На портале информации о запросах, который создается автоматически, я хочу добавить настраиваемый 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)


Использование TelemetryInitializers - правильное решение. Некоторые комментарии:

  • var requestTelemetry = telemetry as RequestTelemetry;: после этого вы не используете requestTelemetry. Я думаю, вы хотели проверить значение null.
  • Добавление инициализатора телеметрии в активную конфигурацию должно быть нормальным. Вы также можете рассмотреть возможность переноса его в applicationinsights.config.
  • Настраиваемые свойства не отображаются на портале сразу. Вы пытались снова открыть IE через некоторое время и снова проверить свой запрос?
  • Вы умеете отлаживать? Вы видите, что попали в свой инициализатор темеметрии? Видите ли вы в поиске какие-либо следы, характерные для ИИ?

По поводу вашего второго вопроса. Прямо сейчас инициализаторы телеметрии - единственный (официальный) способ добраться до автоматически сгенерированной RequestTelemetry (которая фактически находится в HttpContext). Есть планы сделать большинство классов общедоступными и в конечном итоге открыть их исходный код. Но расчетного времени прибытия пока нет. Если вы создаете и отслеживаете запрос самостоятельно, вы можете добавлять настраиваемые свойства, как вы упомянули.

ОБНОВЛЕНИЕ: начиная с версии 2.0.0-beta3 телеметрия автоматически сгенерированного запроса доступна через метод расширения HttpContext: System.Web.HttpContextExtension.GetRequestTelemetry

person Anastasia Black    schedule 24.06.2015