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-installatiekopieën waarmee u ze eenvoudig aan uw projecten kunt toevoegen. U neemt ze op in het docker-compose.yml-bestand , in de hoofdmap van de oplossing.

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

  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. Hiermee wordt de prometheus-map toegewezen die een prometheus.yml-bestand verwacht. In de sectie Grafana wordt een container geconfigureerd om te reageren op poort 3000. Er worden drie mappen in een grafana-map toegewezen.

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 Visual Studio Code in het deelvenster EXPLORER met de rechtermuisknop op de map dotnet-waarneembaarheid en selecteer vervolgens 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 Visual Studio Code 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 map grafana en selecteer Vervolgens Nieuwe map.

  4. Voer in het naamveld gegevensbron in.

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

  6. Voer het dashboard in het naamveld in.

  7. Vouw de grafana-map uit, klik met de rechtermuisknop op de map gegevensbron en selecteer Vervolgens 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 Visual Studio Code 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 schrooten http://service/metrics.

  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 app.Run() methode 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 app.Run() methode 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-waarneembaarheid/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 vervolgens 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 als UP worden vermeld.

  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 gebruikersnaambeheerder 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+C 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 Visual Studio Code in het deelvenster EXPLORER het bestand docker-compose.yml in de map dotnet-waarneembaarheid .

  2. Voeg prometheus en zipkin voeg de depends_on voor de frontend.

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

     depends_on: 
       - prometheus
    
  4. Omgevingsvariabelen voor Zipkin toevoegen aan BEIDE frontend 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-waarneembaarheid/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+C 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 Visual Studio Code in het deelvenster TERMINAL 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. Een Application Insights-resource maken.

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

    De uitvoer moet er ongeveer als volgt uitzien:

    {
      "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 uit de voorgaande geretourneerde JSON de connectionString, exclusief de '. Voorbeeld:

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

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

  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 hieronder var otelBuilder = services.AddOpenTelemetry();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-waarneembaarheid/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 Application Insights-resource eShopLiteInsights .

  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 app en wijzigt u de eShopLite voorraad. Vernieuw vervolgens het Application Insights-dashboard.

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