{
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.
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;
}
{
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);
}
}