Condividi tramite


Uso dei contatori delle prestazioni di SignalR in un ruolo Web di Azure

Di Luke Latham

Avviso

Questa documentazione non è per la versione più recente di SignalR. Esaminare ASP.NET Core SignalR.

I contatori delle prestazioni di SignalR vengono usati per monitorare le prestazioni dell'app in un ruolo Web di Azure. I contatori vengono acquisiti da Microsoft Diagnostica di Azure. I contatori delle prestazioni di SignalR vengono installati in Azure con signalr.exe, lo stesso strumento usato per le app autonome o locali. Poiché i ruoli di Azure sono temporanei, si configura un'app per installare e registrare i contatori delle prestazioni di SignalR all'avvio.

Prerequisiti

Creazione di un'applicazione ruolo Web di Azure che espone i contatori delle prestazioni di SignalR

  1. Aprire Visual Studio.

  2. In Visual Studio selezionare File>Nuovo>Progetto.

  3. Nella finestra di dialogo Nuovo progetto selezionare la categoria Visual C#>Cloud a sinistra e quindi selezionare il modello Servizio cloud di Azure. Assegnare all'app il nome SignalRPerfCounters e selezionare OK.

    Nuova applicazione cloud

    Nota

    Se non viene visualizzata la categoria modello Cloud o il modello di Servizio cloud di Azure, è necessario installare il carico di lavoro Sviluppo di Azure per Visual Studio 2017. Scegliere il collegamento Apri Programma di installazione di Visual Studio sul lato inferiore sinistro della finestra di dialogo Nuovo progetto per aprire Programma di installazione di Visual Studio. Selezionare il carico di lavoro Sviluppo di Azure e quindi scegliere Modifica per avviare l'installazione del carico di lavoro.

    Carico di lavoro sviluppo di Azure in Programma di installazione di Visual Studio

  4. Nella finestra di dialogo Nuovo servizio cloud di Microsoft Azure selezionare ASP.NET ruolo Web e selezionare il > pulsante per aggiungere il ruolo al progetto. Seleziona OK.

    Aggiungere ASP.NET ruolo Web

  5. Nella finestra di dialogo Nuova applicazione Web ASP.NET - WebRole1 selezionare il modello MVC e quindi selezionare OK.

    Aggiungere MVC e API Web

  6. In Esplora soluzioni aprire il file diagnostics.wadcfgx in WebRole1.

    Esplora soluzioni diagnostics.wadcfgx

  7. Sostituire il contenuto del file con la configurazione seguente e salvare il file:

    <?xml version="1.0" encoding="utf-8"?>
    <DiagnosticsConfiguration xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
      <PublicConfig>
        <WadCfg>
          <DiagnosticMonitorConfiguration overallQuotaInMB="4096">
            <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter="Error" />
            <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Error" />
            <Directories scheduledTransferPeriod="PT1M">
              <IISLogs containerName ="wad-iis-logfiles" />
              <FailedRequestLogs containerName ="wad-failedrequestlogs" />
            </Directories>
            <WindowsEventLog scheduledTransferPeriod="PT1M">
              <DataSource name="Application!*[System[(Level=1 or Level=2 or Level=3)]]" />
              <DataSource name="Windows Azure!*[System[(Level=1 or Level=2 or Level=3 or Level=4)]]" />
            </WindowsEventLog>
            <CrashDumps containerName="wad-crashdumps" dumpType="Mini">
              <CrashDumpConfiguration processName="WaIISHost.exe" />
              <CrashDumpConfiguration processName="WaWorkerHost.exe" />
              <CrashDumpConfiguration processName="w3wp.exe" />
            </CrashDumps>
            <PerformanceCounters scheduledTransferPeriod="PT1M">
              <PerformanceCounterConfiguration counterSpecifier="\Memory\Available MBytes" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\ISAPI Extension Requests/sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\Bytes Total/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Requests/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Errors Total/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Queued" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Rejected" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\% Time in GC" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Exceptions(w3wp)\# of Exceps Thrown / sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current logical Threads" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current physical Threads" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Current Queue Length" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Contention Rate / sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# Bytes in all Heaps" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# GC Handles" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# of Pinned Objects" sampleRate="PT10S" />
    
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Connected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Reconnected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Disconnected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Message Bus Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Allocated Workers" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Busy Workers" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Topics Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Tranport Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Transport/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Open" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Buffering" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Send Queue Length" sampleRate="PT10S" />
            </PerformanceCounters>
          </DiagnosticMonitorConfiguration>
        </WadCfg>
        <StorageAccount></StorageAccount>
      </PublicConfig>
      <PrivateConfig>
        <StorageAccount name="" key="" endpoint="" />
      </PrivateConfig>
      <IsEnabled>true</IsEnabled>
    </DiagnosticsConfiguration>
    
  8. Aprire la console di Gestione pacchetti da Strumenti>Gestione pacchetti NuGet. Immettere i comandi seguenti per installare la versione più recente di SignalR e il pacchetto di utilità SignalR:

    install-package microsoft.aspnet.signalr
    install-package microsoft.aspnet.signalr.utils
    
  9. Configurare l'app per installare i contatori delle prestazioni di SignalR nell'istanza del ruolo all'avvio o al riciclo. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto WebRole1 e scegliere Aggiungi>nuova cartella. Denominare la nuova cartella Startup.

    Aggiungi cartella di avvio

  10. Copiare il file signalr.exe (aggiunto con il pacchetto Microsoft.AspNet.SignalR.Utils ) dalla <cartella> del progetto/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<versione>/strumenti per la cartella di avvio creata nel passaggio precedente.

  11. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla cartella Avvio e scegliere Aggiungi>elemento esistente. Nella finestra di dialogo visualizzata selezionare signalr.exe e selezionare Aggiungi.

    Aggiungere signalr.exe al progetto

  12. Fare clic con il pulsante destro del mouse sulla cartella Startup creata. Scegliere Aggiungi>Nuovo elemento. Selezionare il nodo Generale , selezionare File di testo e denominare il nuovo elemento SignalRPerfCounterInstall.cmd. Questo file di comando installerà i contatori delle prestazioni di SignalR nel ruolo Web.

    Creare un file batch di installazione del contatore delle prestazioni di SignalR

  13. Quando Visual Studio crea il file SignalRPerfCounterInstall.cmd , verrà aperto automaticamente nella finestra principale. Sostituire il contenuto del file con lo script seguente, quindi salvare e chiudere il file. Questo script esegue signalr.exe, che aggiunge i contatori delle prestazioni signalR all'istanza del ruolo.

    SET SignalR_LogDir=%~dp0Log\
    MKDIR "%SignalR_LogDir%"
    cd %~dp0
    signalr.exe ipc >> "%SignalR_LogDir%SignalR_Log.txt" 2>&1
    net localgroup "Performance Monitor Users" "Network Service" /ADD >> "%SignalR_LogDir%NetworkAdd.txt" 2>&1
    
  14. Selezionare il file signalr.exe in Esplora soluzioni. Nelle proprietà del file impostare Copia su Directory di output su Copia sempre.

    Impostare Copia nella directory di output su Copia sempre

  15. Ripetere il passaggio precedente per il file SignalRPerfCounterInstall.cmd .

  16. Fare clic con il pulsante destro del mouse sul file SignalRPerfCounterInstall.cmd e scegliere Apri con. Nella finestra di dialogo visualizzata selezionare Editor binario e selezionare OK.

    Apri con l'editor binario

  17. Nell'editor binario selezionare i byte iniziali nel file ed eliminarli. Salva e chiudi il file.

    Eliminare i byte iniziali

  18. Aprire ServiceDefinition.csdef e aggiungere un'attività di avvio che esegue il file SignalrPerfCounterInstall.cmd all'avvio del servizio:

    <?xml version="1.0" encoding="utf-8"?>
    <ServiceDefinition name="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
      <WebRole name="WebRole1" vmsize="Small">
        <Startup>
          <Task commandLine="Startup\SignalRPerfCounterInstall.cmd" executionContext="elevated" taskType="background" />
        </Startup>
        <Sites>
          <Site name="Web">
            <Bindings>
              <Binding name="Endpoint1" endpointName="Endpoint1" />
            </Bindings>
          </Site>
        </Sites>
        <Endpoints>
          <InputEndpoint name="Endpoint1" protocol="http" port="80" />
        </Endpoints>
      </WebRole>
    </ServiceDefinition>
    
  19. Aprire Views/Shared/_Layout.cshtml e rimuovere lo script bundle jQuery dalla fine del file.

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    </body>
    </html>
    
  20. Aggiungere un client JavaScript che chiama continuamente il increment metodo nel server. Aprire Views/Home/Index.cshtml e sostituire il contenuto con il codice seguente:

    @{
        ViewBag.Title = "Home Page";
    }
    
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="~/signalr/hubs" type="text/javascript"></script>
    
    <div id="body">
        <section class="featured">
            <div class="content-wrapper">
                <p>
                    Hello World!
                </p>
                <div style="font-size:large;">
                    My Counter: <span id="counter"></span>
                </div>
            </div>
        </section>
        <section class="content-wrapper main-content clear-fix"></section>
    </div>
    
    <script type="text/javascript">
      $(document).ready(function () {
        var hub = $.connection.myHub;
    
        hub.client.sendResult = function (x) {
          console.log('sendResult(' + x + ')');
          $("#counter").text(x);
          window.setTimeout(function () {
            hub.server.increment(x);
          }, 1000);
        };
    
        $.connection.hub.connected = function () {};
        $.connection.hub.disconnected = function () {};
    
        $.connection.hub.stateChanged(function (change) {
          console.log('new State' + change.newState);
          if (change.newState === $.signalR.connectionState.disconnected) {
            $.connection.hub.start();
          }
          if (change.newState === $.signalR.connectionState.reconnecting) {
            console.log('Re-connecting');
          } else if (change.newState === $.signalR.connectionState.connected) {
            console.log('The server is online');
          }
        });
    
        $.connection.hub.error(function (error) {
          console.log('error ' + error);
        });
        
        $.connection.hub.logging = true;
        
        $.connection.hub.reconnected(function () {
          console.log('Reconnected');
          hub.server.increment(0);
        });
    
        $.connection.hub.start().done(function () {
          console.log('hub started');
          hub.server.increment(0);
        });
      });
    </script>
    
  21. Creare una nuova cartella nel progetto WebRole1 denominato Hubs. Fare clic con il pulsante destro del mouse sulla cartella Hubs in Esplora soluzioni e scegliere Aggiungi>nuovo elemento. Nella finestra di dialogo Aggiungi nuovo elemento selezionare la categoria Web>SignalR e quindi selezionare il modello di elemento Classe hub SignalR (v2). Assegnare al nuovo hub il nome MyHub.cs e selezionare Aggiungi.

    Aggiunta della classe hub SignalR alla cartella Hubs nella finestra di dialogo Aggiungi nuovo elemento

  22. MyHub.cs verrà aperto automaticamente nella finestra principale. Sostituire il contenuto con il codice seguente, quindi salvare e chiudere il file:

    using System.Threading.Tasks;
    using Microsoft.AspNet.SignalR;
    
    namespace WebRole1.Hubs
    {
        public class MyHub : Hub
        {
            public async Task Increment(int x)
            {
                await this.Clients.Caller.sendResult(x + 1);
            }
        }
    }
    
  23. Crank.exe è uno strumento di test della densità di connessione fornito con la codebase SignalR. Poiché Crank richiede una connessione permanente, è necessario aggiungerne uno al sito per l'uso durante il test. Aggiungere una nuova cartella al progetto WebRole1 denominato PersistentConnections. Fare clic con il pulsante destro del mouse su questa cartella e scegliere Aggiungi>classe. Assegnare al nuovo file di classe il nome MyPersistentConnections.cs e selezionare Aggiungi.

  24. Visual Studio aprirà il file MyPersistentConnections.cs nella finestra principale. Sostituire il contenuto con il codice seguente, quindi salvare e chiudere il file:

    using System.Threading.Tasks;
    using Microsoft.AspNet.SignalR;
    using Microsoft.AspNet.SignalR.Infrastructure;
    
    namespace WebRole1.PersistentConnections
    {
        public class MyPersistentConnection : PersistentConnection
        {
            protected override Task OnReceived(IRequest request, string connectionId, string data)
            {
                //Return data to calling user
                return Connection.Send(connectionId, data);        
            }
        }
    }
    
  25. Usando la Startup classe , gli oggetti SignalR iniziano all'avvio di OWIN. Aprire o creare Startup.cs e sostituire il contenuto con il codice seguente:

    using Microsoft.Owin;
    using Owin;
    using WebRole1.PersistentConnections;
    
    // Marks this class for automatic OWIN startup
    [assembly: OwinStartup(typeof(WebRole1.Startup))]
    namespace WebRole1
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                ConfigureAuth(app);
                // Only needed if "No Authentication" was not selected for the project
                app.MapSignalR();
                app.MapSignalR<MyPersistentConnection>("/echo");
            }
        }
    }
    

    Nel codice precedente, l'attributo OwinStartup contrassegna questa classe per avviare OWIN. Il Configuration metodo avvia SignalR.

  26. Testare l'applicazione nel emulatore di Microsoft Azure premendo F5.

    Nota

    Se si verifica un'eccezione FileLoadException in MapSignalR, modificare il reindirizzamento dell'associazione in web.config nel modo seguente:

    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    
  27. Attendere circa un minuto. Aprire la finestra degli strumenti di Cloud Explorer in Visual Studio (Visualizza>Cloud Explorer) ed espandere il percorso .(Local)/Storage Accounts/(Development)/Tables Fare doppio clic su WADPerformanceCountersTable. I contatori SignalR verranno visualizzati nei dati della tabella. Se la tabella non viene visualizzata, potrebbe essere necessario immettere nuovamente le credenziali di Archiviazione di Azure. Potrebbe essere necessario selezionare il pulsante Aggiorna per visualizzare la tabella in Cloud Explorer oppure selezionare il pulsante Aggiorna nella finestra della tabella aperta per visualizzare i dati nella tabella.

    Selezione della tabella dei contatori delle prestazioni WAD in Visual Studio Cloud Explorer

    Visualizzazione dei contatori raccolti nella tabella dei contatori delle prestazioni WAD

  28. Per testare l'applicazione nel cloud, aggiornare il file ServiceConfiguration.Cloud.cscfg e impostare su Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString un account Archiviazione di Azure valido stringa di connessione.

    <?xml version="1.0" encoding="utf-8"?>
    <ServiceConfiguration serviceName="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2015-04.2.6">
      <Role name="WebRole1">
        <Instances count="1" />
        <ConfigurationSettings>
          <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=&lt;account-name&gt;;AccountKey=&lt;account-key&gt;" />
        </ConfigurationSettings>
      </Role>
    </ServiceConfiguration>
    
  29. Distribuire l'applicazione nella sottoscrizione di Azure. Per informazioni dettagliate su come distribuire un'applicazione in Azure, vedere Come creare e distribuire un servizio cloud.

  30. Attendere qualche minuto. In Cloud Explorer individuare l'account di archiviazione configurato in precedenza e trovarla WADPerformanceCountersTable . I contatori SignalR verranno visualizzati nei dati della tabella. Se la tabella non viene visualizzata, potrebbe essere necessario immettere nuovamente le credenziali di Archiviazione di Azure. Potrebbe essere necessario selezionare il pulsante Aggiorna per visualizzare la tabella in Cloud Explorer oppure selezionare il pulsante Aggiorna nella finestra della tabella aperta per visualizzare i dati nella tabella.

Grazie speciale a Martin Richard per il contenuto originale usato in questa esercitazione.