Ćwiczenie — dodawanie biblioteki OpenTelemetry do aplikacji natywnej dla chmury

Ukończone

W tym ćwiczeniu dodasz nowy projekt diagnostyczny do rozwiązania eShopLite. Zobaczysz, jak uwzględnić pakiety NuGet OpenTelemetry, a następnie dodać funkcje obserwowalności do usługi Products.

Otwórz środowisko deweloperskie i utwórz zasoby platformy Azure

Możesz użyć usługi GitHub codespace, która hostuje ćwiczenie lub wykonać ćwiczenie lokalnie w programie Visual Studio Code.

Aby użyć przestrzeni kodowej, utwórz wstępnie skonfigurowaną przestrzeń kodową GitHub przy użyciu tego szablonu tworzenia przestrzeni kodowej .

Ten krok trwa kilka minut, gdy usługa GitHub tworzy i konfiguruje przestrzeń kodu. Po zakończeniu procesu zobaczysz pliki kodu dla ćwiczenia. Kod używany w pozostałej części tego modułu znajduje się w katalogu /dotnet-observability.

Aby użyć programu Visual Studio Code, sklonuj repozytorium https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative na komputer lokalny. Wtedy:

  1. Zainstaluj wszelkie wymagania systemowe, aby uruchomić Dev Container w programie Visual Studio Code.
  2. Upewnij się, że platforma Docker jest uruchomiona.
  3. W nowym oknie programu Visual Studio Code otwórz folder sklonowanego repozytorium
  4. Naciśnij Ctrl+Shift+P, aby otworzyć paletę poleceń.
  5. Wyszukiwanie: >Dev Containers: ponowne kompilowanie i ponowne otwieranie w kontenerze
  6. Wybierz pozycję eShopLite — dotnet-observability z listy rozwijanej. Program Visual Studio Code tworzy kontener programistyczny lokalnie.

Dodawanie projektu diagnostycznego do rozwiązania

Pierwszym krokiem do dodania obserwowalności do aplikacji eShopLite jest wprowadzenie nowego projektu diagnostycznego w ramach rozwiązania. Ten projekt zawiera wszystkie pakiety i konfiguracje OpenTelemetry, których będziesz używać do dodawania obserwowalności do aplikacji.

  1. W palecie poleceń programu Visual Studio Code wprowadź >.NET: Otwórz rozwiązanie.
  2. Wybierz dotnet-observability/eShopLite/eShopLite.sln.
  3. W Eksploratorze rozwiązań w dolnej części okienka EKPLORATORA kliknij prawym przyciskiem myszy rozwiązanie eShopLite, a następnie wybierz pozycję Nowy projekt.
  4. W oknie dialogowym 'Wybierz szablon, aby utworzyć nowy projekt .NET', wybierz pozycję Class Library (Common, Library).
  5. W polu Nazwa wprowadź „Diagnostics”.
  6. W menu rozwijanym , w sekcji Project, wybierz Domyślny katalog.

Dodawanie pakietów OpenTelemetry

Teraz dodaj pakiety OpenTelemetry do nowego projektu diagnostycznego.

  1. Korzystając z okienka terminalu w dolnej części programu Visual Studio Code, przejdź do folderu projektu Diagnostyka:

    cd dotnet-observability/eShopLite/Diagnostics
    
  2. Uruchom następujące polecenia dotnet add:

    dotnet add package OpenTelemetry.Exporter.Console
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
    dotnet add package OpenTelemetry.Instrumentation.EventCounters --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Runtime
    dotnet add package OpenTelemetry.Instrumentation.SqlClient --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Http
    
  3. Na okienku EXPLORER rozwiń folder Diagnostics, a następnie wybierz Diagnostics.csproj.

  4. Zmień Project Sdk u góry na:

    <Project Sdk="Microsoft.NET.Sdk.Web">
    

    Powyższy kod umożliwia użycie klasy IConfiguration w kodzie.

  5. W <PropertyGroup>dodaj typ danych wyjściowych:

    <OutputType>Library</OutputType>
    

    Powyższy kod gwarantuje, że projekt zostanie zbudowany w formie biblioteki. W przeciwnym razie kompilator oczekuje pliku Program.cs z metodą main.

Dodaj kod do użycia OpenTelemetry

Po dodaniu pakietów OpenTelemetry można teraz wprowadzić kod umożliwiający ich użycie.

  1. Na panelu eksploratora kliknij prawym przyciskiem myszy plik Class1.cs, a następnie wybierz Zmień nazwę.

  2. Zmień nazwę pliku na DiagnosticServiceCollectionExtensions.cs.

  3. Zastąp kod w pliku następującym kodem:

    using OpenTelemetry.Metrics;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    
    namespace Microsoft.Extensions.DependencyInjection;
    
    public static class DiagnosticServiceCollectionExtensions
    {
      public static IServiceCollection AddObservability(this IServiceCollection services,
          string serviceName,
          IConfiguration configuration)
      {
        // create the resource that references the service name passed in
        var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");
    
        // add the OpenTelemetry services
        var otelBuilder = services.AddOpenTelemetry();
    
        otelBuilder
            // add the metrics providers
            .WithMetrics(metrics =>
            {
              metrics
                .SetResourceBuilder(resource)
                .AddRuntimeInstrumentation()
                .AddAspNetCoreInstrumentation()
                .AddHttpClientInstrumentation()
                .AddEventCountersInstrumentation(c =>
                {
                  c.AddEventSources(
                          "Microsoft.AspNetCore.Hosting",
                          "Microsoft-AspNetCore-Server-Kestrel",
                          "System.Net.Http",
                          "System.Net.Sockets");
                })
                .AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
                .AddConsoleExporter();
    
            })
            // add the tracing providers
            .WithTracing(tracing =>
            {
              tracing.SetResourceBuilder(resource)
                          .AddAspNetCoreInstrumentation()
                          .AddHttpClientInstrumentation()
                          .AddSqlClientInstrumentation();
            });
    
        return services;
      }
    }
    
  4. W okienku terminalu uruchom następujące polecenie, aby skompilować projekt:

    dotnet build
    

    Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
  5. Projekt Diagnostics jest teraz gotowy do użycia przez usługę Products.

  6. W okienku EXPLORER, w obszarze EKSPLORATOR ROZWIĄZAŃ, kliknij prawym przyciskiem myszy na projekt Products, a następnie wybierz Dodaj odwołanie do projektu.

  7. Wybierz pozycję Diagnostics.

  8. W okienku eksploratora rozwiń folder Products, a następnie wybierz pozycję Program.cs.

  9. W obszarze komentarza kodu // Add observability code heredodaj wywołanie metody Diagnostyka:

    builder.Services.AddObservability("Products", builder.Configuration);
    
  10. W okienku TERMINAL przejdź do folderu Products.

    cd ../Products
    
  11. Uruchom to polecenie, aby skompilować projekt:

    dotnet build
    

    Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    

Aktualizowanie ustawień platformy Docker i uruchamianie aplikacji

  1. W okienku TERMINAL przejdź do katalogu głównego dotnet-observability.

    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    
  2. Uruchom następujące polecenia platformy Docker:

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/
    docker compose up 
    

    Kontenery zaplecza (usługiProducts) i frontonu (Store Service) powinny być kompilne. Następnie aplikacja zostanie uruchomiona.

  3. Jeśli wykonujesz to ćwiczenie w przestrzeni kodu, wybierz kartę PORTS w dolnej części okna programu Visual Studio Code. Wybierz link Otwórz w przeglądarce obok usługi Front End.

  4. Jeśli wykonujesz to ćwiczenie lokalnie w programie Visual Studio Code, na nowej karcie przeglądarki przejdź do aplikacji pod adresem http://localhost:32000.

  5. W aplikacji wybierz pozycję Products na pasku nawigacyjnym.

    Zrzut ekranu przedstawiający stronę Products (Produkty) w aplikacji eShopLite. Na stronie zostanie wyświetlona lista produktów z nazwą, opisem i ceną oraz przyciskiem umożliwiającym zaktualizowanie zapasów.

  6. Wybierz pozycję Update Stock dla niektórych produktów. Następnie w oknie dialogowym zmień wartość akcji i wybierz pozycję Update.

  7. Wybierz kartę TERMINAL i przewiń komunikaty. Zwróć uwagę, że istnieją komunikaty z funkcji OpenTelemetry, takie jak:

    backend-1   | Export ec.Microsoft-AspNetCore-Server-Kestrel.connection-queue-length, Meter: OpenTelemetry.Instrumentation.EventCounters/1.5.1.1
    backend-1   | (2023-11-09T19:55:14.8933518Z, 2023-11-09T20:04:44.8596671Z] http.request.method: PUT http.response.status_code: 200 http.route: /api/Stock/{id} network.protocol.name: http network.protocol.version: 1.1 url.scheme: http Histogram      
    backend-1   | Value: Sum: 0.05144170000000001 Count: 4 Min: 0.0039736 Max: 0.0359739
    
  8. Naciśnij Ctrl+C, aby zatrzymać aplikację.

Pomyślnie dodano usługę OpenTelemetry do usługi Products. W następnej lekcji dowiesz się, jak lepiej wykorzystać dane telemetryczne, wyświetlając je na narzędziach takich jak Prometheus i Grafana.