2015-04-06 11 views
10

Mamy kilka problemów (przeczytaj długi czas reakcji) z kilkoma projektami w produkcji i chciałem zobaczyć, co dokładnie dzieje się na serwerze. Następnie przystąpiłem do dodawania statystyk aplikacji do wszystkich naszych projektów, postępując zgodnie z this article. Problem polega na tym, że oba nasze projekty WebAPI nie wysyłają danych serwera do portalu Azure, podczas gdy wszystkie inne projekty (MVC 5) są.Jak włączyć telemetrię serwera Application Insights w projekcie WebApi, który używa OWIN?

to, co jest wyświetlane, kiedy dostęp do odpowiednich Insights aplikacji tarczy na Azure:

enter image description here

starałem się wyłączyć i ponownie włączyć zbieranie danych w aplikacji Insights Status Monitor w naszej Azure maszyn wirtualnych, ponownie uruchomił IIS kilka razy podczas wysyłania żądań do API, bezskutecznie. Po włączeniu go w projekcie MVC niemal natychmiast widzę dane w portalu Azure po otwarciu stron w witrynie.

Kiedy zobaczyłem, że dane nie były wysyłane z naszych maszyn wirtualnych Azure dla tych konkretnych projektów, próbowałem ustawić te same kolekcje w naszym środowisku deweloperskim, które jest hostowane we własnej infrastrukturze, i ta sama sytuacja powtórzyła się, wyklucza możliwość, że jest to związane z projektami hostowanymi na maszynach wirtualnych Azure.

Nie jestem do końca pewien, co uniemożliwia wysyłanie danych do Azure, ale patrząc na projekty robocze w stosunku do nie pracujących, myślę, że może to być w jakiś sposób związane z faktem, że nasze projekty WebAPI użyj nowego potoku OWIN, podczas gdy MVC są standardowymi projektami MVC. Sprawdziłem zarówno plik web.config, jak i folder bin dla obu typów projektów i wydają się być poprawnie modyfikowane przez Insights Monitor (widzę te same nowe biblioteki dll dodane do folderu bin i ten sam moduł http dodany do sieci. config).

Mając to na uwadze, w jaki sposób włączyć telemetrię po stronie serwera, korzystając z aplikacji Insight dla projektów WebAPI, które opierają się na potoku OWIN/Katana? Co mogę zrobić, aby dowiedzieć się, co dokładnie powoduje, że projekt nie wysyła danych do platformy Azure w tym przypadku?

Odpowiedz

8

AI używa httpmodule do zbierania informacji na temat żądania rozpoczęcia i wysyłania go na żądanie końcowe. Zgodnie z opisem here Owin/Katana używa programów pośrednich do wykonywania logiki na różnych etapach. Ponieważ większość logiki automatycznego pobierania AI jest wewnętrzna, nie można jej ponownie użyć w oprogramowaniu pośredniczącym. Ale możesz sam zaprogramować swój kod. Utwórz TelemetryClient z kodu i rozpocznij wysyłanie Żądań, Śladów i Wyjątków (jak opisano here)

+0

W zasadzie mówisz, że nie można zintegrować sztucznej inteligencji w projekcie WebAPI wykorzystującym OWIN/Katana bez modyfikacji kodu? Naprawdę chciałbym tego uniknąć, ponieważ potrzebujemy teraz tylko tymczasowego profilowania, aby wykryć i naprawić spowolnienie, a następnie ponownie usunąć sztuczną inteligencję z projektów. Jeśli potrzebne są modyfikacje kodu, oznacza to, że będziemy musieli wdrożyć całkowicie nową wersję do produkcji, aby zdiagnozować problem, co jest obecnie dużym problemem. – julealgon

+1

AI nie jest profilem. Jest to SDK dla oprzyrządowania kodu. Obsługa pól aplikacji asp.net, które używają zwykłego stosu IIS, jest niedostępna. Jeśli onBegin i onEnd nie są wywoływane, kod AI nie jest wywoływany. –

+0

Rozumiem to, ale nasz obecny scenariusz znacznie skorzystałby z telemetrii Monitora aplikacji w rzeczywistym środowisku. Jeśli podejmiemy teraz podejście kodowe, oznacza to, że będziemy musieli opracować plan zarządzania kluczami w różnych środowiskach, sposobu ich ustawiania, gdzie w kodzie będzie to konieczne itd. Niestety, nie Teraz nie ma czasu na te zadania i musimy rozwiązać problem tak szybko, jak to możliwe, więc to bardzo smutne, że ten proces nie działa. Czy jesteś z zespołu programistów? Czy zastanawiałeś się już, czy nie wyjąć katany z pudełka? – julealgon

5

Poniżej przedstawiamy naszą implementację oprogramowania pośredniego OWIN dla Insightów aplikacji.

/// <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); 

    } 
} 
+0

Wygląda całkiem nieźle, czysto i prosto. Nie widzę jednak żadnej właściwości klucza, w jaki sposób serwer AI wie, do której aplikacji dodać telemetrię? Czy jest oparty na tym parametrze 'Name' na żądaniu telemetrii? – julealgon

+0

@julealgon Klucz instrumentacyjny jest odczytywany z pliku ApplicationInsights.config. Próbowałem tego rozwiązania i działało idealnie! –

15

To jest stare pytanie, ale wciąż znajdowało się ono w pierwszych 3 wynikach wyszukiwania "web api application insights owin". Po wielu poszukiwaniach i niezbyt wielu odpowiedziach, które nie wymagały od nas pisania własnego oprogramowania pośredniego lub wnikliwego instrumentowania wszystkiego. Natrafiliśmy pakietu rozszerzeń, które wykonane rzeczy bardzo prosta:

Oto Github Repository dla niej i związane NuGet Package

Dla tych, zbyt leniwy, aby spojrzeć na linki, wszystko, co było potrzebne, aby zostać dodano:

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

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

i dodaj to do ApplicationInsights.Konfig.

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

następnie pobierz oprogramowanie owin z Request.GetOwinContext(). Pobierz (); – WarrenDodsworth

Powiązane problemy