Condividi tramite


Esercitazione: Monitorare e diagnosticare un'applicazione di Service Fabric usando Application Insights

Questa esercitazione è la terza parte di una serie. Illustra i passaggi per configurare il monitoraggio e la diagnostica per un'applicazione ASP.NET Core in esecuzione in un cluster di Azure Service Fabric usando Application Insights. I dati di telemetria vengono 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 telemetria e la mappa delle applicazioni in Application Insights
  • Aggiungere la strumentazione personalizzata all'applicazione

La serie di esercitazioni illustra come:

Prerequisiti

Prima di iniziare questa esercitazione:

Scaricare l'applicazione di voto di esempio

Se non è stata compilata l'applicazione di esempio Voting nella prima parte di questa serie di esercitazioni, è possibile scaricarla. In una finestra di comando o in un terminale eseguire il comando seguente per clonare il repository di 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, passare alla portale di Azure. Selezionare Crea una risorsa. Nel menu del portale selezionare Monitoraggio e diagnostica. Nella colonna Servizi di Azure più diffusi in Application Insights selezionare 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. Per Tipo di applicazione lasciare ASP.NET'applicazione Web.

Screenshot che mostra gli attributi delle risorse 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 Open>Project/Solution (Apri progetto/soluzione)>e passare all'applicazione Voting (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 scegliere Aggiungi> Connessione ed Services>Monitoring 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, potrebbe essere necessario selezionare Aggiungi e quindi selezionare Application Insights Telemetry(Telemetria di Application Insights).

  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 alla risorsa 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 nell'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 contenitori ed eseguibili guest. In questo caso viene usato il pacchetto NuGet Microsoft.ApplicationInsights.ServiceFabric.Native per 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 su Soluzione 'Voting' 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

    Potrebbe essere necessario installare il pacchetto Microsoft.ServiceFabric.Diagnostics.Internal nello stesso modo se non è stato preinstallato prima di installare il pacchetto di Application Insights.

  3. Cercare Microsoft.ApplicationInsights.ServiceFabric.Native e quindi selezionare il pacchetto NuGet.

  4. Nel riquadro destro selezionare la casella di controllo VotingWeb e la casella di controllo 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. Configurare quindi l'inizializzatore di telemetria nei due servizi. Aprire VotingWeb.cs e VotingData.cs. Completare i passaggi seguenti in entrambi i file di codice:

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

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

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

      Questo codice aggiunge Service Context ai dati di telemetria, in modo da comprendere meglio l'origine dei dati di telemetria 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();

Verificare che il UseApplicationInsights() metodo venga chiamato sia in VotingWeb.cs che in VotingData.cs come illustrato negli esempi.

Nota

Questa app di esempio usa HTTP per i servizi da comunicare. Se si sviluppa un'app usando Service Fabric Service Remoting 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 l'applicazione, configura il cluster locale e distribuisce l'applicazione nel cluster.

Nota

È possibile che venga visualizzato un errore di compilazione se non è installata una versione aggiornata di .NET Core SDK.

Quando l'applicazione viene distribuita, passare a localhost:8080, in cui è in esecuzione l'applicazione Voting Sample a pagina singola. Votare per alcuni elementi diversi a scelta per creare alcuni dati di esempio e dati di telemetria. 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 telemetria e la mappa delle applicazioni in Application Insights

Nella portale di Azure passare alla risorsa di Application Insights.

Selezionare Panoramica per tornare al riquadro 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 .

Screenshot che mostra la visualizzazione tracce di Application Insights.

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

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

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

Screenshot che mostra i dettagli della traccia di Application Insights.

Per passare a Mappa applicazioni, selezionare Mappa 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.

Mapping delle applicazioni consente di comprendere meglio la topologia dell'applicazione, soprattutto quando si inizia ad aggiungere servizi che interagiscono. Fornisce anche dati di base sulla frequenza di esito positivo delle richieste e consente di diagnosticare la richiesta non riuscita per capire dove si sono verificato problemi. Per altre informazioni, vedere Mappa delle applicazioni in Application Insights.

Aggiungere la strumentazione personalizzata all'applicazione

Anche se Application Insights offre dati di telemetria predefiniti, è possibile aggiungere strumentazione personalizzata. È possibile che si disponga di esigenze aziendali per la strumentazione personalizzata 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; alla fine delle altre using istruzioni.

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

  3. Put() Nella funzione aggiungere un evento che conferma l'aggiunta di un voto. Aggiungere telemetry.TrackEvent($"Added a vote for {name}"); dopo il completamento 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");

Di seguito è riportato un esempio dell'aspetto delle Put() funzioni 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 in modo che venga compilata e distribuita la versione più recente. Al termine della distribuzione dell'applicazione, passare a localhost:8080. Aggiungere ed eliminare alcune opzioni di voto. Tornare quindi alla risorsa di Application Insights per visualizzare le tracce per l'esecuzione più recente (le tracce richiedono da 1 a 2 minuti per essere visualizzate in Application Insights). Per tutti i voti aggiunti ed eliminati, dovrebbe ora essere visualizzata una voce per l'evento personalizzato con i dati di telemetria di risposta associati.

Screenshot che mostra eventi personalizzati.