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
- Visual Studio 2015 nebo 2017
- Microsoft Azure SDK pro Visual Studio Poznámka: Po instalaci sady SDK restartujte počítač.
- Předplatné Microsoft Azure: Pokud si chcete zaregistrovat bezplatný zkušební účet Azure, podívejte se na bezplatnou zkušební verzi Azure.
Vytvoření aplikace webové role Azure, která zveřejňuje čítače výkonu SignalR
Otevřete sadu Visual Studio.
V sadě Visual Studio vyberte Soubor>nový>projekt.
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.
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.
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.
V dialogovém okně Nová webová aplikace ASP.NET – WebRole1 vyberte šablonu MVC a pak vyberte OK.
V Průzkumník řešení otevřete soubor diagnostics.wadcfgx v části WebRole1.
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>
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
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í.
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.
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.
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.
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
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.
Opakujte předchozí krok pro soubor SignalRPerfCounterInstall.cmd .
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.
V binárním editoru vyberte všechny úvodní bajty v souboru a odstraňte je. Soubor uložte a zavřete.
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>
Otevřete
Views/Shared/_Layout.cshtml
a odeberte skript sady jQuery na konci souboru.<div class="container body-content"> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - My ASP.NET Application</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
Přidejte javascriptového klienta, který průběžně volá metodu
increment
na serveru. OtevřeteViews/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>
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.
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); } } }
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.
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); } } }
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. MetodaConfiguration
spustí SignalR.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>
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.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=<account-name>;AccountKey=<account-key>" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
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.
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.