Utilisation de compteurs de performances SignalR dans un rôle web Azure
Par Luke Latham
Avertissement
Cette documentation ne concerne pas la dernière version de SignalR. Examinez ASP.NET Core SignalR.
Les compteurs de performances SignalR sont utilisés pour surveiller les performances de votre application dans un rôle web Azure. Les compteurs sont capturés par Microsoft Diagnostics Azure. Vous installez des compteurs de performances SignalR sur Azure avec signalr.exe, le même outil utilisé pour les applications autonomes ou locales. Étant donné que les rôles Azure sont temporaires, vous configurez une application pour installer et inscrire des compteurs de performances SignalR au démarrage.
Prérequis
- Visual Studio 2015 ou 2017
- Remarque du Kit de développement logiciel (SDK) Microsoft Azure pour Visual Studio : Redémarrez votre machine après l’installation du Kit de développement logiciel (SDK).
- Abonnement Microsoft Azure : Pour vous inscrire à un compte d’essai Azure gratuit, consultez La version d’évaluation gratuite d’Azure.
Création d’une application de rôle web Azure qui expose les compteurs de performances SignalR
Ouvrez Visual Studio.
Dans Visual Studio, sélectionnez Fichier>Nouveau>Projet.
Dans la boîte de dialogue Nouveau projet, sélectionnez la catégorie Visual C#>Cloud sur la gauche, puis sélectionnez le modèle Azure Cloud Service. Nommez l’application SignalRPerfCounters , puis sélectionnez OK.
Remarque
Si vous ne voyez pas la catégorie de modèle cloud ou le modèle Azure Cloud Service , vous devez installer la charge de travail de développement Azure pour Visual Studio 2017. Choisissez le lien Ouvrir Visual Studio Installer en bas à gauche de la boîte de dialogue Nouveau projet pour ouvrir Visual Studio Installer. Sélectionnez la charge de travail de développement Azure, puis choisissez Modifier pour démarrer l’installation de la charge de travail.
Dans la boîte de dialogue Nouveau service cloud Microsoft Azure, sélectionnez ASP.NET rôle web, puis sélectionnez le > bouton pour ajouter le rôle au projet. Cliquez sur OK.
Dans la boîte de dialogue New ASP.NET Web Application - WebRole1 , sélectionnez le modèle MVC , puis sélectionnez OK.
Dans Explorateur de solutions, ouvrez le fichier diagnostics.wadcfgx sous WebRole1.
Remplacez le contenu du fichier par la configuration suivante et enregistrez le fichier :
<?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>
Ouvrez la console Gestionnaire de package à partir des outils>NuGet Gestionnaire de package. Entrez les commandes suivantes pour installer la dernière version de SignalR et le package d’utilitaires SignalR :
install-package microsoft.aspnet.signalr install-package microsoft.aspnet.signalr.utils
Configurez l’application pour installer les compteurs de performances SignalR dans l’instance de rôle lorsqu’elle démarre ou recycle. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet WebRole1 et sélectionnez Ajouter>un nouveau dossier. Nommez le nouveau dossier Démarrage.
Copiez le fichier signalr.exe (ajouté avec le package Microsoft.AspNet.SignalR.Utils ) à partir du <dossier> de projet/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<version>/outils dans le dossier démarrage que vous avez créé à l’étape précédente.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le dossier De démarrage, puis sélectionnez Ajouter>un élément existant. Dans la boîte de dialogue qui s’affiche, sélectionnez signalr.exe et sélectionnez Ajouter.
Cliquez avec le bouton droit sur le dossier de démarrage que vous avez créé. Sélectionnez Ajouter>Nouvel élément. Sélectionnez le nœud Général , sélectionnez Fichier texte et nommez le nouvel élément SignalRPerfCounterInstall.cmd. Ce fichier de commande installe les compteurs de performances SignalR dans le rôle web.
Lorsque Visual Studio crée le fichier SignalRPerfCounterInstall.cmd , il s’ouvre automatiquement dans la fenêtre principale. Remplacez le contenu du fichier par le script suivant, puis enregistrez et fermez le fichier. Ce script exécute signalr.exe, ce qui ajoute les compteurs de performances SignalR à l’instance de rôle.
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
Sélectionnez le fichier signalr.exe dans Explorateur de solutions. Dans les propriétés du fichier, définissez Copier dans le répertoire de sortie pour Toujours copier.
Répétez l’étape précédente pour le fichier SignalRPerfCounterInstall.cmd .
Cliquez avec le bouton droit sur le fichier SignalRPerfCounterInstall.cmd , puis sélectionnez Ouvrir avec. Dans la boîte de dialogue qui s’affiche, sélectionnez Éditeur binaire, puis OK.
Dans l’éditeur binaire, sélectionnez les octets de début dans le fichier et supprimez-les. Enregistrez et fermez le fichier.
Ouvrez ServiceDefinition.csdef et ajoutez une tâche de démarrage qui exécute le fichier SignalrPerfCounterInstall.cmd au démarrage du service :
<?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>
Ouvrez
Views/Shared/_Layout.cshtml
et supprimez le script de bundle jQuery à partir de la fin du fichier.<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>
Ajoutez un client JavaScript qui appelle en permanence la
increment
méthode sur le serveur. Ouvrez et remplacezViews/Home/Index.cshtml
le contenu par le code suivant :@{ 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>
Créez un dossier dans le projet WebRole1 nommé Hubs. Cliquez avec le bouton droit sur le dossier Hubs dans Explorateur de solutions, puis sélectionnez Ajouter>un nouvel élément. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez la catégorie Web>SignalR, puis sélectionnez le modèle d’élément SignalR Hub Class (v2). Nommez le nouveau hub MyHub.cs , puis sélectionnez Ajouter.
MyHub.cs s’ouvre automatiquement dans la fenêtre principale. Remplacez le contenu par le code suivant, puis enregistrez et fermez le fichier :
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 est un outil de test de densité de connexion fourni avec la base de code SignalR. Étant donné que Crank nécessite une connexion persistante, vous en ajoutez un à votre site pour une utilisation lors du test. Ajoutez un nouveau dossier au projet WebRole1 appelé PersistentConnections. Cliquez avec le bouton droit sur ce dossier, puis sélectionnez Ajouter une>classe. Nommez le nouveau fichier de classe MyPersistentConnections.cs , puis sélectionnez Ajouter.
Visual Studio ouvre le fichier MyPersistentConnections.cs dans la fenêtre principale. Remplacez le contenu par le code suivant, puis enregistrez et fermez le fichier :
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); } } }
À l’aide de la
Startup
classe, les objets SignalR démarrent au démarrage d’OWIN. Ouvrez ou créez Startup.cs et remplacez le contenu par le code suivant :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"); } } }
Dans le code ci-dessus, l’attribut
OwinStartup
marque cette classe pour démarrer OWIN. LaConfiguration
méthode démarre SignalR.Testez votre application dans l’émulateur Microsoft Azure en appuyant sur F5.
Remarque
Si vous rencontrez une fileLoadException sur MapSignalR, modifiez les redirections de liaison dans web.config en procédant comme suit :
<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>
Attendez environ une minute. Ouvrez la fenêtre de l’outil Cloud Explorer dans Visual Studio (Afficher>Cloud Explorer) et développez le chemin d’accès.
(Local)/Storage Accounts/(Development)/Tables
Double-cliquez sur WADPerformanceCountersTable. Vous devez voir les compteurs SignalR dans les données de la table. Si vous ne voyez pas la table, vous devrez peut-être entrer à nouveau vos informations d’identification Stockage Azure. Vous devrez peut-être sélectionner le bouton Actualiser pour afficher la table dans Cloud Explorer ou sélectionner le bouton Actualiser dans la fenêtre ouvrir la table pour afficher les données de la table.Pour tester votre application dans le cloud, mettez à jour le fichier ServiceConfiguration.Cloud.cscfg et définissez-le
Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString
sur un compte de Stockage Azure valide chaîne de connexion.<?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>
Déployez l’application sur votre abonnement Azure. Pour plus d’informations sur le déploiement d’une application sur Azure, consultez Comment créer et déployer un service cloud.
Patientez quelques minutes. Dans Cloud Explorer, recherchez le compte de stockage que vous avez configuré ci-dessus et recherchez la
WADPerformanceCountersTable
table dans celle-ci. Vous devez voir les compteurs SignalR dans les données de la table. Si vous ne voyez pas la table, vous devrez peut-être entrer à nouveau vos informations d’identification Stockage Azure. Vous devrez peut-être sélectionner le bouton Actualiser pour afficher la table dans Cloud Explorer ou sélectionner le bouton Actualiser dans la fenêtre ouvrir la table pour afficher les données de la table.
Merci particulièrement à Martin Richard pour le contenu original utilisé dans ce tutoriel.