Logowanie to jeden z trzech głównych filarów obserwowalności naszych aplikacji – często niedoceniany, wykonany po macoszemu, byle był. Jako konsultant widziałem wiele aplikacji / systemów, które borykały się z problemem logowania niepoprawnej ilości danych, logowania danych poufnych bez wyraźnej przyczyny. Nie myśląc o tym w fazie planowania tworzymy problem nie tylko uciążliwy, lecz również trudny do naprawienia. Co więcej, w przypadku logowania wielu informacji trudno jest wyszukać te, które są nam faktycznie potrzebne. Kończymy z dodatkowymi elementami infrastruktury służącymi jako agregator logów (np. ELK, EFK, Seq).  Teraz spodziewasz się pewnie listy dobrych praktyk? Cóż, dzisiaj nie o tym, chodź w pobliżu. Chciałbym wprowadzić Ciebie w usługę Azure, którą osobiście uwielbiam – Application Insights. Może służyć za agregator logów, fakt, jednak zakres możliwości ma znacznie większy.

Czym jest Application Insights?

Zacznijmy od podstaw. Jako, że to (na razie) pierwszy artykuł na ten temat nie chciałbym Cię zarzucać zbyt wielką ilością informacji. Pozwól jednak, że po krótce wyjaśnię czym jest, w jaki sposób działa i do jakich celów można jej użyć.

Application Insights jest jedną z funkcjonalności usługi Azure Monitor, która pozwala na obserwowanie i monitorowanie aplikacji, infrastruktury i sieci. Jak zapewne się domyślasz został zaprojektowany właśnie z myślą o obserwowaniu i monitorowaniu aplikacji. Jest to usługa APM (Application Performance Management), co oznacza że nie tylko można śledzić co się wydarzyło w naszej aplikacji, ale także zbierać metryki dotyczące wydajności, jak np. liczby obsłużonych żądań HTTP czy zwróconych błędów.

Wszystko jest rzecz jasna konfigurowalne, więc jeśli potrzebujesz wysyłać własne zdarzenia / metryki to także nie powinno być z tym problemu.

Osobiście korzystałem z Application Insights do:

  • Obserwowania zachowania systemu
  • Monitorowania wydajności systemu
  • Monitorowania aktywności użytkowników
  • Stworzenia prostego systemu statystycznego opierajacego się na zdarzeniach z Application Iinsights

Ostatni punkt może wywoływać lekkie kontrowersje w  niektórych kręgach. Nie jest to standardowe zastosowanie, prawdopodobnie znalazłby się lepsze, jednak jako, że wszystkie zdarzenia były już wewnątrz Application Insights, tak było najprościej / najszybciej / najtaniej [niepotrzebne skreślić].

Integracja Application Insights z aplikacją .NET

Zintegrować się z usługą Application Insights możesz na dwa sposoby: poprzez instalacje paczki do Twojej aplikacji lub wykorzystując Application Insights Agent (jeśli twój ekosystem pozwala na jego wykorzystanie). W tym artykule zaprezentuje tylko instalacje paczki nuget-a, gdyż jest to najczęstszy sposób integracji. Ma on też inną, bardzo ważną zaletę. Twoja aplikacja nie musi być uruchomiona w chmurze Azure aby korzystać z Application Insights.  Równie dobrze może działać na maszynie wirtualnej, lub po prostu na localhost-cie.

Zacznij od dodawania paczki o nazwie Microsoft.ApplicationInsights.AspNetCore.

Następnie, w głównym pliku projektu Startup.cs , w metodzie ConfigureServices , dodaj następujące wywołanie:

public void ConfigureServices(IServiceCollection services) {
    services.AddApplicationInsightsTelemetry();
    // ...
    services.AddControllersWithViews();
    // ...
}

Ostatnim elementem jest skonfigurowanie InstrumentationKey w pliku appsettings.json.

{
    "ApplicationInsights": {
        "InstrumentationKey": "putinstrumentationkeyhere"
    }
}

Przy takiej konfiguracji SDK będzie w stanie samo wyciągnąć potrzebny klucz do połączenia się z usługą.
Jeżeli nie lubisz trzymać istotnych danych w pliku appsettings (co całkowicie rozumiem) możesz wykorzystać jedną ze zmiennych środowiskowych (ApplicationInsights:InstrumentationKey, APPINSIGHTS_INSTRUMENTATIONKEY):

SET ApplicationInsights:InstrumentationKey=putinstrumentationkeyhere
SET APPINSIGHTS_INSTRUMENTATIONKEY=putinstrumentationkeyhere

Utworzenie usługi Application Insights

Dobrze, masz już stworzoną implementacje. Przetestowanie poprawnego działania wymaga… chwila napięcia… utworzenia samej usługi. Możemy to zrobić za pomocą panelu webowego, no ale to chyba nie byłoby zbyt interesujące do czytania. Spróbujmy zatem utworzyć ją za pomocą azure cli.
Jako, że obecnie ta funkcjonalność jest w preview, musisz zacząć od instalacji dodatku do azure CLI.

$ az extension add -n application-insights

Jeżeli w tym momencie wykonasz komendę

$ az monitor app-insights --help

Powinieneś zobaczyć listę możliwych operacji do wykonania. Na tą chwile interesuje nas podgrupa komend o nazwie component.
Wystarczy wywołanie pojedynczej komendy, aby utworzyć zasób

$ az monitor app-insights component create --app demo-insights --location eastus --kind web -g bd90-blog --application-type web

Jako zwrotkę otrzymamy json-a, który będzie zawierał wszystkie potrzebne informacje… na potrzebę tego dema InstrumentationKey

{
  "appId": "d35dcdf7-eadb-429a-9582-23254e5bb8ea",
  "applicationId": "demo-insights",
  "applicationType": "web",
  "connectionString": "InstrumentationKey=390f5379-5f49-41a1-970e-dd807ef7a229;IngestionEndpoint=https://eastus-6.in.applicationinsights.azure.com/",
  "creationDate": "2021-01-12T17:41:43.649560+00:00",
  "disableIpMasking": null,
  "etag": "\"1901fa05-0000-0100-0000-5ffddf570000\"",
  "flowType": "Bluefield",
  "hockeyAppId": null,
  "hockeyAppToken": null,
  "id": "id-zawiera-id-subkrypcji-dlatego-nie-moge-tego-tutaj-pokazac",
  "immediatePurgeDataOn30Days": null,
  "instrumentationKey": "390f5379-5f49-41a1-970e-dd807ef7a229",
  "kind": "web",
  "location": "eastus",
  "name": "demo-insights",
  "privateLinkScopedResources": null,
  "provisioningState": "Succeeded",
  "publicNetworkAccessForIngestion": "Enabled",
  "publicNetworkAccessForQuery": "Enabled",
  "requestSource": "rest",
  "resourceGroup": "bd90-blog",
  "retentionInDays": 90,
  "samplingPercentage": null,
  "tags": {},
  "tenantId": "tego tez wole nie ujawniac :)",
  "type": "microsoft.insights/components"
}

Jeszcze szybko zerknijmy do portalu Azure, czy wszystko zostało utworzone poprawnie.

Wygląda na to, że działa jak należy. Przejdźmy do omówienia poszczególnych elementów komendy.

  • --app -> nazwa zasobu, która będzie wyświetlana w panelu Azure
  • --location -> lokacja, w której zostanie utworzony zasób. W tym przypadku instancja Application Insights została utworzona w data center na wschodnim wybrzeżu USA
  • --kind -> typ aplikacji, do której Application Insights zostanie użyty. Możliwymi wartościami są web, ios, other, store, java, phone.
  • -g -> definiuje w jakiej Resource Gruop zostanie utworzony zasób
  • --application-type -> typ aplikacji, która będzie monitorowana

Podsumowanie

Artykuł się kończy, jednak to nie koniec tematu Application Insights na tym blogu. Niedługo poruszymy takie tematy jak przeszukiwanie zdarzeń, wykorzystanie restowego api do pobierania danych, integracje z aplikacją frontendową czy generowanie dashboard-ów do łatwiejszego monitorowania środowiska, w którym działa aplikacja.

Jak zwykle mam nadzieje że artykuł się podobał.
Do Następnego!

PS. Spodobał Ci się ten artykuł?

Referencje