Как включить телеметрию сервера 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);
}
}