Oefening: OpenTelemetry-gegevens gebruiken in een cloudeigen toepassing

Voltooid

In deze oefening krijgt u een betere zichtbaarheid van alle gegevens die zijn gegenereerd door OpenTelemetry in uw app. U voltooit het toevoegen van diagnostische gegevens aan de Store-service. Hiermee voegt u Prometheus en Grafana toe aan de eShopLite-services en bekijkt u enkele van de metrische gegevens die worden vastgelegd. De volgende stap bestaat uit het toevoegen van Zipkin en het weergeven van de gedistribueerde traceringen. Ten slotte voegt u Application Insights toe aan uw app en gebruikt u deze om de gegevens weer te geven.

Prometheus en Grafana toevoegen

Prometheus en Grafana bieden Docker-images waarmee u ze eenvoudig aan uw projecten kunt toevoegen. Je neemt ze op in het bestand docker-compose.yml, in de hoofdmap van de oplossing.

  1. Selecteer in het deelvenster EXPLORER het docker-compose.yml bestand.

  2. Voeg deze YAML toe aan de onderkant van het bestand:

      prometheus:
        image: prom/prometheus
        container_name: prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
        ports:
          - 9090:9090
        restart: unless-stopped
        volumes:
          - ./prometheus:/etc/prometheus
    
      grafana:
        image: grafana/grafana
        container_name: grafana
        ports:
          - 3000:3000
        restart: unless-stopped
        environment:
          - GF_SECURITY_ADMIN_USER=admin
          - GF_SECURITY_ADMIN_PASSWORD=grafana
        volumes:
          - ./grafana/datasource:/etc/grafana/provisioning/datasources
    

Met de voorgaande Docker yaml worden twee nieuwe services, Prometheus en Grafana, toegevoegd. De sectie Prometheus configureert een container om te reageren op poort 9090. Het wijst de prometheus-map toe die een prometheus.yml-bestand verwacht. In de sectie Grafana wordt een container geconfigureerd om te reageren op poort 3000. Het wijst drie mappen toe binnen een grafana-map.

Prometheus configureren

Prometheus moet zo worden geconfigureerd dat deze weet waar de metrische gegevens moeten worden verzameld. U voegt een prometheus.yml bestand toe aan de map prometheus.

  1. Klik in het deelvenster EXPLORER met de rechtermuisknop op de map dotnet-observability en selecteer Nieuwe map.

  2. Voer prometheus in het naamveld in.

  3. Klik in het deelvenster EXPLORER met de rechtermuisknop op de map prometheus en selecteer Vervolgens Nieuw bestand.

  4. Voer in het naamveld prometheus.yml in.

  5. Voer in de bestandseditor deze YAML in:

    global:
      scrape_interval: 1s
    
    scrape_configs:
      - job_name: 'products'
        static_configs:
          - targets: ['backend:8080']
      - job_name: 'store'
        static_configs:
          - targets: ['frontend:8080']
    

    De voorgaande YAML configureert Prometheus om metrische gegevens van de back-end- en front-endservices te scrapen. Terwijl de app wordt uitgevoerd in Docker, zijn de hostnamen de servicenamen.

  6. Selecteer Ctrl+S om het bestand op te slaan.

Grafana configureren

Grafana moet zo worden geconfigureerd dat deze weet waar de metrische gegevens moeten worden verzameld.

  1. Klik in het deelvenster EXPLORER met de rechtermuisknop op de map dotnet-waarneembaarheid en selecteer vervolgens Nieuwe map.

  2. Voer grafana in het naamveld in.

  3. Klik met de rechtermuisknop op de grafana-map en selecteer Nieuwe map.

  4. Voer in het naamveld de gegevensbron in.

  5. Klik met de rechtermuisknop op de grafana-map en selecteer Nieuwe map.

  6. Voer het dashboard in het naamveld in.

  7. Vouw de grafana-map uit, klik met de rechtermuisknop op de datasource-map en selecteer Nieuw bestand.

  8. Voer in het naamveld datasource.yml in.

  9. Voer op het tabblad Editor deze YAML in:

    apiVersion: 1
    
    datasources:
    - name: Prometheus
      type: prometheus
      url: http://prometheus:9090 
      isDefault: true
      access: proxy
      editable: true
    

    De voorgaande YAML configureert Grafana om Prometheus als gegevensbron te gebruiken.

  10. Selecteer Ctrl+S om het bestand op te slaan.

Uw ASP.NET Core-app bijwerken om metrische gegevens beschikbaar te maken voor Prometheus

Het diagnostische project is nu alleen geconfigureerd om metrische gegevens beschikbaar te maken voor de console. U werkt het project bij om in plaats daarvan metrische gegevens beschikbaar te maken voor Prometheus.

  1. Ga in het TERMINAL-deelvenster onderaan naar de map Diagnostische gegevens .

  2. Voer deze opdracht uit:

    cd .\eShopLite\Diagnostics\ 
    
  3. Verwijder het OpenTelemetry.Exporter.Console-pakket:

    dotnet remove package OpenTelemetry.Exporter.Console
    
  4. Voeg het OpenTelemetry.Exporter.Prometheus.AspNetCore-pakket toe:

    dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prerelease
    
  5. Vouw in het deelvenster EXPLORER de map Diagnostische gegevens uit en selecteer DiagnosticServiceCollectionExtensions.cs.

  6. Vervang de consoleexporteur .AddConsoleExporter(); door deze code:

    .AddPrometheusExporter();
    
  7. Voeg onder aan het bestand, vóór de laatste }, deze code toe:

    public static void MapObservability(this IEndpointRouteBuilder routes)
    {
      routes.MapPrometheusScrapingEndpoint();
    }
    

    Met deze code wordt een Prometheus-scraping-eindpunt toegevoegd aan elke service die dit met hun app omvat. Hierdoor kan Prometheus metrische gegevens uit http://service/metricsscrapen.

  8. Selecteer Ctrl+S om het bestand op te slaan.

Metrische gegevens beschikbaar maken in de Store-service

De app is momenteel alleen geconfigureerd om metrische gegevens beschikbaar te maken voor de productenservice . U werkt de app bij om ook metrische gegevens voor de Store-service beschikbaar te maken.

  1. Klik in het deelvenster EXPLORER onder SOLUTION EXPLORER met de rechtermuisknop op het Store-project en selecteer Vervolgens Projectverwijzing toevoegen.

  2. Selecteer Diagnostische gegevens.

  3. Vouw in het deelvenster EXPLORER de map Store uit en selecteer Program.cs.

  4. Voeg onder de codeopmerking // Add observability code hereeen aanroep toe aan de diagnostische methode:

    builder.Services.AddObservability("Store", builder.Configuration);
    
  5. Voeg vóór de methode app.Run() deze code toe:

    app.MapObservability();
    

    Met deze methode wordt het Prometheus-scraping-eindpunt toegevoegd aan de Store-service .

  6. Selecteer Ctrl+S om het bestand op te slaan.

  7. Vouw in het deelvenster EXPLORER de map Product uit en selecteer Program.cs.

  8. Voeg vóór de methode app.Run() deze code toe:

    app.MapObservability();
    

    Met deze methode wordt het Prometheus-scraping-eindpunt toegevoegd aan de Productenservice.

  9. Selecteer Ctrl+S om het bestand op te slaan.

De nieuwe waarneembaarheidsfuncties testen

U test nu de nieuwe waarneembaarheidsfuncties die u aan de app hebt toegevoegd.

  1. Ga in het TERMINAL-deelvenster onderaan naar de map dotnet-observability/eShopLite.

    cd ..
    
  2. Werk de appscontainers bij.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Ga naar de map dotnet-waarneembaarheid en start de app met Docker:

    cd ..
    docker compose up
    
  4. Selecteer Openen in Browser voor Prometheus (9090) op het tabblad POORTEN. Als u lokaal in Visual Studio Code werkt, opent u een browser en gaat u op een nieuw tabblad naar de Prometheus-app http://localhost:9090.

  5. Selecteer Status in het bovenste menu en selecteer Doelen.

    Schermopname van de geconfigureerde Prometheus-app met de status van de eShopLite-app.

    Als het goed is, ziet u de producten en Store services die worden weergegeven als UP.

  6. Selecteer Openen in Browser voor Grafana (3000) op het tabblad POORTEN. Als u lokaal in Visual Studio Code werkt, opent u een browser en gaat u op een nieuw tabblad naar de Grafana-app http://localhost:3000.

  7. Voer de gebruikersnaam admin in.

  8. Voer het wachtwoord grafana in.

  9. Selecteer Uw eerste dashboard maken.

  10. Selecteer Dashboard importeren.

  11. Ga op een nieuw tabblad naar GitHub en open het json-bestand ASP.NET Core-dashboard .

  12. Kopieer het Raw-bestand .

  13. Plak de JSON in het tekstvak Importeren via het JSON-dashboardmodel .

  14. Selecteer laden.

  15. Selecteer Prometheus in de vervolgkeuzelijst Prometheus-gegevensbron.

  16. Selecteer importeren.

    Schermopname van een ASP.NET dashboard in Grafana.

    U ziet nu een dashboard met metrische gegevens voor de producten - en winkelservices . Selecteer de taak die u wilt wijzigen tussen de twee services.

  17. Selecteer Ctrl+ in het TERMINAL-deelvenster om de app te stoppen.

Zipkin toevoegen

U kunt nu de traceringsmogelijkheden van de app uitbreiden door Zipkin toe te voegen. Zoals u eerder hebt gedaan, voegt u een Zipkin-container toe aan uw app en configureert u deze om verbinding te maken met de OpenTelemetry-collector. Vervolgens voegt u de OpenTelemetry Zipkin-exporteur toe aan uw app.

  1. Selecteer in het deelvenster EXPLORER het docker-compose.yml bestand in de map dotnet-waarneembaarheid .

  2. Voeg prometheus en zipkin toe aan de depends_on voor de frontend.

    depends_on: 
      - backend
      - prometheus
      - zipkin 
    
  3. Voeg prometheus toe aan de depends_on voor de backend.

     depends_on: 
       - prometheus
    
  4. Omgevingsvariabelen voor Zipkin toevoegen aan BEIDEfrontend en backend:

    environment: 
      - ZIPKIN_URL=http://zipkin:9411    
    

    De twee services moeten er als volgt uitzien:

    frontend:
      image: storeimage
      build:
        context: .
        dockerfile: ./eShopLite/Store/Dockerfile
      environment: 
        - ProductEndpoint=http://backend:8080
        - ZIPKIN_URL=http://zipkin:9411
      ports:
        - "32000:8080"
      depends_on: 
        - backend
        - prometheus
        - zipkin
    
    backend:
      image: productservice
      build: 
        context: .
        dockerfile: ./eShopLite/Products/Dockerfile
      environment: 
        - ZIPKIN_URL=http://zipkin:9411
    
      ports: 
        - "32001:8080"
      depends_on: 
        - prometheus    
    
  5. Voeg deze YAML toe aan de onderkant van het bestand:

      zipkin:
        image: openzipkin/zipkin
        ports:
          - 9411:9411
    

    De voorgaande YAML voegt een Zipkin-container toe aan de app. Hiermee configureert u de Zipkin-container om te reageren op poort 9411.

  6. Selecteer Ctrl+S om het bestand op te slaan.

  7. Ga in het TERMINAL-deelvenster naar de map Diagnostische gegevens .

    cd ./eShopLite/Diagnostics/
    
  8. Voeg de Zipkin-exportpakketten toe.

    dotnet add package OpenTelemetry.Exporter.Zipkin --prerelease
    
  9. Vouw in het deelvenster EXPLORER de map Diagnostische gegevens uit en selecteer DiagnosticServiceCollectionExtensions.cs.

  10. Voeg onder aan de traceringsproviders Zipkin toe:

    // add the tracing providers
    .WithTracing(tracing =>
    {
      tracing.SetResourceBuilder(resource)
                  .AddAspNetCoreInstrumentation()
                  .AddHttpClientInstrumentation()
                  .AddSqlClientInstrumentation()
                  .AddZipkinExporter(zipkin =>
                  {
                    var zipkinUrl = configuration["ZIPKIN_URL"] ?? "http://zipkin:9411";
                    zipkin.Endpoint = new Uri($"{zipkinUrl}/api/v2/spans");
                  });
    });
    
  11. Selecteer Ctrl+S om het bestand op te slaan.

  12. Ga in het TERMINAL-deelvenster onderaan naar de map dotnet-observability/eShopLite.

    cd ..
    
  13. Werk de appscontainers bij.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  14. Ga naar de map dotnet-waarneembaarheid en start de app met Docker:

    cd ..
    docker compose up
    
  15. Selecteer Openen in Browser voor Prometheus (9090) op het tabblad POORTEN. Als u lokaal in Visual Studio Code werkt, opent u een nieuw browsertabblad en gaat u naar de Zipkin-app http://localhost:9411.

  16. Selecteer Afhankelijkheden in het menu.

    Schermopname van Zipkin met de afhankelijkheden van de eShopLite App Store die aanvragen verzendt naar de productenservice.

  17. Selecteer Ctrl+ in het TERMINAL-deelvenster om de app te stoppen.

Application Insights toevoegen

De laatste stap is het toevoegen van Application Insights aan uw app.

De Application Insights-resource maken in Azure

  1. Meld u in het TERMINAL-deelvenster aan bij Azure.

    az login --use-device-code
    
  2. Bekijk uw geselecteerde Azure-abonnement.

    az account show -o table
    

    Als het verkeerde abonnement is geselecteerd, selecteert u het juiste abonnement met behulp van de opdracht az account set .

  3. Voeg de extensie voor Application Insights toe.

    az extension add -n application-insights
    
  4. Maak een Application Insights-resource.

    az monitor app-insights component create --app eShopLiteInsights --location eastus --kind web -g eShopLite
    

    Je zou deze uitvoer moeten zien:

    {
      "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "applicationId": "eShopLiteInsights",
      "applicationType": "web",
      "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/",
      "creationDate": "2023-11-10T16:50:00.950726+00:00",
      "disableIpMasking": null,
      "etag": "\"3a02952a-0000-0100-0000-654e5f380000\"",
      "flowType": "Bluefield",
      "hockeyAppId": null,
      "hockeyAppToken": null,
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/eShopLite/providers/microsoft.insights/components/eShopLiteInsights",
      "immediatePurgeDataOn30Days": null,
      "ingestionMode": "ApplicationInsights",
      "instrumentationKey": "00000000-0000-0000-0000-000000000000",
      "kind": "web",
      "location": "eastus",
      "name": "eShopLiteInsights",
      "privateLinkScopedResources": null,
      "provisioningState": "Succeeded",
      "publicNetworkAccessForIngestion": "Enabled",
      "publicNetworkAccessForQuery": "Enabled",
      "requestSource": "rest",
      "resourceGroup": "eShopLite",
      "retentionInDays": 90,
      "samplingPercentage": null,
      "tags": {},
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "microsoft.insights/components"
    }
    

    Kopieer de connectionStringuit de voorgaande geretourneerde JSON, met uitzondering van de '. Bijvoorbeeld:

    InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/

  5. Selecteer in het deelvenster EXPLORER het docker-compose.yml bestand.

  6. U voegt een omgevingsvariabele toe die door het diagnostische project wordt gebruikt om verbinding te maken met Application Insights. Voeg deze YAML toe aan de Store-service :

    environment:
      - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
    

    Vervang de voorgaande verbindingsreeks door de verbindingsreeks die u hebt gekopieerd uit de Azure CLI.

  7. Herhaal deze stappen voor de productenservice . De uiteindelijke YAML moet er als volgt uitzien:

      frontend:
        image: storeimage
        build:
          context: .
          dockerfile: ./eShopLite/Store/Dockerfile
        environment: 
          - ProductEndpoint=http://backend:8080
          - ZIPKIN_URL=http://zipkin:9411
          - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
        ports:
          - "32000:8080"
        depends_on: 
          - backend
          - prometheus
          - zipkin
    
      backend:
        image: productservice
        build: 
          context: .
          dockerfile: ./eShopLite/Products/Dockerfile
        environment: 
          - ZIPKIN_URL=http://zipkin:9411
          - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
    
    
  8. Selecteer Ctrl+S om het bestand op te slaan.

  9. Ga in het TERMINAL-deelvenster naar de map Diagnostische gegevens .

    cd .\eShopLite\Diagnostics\ 
    
  10. Voeg het Application Insights-exportpakket toe.

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore --prerelease
    
  11. Selecteer in het deelvenster VERKENNEN de map Diagnostische gegevens en selecteer vervolgens DiagnosticServiceCollectionExtensions.cs.

  12. Voeg boven aan het bestand deze using instructie toe:

    using Azure.Monitor.OpenTelemetry.AspNetCore;
    
  13. Voeg var otelBuilder = services.AddOpenTelemetry();hierna deze code toe:

    if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
    {
      otelBuilder.UseAzureMonitor();
    }
    
  14. Selecteer Ctrl+S om het bestand op te slaan.

  15. Ga in het TERMINAL-deelvenster onderaan naar de map dotnet-observability/eShopLite.

    cd ..
    
  16. Werk de appscontainers bij.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  17. Ga naar de map dotnet-waarneembaarheid en start de app met Docker:

    cd ..
    docker compose up
    
  18. Meld u aan bij Azure Portal met dezelfde referenties die u hebt gebruikt om u aan te melden bij de Azure CLI.

  19. Selecteer resourcegroepen in de Azure-portal.

  20. Selecteer de eShopLite-resourcegroep .

  21. Selecteer de eShopLiteInsights Application Insights-resource .

  22. Selecteer het toepassingsdashboard.

    Schermopname van Application Insights met de status van de eShopLite-app.

  23. Als u wijzigingen in metrische gegevens wilt zien, gaat u naar de eShopLite-app en wijzigt u de voorraad. Vernieuw vervolgens het Application Insights-dashboard.

  24. Druk in het TERMINAL-deelvenster op Ctrl+C om de app te stoppen.