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

Autor : Luke Latham

Upozornění

Tato dokumentace není určená pro nejnovější verzi služby 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 microsoftem Azure Diagnostics. Čítače výkonu SignalR nainstalujete do Azure pomocí nástrojesignalr.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 vlevo kategorii Visual C#>Cloud a pak vyberte šablonu Cloudová služba Azure . Pojmenujte aplikaci SignalRPerfCounters a vyberte OK.

    Nová cloudová aplikace

    Poznámka

    Pokud nevidíte kategorii šablony Cloud nebo šablonu cloudové služby Azure , musíte nainstalovat úlohu Vývoj 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 spustila instalace úlohy.

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

  4. V dialogovém okně Nová cloudová služba Microsoft Azure vyberte ASP.NET Webová role 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>Správce balíčků NuGet. Zadáním následujících příkazů nainstalujte nejnovější verzi služby SignalR a balíček nástrojů signalr:

    install-package microsoft.aspnet.signalr
    install-package microsoft.aspnet.signalr.utils
    
  9. Nakonfigurujte aplikaci tak, aby do instance role při spuštění nebo recyklaci nainstalovala čítače výkonu Služby SignalR. 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 souborsignalr.exe (přidaný pomocí balíčku Microsoft.AspNet.SignalR.Utils ) ze <složky> projektu/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools 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 složku Po spuštění 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 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 služby SignalR do webové role.

    Vytvoření instalační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 služby 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. Vyberte souborsignalr.exe v Průzkumník řešení. Ve vlastnostech souboru nastavte kopírovat do výstupního adresáře na Kopírovat vždy.

    Nastavení možnosti Kopírovat do výstupního adresáře na kopírovat vždy

  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 programu. 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 počáteční bajty v souboru a odstraňte je. Uložte soubor a zavřete ho.

    Odstranit počáteční bajty

  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 skript sady jQuery a odeberte ho z konce 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ý nepřetržitě volá metodu increment na serveru. Otevřete Views/Home/Index.cshtml obsah a nahraďte ho 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. V projektu WebRole1 vytvořte novou složku 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 SignalR Hub Class (v2). Pojmenujte nové centrum MyHub.cs 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. Soubor 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 lokality pro použití při testování. Přidejte do projektu WebRole1 novou složku s názvem PersistentConnections. Klikněte pravým tlačítkem 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 Při použití třídy se objekty SignalR spustí při spuštění OWIN. Otevřete nebo vytvořte soubor Startup.cs a nahraďte jeho 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čuje tuto třídu pro spuštění OWIN. Metoda Configuration spustí SignalR.

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

    Poznámka

    Pokud narazíte na FileLoadException v MapSignalR, změňte přesměrování vazby v 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čkej asi minutu. Otevřete okno nástroje Průzkumník cloudu v sadě Visual Studio (zobrazit>Průzkumníka cloudu) a rozbalte cestu (Local)/Storage Accounts/(Development)/Tables. Dvakrát klikněte na WADPerformanceCountersTable. V tabulkových datech byste měli vidět čítače SignalR. Pokud tabulku nevidíte, možná budete muset znovu zadat přihlašovací údaje služby Azure Storage. Možná budete muset vybrat tlačítko Aktualizovat , aby se tabulka zobrazila v Průzkumníku cloudu , nebo vybrat tlačítko Aktualizovat v otevřeném okně tabulky, aby se data v tabulce zobrazila.

    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ý připojovací řetězec účtu Azure Storage.

    <?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 nasazení aplikace 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, WADPerformanceCountersTable a najděte v něm tabulku. V tabulkových datech byste měli vidět čítače SignalR. Pokud tabulku nevidíte, možná budete muset znovu zadat přihlašovací údaje služby Azure Storage. Možná budete muset vybrat tlačítko Aktualizovat , aby se tabulka zobrazila v Průzkumníku cloudu , nebo vybrat tlačítko Aktualizovat v otevřeném okně tabulky, aby se data v tabulce zobrazila.

Zvláštní poděkování patří Martinu Richardu za původní obsah použitý v tomto kurzu.