From 865627a2e04918c640043a7cedb17c1be7216ce0 Mon Sep 17 00:00:00 2001 From: Gutemberg Ribeiro Date: Tue, 6 Sep 2016 23:35:03 -0300 Subject: [PATCH 1/7] Moved Performance Counters to its own Telemetry Consumer --- ....OrleansTelemetryConsumers.Counters.nuspec | 27 +++ src/Orleans.sln | 8 + src/Orleans/Properties/AssemblyInfo.cs | 1 + src/OrleansCounterControl/CounterControl.cs | 16 +- .../OrleansCounterControl.csproj | 6 +- .../Counters/CounterConfigData.cs | 108 +++++++++ ...ersStatistics.cs => CountersStatistics.cs} | 40 +--- .../Counters/OrleansCounterManager.cs | 102 ++++++++ .../Counters/OrleansPerfCounterManager.cs | 166 ------------- .../Counters/SiloStatisticsManager.cs | 12 +- src/OrleansRuntime/OrleansRuntime.csproj | 9 +- src/OrleansRuntime/Properties/AssemblyInfo.cs | 1 + .../OrleansPerformanceCounterInstaller.cs | 9 +- .../OrleansTelemetryConsumers.Counters.csproj | 72 ++++++ .../PerfCounterConfigData.cs | 7 +- .../PerfCounterTelemetryConsumer.cs | 224 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 19 ++ 17 files changed, 599 insertions(+), 228 deletions(-) create mode 100644 src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec create mode 100644 src/OrleansRuntime/Counters/CounterConfigData.cs rename src/OrleansRuntime/Counters/{PerfCountersStatistics.cs => CountersStatistics.cs} (70%) create mode 100644 src/OrleansRuntime/Counters/OrleansCounterManager.cs delete mode 100644 src/OrleansRuntime/Counters/OrleansPerfCounterManager.cs rename src/{OrleansRuntime/Counters => OrleansTelemetryConsumers.Counters}/OrleansPerformanceCounterInstaller.cs (85%) create mode 100644 src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj rename src/{OrleansRuntime/Counters => OrleansTelemetryConsumers.Counters}/PerfCounterConfigData.cs (98%) create mode 100644 src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs create mode 100644 src/OrleansTelemetryConsumers.Counters/Properties/AssemblyInfo.cs diff --git a/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec b/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec new file mode 100644 index 0000000000..10bd19babf --- /dev/null +++ b/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec @@ -0,0 +1,27 @@ + + + + Microsoft.Orleans.OrleansTelemetryConsumers.Counters + $version$ + Microsoft Orleans Telemetry Consumer - Performance Counters + Microsoft Research + Microsoft,Orleans + https://github.com/dotnet/Orleans + https://github.com/dotnet/Orleans#license + https://raw.githubusercontent.com/dotnet/orleans/gh-pages/assets/logo_128.png + + Microsoft Orleans Telemetry Consumer for Windows Performance Counters + + + Windows Performance Counters implementation of Orleans Telemetry API. + + Copyright Microsoft 2015 + Orleans Cloud-Computing Actor-Model Actors Distributed-Systems C# .NET + + + + + + + + diff --git a/src/Orleans.sln b/src/Orleans.sln index 4570732e6e..7730fe0148 100644 --- a/src/Orleans.sln +++ b/src/Orleans.sln @@ -75,6 +75,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Nuget", "Nuget", "{014CD19F NuGet\Microsoft.Orleans.OrleansRuntime.nuspec = NuGet\Microsoft.Orleans.OrleansRuntime.nuspec NuGet\Microsoft.Orleans.OrleansServiceBus.nuspec = NuGet\Microsoft.Orleans.OrleansServiceBus.nuspec NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.AI.nuspec = NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.AI.nuspec + NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec = NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.NewRelic.nuspec = NuGet\Microsoft.Orleans.OrleansTelemetryConsumers.NewRelic.nuspec NuGet\Microsoft.Orleans.OrleansZooKeeperUtils.nuspec = NuGet\Microsoft.Orleans.OrleansZooKeeperUtils.nuspec NuGet\Microsoft.Orleans.Serialization.Bond.nuspec = NuGet\Microsoft.Orleans.Serialization.Bond.nuspec @@ -187,6 +188,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrleansPSUtils", "OrleansPS EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrleansAWSUtils", "OrleansAWSUtils\OrleansAWSUtils.csproj", "{67738E6C-F292-46A2-994D-5B52E745205B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrleansTelemetryConsumers.Counters", "OrleansTelemetryConsumers.Counters\OrleansTelemetryConsumers.Counters.csproj", "{69F40A37-4A2F-44D4-A994-CC165C12FB91}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{24596567-5805-4493-B4F0-46BA4811C0AA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrleansBenchmarkGrainInterfaces", "..\test\Benchmarks\OrleansBenchmarkGrainInterfaces\OrleansBenchmarkGrainInterfaces.csproj", "{936397DF-8D11-4244-A493-767D31F9D727}" @@ -329,6 +332,10 @@ Global {67738E6C-F292-46A2-994D-5B52E745205B}.Debug|Any CPU.Build.0 = Debug|Any CPU {67738E6C-F292-46A2-994D-5B52E745205B}.Release|Any CPU.ActiveCfg = Release|Any CPU {67738E6C-F292-46A2-994D-5B52E745205B}.Release|Any CPU.Build.0 = Release|Any CPU + {69F40A37-4A2F-44D4-A994-CC165C12FB91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69F40A37-4A2F-44D4-A994-CC165C12FB91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69F40A37-4A2F-44D4-A994-CC165C12FB91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69F40A37-4A2F-44D4-A994-CC165C12FB91}.Release|Any CPU.Build.0 = Release|Any CPU {936397DF-8D11-4244-A493-767D31F9D727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {936397DF-8D11-4244-A493-767D31F9D727}.Debug|Any CPU.Build.0 = Debug|Any CPU {936397DF-8D11-4244-A493-767D31F9D727}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -380,6 +387,7 @@ Global {F3C3FA92-FC69-4B94-8914-3B70E624B5B5} = {4CD3AA9E-D937-48CA-BB6C-158E12257D23} {6AD37425-7CB4-4D23-80C3-A9D143329A66} = {F3C3FA92-FC69-4B94-8914-3B70E624B5B5} {67738E6C-F292-46A2-994D-5B52E745205B} = {F3C3FA92-FC69-4B94-8914-3B70E624B5B5} + {69F40A37-4A2F-44D4-A994-CC165C12FB91} = {F3C3FA92-FC69-4B94-8914-3B70E624B5B5} {24596567-5805-4493-B4F0-46BA4811C0AA} = {01F3CC7E-F996-411E-AFD6-72673A826549} {936397DF-8D11-4244-A493-767D31F9D727} = {24596567-5805-4493-B4F0-46BA4811C0AA} {071CB148-EAA3-4F85-A1F7-52D1B7FDAF82} = {24596567-5805-4493-B4F0-46BA4811C0AA} diff --git a/src/Orleans/Properties/AssemblyInfo.cs b/src/Orleans/Properties/AssemblyInfo.cs index 0de6c874d1..76295bf974 100644 --- a/src/Orleans/Properties/AssemblyInfo.cs +++ b/src/Orleans/Properties/AssemblyInfo.cs @@ -20,6 +20,7 @@ [assembly: InternalsVisibleTo("ClientGenerator")] [assembly: InternalsVisibleTo("OrleansCounterControl")] +[assembly: InternalsVisibleTo("OrleansTelemetryConsumers.Counters")] [assembly: InternalsVisibleTo("OrleansCodeGenerator")] [assembly: InternalsVisibleTo("OrleansRuntime")] [assembly: InternalsVisibleTo("OrleansHost")] diff --git a/src/OrleansCounterControl/CounterControl.cs b/src/OrleansCounterControl/CounterControl.cs index c0078c4237..5e293de2af 100644 --- a/src/OrleansCounterControl/CounterControl.cs +++ b/src/OrleansCounterControl/CounterControl.cs @@ -5,13 +5,14 @@ using System.Security.Principal; using Orleans.Runtime; using Orleans.Runtime.Configuration; -using Orleans.Runtime.Counters; namespace Orleans.Counter.Control { using System.Collections.Generic; using Orleans.Serialization; + using OrleansTelemetryConsumers.Counters; + /// /// Control Orleans Counters - Register or Unregister the Orleans counter set /// @@ -23,12 +24,15 @@ internal class CounterControl public bool IsRunningAsAdministrator { get; private set; } public bool PauseAtEnd { get; private set; } + private static PerfCounterTelemetryConsumer perfCounterConsumer; + public CounterControl() { // Check user is Administrator and has granted UAC elevation permission to run this app var userIdent = WindowsIdentity.GetCurrent(); var userPrincipal = new WindowsPrincipal(userIdent); IsRunningAsAdministrator = userPrincipal.IsInRole(WindowsBuiltInRole.Administrator); + perfCounterConsumer = new PerfCounterTelemetryConsumer(true); } public void PrintUsage() @@ -158,7 +162,7 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) { try { - if (OrleansPerfCounterManager.AreWindowsPerfCountersAvailable()) + if (PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) { if (!useBruteForce) { @@ -177,9 +181,9 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) GrainTypeManager.Instance.Start(false); } // Register perf counters - OrleansPerfCounterManager.InstallCounters(); + perfCounterConsumer.InstallCounters(); - if (OrleansPerfCounterManager.AreWindowsPerfCountersAvailable()) + if (PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) ConsoleText.WriteStatus("Orleans counters registered successfully"); else ConsoleText.WriteError("Orleans counters are NOT registered"); @@ -198,7 +202,7 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) /// Note: Program needs to be running as Administrator to be able to unregister Windows perf counters. private static void UnregisterWindowsPerfCounters(bool useBruteForce) { - if (!OrleansPerfCounterManager.AreWindowsPerfCountersAvailable()) + if (!PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) { ConsoleText.WriteStatus("Orleans counters are already unregistered"); return; @@ -207,7 +211,7 @@ private static void UnregisterWindowsPerfCounters(bool useBruteForce) // Delete any old perf counters try { - OrleansPerfCounterManager.DeleteCounters(); + perfCounterConsumer.DeleteCounters(); } catch (Exception exc) { diff --git a/src/OrleansCounterControl/OrleansCounterControl.csproj b/src/OrleansCounterControl/OrleansCounterControl.csproj index 63ebd32775..c7a1ab435f 100644 --- a/src/OrleansCounterControl/OrleansCounterControl.csproj +++ b/src/OrleansCounterControl/OrleansCounterControl.csproj @@ -62,9 +62,13 @@ - {6FF2004C-CDF8-479C-BF27-C6BFE8EF93E0} + {6ff2004c-cdf8-479c-bf27-c6bfe8ef93e0} OrleansRuntime + + {69f40a37-4a2f-44d4-a994-cc165c12fb91} + OrleansTelemetryConsumers.Counters + {BC1BD60C-E7D8-4452-A21C-290AEC8E2E74} Orleans diff --git a/src/OrleansRuntime/Counters/CounterConfigData.cs b/src/OrleansRuntime/Counters/CounterConfigData.cs new file mode 100644 index 0000000000..43e095ec83 --- /dev/null +++ b/src/OrleansRuntime/Counters/CounterConfigData.cs @@ -0,0 +1,108 @@ +namespace Orleans.Runtime.Counters +{ + internal class CounterConfigData + { + public StatisticName Name; + public bool UseDeltaValue; + internal ICounter CounterStat; + + // TODO: Move this list to some kind of config file + internal static readonly CounterConfigData[] StaticCounters = + { + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_COLLECTION_NUMBER_OF_COLLECTIONS, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_COLLECTION}, + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DEACTIVATE_ON_IDLE}, + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DIRECT_SHUTDOWN}, + new CounterConfigData {Name = StatisticNames.DIRECTORY_CACHE_SIZE}, + new CounterConfigData {Name = StatisticNames.DIRECTORY_LOOKUPS_FULL_ISSUED, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.DIRECTORY_LOOKUPS_LOCAL_ISSUED, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.DIRECTORY_LOOKUPS_LOCAL_SUCCESSES, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.DIRECTORY_PARTITION_SIZE}, + new CounterConfigData {Name = StatisticNames.GATEWAY_CONNECTED_CLIENTS}, + new CounterConfigData {Name = StatisticNames.GATEWAY_LOAD_SHEDDING, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.GATEWAY_RECEIVED, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.MEMBERSHIP_ACTIVE_CLUSTER_SIZE}, + new CounterConfigData {Name = StatisticNames.MESSAGING_SENT_BYTES_TOTAL, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.MESSAGING_SENT_MESSAGES_TOTAL, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.MESSAGING_SENT_LOCALMESSAGES, UseDeltaValue = true}, + + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + Message.Directions.OneWay.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + Message.Directions.Request.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + Message.Directions.Response.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + Message.Directions.OneWay.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + Message.Directions.Request.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + Message.Directions.Response.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + Message.Directions.OneWay.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + Message.Directions.Request.ToString()), + UseDeltaValue = true + }, + new CounterConfigData + { + Name = + new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + Message.Directions.Response.ToString()), + UseDeltaValue = true + }, + new CounterConfigData {Name = StatisticNames.MESSAGE_CENTER_RECEIVE_QUEUE_LENGTH}, + new CounterConfigData {Name = StatisticNames.MESSAGE_CENTER_SEND_QUEUE_LENGTH}, + new CounterConfigData {Name = StatisticNames.SCHEDULER_PENDINGWORKITEMS}, + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_COUNT}, + new CounterConfigData {Name = StatisticNames.CATALOG_ACTIVATION_DUPLICATE_ACTIVATIONS}, + new CounterConfigData {Name = StatisticNames.RUNTIME_GC_TOTALMEMORYKB}, + new CounterConfigData {Name = StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_WORKERTHREADS}, + new CounterConfigData {Name = StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_COMPLETIONPORTTHREADS}, + new CounterConfigData {Name = StatisticNames.STORAGE_READ_TOTAL, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.STORAGE_WRITE_TOTAL, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.STORAGE_ACTIVATE_TOTAL, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.STORAGE_READ_ERRORS, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.STORAGE_WRITE_ERRORS, UseDeltaValue = true}, + new CounterConfigData {Name = StatisticNames.AZURE_SERVER_BUSY, UseDeltaValue = true}, + }; + } +} diff --git a/src/OrleansRuntime/Counters/PerfCountersStatistics.cs b/src/OrleansRuntime/Counters/CountersStatistics.cs similarity index 70% rename from src/OrleansRuntime/Counters/PerfCountersStatistics.cs rename to src/OrleansRuntime/Counters/CountersStatistics.cs index 252fd828a4..dec0c8a1dc 100644 --- a/src/OrleansRuntime/Counters/PerfCountersStatistics.cs +++ b/src/OrleansRuntime/Counters/CountersStatistics.cs @@ -7,7 +7,7 @@ namespace Orleans.Runtime.Counters /// Updates to counters needs to be very fast, so are all in-memory operations. /// This class then follows up to periodically write the counter values to OS /// - internal class PerfCountersStatistics + internal class CountersStatistics { private static readonly Logger logger = LogManager.GetLogger("WindowsPerfCountersStatistics", LoggerType.Runtime); @@ -25,51 +25,21 @@ internal class PerfCountersStatistics /// Initialize the counter publisher framework. Start the background stats writer thread. /// /// Frequency of writing to Windows perf counters - public PerfCountersStatistics(TimeSpan writeInterval) + public CountersStatistics(TimeSpan writeInterval) { if (writeInterval <= TimeSpan.Zero) throw new ArgumentException("Creating CounterStatsPublisher with negative or zero writeInterval", "writeInterval"); PerfCountersWriteInterval = writeInterval; } - - /// - /// Prepare for stats collection - /// - private void Prepare() - { - if (Environment.OSVersion.ToString().StartsWith("unix", StringComparison.InvariantCultureIgnoreCase)) - { - logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters are only available on Windows :) -- defaulting to in-memory counters."); - shouldWritePerfCounters = false; - return; - } - - if (!OrleansPerfCounterManager.AreWindowsPerfCountersAvailable()) - { - logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters not found -- defaulting to in-memory counters. " + ExplainHowToCreateOrleansPerfCounters); - shouldWritePerfCounters = false; - return; - } - - try - { - OrleansPerfCounterManager.PrecreateCounters(); - } - catch(Exception exc) - { - logger.Warn(ErrorCode.PerfCounterFailedToInitialize, "Failed to initialize perf counters -- defaulting to in-memory counters. " + ExplainHowToCreateOrleansPerfCounters, exc); - shouldWritePerfCounters = false; - } - } - + /// /// Start stats collection /// public void Start() { logger.Info(ErrorCode.PerfCounterStarting, "Starting Windows perf counter stats collection with frequency={0}", PerfCountersWriteInterval); - Prepare(); + // Start the timer timer = new SafeTimer(TimerTick, null, PerfCountersWriteInterval, PerfCountersWriteInterval); } @@ -95,7 +65,7 @@ private void TimerTick(object state) if (shouldWritePerfCounters) { // Write counters to Windows perf counters - int numErrors = OrleansPerfCounterManager.WriteCounters(); + int numErrors = OrleansCounterManager.WriteCounters(); if (numErrors > 0) { diff --git a/src/OrleansRuntime/Counters/OrleansCounterManager.cs b/src/OrleansRuntime/Counters/OrleansCounterManager.cs new file mode 100644 index 0000000000..32eafebb17 --- /dev/null +++ b/src/OrleansRuntime/Counters/OrleansCounterManager.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; + +namespace Orleans.Runtime.Counters +{ + internal static class OrleansCounterManager + { + private static readonly Logger logger = LogManager.GetLogger("OrleansPerfCounterManager", LoggerType.Runtime); + //private static readonly List> counterNames = new List>(); + + //public static void PrecreateCounters() + //{ + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_COLLECTION_NUMBER_OF_COLLECTIONS, true)); + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_COLLECTION, false)); + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DEACTIVATE_ON_IDLE, false)); + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DIRECT_SHUTDOWN, false)); + // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_CACHE_SIZE, false)); + // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_FULL_ISSUED, true)); + // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_LOCAL_ISSUED, true)); + // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_LOCAL_SUCCESSES, true)); + // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_PARTITION_SIZE, false)); + // counterNames.Add(new Tuple(StatisticNames.GATEWAY_CONNECTED_CLIENTS, false)); + // counterNames.Add(new Tuple(StatisticNames.GATEWAY_LOAD_SHEDDING, true)); + // counterNames.Add(new Tuple(StatisticNames.GATEWAY_RECEIVED, true)); + // counterNames.Add(new Tuple(StatisticNames.MEMBERSHIP_ACTIVE_CLUSTER_SIZE, false)); + // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_BYTES_TOTAL, true)); + // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_MESSAGES_TOTAL, true)); + // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_LOCALMESSAGES, true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + // Message.Directions.OneWay.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + // Message.Directions.Request.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, + // Message.Directions.Response.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + // Message.Directions.OneWay.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + // Message.Directions.Request.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, + // Message.Directions.Response.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + // Message.Directions.OneWay.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + // Message.Directions.Request.ToString()), true)); + // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, + // Message.Directions.Response.ToString()), true)); + // counterNames.Add(new Tuple(StatisticNames.MESSAGE_CENTER_RECEIVE_QUEUE_LENGTH, false)); + // counterNames.Add(new Tuple(StatisticNames.MESSAGE_CENTER_SEND_QUEUE_LENGTH, false)); + // counterNames.Add(new Tuple(StatisticNames.SCHEDULER_PENDINGWORKITEMS, false)); + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_COUNT, false)); + // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_DUPLICATE_ACTIVATIONS, false)); + // counterNames.Add(new Tuple(StatisticNames.RUNTIME_GC_TOTALMEMORYKB, false)); + // counterNames.Add(new Tuple(StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_WORKERTHREADS, false)); + // counterNames.Add(new Tuple(StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_COMPLETIONPORTTHREADS, false)); + // counterNames.Add(new Tuple(StatisticNames.STORAGE_READ_TOTAL, true)); + // counterNames.Add(new Tuple(StatisticNames.STORAGE_WRITE_TOTAL, true)); + // counterNames.Add(new Tuple(StatisticNames.STORAGE_ACTIVATE_TOTAL, true)); + // counterNames.Add(new Tuple(StatisticNames.STORAGE_READ_ERRORS, true)); + // counterNames.Add(new Tuple(StatisticNames.STORAGE_WRITE_ERRORS, true)); + // counterNames.Add(new Tuple(StatisticNames.AZURE_SERVER_BUSY, true)); + //} + + public static int WriteCounters() + { + if (logger.IsVerbose) logger.Verbose("Writing Windows perf counters."); + + int numWriteErrors = 0; + + foreach (CounterConfigData cd in CounterConfigData.StaticCounters) + { + StatisticName name = cd.Name; + string perfCounterName = GetPerfCounterName(cd); + + try + { + if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing perf counter {0}", perfCounterName); + + if (cd.CounterStat == null) + { + if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterRegistering, "Searching for statistic {0}", name); + ICounter ctr = IntValueStatistic.Find(name); + cd.CounterStat = ctr ?? CounterStatistic.FindOrCreate(name); + } + + if (cd.CounterStat != null) + logger.TrackMetric(perfCounterName, cd.CounterStat.GetCurrentValue()); + } + catch (Exception ex) + { + numWriteErrors++; + logger.Error(ErrorCode.PerfCounterUnableToWrite, string.Format("Unable to write to Windows perf counter '{0}'", name), ex); + } + } + return numWriteErrors; + } + + private static string GetPerfCounterName(CounterConfigData cd) + { + return cd.Name.Name + "." + (cd.UseDeltaValue ? "Delta" : "Current"); + } + } +} diff --git a/src/OrleansRuntime/Counters/OrleansPerfCounterManager.cs b/src/OrleansRuntime/Counters/OrleansPerfCounterManager.cs deleted file mode 100644 index f7108f364e..0000000000 --- a/src/OrleansRuntime/Counters/OrleansPerfCounterManager.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Orleans.Runtime.Counters -{ - internal static class OrleansPerfCounterManager - { - internal const string CATEGORY_NAME = "OrleansRuntime"; - internal const string CATEGORY_DESCRIPTION = "Orleans Runtime Counters"; - - private static readonly Logger logger = LogManager.GetLogger("OrleansPerfCounterManager", LoggerType.Runtime); - private static readonly List perfCounterData = new List(); - - - /// - /// Have the perf counters we will use previously been registered with Windows? - /// - /// true if Windows perf counters are registered and available for Orleans - public static bool AreWindowsPerfCountersAvailable() - { - try - { - return PerformanceCounterCategory.Exists(CATEGORY_NAME); - } - catch (Exception exc) - { - logger.Warn(ErrorCode.PerfCounterCategoryCheckError, - string.Format("Ignoring error checking for {0} perf counter category", CATEGORY_NAME), exc); - } - return false; - } - - public static void PrecreateCounters() - { - GetCounterData(); - - foreach (var cd in perfCounterData) - { - var perfCounterName = GetPerfCounterName(cd); - cd.PerfCounter = CreatePerfCounter(perfCounterName); - } - } - - internal static void GetCounterData() - { - perfCounterData.Clear(); - - // (1) Start with list of static counters - perfCounterData.AddRange(PerfCounterConfigData.StaticPerfCounters); - - // (2) Then search for grain DLLs and pre-create activation counters for any grain types found - var loadedGrainClasses = GrainTypeManager.Instance.GrainClassTypeData; - foreach (var grainClass in loadedGrainClasses) - { - var counterName = new StatisticName(StatisticNames.GRAIN_COUNTS_PER_GRAIN, grainClass.Key); - perfCounterData.Add(new PerfCounterConfigData - { - Name = counterName, - UseDeltaValue = false, - CounterStat = CounterStatistic.FindOrCreate(counterName, false), - }); - } - } - - internal static CounterCreationData[] GetCounterCreationData() - { - GetCounterData(); - var ctrCreationData = new List(); - foreach (PerfCounterConfigData cd in perfCounterData) - { - var perfCounterName = GetPerfCounterName(cd); - var description = cd.Name.Name; - - var msg = string.Format("Registering perf counter {0}", perfCounterName); - Console.WriteLine(msg); - - ctrCreationData.Add(new CounterCreationData(perfCounterName, description, PerformanceCounterType.NumberOfItems32)); - } - return ctrCreationData.ToArray(); - } - - internal static PerformanceCounter CreatePerfCounter(string perfCounterName) - { - logger.Verbose(ErrorCode.PerfCounterRegistering, "Creating perf counter {0}", perfCounterName); - return new PerformanceCounter(CATEGORY_NAME, perfCounterName, false); - } - - /// - /// Register Orleans perf counters with Windows - /// - /// Note: Program needs to be running as Administrator to be able to delete Windows perf counters. - public static void InstallCounters() - { - var collection = new CounterCreationDataCollection(); - collection.AddRange(GetCounterCreationData()); - - PerformanceCounterCategory.Create( - CATEGORY_NAME, - CATEGORY_DESCRIPTION, - PerformanceCounterCategoryType.SingleInstance, - collection); - } - - /// - /// Delete any existing perf counters registered with Windows - /// - /// Note: Program needs to be running as Administrator to be able to delete Windows perf counters. - public static void DeleteCounters() - { - PerformanceCounterCategory.Delete(CATEGORY_NAME); - } - - public static int WriteCounters() - { - if(logger.IsVerbose) logger.Verbose("Writing Windows perf counters."); - - int numWriteErrors = 0; - - foreach (PerfCounterConfigData cd in perfCounterData) - { - StatisticName name = cd.Name; - string perfCounterName = GetPerfCounterName(cd); - - try - { - if (cd.PerfCounter == null) - { - if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterUnableToConnect, "No perf counter found for {0}", name); - cd.PerfCounter = CreatePerfCounter(perfCounterName); - } - - if (cd.CounterStat == null) - { - if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterRegistering, "Searching for statistic {0}", name); - ICounter ctr = IntValueStatistic.Find(name); - cd.CounterStat = ctr ?? CounterStatistic.FindOrCreate(name); - } - - long val; - //if (cd.UseDeltaValue) - //{ - // ((CounterStatistic)cd.CounterStat).GetCurrentValueAndDeltaAndResetDelta(out val); - //} - //else - { - val = cd.CounterStat.GetCurrentValue(); - } - if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing perf counter {0} Value={1}", perfCounterName, val); - cd.PerfCounter.RawValue = val; - } - catch (Exception ex) - { - numWriteErrors++; - logger.Error(ErrorCode.PerfCounterUnableToWrite, string.Format("Unable to write to Windows perf counter '{0}'", name), ex); - } - } - return numWriteErrors; - } - - private static string GetPerfCounterName(PerfCounterConfigData cd) - { - return cd.Name.Name + "." + (cd.UseDeltaValue ? "Delta" : "Current"); - } - } -} diff --git a/src/OrleansRuntime/Counters/SiloStatisticsManager.cs b/src/OrleansRuntime/Counters/SiloStatisticsManager.cs index 40b1413ea6..899b9cd1a6 100644 --- a/src/OrleansRuntime/Counters/SiloStatisticsManager.cs +++ b/src/OrleansRuntime/Counters/SiloStatisticsManager.cs @@ -8,7 +8,7 @@ internal class SiloStatisticsManager { private LogStatistics logStatistics; private RuntimeStatisticsGroup runtimeStats; - private PerfCountersStatistics perfCountersPublisher; + private CountersStatistics countersPublisher; internal SiloPerformanceMetrics MetricsTable; private readonly Logger logger = LogManager.GetLogger("SiloStatisticsManager"); @@ -23,7 +23,7 @@ internal SiloStatisticsManager(GlobalConfiguration globalConfig, NodeConfigurati runtimeStats = new RuntimeStatisticsGroup(); logStatistics = new LogStatistics(nodeConfig.StatisticsLogWriteInterval, true); MetricsTable = new SiloPerformanceMetrics(runtimeStats, nodeConfig); - perfCountersPublisher = new PerfCountersStatistics(nodeConfig.StatisticsPerfCountersWriteInterval); + countersPublisher = new CountersStatistics(nodeConfig.StatisticsPerfCountersWriteInterval); } internal async Task SetSiloMetricsTableDataManager(Silo silo, NodeConfiguration nodeConfig) @@ -114,7 +114,7 @@ private static bool ShouldUseExternalMetricsProvider( internal void Start(NodeConfiguration config) { - perfCountersPublisher.Start(); + countersPublisher.Start(); logStatistics.Start(); runtimeStats.Start(); // Start performance metrics publisher @@ -129,9 +129,9 @@ internal void Stop() if (MetricsTable != null) MetricsTable.Dispose(); MetricsTable = null; - if (perfCountersPublisher != null) - perfCountersPublisher.Stop(); - perfCountersPublisher = null; + if (countersPublisher != null) + countersPublisher.Stop(); + countersPublisher = null; if (logStatistics != null) { logStatistics.Stop(); diff --git a/src/OrleansRuntime/OrleansRuntime.csproj b/src/OrleansRuntime/OrleansRuntime.csproj index 6bb1e4e767..ed89d632e3 100644 --- a/src/OrleansRuntime/OrleansRuntime.csproj +++ b/src/OrleansRuntime/OrleansRuntime.csproj @@ -58,7 +58,7 @@ - + @@ -102,9 +102,6 @@ - - Component - @@ -127,8 +124,8 @@ - - + + diff --git a/src/OrleansRuntime/Properties/AssemblyInfo.cs b/src/OrleansRuntime/Properties/AssemblyInfo.cs index 45e160eec7..220eb0f8f5 100644 --- a/src/OrleansRuntime/Properties/AssemblyInfo.cs +++ b/src/OrleansRuntime/Properties/AssemblyInfo.cs @@ -21,5 +21,6 @@ [assembly: InternalsVisibleTo("LoadTestGrains")] [assembly: InternalsVisibleTo("UnitTests")] [assembly: InternalsVisibleTo("OrleansCounterControl")] +[assembly: InternalsVisibleTo("OrleansTelemetryConsumers.Counters")] [assembly: InternalsVisibleTo("TesterInternal")] [assembly: InternalsVisibleTo("TestInternalGrains")] diff --git a/src/OrleansRuntime/Counters/OrleansPerformanceCounterInstaller.cs b/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs similarity index 85% rename from src/OrleansRuntime/Counters/OrleansPerformanceCounterInstaller.cs rename to src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs index 17b654d020..ee6d90c3d2 100644 --- a/src/OrleansRuntime/Counters/OrleansPerformanceCounterInstaller.cs +++ b/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs @@ -1,9 +1,9 @@ -using System; +using System; using System.ComponentModel; using System.Configuration.Install; using System.Diagnostics; -namespace Orleans.Runtime.Counters +namespace OrleansTelemetryConsumers.Counters { /// /// Providers installer hooks for registering Orleans custom performance counters. @@ -21,9 +21,10 @@ public OrleansPerformanceCounterInstaller() { using (var myPerformanceCounterInstaller = new PerformanceCounterInstaller()) { - myPerformanceCounterInstaller.CategoryName = OrleansPerfCounterManager.CATEGORY_NAME; + myPerformanceCounterInstaller.CategoryName = PerfCounterTelemetryConsumer.CATEGORY_NAME; myPerformanceCounterInstaller.CategoryType = PerformanceCounterCategoryType.MultiInstance; - myPerformanceCounterInstaller.Counters.AddRange(OrleansPerfCounterManager.GetCounterCreationData()); + var consumer = new PerfCounterTelemetryConsumer(); + myPerformanceCounterInstaller.Counters.AddRange(consumer.GetCounterCreationData()); Installers.Add(myPerformanceCounterInstaller); } } diff --git a/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj b/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj new file mode 100644 index 0000000000..d907734da5 --- /dev/null +++ b/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {69F40A37-4A2F-44D4-A994-CC165C12FB91} + Library + Properties + OrleansTelemetryConsumers.Counters + OrleansTelemetryConsumers.Counters + v4.5.1 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + Properties\GlobalAssemblyInfo.cs + + + Component + + + + + + + + {6ff2004c-cdf8-479c-bf27-c6bfe8ef93e0} + OrleansRuntime + + + {bc1bd60c-e7d8-4452-a21c-290aec8e2e74} + Orleans + + + + + \ No newline at end of file diff --git a/src/OrleansRuntime/Counters/PerfCounterConfigData.cs b/src/OrleansTelemetryConsumers.Counters/PerfCounterConfigData.cs similarity index 98% rename from src/OrleansRuntime/Counters/PerfCounterConfigData.cs rename to src/OrleansTelemetryConsumers.Counters/PerfCounterConfigData.cs index f662387abe..a13eec3eb2 100644 --- a/src/OrleansRuntime/Counters/PerfCounterConfigData.cs +++ b/src/OrleansTelemetryConsumers.Counters/PerfCounterConfigData.cs @@ -1,12 +1,12 @@ +using Orleans.Runtime; using System.Diagnostics; -namespace Orleans.Runtime.Counters +namespace OrleansTelemetryConsumers.Counters { internal class PerfCounterConfigData { public StatisticName Name; public bool UseDeltaValue; - internal ICounter CounterStat; internal PerformanceCounter PerfCounter; // TODO: Move this list to some kind of config file @@ -28,7 +28,7 @@ internal class PerfCounterConfigData new PerfCounterConfigData {Name = StatisticNames.MESSAGING_SENT_BYTES_TOTAL, UseDeltaValue = true}, new PerfCounterConfigData {Name = StatisticNames.MESSAGING_SENT_MESSAGES_TOTAL, UseDeltaValue = true}, new PerfCounterConfigData {Name = StatisticNames.MESSAGING_SENT_LOCALMESSAGES, UseDeltaValue = true}, - + new PerfCounterConfigData { Name = @@ -109,4 +109,3 @@ internal class PerfCounterConfigData }; } } - diff --git a/src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs b/src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs new file mode 100644 index 0000000000..ed72a6fc2a --- /dev/null +++ b/src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs @@ -0,0 +1,224 @@ +using Orleans; +using Orleans.Runtime; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace OrleansTelemetryConsumers.Counters +{ + public class PerfCounterTelemetryConsumer : IMetricTelemetryConsumer + { + internal const string CATEGORY_NAME = "OrleansRuntime"; + internal const string CATEGORY_DESCRIPTION = "Orleans Runtime Counters"; + private const string CounterControlProgName = "OrleansCounterControl.exe"; + private const string ExplainHowToCreateOrleansPerfCounters = "Run " + CounterControlProgName + " as Administrator to create perf counters for Orleans."; + + private static readonly Logger logger = LogManager.GetLogger("OrleansPerfCounterManager", LoggerType.Runtime); + private readonly List perfCounterData = new List(); + + public PerfCounterTelemetryConsumer(bool installMode = false) + { + if (!AreWindowsPerfCountersAvailable()) + { + logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters not found -- defaulting to in-memory counters. " + ExplainHowToCreateOrleansPerfCounters); + return; + } + + GetCounterData(installMode); + + foreach (var cd in perfCounterData) + { + var perfCounterName = GetPerfCounterName(cd); + cd.PerfCounter = CreatePerfCounter(perfCounterName); + } + } + + #region Counter Management methods + + private void GetCounterData(bool installMode) + { + perfCounterData.Clear(); + + // (1) Start with list of static counters + perfCounterData.AddRange(PerfCounterConfigData.StaticPerfCounters); + + if (!installMode) + { + // (2) Then search for grain DLLs and pre-create activation counters for any grain types found + var loadedGrainClasses = GrainTypeManager.Instance.GrainClassTypeData; + foreach (var grainClass in loadedGrainClasses) + { + var counterName = new StatisticName(StatisticNames.GRAIN_COUNTS_PER_GRAIN, grainClass.Key); + perfCounterData.Add(new PerfCounterConfigData + { + Name = counterName, + UseDeltaValue = false + }); + } + } + } + + public static bool AreWindowsPerfCountersAvailable() + { + try + { + if (Environment.OSVersion.ToString().StartsWith("unix", StringComparison.InvariantCultureIgnoreCase)) + { + logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters are only available on Windows :) -- defaulting to in-memory counters."); + return false; + } + + return PerformanceCounterCategory.Exists(CATEGORY_NAME); + } + catch (Exception exc) + { + logger.Warn(ErrorCode.PerfCounterCategoryCheckError, + string.Format("Ignoring error checking for {0} perf counter category", CATEGORY_NAME), exc); + } + return false; + } + + private PerformanceCounter CreatePerfCounter(string perfCounterName) + { + logger.Verbose(ErrorCode.PerfCounterRegistering, "Creating perf counter {0}", perfCounterName); + return new PerformanceCounter(CATEGORY_NAME, perfCounterName, false); + } + + private string GetPerfCounterName(PerfCounterConfigData cd) + { + return cd.Name.Name + "." + (cd.UseDeltaValue ? "Delta" : "Current"); + } + + internal CounterCreationData[] GetCounterCreationData() + { + GetCounterData(false); + var ctrCreationData = new List(); + foreach (PerfCounterConfigData cd in perfCounterData) + { + var perfCounterName = GetPerfCounterName(cd); + var description = cd.Name.Name; + + var msg = string.Format("Registering perf counter {0}", perfCounterName); + Console.WriteLine(msg); + + ctrCreationData.Add(new CounterCreationData(perfCounterName, description, PerformanceCounterType.NumberOfItems32)); + } + return ctrCreationData.ToArray(); + } + + /// + /// Register Orleans perf counters with Windows + /// + /// Note: Program needs to be running as Administrator to be able to delete Windows perf counters. + public void InstallCounters() + { + var collection = new CounterCreationDataCollection(); + collection.AddRange(GetCounterCreationData()); + + PerformanceCounterCategory.Create( + CATEGORY_NAME, + CATEGORY_DESCRIPTION, + PerformanceCounterCategoryType.SingleInstance, + collection); + } + + /// + /// Delete any existing perf counters registered with Windows + /// + /// Note: Program needs to be running as Administrator to be able to delete Windows perf counters. + public void DeleteCounters() + { + PerformanceCounterCategory.Delete(CATEGORY_NAME); + } + + private PerfCounterConfigData GetCounter(string counterName) + { + return perfCounterData.Where(pcd => GetPerfCounterName(pcd) == counterName).SingleOrDefault(); + } + + #endregion + + #region IMetricTelemetryConsumer Methods + + public void IncrementMetric(string name) => WriteMetric(name, UpdateMode.Increment); + + public void IncrementMetric(string name, double value) => WriteMetric(name, UpdateMode.Increment, value); + + public void TrackMetric(string name, double value, IDictionary properties = null) => WriteMetric(name, UpdateMode.Set, value); + + public void TrackMetric(string name, TimeSpan value, IDictionary properties = null) => WriteMetric(name, UpdateMode.Set, value.Ticks); + + public void DecrementMetric(string name) => WriteMetric(name, UpdateMode.Decrement); + + public void DecrementMetric(string name, double value) => WriteMetric(name, UpdateMode.Decrement, value); + + public void Flush() { } + + public void Close() { } + + private void WriteMetric(string name, UpdateMode mode = UpdateMode.Increment, double? value = null) + { + PerfCounterConfigData cd = GetCounter(name); + if (cd == null) + { + if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterNotFound, "No perf counter found for {0}", name); + return; + } + + StatisticName statsName = cd.Name; + string perfCounterName = GetPerfCounterName(cd); + + try + { + if (cd.PerfCounter == null) + { + if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterUnableToConnect, "No perf counter found for {0}", name); + cd.PerfCounter = CreatePerfCounter(perfCounterName); + } + + if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing perf counter {0}", perfCounterName); + + switch (mode) + { + case UpdateMode.Increment: + if (value.HasValue) + { + cd.PerfCounter.IncrementBy((long)value.Value); + } + else + { + cd.PerfCounter.Increment(); + } + break; + case UpdateMode.Decrement: + if (value.HasValue) + { + cd.PerfCounter.RawValue = cd.PerfCounter.RawValue - (long)value.Value; + } + else + { + cd.PerfCounter.Decrement(); + } + break; + case UpdateMode.Set: + cd.PerfCounter.RawValue = (long)value.Value; + break; + } + } + catch (Exception ex) + { + logger.Error(ErrorCode.PerfCounterUnableToWrite, string.Format("Unable to write to Windows perf counter '{0}'", statsName), ex); + } + } + + private enum UpdateMode + { + Increment = 0, + Decrement, + Set + } + + #endregion + } +} diff --git a/src/OrleansTelemetryConsumers.Counters/Properties/AssemblyInfo.cs b/src/OrleansTelemetryConsumers.Counters/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..741fc8a0c9 --- /dev/null +++ b/src/OrleansTelemetryConsumers.Counters/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using Orleans.CodeGeneration; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OrleansTelemetryConsumers.Counters")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("69f40a37-4a2f-44d4-a994-cc165c12fb91")] +[assembly: SkipCodeGeneration] From 288076919ba706d03e0bc461ab3c4a77e29c918a Mon Sep 17 00:00:00 2001 From: Gutemberg Ribeiro Date: Wed, 7 Sep 2016 23:19:23 -0300 Subject: [PATCH 2/7] Addressed feedback --- changelog.md | 7 +- src/OrleansCounterControl/CounterControl.cs | 10 +- .../Counters/OrleansCounterManager.cs | 61 +---------- ...=> OrleansPerfCounterTelemetryConsumer.cs} | 103 ++++++++++-------- .../OrleansPerformanceCounterInstaller.cs | 4 +- .../OrleansTelemetryConsumers.Counters.csproj | 2 +- .../OrleansTestingHost.csproj | 4 + src/OrleansTestingHost/TestCluster.cs | 7 ++ src/OrleansTestingHost/TestingSiloHost.cs | 7 ++ test/Tester/Tester.csproj | 4 + test/TesterInternal/TesterInternal.csproj | 4 + 11 files changed, 101 insertions(+), 112 deletions(-) rename src/OrleansTelemetryConsumers.Counters/{PerfCounterTelemetryConsumer.cs => OrleansPerfCounterTelemetryConsumer.cs} (75%) diff --git a/changelog.md b/changelog.md index 21e10d9f6b..75e12f0532 100644 --- a/changelog.md +++ b/changelog.md @@ -12,7 +12,12 @@ The idea is to track end-user facing changes as they occur.* - Updated Azure Storage dependency to 7.0.0 #1968 - A new ADO.NET storage provider that is significantly easier to setup, which replaces the the previous one. This change is not backwards compatible and does not support sharding (likely be replaced later with Orleans sharding provider). The most straightforward migration plan is likely to persist the state classes from Orleans application code. - More information in [#1682](https://github.com/dotnet/orleans/pull/1682) and in [#1682 (comment)](https://github.com/dotnet/orleans/pull/1682#issuecomment-234371701). + More information in [#1682](https://github.com/dotnet/orleans/pull/1682) and in [#1682 (comment)](https://github.com/dotnet/orleans/pull/1682#issuecomment-234371701). +- Added new Amazon AWS basic Orleans providers [#2006](https://github.com/dotnet/orleans/issues/2006) +- Moved Orleans Performance Counters into its own Telemetry Consumer. Now you need to explicitly register the `OrleansPerfCounterTelemetryConsumer` either by code or XML. More information in [#2122](https://github.com/dotnet/orleans/pull/2122) and docs will come later + - `Microsoft.Orleans.CounterControl` Nuget package is deprecated. When installing the new `Microsoft.Orleans.OrleansTelemetryConsumers.Counters` which contains the telemetry consumer, you can find `OrleansCounterControl.exe` under the `tools\` directory at the packages folder. + - `OrleansCounterControl.exe` usage remain the same + ### [v1.2.3] - Ability to force creation of Orleans serializers for types not marked with [Serializable] by using GenerateSerializer, KnownType or KnownAssembly.TreatTypesAsSerializable #1888 #1864 #1855 diff --git a/src/OrleansCounterControl/CounterControl.cs b/src/OrleansCounterControl/CounterControl.cs index 5e293de2af..9d6b0317d2 100644 --- a/src/OrleansCounterControl/CounterControl.cs +++ b/src/OrleansCounterControl/CounterControl.cs @@ -24,7 +24,7 @@ internal class CounterControl public bool IsRunningAsAdministrator { get; private set; } public bool PauseAtEnd { get; private set; } - private static PerfCounterTelemetryConsumer perfCounterConsumer; + private static OrleansPerfCounterTelemetryConsumer perfCounterConsumer; public CounterControl() { @@ -32,7 +32,7 @@ public CounterControl() var userIdent = WindowsIdentity.GetCurrent(); var userPrincipal = new WindowsPrincipal(userIdent); IsRunningAsAdministrator = userPrincipal.IsInRole(WindowsBuiltInRole.Administrator); - perfCounterConsumer = new PerfCounterTelemetryConsumer(true); + perfCounterConsumer = new OrleansPerfCounterTelemetryConsumer(); } public void PrintUsage() @@ -162,7 +162,7 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) { try { - if (PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) + if (OrleansPerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) { if (!useBruteForce) { @@ -183,7 +183,7 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) // Register perf counters perfCounterConsumer.InstallCounters(); - if (PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) + if (OrleansPerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) ConsoleText.WriteStatus("Orleans counters registered successfully"); else ConsoleText.WriteError("Orleans counters are NOT registered"); @@ -202,7 +202,7 @@ private static void RegisterWindowsPerfCounters(bool useBruteForce) /// Note: Program needs to be running as Administrator to be able to unregister Windows perf counters. private static void UnregisterWindowsPerfCounters(bool useBruteForce) { - if (!PerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) + if (!OrleansPerfCounterTelemetryConsumer.AreWindowsPerfCountersAvailable()) { ConsoleText.WriteStatus("Orleans counters are already unregistered"); return; diff --git a/src/OrleansRuntime/Counters/OrleansCounterManager.cs b/src/OrleansRuntime/Counters/OrleansCounterManager.cs index 32eafebb17..d0d8fe2645 100644 --- a/src/OrleansRuntime/Counters/OrleansCounterManager.cs +++ b/src/OrleansRuntime/Counters/OrleansCounterManager.cs @@ -5,64 +5,11 @@ namespace Orleans.Runtime.Counters { internal static class OrleansCounterManager { - private static readonly Logger logger = LogManager.GetLogger("OrleansPerfCounterManager", LoggerType.Runtime); - //private static readonly List> counterNames = new List>(); - - //public static void PrecreateCounters() - //{ - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_COLLECTION_NUMBER_OF_COLLECTIONS, true)); - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_COLLECTION, false)); - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DEACTIVATE_ON_IDLE, false)); - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_SHUTDOWN_VIA_DIRECT_SHUTDOWN, false)); - // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_CACHE_SIZE, false)); - // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_FULL_ISSUED, true)); - // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_LOCAL_ISSUED, true)); - // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_LOOKUPS_LOCAL_SUCCESSES, true)); - // counterNames.Add(new Tuple(StatisticNames.DIRECTORY_PARTITION_SIZE, false)); - // counterNames.Add(new Tuple(StatisticNames.GATEWAY_CONNECTED_CLIENTS, false)); - // counterNames.Add(new Tuple(StatisticNames.GATEWAY_LOAD_SHEDDING, true)); - // counterNames.Add(new Tuple(StatisticNames.GATEWAY_RECEIVED, true)); - // counterNames.Add(new Tuple(StatisticNames.MEMBERSHIP_ACTIVE_CLUSTER_SIZE, false)); - // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_BYTES_TOTAL, true)); - // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_MESSAGES_TOTAL, true)); - // counterNames.Add(new Tuple(StatisticNames.MESSAGING_SENT_LOCALMESSAGES, true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, - // Message.Directions.OneWay.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, - // Message.Directions.Request.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_OK_PER_DIRECTION, - // Message.Directions.Response.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, - // Message.Directions.OneWay.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, - // Message.Directions.Request.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_PROCESSED_ERRORS_PER_DIRECTION, - // Message.Directions.Response.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, - // Message.Directions.OneWay.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, - // Message.Directions.Request.ToString()), true)); - // counterNames.Add(new Tuple(new StatisticName(StatisticNames.MESSAGING_DISPATCHER_RECEIVED_PER_DIRECTION, - // Message.Directions.Response.ToString()), true)); - // counterNames.Add(new Tuple(StatisticNames.MESSAGE_CENTER_RECEIVE_QUEUE_LENGTH, false)); - // counterNames.Add(new Tuple(StatisticNames.MESSAGE_CENTER_SEND_QUEUE_LENGTH, false)); - // counterNames.Add(new Tuple(StatisticNames.SCHEDULER_PENDINGWORKITEMS, false)); - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_COUNT, false)); - // counterNames.Add(new Tuple(StatisticNames.CATALOG_ACTIVATION_DUPLICATE_ACTIVATIONS, false)); - // counterNames.Add(new Tuple(StatisticNames.RUNTIME_GC_TOTALMEMORYKB, false)); - // counterNames.Add(new Tuple(StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_WORKERTHREADS, false)); - // counterNames.Add(new Tuple(StatisticNames.RUNTIME_DOT_NET_THREADPOOL_INUSE_COMPLETIONPORTTHREADS, false)); - // counterNames.Add(new Tuple(StatisticNames.STORAGE_READ_TOTAL, true)); - // counterNames.Add(new Tuple(StatisticNames.STORAGE_WRITE_TOTAL, true)); - // counterNames.Add(new Tuple(StatisticNames.STORAGE_ACTIVATE_TOTAL, true)); - // counterNames.Add(new Tuple(StatisticNames.STORAGE_READ_ERRORS, true)); - // counterNames.Add(new Tuple(StatisticNames.STORAGE_WRITE_ERRORS, true)); - // counterNames.Add(new Tuple(StatisticNames.AZURE_SERVER_BUSY, true)); - //} + private static readonly Logger logger = LogManager.GetLogger("OrleansCounterManager", LoggerType.Runtime); public static int WriteCounters() { - if (logger.IsVerbose) logger.Verbose("Writing Windows perf counters."); + if (logger.IsVerbose) logger.Verbose("Writing counters."); int numWriteErrors = 0; @@ -73,7 +20,7 @@ public static int WriteCounters() try { - if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing perf counter {0}", perfCounterName); + if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing counter {0}", perfCounterName); if (cd.CounterStat == null) { @@ -88,7 +35,7 @@ public static int WriteCounters() catch (Exception ex) { numWriteErrors++; - logger.Error(ErrorCode.PerfCounterUnableToWrite, string.Format("Unable to write to Windows perf counter '{0}'", name), ex); + logger.Error(ErrorCode.PerfCounterUnableToWrite, string.Format("Unable to write to counter '{0}'", name), ex); } } return numWriteErrors; diff --git a/src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs b/src/OrleansTelemetryConsumers.Counters/OrleansPerfCounterTelemetryConsumer.cs similarity index 75% rename from src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs rename to src/OrleansTelemetryConsumers.Counters/OrleansPerfCounterTelemetryConsumer.cs index ed72a6fc2a..81a7854eb3 100644 --- a/src/OrleansTelemetryConsumers.Counters/PerfCounterTelemetryConsumer.cs +++ b/src/OrleansTelemetryConsumers.Counters/OrleansPerfCounterTelemetryConsumer.cs @@ -7,7 +7,7 @@ namespace OrleansTelemetryConsumers.Counters { - public class PerfCounterTelemetryConsumer : IMetricTelemetryConsumer + public class OrleansPerfCounterTelemetryConsumer : IMetricTelemetryConsumer { internal const string CATEGORY_NAME = "OrleansRuntime"; internal const string CATEGORY_DESCRIPTION = "Orleans Runtime Counters"; @@ -15,50 +15,59 @@ public class PerfCounterTelemetryConsumer : IMetricTelemetryConsumer private const string ExplainHowToCreateOrleansPerfCounters = "Run " + CounterControlProgName + " as Administrator to create perf counters for Orleans."; private static readonly Logger logger = LogManager.GetLogger("OrleansPerfCounterManager", LoggerType.Runtime); - private readonly List perfCounterData = new List(); - - public PerfCounterTelemetryConsumer(bool installMode = false) + private static readonly List perfCounterData = new List(); + private static bool isInstalling = false; + private readonly Lazy isInitialized = new Lazy(() => { - if (!AreWindowsPerfCountersAvailable()) - { - logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters not found -- defaulting to in-memory counters. " + ExplainHowToCreateOrleansPerfCounters); - return; - } - - GetCounterData(installMode); - - foreach (var cd in perfCounterData) + try { - var perfCounterName = GetPerfCounterName(cd); - cd.PerfCounter = CreatePerfCounter(perfCounterName); - } - } + perfCounterData.Clear(); - #region Counter Management methods - - private void GetCounterData(bool installMode) - { - perfCounterData.Clear(); + // (1) Start with list of static counters + perfCounterData.AddRange(PerfCounterConfigData.StaticPerfCounters); - // (1) Start with list of static counters - perfCounterData.AddRange(PerfCounterConfigData.StaticPerfCounters); + if (GrainTypeManager.Instance != null && GrainTypeManager.Instance.GrainClassTypeData != null) + { + // (2) Then search for grain DLLs and pre-create activation counters for any grain types found + var loadedGrainClasses = GrainTypeManager.Instance.GrainClassTypeData; + foreach (var grainClass in loadedGrainClasses) + { + var counterName = new StatisticName(StatisticNames.GRAIN_COUNTS_PER_GRAIN, grainClass.Key); + perfCounterData.Add(new PerfCounterConfigData + { + Name = counterName, + UseDeltaValue = false + }); + } + } - if (!installMode) - { - // (2) Then search for grain DLLs and pre-create activation counters for any grain types found - var loadedGrainClasses = GrainTypeManager.Instance.GrainClassTypeData; - foreach (var grainClass in loadedGrainClasses) + if (!isInstalling) { - var counterName = new StatisticName(StatisticNames.GRAIN_COUNTS_PER_GRAIN, grainClass.Key); - perfCounterData.Add(new PerfCounterConfigData + foreach (var cd in perfCounterData) { - Name = counterName, - UseDeltaValue = false - }); + var perfCounterName = GetPerfCounterName(cd); + cd.PerfCounter = CreatePerfCounter(perfCounterName); + } } + + return true; + } + catch + { + return false; } + }, true); + + public OrleansPerfCounterTelemetryConsumer() + { + if (!AreWindowsPerfCountersAvailable()) + { + logger.Warn(ErrorCode.PerfCounterNotFound, "Windows perf counters not found -- defaulting to in-memory counters. " + ExplainHowToCreateOrleansPerfCounters); + } } + #region Counter Management methods + public static bool AreWindowsPerfCountersAvailable() { try @@ -79,20 +88,19 @@ public static bool AreWindowsPerfCountersAvailable() return false; } - private PerformanceCounter CreatePerfCounter(string perfCounterName) + private static PerformanceCounter CreatePerfCounter(string perfCounterName) { logger.Verbose(ErrorCode.PerfCounterRegistering, "Creating perf counter {0}", perfCounterName); return new PerformanceCounter(CATEGORY_NAME, perfCounterName, false); } - private string GetPerfCounterName(PerfCounterConfigData cd) + private static string GetPerfCounterName(PerfCounterConfigData cd) { return cd.Name.Name + "." + (cd.UseDeltaValue ? "Delta" : "Current"); } - + internal CounterCreationData[] GetCounterCreationData() { - GetCounterData(false); var ctrCreationData = new List(); foreach (PerfCounterConfigData cd in perfCounterData) { @@ -113,6 +121,14 @@ internal CounterCreationData[] GetCounterCreationData() /// Note: Program needs to be running as Administrator to be able to delete Windows perf counters. public void InstallCounters() { + isInstalling = true; + if (!isInitialized.Value) + { + var msg = "Unable to install Windows Performance counters"; + logger.Warn(ErrorCode.PerfCounterNotFound, msg); + throw new InvalidOperationException(msg); + } + var collection = new CounterCreationDataCollection(); collection.AddRange(GetCounterCreationData()); @@ -159,23 +175,18 @@ public void Close() { } private void WriteMetric(string name, UpdateMode mode = UpdateMode.Increment, double? value = null) { + if (!isInitialized.Value) + return; + PerfCounterConfigData cd = GetCounter(name); if (cd == null) - { - if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterNotFound, "No perf counter found for {0}", name); return; - } StatisticName statsName = cd.Name; string perfCounterName = GetPerfCounterName(cd); try { - if (cd.PerfCounter == null) - { - if (logger.IsVerbose) logger.Verbose(ErrorCode.PerfCounterUnableToConnect, "No perf counter found for {0}", name); - cd.PerfCounter = CreatePerfCounter(perfCounterName); - } if (logger.IsVerbose3) logger.Verbose3(ErrorCode.PerfCounterWriting, "Writing perf counter {0}", perfCounterName); diff --git a/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs b/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs index ee6d90c3d2..8b085c4ecd 100644 --- a/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs +++ b/src/OrleansTelemetryConsumers.Counters/OrleansPerformanceCounterInstaller.cs @@ -21,9 +21,9 @@ public OrleansPerformanceCounterInstaller() { using (var myPerformanceCounterInstaller = new PerformanceCounterInstaller()) { - myPerformanceCounterInstaller.CategoryName = PerfCounterTelemetryConsumer.CATEGORY_NAME; + myPerformanceCounterInstaller.CategoryName = OrleansPerfCounterTelemetryConsumer.CATEGORY_NAME; myPerformanceCounterInstaller.CategoryType = PerformanceCounterCategoryType.MultiInstance; - var consumer = new PerfCounterTelemetryConsumer(); + var consumer = new OrleansPerfCounterTelemetryConsumer(); myPerformanceCounterInstaller.Counters.AddRange(consumer.GetCounterCreationData()); Installers.Add(myPerformanceCounterInstaller); } diff --git a/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj b/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj index d907734da5..40789146ec 100644 --- a/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj +++ b/src/OrleansTelemetryConsumers.Counters/OrleansTelemetryConsumers.Counters.csproj @@ -48,7 +48,7 @@ Component - + diff --git a/src/OrleansTestingHost/OrleansTestingHost.csproj b/src/OrleansTestingHost/OrleansTestingHost.csproj index efb10a1919..86f87d5835 100644 --- a/src/OrleansTestingHost/OrleansTestingHost.csproj +++ b/src/OrleansTestingHost/OrleansTestingHost.csproj @@ -80,6 +80,10 @@ {6ff2004c-cdf8-479c-bf27-c6bfe8ef93e0} OrleansRuntime + + {69f40a37-4a2f-44d4-a994-cc165c12fb91} + OrleansTelemetryConsumers.Counters + {bc1bd60c-e7d8-4452-a21c-290aec8e2e74} Orleans diff --git a/src/OrleansTestingHost/TestCluster.cs b/src/OrleansTestingHost/TestCluster.cs index 70e8cf75ca..30d5617e3e 100644 --- a/src/OrleansTestingHost/TestCluster.cs +++ b/src/OrleansTestingHost/TestCluster.cs @@ -11,6 +11,7 @@ using Orleans.Runtime; using Orleans.Runtime.Configuration; using Orleans.TestingHost.Utils; +using OrleansTelemetryConsumers.Counters; namespace Orleans.TestingHost { @@ -585,6 +586,7 @@ private Silo LoadSiloInNewAppDomain(string siloName, Silo.SiloType type, Cluster new object[] { }); appDomain.UnhandledException += ReportUnobservedException; + appDomain.DoCallBack(RegisterPerfCountersTelemetryConsumer); return silo; } @@ -598,6 +600,11 @@ private void UnloadSiloInAppDomain(AppDomain appDomain) } } + private static void RegisterPerfCountersTelemetryConsumer() + { + LogManager.TelemetryConsumers.Add(new OrleansPerfCounterTelemetryConsumer()); + } + private static AppDomainSetup GetAppDomainSetupInfo() { AppDomain currentAppDomain = AppDomain.CurrentDomain; diff --git a/src/OrleansTestingHost/TestingSiloHost.cs b/src/OrleansTestingHost/TestingSiloHost.cs index a331ab718d..3783d94b76 100644 --- a/src/OrleansTestingHost/TestingSiloHost.cs +++ b/src/OrleansTestingHost/TestingSiloHost.cs @@ -13,6 +13,7 @@ using Orleans.Runtime.Configuration; using Orleans.TestingHost.Extensions; using Orleans.TestingHost.Utils; +using OrleansTelemetryConsumers.Counters; namespace Orleans.TestingHost { @@ -861,10 +862,16 @@ private Silo LoadSiloInNewAppDomain(string siloName, Silo.SiloType type, Cluster new object[] { }); appDomain.UnhandledException += ReportUnobservedException; + appDomain.DoCallBack(RegisterPerfCountersTelemetryConsumer); return silo; } + private static void RegisterPerfCountersTelemetryConsumer() + { + LogManager.TelemetryConsumers.Add(new OrleansPerfCounterTelemetryConsumer()); + } + private static void UnloadSiloInAppDomain(AppDomain appDomain) { if (appDomain != null) diff --git a/test/Tester/Tester.csproj b/test/Tester/Tester.csproj index 442cbfd3a8..739318f4c2 100644 --- a/test/Tester/Tester.csproj +++ b/test/Tester/Tester.csproj @@ -246,6 +246,10 @@ {47e9ae37-4eae-48d5-a778-2c80e9a6375f} OrleansSQLUtils + + {69f40a37-4a2f-44d4-a994-cc165c12fb91} + OrleansTelemetryConsumers.Counters + {40ee3b00-d381-485f-9c69-ff706837deed} OrleansTestingHost diff --git a/test/TesterInternal/TesterInternal.csproj b/test/TesterInternal/TesterInternal.csproj index 0a86a36ae7..e32fe27123 100644 --- a/test/TesterInternal/TesterInternal.csproj +++ b/test/TesterInternal/TesterInternal.csproj @@ -260,6 +260,10 @@ {47e9ae37-4eae-48d5-a778-2c80e9a6375f} OrleansSQLUtils + + {69f40a37-4a2f-44d4-a994-cc165c12fb91} + OrleansTelemetryConsumers.Counters + {40ee3b00-d381-485f-9c69-ff706837deed} OrleansTestingHost From c0b7d5d0049c2edc0e44f507d0315816008717e9 Mon Sep 17 00:00:00 2001 From: Gutemberg Ribeiro Date: Wed, 7 Sep 2016 23:41:19 -0300 Subject: [PATCH 3/7] Updated nuspecs --- src/NuGet/Microsoft.Orleans.CounterControl.nuspec | 7 +++++++ ...osoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec | 7 ++++++- src/OrleansCounterControl/OrleansCounterControl.csproj | 5 +++++ .../OrleansTelemetryConsumers.Counters.csproj | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/NuGet/Microsoft.Orleans.CounterControl.nuspec b/src/NuGet/Microsoft.Orleans.CounterControl.nuspec index d67231ee5f..abd481abad 100644 --- a/src/NuGet/Microsoft.Orleans.CounterControl.nuspec +++ b/src/NuGet/Microsoft.Orleans.CounterControl.nuspec @@ -10,9 +10,16 @@ https://github.com/dotnet/Orleans#license https://raw.githubusercontent.com/dotnet/orleans/gh-pages/assets/logo_128.png + [DEPRECATED] Tool for registering performance counters of Microsoft Orleans - OrleansCounterControl.exe. + [DEPRECATED] + [DEPRECATED] + This package was deprecated. + Please use the package "Microsoft.Orleans.OrleansTelemetryConsumers.Counters" and "OrleansCounterControl.exe" will be under "tools\" directory of it. + [DEPRECATED] + Tool that registers performance counter categories for performance counters published by Orleans runtime. diff --git a/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec b/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec index 10bd19babf..5b9dccdacd 100644 --- a/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec +++ b/src/NuGet/Microsoft.Orleans.OrleansTelemetryConsumers.Counters.nuspec @@ -22,6 +22,11 @@ - + + + + + + diff --git a/src/OrleansCounterControl/OrleansCounterControl.csproj b/src/OrleansCounterControl/OrleansCounterControl.csproj index c7a1ab435f..b54a244197 100644 --- a/src/OrleansCounterControl/OrleansCounterControl.csproj +++ b/src/OrleansCounterControl/OrleansCounterControl.csproj @@ -43,6 +43,8 @@ true false 4014 + + @@ -75,6 +77,9 @@ + + copy $(TargetPath) $(SolutionDir)OrleansTelemetryConsumers.Counters\bin\$(ConfigurationName) +