Как включить телеметрию сервера Application Insights в проекте WebApi, использующем OWIN?

У нас есть куча проблем (длительное время ответа) с несколькими проектами в производстве и хотелось посмотреть, что именно происходит на сервере. Затем я продолжил добавлять Application Insights ко всем нашим проектам, следуя этой статье. Проблема в том, что оба наших проекта WebAPI не отправляют данные сервера на портал Azure, а все остальные проекты (MVC 5).

Это то, что показано, когда я обращаюсь к соответствующему лесу Application Insights на Azure:

enter image description here

Я попытался отключить и снова включить сбор данных в Мониторе состояния Insight Status на наших Azure VM, перезапустил IIS несколько раз при обращении к API, но безрезультатно. Когда я включаю его в проект MVC, я могу видеть данные почти мгновенно на портале Azure, когда открываю страницы на сайте.

Когда я увидел, что эти данные не были отправлены с наших Azure VM для этих конкретных проектов, я попытался настроить те же коллекции в нашей среде dev, которая размещена в нашей собственной инфраструктуре, и точно такая же ситуация повторялась сама, что это связано с проектами, размещаемыми в Azure VM.

Я не совсем уверен, что мешает этим проектам отправлять данные Azure, но, взглянув на рабочие проекты и на неработающие, я думаю, что это может быть связано с тем, что наши проекты WebAPI используют новый OWIN-конвейер, а MVC - это стандартные проекты MVC. Я проверил как файл web.config, так и папку bin для обоих типов проектов, и они, похоже, были правильно изменены монитором Insights (я могу видеть те же новые DLL, добавленные в папку bin и тот же самый http-модуль, добавленный в Интернет. конфигурации).

С учетом этого, как включить телеметрию на стороне сервера, используя приложения Insights для проектов WebAPI, которые полагаются на конвейер OWIN/Katana? Что я могу сделать, чтобы узнать, что именно заставляет проект не отправлять данные в Azure в этом случае?

Ответ 1

AI использует httpmodule для сбора информации о запросе на начало и отправки его на конец запроса. Как описано здесь, Owin/Katana использует средние версии для выполнения логики на разных этапах. Поскольку большая часть логики автоматического сбора AI является внутренней, вы не можете повторно использовать ее в своем промежуточном программном обеспечении. Но вы можете сами измерить свой код. Создайте TelemetryClient из своего кода и начните отправку запроса, следов и исключений (например, здесь)

Ответ 2

Это старый вопрос, но он по-прежнему находится в первых трех результатах поиска "web api application insights owin". После многих поисков и не много ответов, которые не требовали, чтобы мы писали наше собственное промежуточное программное обеспечение или явно разбирали все. Мы столкнулись с пакетом расширения, который сделал вещи очень простыми:

Здесь Репозиторий Github для него и связанный пакет NuGet

Для тех, кто слишком ленив, чтобы посмотреть ссылки, все, что нужно было добавить:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseApplicationInsights();

        // rest of the config here...
    }
}

и добавьте это в свой ApplicationInsights.Config

<TelemetryInitializers>
    <!-- other initializers.. -->
    <Add Type="ApplicationInsights.OwinExtensions.OperationIdTelemetryInitializer, ApplicationInsights.OwinExtensions"/>
</TelemetryInitializers>

Ответ 3

Ниже представлена ​​наша реализация промежуточного ПО OWIN для приложений.

/// <summary>
/// Extensions to help adding middleware to the OWIN pipeline
/// </summary>
public static class OwinExtensions
{
    /// <summary>
    /// Add Application Insight Request Tracking to the OWIN pipeline
    /// </summary>
    /// <param name="app"><see cref="IAppBuilder"/></param>
    public static void UseApplicationInsights(this IAppBuilder app) => app.Use(typeof(ApplicationInsights));

}

/// <summary>
/// Allows for tracking requests via Application Insight
/// </summary>
public class ApplicationInsights : OwinMiddleware
{

    /// <summary>
    /// Allows for tracking requests via Application Insight
    /// </summary>
    /// <param name="next"><see cref="OwinMiddleware"/></param>
    public ApplicationInsights(OwinMiddleware next) : base(next)
    {
    }

    /// <summary>
    /// Tracks the request and sends telemetry to application insights
    /// </summary>
    /// <param name="context"><see cref="IOwinContext"/></param>
    /// <returns></returns>
    public override async Task Invoke(IOwinContext context)
    {
        // Start Time Tracking
        var sw = new Stopwatch();
        var startTime = DateTimeOffset.Now;
        sw.Start();

        await Next.Invoke(context);

        // Send tracking to AI on request completion
        sw.Stop();

        var request = new RequestTelemetry(
            name: context.Request.Path.Value,
            startTime: startTime,
            duration: sw.Elapsed,
            responseCode: context.Response.StatusCode.ToString(),
            success: context.Response.StatusCode >= 200 && context.Response.StatusCode < 300
            )
        {
            Url = context.Request.Uri,
            HttpMethod = context.Request.Method
        };

        var client = new TelemetryClient();
        client.TrackRequest(request);

    }
}