Azure Web Rolünde SignalR performans sayaçlarını kullanma

Tarafından Luke Latham

Uyarı

Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.

SignalR performans sayaçları, azure web rolünde uygulamanızın performansını izlemek için kullanılır. Sayaçlar Microsoft Azure Tanılama tarafından yakalanır. Azure'da SignalR performans sayaçlarını, tek başına veya şirket içi uygulamalar için kullanılan aynı araç olan signalr.exeile yüklersiniz. Azure rolleri geçici olduğundan, başlatma sırasında SignalR performans sayaçlarını yükleyip kaydedecek bir uygulama yapılandırabilirsiniz.

Önkoşullar

SignalR performans sayaçlarını kullanıma sunan bir Azure Web Rolü uygulaması oluşturma

  1. Visual Studio'yu açın.

  2. Visual Studio'da Dosya>Yeni Proje'yi> seçin.

  3. Yeni Proje iletişim kutusunda, soldaki Visual C#>Cloud kategorisini ve ardından Azure Bulut Hizmeti şablonunu seçin. Uygulamaya SignalRPerfCounters adını verin ve Tamam'ı seçin.

    Yeni Bulut Uygulaması

    Not

    Bulut şablonu kategorisini veya Azure Bulut Hizmeti şablonunu görmüyorsanız Visual Studio 2017 için Azure geliştirme iş yükünü yüklemeniz gerekir. Visual Studio Yükleyicisi açmak için Yeni Proje iletişim kutusunun sol alt tarafındaki Visual Studio Yükleyicisi bağlantısını seçin. Azure geliştirme iş yükünü seçin ve ardından değiştir'i seçerek iş yükünü yüklemeye başlayın.

    Visual Studio Yükleyicisi'de Azure geliştirme iş yükü

  4. Yeni Microsoft Azure Bulut Hizmeti iletişim kutusunda ASP.NET Web Rolü'ne> tıklayın ve rolü projeye eklemek için düğmeyi seçin. Tamam’ı seçin.

    ASP.NET Web Rolü Ekle

  5. Yeni ASP.NET Web Uygulaması - WebRole1 iletişim kutusunda MVC şablonunu ve ardından Tamam'ı seçin.

    MVC ve Web API'sini ekleme

  6. Çözüm Gezgini'daWebRole1 altında diagnostics.wadcfgx dosyasını açın.

    Çözüm Gezgini diagnostics.wadcfgx

  7. Dosyanın içeriğini aşağıdaki yapılandırmayla değiştirin ve dosyayı kaydedin:

    <?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. Araçlar>NuGet Paket Yöneticisi'nden Paket YöneticisiKonsolu'nu açın. SignalR'nin en son sürümünü ve SignalR yardımcı programları paketini yüklemek için aşağıdaki komutları girin:

    install-package microsoft.aspnet.signalr
    install-package microsoft.aspnet.signalr.utils
    
  9. Başlatma veya geri dönüşüm sırasında rol örneğine SignalR performans sayaçlarını yüklemek için uygulamayı yapılandırın. Çözüm Gezgini'daWebRole1 projesine sağ tıklayın veYeni Klasör Ekle'yi> seçin. Yeni klasörü Başlangıç olarak adlandırın.

    Başlangıç Klasörü Ekle

  10. signalr.exe dosyasını (Microsoft.AspNet.SignalR.Utils paketiyle birlikte eklenir) proje klasöründen<>/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils dosyasından kopyalayın.<önceki adımda oluşturduğunuz Başlangıç klasörüne sürüm>/araçlar.

  11. Çözüm Gezgini'daBaşlangıç klasörüne sağ tıklayın veVarolan ÖğeYiEkle'yi> seçin. Görüntülenen iletişim kutusunda signalr.exe ve ekle'yi seçin.

    Projeye signalr.exe ekleme

  12. Oluşturduğunuz Başlangıç klasörüne sağ tıklayın. Yeni Öğe Ekle'yi> seçin. Genel düğümünü seçin, Metin Dosyası'nı seçin ve yeni öğeyi SignalRPerfCounterInstall.cmd olarak adlandırın. Bu komut dosyası SignalR performans sayaçlarını web rolüne yükler.

    SignalR performans sayacı yükleme toplu iş dosyası oluşturma

  13. Visual Studio SignalRPerfCounterInstall.cmd dosyasını oluşturduğunda, otomatik olarak ana pencerede açılır. Dosyanın içeriğini aşağıdaki betikle değiştirin, ardından dosyayı kaydedip kapatın. Bu betik signalr.exeyürütür ve bu da SignalR performans sayaçlarını rol örneğine ekler.

    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. Çözüm Gezgini signalr.exedosyasını seçin. Dosyanın Özellikleri'nde, Çıkış Dizinine Kopyala'yıHer Zaman Kopyala olarak ayarlayın.

    Çıkış Dizinine Kopyala'yı Her Zaman Kopyala olarak ayarlayın

  15. SignalRPerfCounterInstall.cmd dosyası için önceki adımı yineleyin.

  16. SignalRPerfCounterInstall.cmd dosyasına sağ tıklayın ve Birlikte Aç'ı seçin. Görüntülenen iletişim kutusunda İkili Düzenleyici'yi ve ardından Tamam'ı seçin.

    İkili Düzenleyici ile aç

  17. İkili düzenleyicide, dosyada önde gelen baytları seçin ve silin. Dosyayı kaydedin ve kapatın.

    Baştaki baytları silme

  18. ServiceDefinition.csdef dosyasını açın ve hizmet başlatıldığında SignalrPerfCounterInstall.cmd dosyasını yürüten bir başlangıç görevi ekleyin:

    <?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. jQuery paket betiğini açın Views/Shared/_Layout.cshtml ve dosyanın sonundan kaldırın.

    <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. Sunucuda yöntemini sürekli olarak çağıran increment bir JavaScript istemcisi ekleyin. İçeriği açın Views/Home/Index.cshtml ve aşağıdaki kodla değiştirin:

    @{
        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. WebRole1 projesinde Hubs adlı yeni bir klasör oluşturun. Çözüm Gezgini'daHubs klasörüne sağ tıklayın veYeni ÖğeEkle'yi> seçin. Yeni Öğe Ekle iletişim kutusunda Web>SignalR kategorisini ve ardından SignalR Hub Sınıfı (v2) öğe şablonunu seçin. Yeni hub'a MyHub.cs adını verin ve Ekle'yi seçin.

    Yeni Öğe Ekle iletişim kutusundaki Hubs klasörüne SignalR Hub Sınıfı ekleme

  22. MyHub.cs otomatik olarak ana pencerede açılır. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:

    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 , SignalR kod tabanıyla sağlanan bir bağlantı yoğunluğu test aracıdır. Krank kalıcı bir bağlantı gerektirdiğinden, test sırasında kullanmak üzere sitenize bir bağlantı eklersiniz. WebRole1 projesine PersistentConnections adlı yeni bir klasör ekleyin. Bu klasöre sağ tıklayın veSınıfEkle'yi> seçin. Yeni sınıf dosyasını MyPersistentConnections.cs olarak adlandırın ve Ekle'yi seçin.

  24. Visual Studio, ana pencerede MyPersistentConnections.cs dosyasını açar. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:

    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. sınıfını Startup kullanarak SignalR nesneleri OWIN başlatıldığında başlar. Startup.cs dosyasını açın veya oluşturun ve içeriğini aşağıdaki kodla değiştirin:

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

    Yukarıdaki kodda özniteliği, OwinStartup OWIN'i başlatmak için bu sınıfı işaretler. yöntemi SignalR'yi Configuration başlatır.

  26. F5 tuşuna basarak uygulamanızı Microsoft Azure Öykünücüsü test edin.

    Not

    MapSignalR'dabir FileLoadException ile karşılaşırsanız, web.config'deki bağlama yeniden yönlendirmelerini aşağıdaki şekilde değiştirin:

    <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. Bir dakika kadar bekleyin. Visual Studio'da Bulut Gezgini araç penceresini açın (Bulut Gezgini'niGörüntüle>) ve yolunu (Local)/Storage Accounts/(Development)/Tablesgenişletin. WADPerformanceCountersTable'a çift tıklayın. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Bulut Gezgini'nde tabloyu görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.

    Visual Studio Bulut Gezgini'nde WAD Performans Sayaçları Tablosunu Seçme

    WAD Performans Sayaçları Tablosunda toplanan sayaçları gösterme

  28. Uygulamanızı bulutta test etmek için ServiceConfiguration.Cloud.cscfg dosyasını güncelleştirin ve öğesini geçerli bir Azure Depolama hesabı bağlantı dizesi olarak ayarlayın Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString .

    <?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. Uygulamayı Azure aboneliğinize dağıtın. Bir uygulamayı Azure'a dağıtma hakkında ayrıntılı bilgi için bkz. Bulut Hizmeti Oluşturma ve Dağıtma.

  30. Birkaç dakika bekleyin. Bulut Gezgini'nde yukarıda yapılandırdığınız depolama hesabını bulun ve içindeki tabloyu bulunWADPerformanceCountersTable. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Bulut Gezgini'nde tabloyu görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.

Bu öğreticide kullanılan orijinal içerik için Martin Richard'a özel teşekkürler.