Použití čítačů výkonu SignalR ve webové roli Azure

Autor: Luke Latham

Upozorňující

Tato dokumentace není určená pro nejnovější verzi SignalR. Podívejte se na ASP.NET Core SignalR.

Čítače výkonu SignalR se používají k monitorování výkonu vaší aplikace ve webové roli Azure. Čítače jsou zachyceny diagnostikou Microsoft Azure. Čítače výkonu SignalR nainstalujete v Azure pomocí signalr.exe, který se používá pro samostatné nebo místní aplikace. Vzhledem k tomu, že role Azure jsou přechodné, nakonfigurujete aplikaci tak, aby při spuštění nainstalovala a zaregistrovala čítače výkonu SignalR.

Požadavky

Vytvoření aplikace webové role Azure, která zveřejňuje čítače výkonu SignalR

  1. Otevřete sadu Visual Studio.

  2. V sadě Visual Studio vyberte Soubor>nový>projekt.

  3. V dialogovém okně Nový projekt vyberte na levé straně kategorii Visual C#>Cloud a pak vyberte šablonu cloudové služby Azure. Pojmenujte aplikaci SignalRPerfCounters a vyberte OK.

    Nová cloudová aplikace

    Poznámka:

    Pokud nevidíte kategorii Šablony cloudu nebo šablonu cloudové služby Azure, musíte nainstalovat úlohu vývoje pro Azure pro Visual Studio 2017. Kliknutím na odkaz Otevřít Instalační program pro Visual Studio v levém dolním rohu dialogového okna Nový projekt otevřete Instalační program pro Visual Studio. Vyberte úlohu vývoj pro Azure a pak zvolte Upravit, aby se úloha začala instalovat.

    Úloha vývoje pro Azure v Instalační program pro Visual Studio

  4. V dialogovém okně Nová cloudová služba Microsoft Azure vyberte ASP.NET webovou roli a výběrem > tlačítka přidejte roli do projektu. Vyberte OK.

    Přidání webové role ASP.NET

  5. V dialogovém okně Nová webová aplikace ASP.NET – WebRole1 vyberte šablonu MVC a pak vyberte OK.

    Přidání MVC a webového rozhraní API

  6. V Průzkumník řešení otevřete soubor diagnostics.wadcfgx v části WebRole1.

    Průzkumník řešení diagnostics.wadcfgx

  7. Obsah souboru nahraďte následující konfigurací a soubor uložte:

    <?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. Otevřete konzolu Správce balíčků z >nástroje NuGet Správce balíčků. Zadáním následujících příkazů nainstalujte nejnovější verzi signalR a balíček nástrojů SignalR:

    install-package microsoft.aspnet.signalr
    install-package microsoft.aspnet.signalr.utils
    
  9. Nakonfigurujte aplikaci tak, aby při spuštění nebo recyklaci nainstalovala čítače výkonu SignalR do instance role. V Průzkumník řešení klikněte pravým tlačítkem na projekt WebRole1 a vyberte Přidat>novou složku. Pojmenujte novou složku Po spuštění.

    Přidat spouštěcí složku

  10. Zkopírujte soubor signalr.exe (přidaný pomocí balíčku Microsoft.AspNet.SignalR.Utils) ze <složky> projektu/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<verze>/nástroje do složky Po spuštění, kterou jste vytvořili v předchozím kroku.

  11. V Průzkumník řešení klikněte pravým tlačítkem na spouštěcí složku a vyberte Přidat>existující položku. V zobrazeném dialogovém okně vyberte signalr.exe a vyberte Přidat.

    Přidání signalr.exe do projektu

  12. Klikněte pravým tlačítkem myši na složku Po spuštění , kterou jste vytvořili. Vyberte Přidat>novou položku. Vyberte uzel Obecné, vyberte Textový soubor a pojmenujte novou položku SignalRPerfCounterInstall.cmd. Tento soubor příkazu nainstaluje čítače výkonu SignalR do webové role.

    Vytvoření dávkového souboru čítače výkonu SignalR

  13. Když Visual Studio vytvoří soubor SignalRPerfCounterInstall.cmd , otevře se automaticky v hlavním okně. Obsah souboru nahraďte následujícím skriptem a pak soubor uložte a zavřete. Tento skript spustí signalr.exe, který do instance role přidá čítače výkonu SignalR.

    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. V Průzkumník řešení vyberte soubor signalr.exe. Ve vlastnostech souboru nastavte možnost Kopírovat do výstupního adresáře tak, aby se vždy kopírovat.

    Nastavit možnost Kopírovat do výstupního adresáře tak, aby se vždy kopírovat

  15. Opakujte předchozí krok pro soubor SignalRPerfCounterInstall.cmd .

  16. Klikněte pravým tlačítkem na soubor SignalRPerfCounterInstall.cmd a vyberte Otevřít v aplikaci. V dialogovém okně, které se zobrazí, vyberte Binární editor a vyberte OK.

    Otevřít v binárním editoru

  17. V binárním editoru vyberte všechny úvodní bajty v souboru a odstraňte je. Soubor uložte a zavřete.

    Odstranění úvodních bajtů

  18. Otevřete ServiceDefinition.csdef a přidejte spouštěcí úlohu, která při spuštění služby spustí soubor SignalrPerfCounterInstall.cmd :

    <?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. Otevřete Views/Shared/_Layout.cshtml a odeberte skript sady jQuery na konci souboru.

    <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. Přidejte javascriptového klienta, který průběžně volá metodu increment na serveru. Otevřete Views/Home/Index.cshtml a nahraďte obsah následujícím kódem:

    @{
        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. Vytvořte novou složku v projektu WebRole1 s názvem Hubs. Klikněte pravým tlačítkem na složku Hubs v Průzkumník řešení a vyberte Přidat>novou položku. V dialogovém okně Přidat novou položku vyberte kategorii Web>SignalR a pak vyberte šablonu položky třídy centra SignalR (v2). Pojmenujte nový MyHub.cs centra a vyberte Přidat.

    Přidání třídy centra SignalR do složky Hubs v dialogovém okně Přidat novou položku

  22. MyHub.cs se automaticky otevře v hlavním okně. Nahraďte obsah následujícím kódem a pak soubor uložte a zavřete:

    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 je nástroj pro testování hustoty připojení, který je součástí základu kódu SignalR. Vzhledem k tomu, že Crank vyžaduje trvalé připojení, přidáte ho do svého webu pro použití při testování. Přidejte novou složku do projektu WebRole1 s názvem PersistentConnections. Klikněte pravým tlačítkem myši na tuto složku a vyberte Přidat>třídu. Pojmenujte nový soubor třídy MyPersistentConnections.cs a vyberte Přidat.

  24. Visual Studio otevře soubor MyPersistentConnections.cs v hlavním okně. Nahraďte obsah následujícím kódem a pak soubor uložte a zavřete:

    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. Startup Pomocí třídy se objekty SignalR spustí při spuštění OWIN. Otevřete nebo vytvořte Startup.cs a nahraďte obsah následujícím kódem:

    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");
            }
        }
    }
    

    Ve výše uvedeném OwinStartup kódu atribut označí tuto třídu pro spuštění OWIN. Metoda Configuration spustí SignalR.

  26. Otestujte aplikaci v emulátoru Microsoft Azure stisknutím klávesy F5.

    Poznámka:

    Pokud narazíte na FileLoadException v MapSignalR, změňte vazby přesměrování ve web.config na následující:

    <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. Počkejte asi minutu. Otevřete okno nástroje Průzkumník cloudu v sadě Visual Studio (Zobrazení>Průzkumníka cloudu) a rozbalte cestu .(Local)/Storage Accounts/(Development)/Tables Poklikejte na WADPerformanceCountersTable. V datech tabulky byste měli vidět čítače signalR. Pokud tabulku nevidíte, možná budete muset znovu zadat přihlašovací údaje pro Azure Storage. Možná budete muset vybrat tlačítko Aktualizovat , aby se zobrazila tabulka v Průzkumníku cloudu, nebo v otevřeném okně tabulky vyberte tlačítko Aktualizovat , abyste viděli data v tabulce.

    Výběr tabulky čítačů výkonu WAD v Průzkumníku cloudu sady Visual Studio

    Zobrazení čítačů shromážděných v tabulce čítačů výkonu WAD

  28. Pokud chcete otestovat aplikaci v cloudu, aktualizujte soubor ServiceConfiguration.Cloud.cscfg a nastavte Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString na platný účet služby Azure Storage připojovací řetězec.

    <?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. Nasaďte aplikaci do svého předplatného Azure. Podrobnosti o tom, jak nasadit aplikaci do Azure, najdete v tématu Vytvoření a nasazení cloudové služby.

  30. Počkejte několik minut. V Průzkumníku cloudu vyhledejte účet úložiště, který jste nakonfigurovali výše, a vyhledejte WADPerformanceCountersTable v ní tabulku. V datech tabulky byste měli vidět čítače signalR. Pokud tabulku nevidíte, možná budete muset znovu zadat přihlašovací údaje pro Azure Storage. Možná budete muset vybrat tlačítko Aktualizovat , aby se zobrazila tabulka v Průzkumníku cloudu, nebo v otevřeném okně tabulky vyberte tlačítko Aktualizovat , abyste viděli data v tabulce.

Zvláštní díky Martinu Richardu za původní obsah použitý v tomto kurzu.