From 6dc171ba296cceca1bae55fa56799fc4716cffcc Mon Sep 17 00:00:00 2001 From: Ted Crossman Date: Wed, 8 Oct 2014 15:49:45 +0000 Subject: [PATCH 1/2] Switch to using NanoTube MetricClient --- .../PerformanceCounterSamplesExtensions.cs | 57 ++++++++----------- src/PerfTap/MonitoringTaskFactory.cs | 14 ++--- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs b/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs index f59c150..5243874 100644 --- a/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs +++ b/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs @@ -13,6 +13,8 @@ namespace PerfTap using System.Text; using System.Text.RegularExpressions; using NanoTube.Support; + using NanoTube.Core; + using NanoTube; using PerfTap.Counter; /// @@ -20,24 +22,20 @@ namespace PerfTap /// public static class PerformanceCounterSamplesExtensions { - private static Regex _validKey = new Regex(@"^[^!\s;:/\.\(\)\\#%\$\^]+$", RegexOptions.Compiled); private const string _keyValue = "kv", _timer = "ms", _performanceCounter = "c", _separator = "\n", _badChars = " ;:/.()*"; - public static IEnumerable ToGraphiteString(this IEnumerable performanceCounters, string key) + public static IEnumerable ToMetrics(this IEnumerable performanceCounters) { if (null == performanceCounters) - { throw new ArgumentNullException("performanceCounter"); } - if (!string.IsNullOrEmpty(key) && !_validKey.IsMatch(key)) - { throw new ArgumentException("Key contains invalid characters", "key"); } + { throw new ArgumentNullException("performanceCounter"); } - var metric = new StringBuilder(150); - string prefix = string.IsNullOrWhiteSpace(key) ? string.Empty : key.Trim() + "."; - string type = _keyValue; + var metricName = new StringBuilder(150); + IMetric metric; foreach (var counter in performanceCounters) { //http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecountertype(v=VS.85).aspx @@ -74,49 +72,44 @@ public static IEnumerable ToGraphiteString(this IEnumerable { var reader = new PerfmonCounterReader(); - using (var messenger = new UdpMessenger(_metricPublishingConfig.HostName, _metricPublishingConfig.Port)) + using (var messenger = new MetricClient(_metricPublishingConfig)) { foreach (var metricBatch in reader.StreamCounterSamples(_counterPaths, _counterSamplingConfig.SampleInterval, cancellationToken) - .SelectMany(set => set.CounterSamples.ToGraphiteString(_metricPublishingConfig.PrefixKey)) + .SelectMany(set => set.CounterSamples.ToMetrics()) .Chunk(10)) { - messenger.SendMetrics(metricBatch); + messenger.Send(metricBatch); } } }, cancellationToken); @@ -67,13 +67,13 @@ public Task CreateTask(CancellationToken cancellationToken, int maximumSamples) { var reader = new PerfmonCounterReader(); - using (var messenger = new UdpMessenger(_metricPublishingConfig.HostName, _metricPublishingConfig.Port)) + using (var messenger = new MetricClient(_metricPublishingConfig)) { foreach (var metricBatch in reader.GetCounterSamples(_counterPaths, _counterSamplingConfig.SampleInterval, maximumSamples, cancellationToken) - .SelectMany(set => set.CounterSamples.ToGraphiteString(_metricPublishingConfig.PrefixKey)) + .SelectMany(set => set.CounterSamples.ToMetrics()) .Chunk(10)) { - messenger.SendMetrics(metricBatch); + messenger.Send(metricBatch); } } }, cancellationToken); From 7941b7f042c9738b1b8445531be844e7e7cc2472 Mon Sep 17 00:00:00 2001 From: Ted Crossman Date: Wed, 8 Oct 2014 15:57:05 +0000 Subject: [PATCH 2/2] Add ability to suppress instance name in sent metrics --- src/PerfTap/Configuration/CounterSamplingConfiguration.cs | 8 ++++++++ .../Configuration/ICounterSamplingConfiguration.cs | 1 + .../Counter/PerformanceCounterSamplesExtensions.cs | 6 +++++- src/PerfTap/MonitoringTaskFactory.cs | 6 +++--- .../Counter/PerformanceCounterSamplesExtensionsTests.cs | 4 ++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/PerfTap/Configuration/CounterSamplingConfiguration.cs b/src/PerfTap/Configuration/CounterSamplingConfiguration.cs index 8e549fb..f48d203 100644 --- a/src/PerfTap/Configuration/CounterSamplingConfiguration.cs +++ b/src/PerfTap/Configuration/CounterSamplingConfiguration.cs @@ -56,6 +56,14 @@ ReadOnlyCollection ICounterSamplingConfiguration.CounterNames get { return new ReadOnlyCollection(CounterDefinitions.OfType().ToList() ?? (IList)new ICounterName[0]); } } + /// Add the instance name in the metrics reported. + /// true or false. + [ConfigurationProperty("addInstanceNameToMetrics", IsRequired = false, DefaultValue = "true")] + public bool AddInstanceNameToMetrics + { + get { return (bool)this["addInstanceNameToMetrics"]; } + set { this["addInstanceNameToMetrics"] = value; } + } //TODO: 1-9-2012 -- add error handling to ensure that there's always at least a set of definition paths OR counter definitions supplied by the user } } \ No newline at end of file diff --git a/src/PerfTap/Configuration/ICounterSamplingConfiguration.cs b/src/PerfTap/Configuration/ICounterSamplingConfiguration.cs index e931fbc..537f553 100644 --- a/src/PerfTap/Configuration/ICounterSamplingConfiguration.cs +++ b/src/PerfTap/Configuration/ICounterSamplingConfiguration.cs @@ -10,5 +10,6 @@ public interface ICounterSamplingConfiguration ReadOnlyCollection DefinitionFilePaths { get; } ReadOnlyCollection CounterNames { get; } TimeSpan SampleInterval { get; } + Boolean AddInstanceNameToMetrics { get; } } } \ No newline at end of file diff --git a/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs b/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs index 5243874..3de5698 100644 --- a/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs +++ b/src/PerfTap/Counter/PerformanceCounterSamplesExtensions.cs @@ -28,7 +28,7 @@ public static class PerformanceCounterSamplesExtensions _separator = "\n", _badChars = " ;:/.()*"; - public static IEnumerable ToMetrics(this IEnumerable performanceCounters) + public static IEnumerable ToMetrics(this IEnumerable performanceCounters, bool addInstance) { if (null == performanceCounters) { throw new ArgumentNullException("performanceCounter"); } @@ -88,6 +88,10 @@ public static IEnumerable ToMetrics(this IEnumerable set.CounterSamples.ToMetrics()) + .SelectMany(set => set.CounterSamples.ToMetrics(_counterSamplingConfig.AddInstanceNameToMetrics)) .Chunk(10)) { messenger.Send(metricBatch); @@ -63,14 +63,14 @@ public Task CreateContinuousTask(CancellationToken cancellationToken) public Task CreateTask(CancellationToken cancellationToken, int maximumSamples) { - return new Task(() => + return new Task(() => { var reader = new PerfmonCounterReader(); using (var messenger = new MetricClient(_metricPublishingConfig)) { foreach (var metricBatch in reader.GetCounterSamples(_counterPaths, _counterSamplingConfig.SampleInterval, maximumSamples, cancellationToken) - .SelectMany(set => set.CounterSamples.ToMetrics()) + .SelectMany(set => set.CounterSamples.ToMetrics(_counterSamplingConfig.AddInstanceNameToMetrics)) .Chunk(10)) { messenger.Send(metricBatch); diff --git a/tests/PerfTap.Tests/Counter/PerformanceCounterSamplesExtensionsTests.cs b/tests/PerfTap.Tests/Counter/PerformanceCounterSamplesExtensionsTests.cs index 6f1660a..108888a 100644 --- a/tests/PerfTap.Tests/Counter/PerformanceCounterSamplesExtensionsTests.cs +++ b/tests/PerfTap.Tests/Counter/PerformanceCounterSamplesExtensionsTests.cs @@ -37,7 +37,7 @@ public class PerformanceCounterSamplesExtensionsTests public void ToGraphiteString_ThrowsOnInvalidKey(string key) { var samples = new [] { new PerformanceCounterSample(@"\\machine-name\memory\% committed bytes in use", null, 36.41245914, 818220, 2247088, 1, PerformanceCounterType.RawFraction, 0, 3579545, DateTime.Now, (ulong)DateTime.Now.ToFileTime(), 0) }; - Assert.Throws(() => samples.ToGraphiteString(key).ToList()); + Assert.Throws(() => samples.ToMetrics(true).ToList()); } public static IEnumerable ExpectedMetricConversions @@ -81,7 +81,7 @@ public static IEnumerable ExpectedMetricConversions [PropertyData("ExpectedMetricConversions")] public void ToGraphiteString_GeneratesExpectedMetrics(string key, PerformanceCounterSample sample, string expected) { - string converted = new [] { sample }.ToGraphiteString(key).First(); + string converted = new [] { sample }.ToMetrics(true).First().ToString(); Assert.Equal(expected, converted); } }