Enable per provider filtering (#3639)
authorWiktor Kopec <wiktork@microsoft.com>
Wed, 22 Feb 2023 01:00:26 +0000 (17:00 -0800)
committerGitHub <noreply@github.com>
Wed, 22 Feb 2023 01:00:26 +0000 (17:00 -0800)
* Enable per provider filtering

* Pr feedback

* Remove unnecessary using directives

src/Microsoft.Diagnostics.Monitoring.EventPipe/Counters/CounterFilter.cs
src/Microsoft.Diagnostics.Monitoring.EventPipe/Counters/MetricsPipeline.cs
src/Microsoft.Diagnostics.Monitoring.EventPipe/Counters/TraceEventExtensions.cs

index c0655147964bcacdb62597349a0d543a356adba5..baebf0fb8395b9942e0c7105a2cac564721dc2d7 100644 (file)
@@ -10,19 +10,19 @@ namespace Microsoft.Diagnostics.Monitoring.EventPipe
 {
     internal sealed class CounterFilter
     {
-        private Dictionary<string, List<string>> _enabledCounters;
-        private int _intervalMilliseconds;
+        private Dictionary<string, (int? IntervalMilliseconds, List<string> CounterNames)> _enabledCounters;
+        private int _defaultIntervalMilliseconds;
 
-        public static CounterFilter AllCounters(float counterIntervalSeconds)
-            => new CounterFilter(counterIntervalSeconds);
+        public static CounterFilter AllCounters(float defaultIntervalSeconds)
+            => new CounterFilter(defaultIntervalSeconds);
 
-        public CounterFilter(float intervalSeconds)
+        public CounterFilter(float defaultIntervalSeconds)
         {
             //Provider names are not case sensitive, but counter names are.
-            _enabledCounters = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
+            _enabledCounters = new(StringComparer.OrdinalIgnoreCase);
 
             //The Series payload of the counter which we use for filtering
-            _intervalMilliseconds = (int)(intervalSeconds * 1000);
+            _defaultIntervalMilliseconds = SecondsToMilliseconds(defaultIntervalSeconds);
         }
 
         // Called when we want to enable all counters under a provider name.
@@ -31,18 +31,28 @@ namespace Microsoft.Diagnostics.Monitoring.EventPipe
             AddFilter(providerName, Array.Empty<string>());
         }
 
-        public void AddFilter(string providerName, string[] counters)
+        public void AddFilter(string providerName, string[] counters, float? intervalSeconds = null)
         {
-            _enabledCounters[providerName] = new List<string>(counters ?? Array.Empty<string>());
+            _enabledCounters[providerName] = (
+                IntervalMilliseconds: (intervalSeconds.HasValue ? SecondsToMilliseconds(intervalSeconds.Value) : null),
+                CounterNames: new List<string>(counters ?? Array.Empty<string>()));
         }
 
         public IEnumerable<string> GetProviders() => _enabledCounters.Keys;
 
-        public int IntervalSeconds => _intervalMilliseconds / 1000;
+        public int DefaultIntervalSeconds => _defaultIntervalMilliseconds / 1000;
 
         public bool IsIncluded(string providerName, string counterName, int intervalMilliseconds)
         {
-            if (_intervalMilliseconds != intervalMilliseconds)
+            int requestedInterval = _defaultIntervalMilliseconds;
+            if (_enabledCounters.TryGetValue(providerName, out (int? IntervalMilliseconds, List<string> CounterNames) enabledCounters))
+            {
+                if (enabledCounters.IntervalMilliseconds.HasValue)
+                {
+                    requestedInterval = enabledCounters.IntervalMilliseconds.Value;
+                }
+            }
+            if (requestedInterval != intervalMilliseconds)
             {
                 return false;
             }
@@ -56,11 +66,13 @@ namespace Microsoft.Diagnostics.Monitoring.EventPipe
             {
                 return true;
             }
-            if (_enabledCounters.TryGetValue(providerName, out List<string> enabledCounters))
+            if (_enabledCounters.TryGetValue(providerName, out (int? IntervalMilliseconds, List<string> CounterNames) enabledCounters))
             {
-                return enabledCounters.Count == 0 || enabledCounters.Contains(counterName, StringComparer.Ordinal);
+                return enabledCounters.CounterNames.Count == 0 || enabledCounters.CounterNames.Contains(counterName, StringComparer.Ordinal);
             }
             return false;
         }
+
+        private static int SecondsToMilliseconds(float intervalSeconds) => (int)(intervalSeconds * 1000);
     }
 }
index 1dfad989c7d0747d1404d9431d865097e9a5e1b7..c77f723b1a41a889115609a818775cc3c43645f5 100644 (file)
@@ -29,7 +29,7 @@ namespace Microsoft.Diagnostics.Monitoring.EventPipe
                 _filter = new CounterFilter(Settings.CounterIntervalSeconds);
                 foreach (var counterGroup in settings.CounterGroups)
                 {
-                    _filter.AddFilter(counterGroup.ProviderName, counterGroup.CounterNames);
+                    _filter.AddFilter(counterGroup.ProviderName, counterGroup.CounterNames, counterGroup.IntervalSeconds);
                 }
             }
             else
index 34255c6d349cb8c79077434c51acabca31328f38..3536386c77a2d0b3b4480d631cef35ddc19b163d 100644 (file)
@@ -180,7 +180,7 @@ namespace Microsoft.Diagnostics.Monitoring.EventPipe
 
             if (double.TryParse(rateText, NumberStyles.Number | NumberStyles.Float, CultureInfo.InvariantCulture, out double rate))
             {
-                payload = new RatePayload(meterName, instrumentName, null, unit, tags, rate, filter.IntervalSeconds, traceEvent.TimeStamp);
+                payload = new RatePayload(meterName, instrumentName, null, unit, tags, rate, filter.DefaultIntervalSeconds, traceEvent.TimeStamp);
             }
             else
             {