Condividi tramite


Esercitazione: Monitorare ed eseguire la diagnostica di un'applicazione di Service Fabric con Application Insights

Questa è la quinta di una serie di esercitazioni. Descrive la procedura per configurare il monitoraggio e la diagnostica per un'applicazione ASP.NET Core in esecuzione in un cluster di Service Fabric con Application Insights. I dati di diagnostica sono stati raccolti dall'applicazione sviluppata nella prima parte della serie di esercitazioni.

In questa esercitazione apprenderai a:

  • Configurare una risorsa di Application Insights
  • Aggiungere Application Insights ai servizi dell'applicazione
  • Visualizzare i dati di diagnostica e la mappa delle applicazioni in Application Insights
  • Aggiungere la strumentazione personalizzata all'applicazione

La serie di esercitazioni mostra come:

Prerequisiti

Prima di iniziare questa esercitazione:

Scaricare l'applicazione di voto di esempio

Se l'applicazione di voto di esempio non è stata creata nella prima parte di questa serie di esercitazioni, è possibile scaricarla. In una finestra di comando o del terminale, eseguire il comando seguente per clonare il repository dell'app di esempio nel computer locale:

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

Configurare una risorsa di Application Insights

Application Insights è la piattaforma di gestione delle prestazioni delle applicazioni di Azure. È consigliabile usare Application Insights per il monitoraggio e la diagnostica delle applicazioni in Service Fabric.

Per creare una risorsa di Application Insights, usare il portale di Azure. Selezionare Crea una risorsa. Nel menu del portale selezionare Monitoraggio e diagnostica. Nella colonna Servizi di Azure più diffusi selezionare Application Insights e quindi scegliere Crea.

Screenshot che mostra come creare una nuova risorsa di Application Insights.

Immettere o selezionare i valori per Sottoscrizione, Gruppo di risorse e Nome. Per Area scegliere dove distribuire il cluster di Service Fabric in futuro. In questa esercitazione l'app viene distribuita in un cluster locale, quindi l'area di Azure è irrilevante. In Tipo di applicazione lasciare l’opzione Applicazione Web ASP.NET selezionata.

Screenshot che mostra gli attributi della risorsa di Application Insights.

Dopo aver immesso o selezionato le informazioni necessarie, selezionare Crea per effettuare il provisioning della risorsa. La risorsa viene distribuita in circa un minuto.

Aggiungere Application Insights ai servizi dell'applicazione

Aprire Visual Studio 2019 usando l'opzione Esegui come amministratore (fare clic con il pulsante destro del mouse sull'icona di Visual Studio nel menu Start). Selezionare File>Apri>Progetto/Soluzione e passare all'applicazione di voto (creata nella prima parte dell'esercitazione o clonata da GitHub). Aprire Voting.sln. Se viene richiesto di ripristinare i pacchetti NuGet dell'applicazione, selezionare .

Per configurare Application Insights per i servizi VotingWeb e VotingData:

  1. Fare clic con il pulsante destro del mouse sul nome del servizio e selezionare Aggiungi>Servizi connessi>Monitoraggio con Application Insights.

    Screenshot che mostra la configurazione dei servizi di Application Insights.

    Nota

    A seconda del tipo di progetto, quando si fa clic con il pulsante destro del mouse sul nome del servizio, è talvolta necessario selezionare Aggiungi e quindi Application Insights Telemetry.

  2. Seleziona Inizia.

  3. Accedere all'account usato per la sottoscrizione di Azure e selezionare la sottoscrizione in cui è stata creata la risorsa di Application Insights. Per trovare la risorsa, in Risorsa passare a Risorsa di Application Insights esistente. Selezionare Registra per aggiungere Application Insights al servizio.

    Screenshot che mostra come registrare Application Insights.

  4. Selezionare Fine.

Nota

Assicurarsi di eseguire questi passaggi per entrambi i servizi dell'applicazione per completare la configurazione di Application Insights per l'applicazione. La stessa risorsa di Application Insights viene usata per entrambi i servizi per visualizzare le richieste in ingresso e in uscita e la comunicazione tra i servizi.

Aggiungere Microsoft.ApplicationInsights.ServiceFabric.Native NuGet ai servizi

Application Insights include due pacchetti NuGet specifici di Service Fabric che è possibile usare a seconda dello scenario. Uno viene usato con i servizi nativi di Service Fabric e l'altro con i contenitori e i file eseguibili guest. In questo caso è stato usato il pacchetto NuGet Microsoft.ApplicationInsights.ServiceFabric.Native per ottenere informazioni sul contesto del servizio. Per altre informazioni su Application Insights SDK e sui pacchetti NuGet specifici di Service Fabric, vedere Microsoft Application Insights per Service Fabric.

Per configurare il pacchetto NuGet:

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione di voto e selezionare Gestisci pacchetti NuGet per la soluzione.

  2. Nella finestra di dialogo NuGet - Soluzione selezionare Sfoglia. Selezionare la casella di controllo Includi versione preliminare.

    Nota

    È possibile che sia necessario installare il pacchetto Microsoft.ServiceFabric.Diagnostics.Internal nello stesso modo se non è stato preinstallato prima dell’installazione del pacchetto di Application Insights.

  3. Cercare Microsoft.ApplicationInsights.ServiceFabric.Nativee quindi selezionare il pacchetto NuGet.

  4. Nel riquadro destro selezionare le caselle di controllo VotingWeb e VotingData. Selezionare Installa.

    Screenshot che mostra Application Insights SDK in NuGet.

  5. Nella finestra di dialogo Anteprima modifiche selezionare OK per accettare la licenza. I pacchetti NuGet vengono aggiunti ai servizi.

  6. A questo punto, è necessario configurare l'inizializzatore dei dati di diagnostica nei due servizi. Aprire VotingWeb.cs e VotingData.cs. Completare i passaggi seguenti in entrambi i file di codice:

    1. Aggiungere queste due istruzioni using all'inizio di ogni file, dopo le istruzioni using esistenti :

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. In entrambi i file, nell’istruzione nidificata return di CreateServiceInstanceListeners() o CreateServiceReplicaListeners(), in ConfigureServices>services, con gli altri servizi singleton dichiarati, aggiungere:

      .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
      

      Questo codice aggiunge Service Context ai dati di diagnostica per consentire all’utente di comprendere meglio l'origine dei dati di diagnostica in Application Insights. L'istruzione nidificata return in VotingWeb.cs ora è simile all'esempio seguente:

      return new WebHostBuilder()
          .UseKestrel()
          .ConfigureServices(
              services => services
                  .AddSingleton<HttpClient>(new HttpClient())
                  .AddSingleton<FabricClient>(new FabricClient())
                  .AddSingleton<StatelessServiceContext>(serviceContext)
                  .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseStartup<Startup>()
          .UseApplicationInsights()
          .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
          .UseUrls(url)
          .Build();
      

In VotingData.cs il codice è ora simile a questo esempio:

return new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<StatefulServiceContext>(serviceContext)
            .AddSingleton<IReliableStateManager>(this.StateManager)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
    .UseUrls(url)
    .Build();

Controllare attentamente che il metodo UseApplicationInsights() venga chiamato in entrambi i file VotingWeb.cs e VotingData.cs come illustrato negli esempi.

Nota

Questa app di esempio usa HTTP per consentire ai servizi di comunicare. Se si sviluppa un'app con Servizio remoto di Service Fabric V2, aggiungere anche le righe seguenti nella stessa posizione nel codice:

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

A questo punto, si è pronti per distribuire l'applicazione. Selezionare Start (o F5). Visual Studio compila e crea pacchetti per l'applicazione, configura il cluster locale e distribuisce l'applicazione nel cluster.

Nota

Se non è installata una versione aggiornata di .NET Core SDK, è possibile che venga generato un errore di compilazione.

Al momento della distribuzione dell’applicazione, passare a localhost:8080, in cui è in esecuzione l'applicazione di voto di esempio a pagina singola. Votare per alcuni elementi diversi di propria scelta per creare alcuni dati e dati di diagnostica di esempio. Ad esempio, dessert.

Screenshot che mostra un esempio di voto per i tipi di dessert.

È anche possibile rimuovere alcune delle opzioni di voto al termine dell'aggiunta di alcuni voti.

Visualizzare i dati di diagnostica e la mappa delle applicazioni in Application Insights

Nel portale di Azure, passare alla risorsa di Application Insights.

Selezionare Panoramica per tornare al riquadro di panoramica della risorsa. Selezionare Cerca per visualizzare le tracce in arrivo. Sono necessari alcuni minuti per visualizzare le tracce in Application Insights. Se non vengono visualizzate tracce, attendere un minuto e quindi selezionare il pulsante Aggiorna .

Scorrere verso il basso nella finestra di ricerca per visualizzare tutti i dati di diagnostica in ingresso inclusi in Application Insights. Per ogni azione eseguita nell'applicazione di voto dovrebbe esserci una richiesta PUT in uscita da VotingWeb (PUT Votes/Put [name]) e una richiesta PUT in ingresso da VotingData (PUT VoteData/Put [name]), seguita da una coppia di richieste GET per l'aggiornamento dei dati visualizzati. Sarà disponibile anche una traccia delle dipendenze per HTTP in localhost perché queste richieste sono richieste HTTP. Di seguito è riportato un esempio di ciò che viene visualizzato per la modalità di aggiunta di un voto:

Screenshot che mostra una traccia di una richiesta di esempio in Application Insights.

È possibile selezionare una traccia per visualizzare altri dettagli. Application Insights include informazioni utili sulla richiesta, inclusi i valori per Tempo di risposta e URL della richiesta. Poiché è stato aggiunto il NuGet specifico di Service Fabric, vengono restituiti anche i dati relativi all'applicazione nel contesto di un cluster di Service Fabric nella sezione Dati personalizzati. Tali dati includono il contesto del servizio, quindi è possibile visualizzare i valori PartitionID e ReplicaId dell'origine della richiesta e localizzare meglio i problemi durante la diagnosi di errori nell'applicazione.

Per passare a Mappa delle applicazioni, selezionare Mappa delle applicazioni nel menu delle risorse nel riquadro Panoramica oppure selezionare l'icona Mappa app. La mappa mostra i due servizi connessi.

Screenshot che evidenzia la mappa delle applicazioni nel menu delle risorse.

Mappa delle applicazioni consente di comprendere meglio la topologia dell'applicazione, soprattutto quando si inizia ad aggiungere servizi che interagiscono tra di loro. Inoltre, offre dati di base sulle percentuali di successo delle richieste e permette di diagnosticare le richieste non riuscite per comprendere dove può essersi verificato un errore. Per altre informazioni, vedere Mappa delle applicazioni in Application Insights.

Aggiungere la strumentazione personalizzata all'applicazione

Anche se Application Insights offre dati di diagnostica predefiniti, è possibile aggiungere strumentazione personalizzata. È possibile che si necessiti di strumentazione personalizzata per esigenze aziendali o si voglia migliorare la diagnostica quando si verificano problemi nell'applicazione. È possibile inserire metriche ed eventi personalizzati usando l'API di Application Insights.

Aggiungere quindi alcuni eventi personalizzati a VoteDataController.cs (in VotingData>Controllers) per tenere traccia dell'aggiunta e dell'eliminazione dei voti dall'oggetto sottostante votesDictionary:

  1. Aggiungere using Microsoft.ApplicationInsights; al termine delle altre istruzioni using.

  2. Dichiarare un nuovo valore per TelemetryClient all'inizio della classe, sotto la creazione di IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.

  3. Nella funzione Put() aggiungere un evento che conferma l'aggiunta di un voto. Aggiungere telemetry.TrackEvent($"Added a vote for {name}"); al termine della transazione, subito prima dell'istruzione return OkResult.

  4. In Delete()è presente un valore "if/else" basato sulla condizione che votesDictionary contiene voti per un'opzione di voto specifica.

    1. Aggiungere un evento che conferma l'eliminazione di un voto nell'istruzione if , dopo await tx.CommitAsync(): telemetry.TrackEvent($"Deleted votes for {name}");
    2. Aggiungere un evento per indicare che l'eliminazione non è stata eseguita nell'istruzione else, prima dell'istruzione return : telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Ecco un esempio dell'aspetto delle funzioni Put() e Delete() dopo l'aggiunta degli eventi:

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

Dopo aver apportato queste modifiche, selezionare Avvia nell'applicazione per compilare e distribuire la versione più recente. Al termine della distribuzione dell'applicazione, passare a localhost:8080. Aggiungere ed eliminare alcune opzioni di voto. Quindi, tornare alla risorsa di Application Insights per visualizzare le tracce dell'esecuzione più recente (la visualizzazione delle tracce in Application Insights può richiedere da 1 a 2 minuti). Per tutti i voti aggiunti ed eliminati, viene ora generalmente visualizzata una voce per l’evento personalizzato con i dati di diagnostica delle risposte associati.

Screenshot che mostra gli eventi personalizzati.