Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
PerformanceCounters.cs
1using System.Collections.Generic;
2using System.Diagnostics;
3
4#pragma warning disable CA1416 // Validate platform compatibility
5
7{
11 public static class PerformanceCounters
12 {
13 private static readonly string[] categoryNames = GetCategoryNames();
14 private static readonly Dictionary<string, CategoryRec> categories = GetCategories();
15
20 private static Dictionary<string, CategoryRec> GetCategories()
21 {
22 Dictionary<string, CategoryRec> Result = new();
23
24 foreach (PerformanceCounterCategory Category in PerformanceCounterCategory.GetCategories())
25 {
26 Result[Category.CategoryName] = new CategoryRec()
27 {
28 Category = Category,
29 Counters = null
30 };
31 }
32
33 return Result;
34 }
35
40 private static string[] GetCategoryNames()
41 {
42 PerformanceCounterCategory[] Categories = PerformanceCounterCategory.GetCategories();
43 int i, c = Categories.Length;
44 string[] Names = new string[c];
45
46 for (i = 0; i < c; i++)
47 Names[i] = Categories[i].CategoryName;
48
49 return Names;
50 }
51
52 private class CategoryRec
53 {
54 public PerformanceCounterCategory Category;
55 public PerformanceCounter[] Counters;
56 public string[] InstanceNames;
57 public Dictionary<string, InstanceRec> Instances;
58 public Dictionary<string, PerformanceCounter> CountersByName;
59 }
60
61 private class InstanceRec
62 {
63 public PerformanceCounter[] Counters;
64 public Dictionary<string, PerformanceCounter> CountersByName;
65 }
66
70 public static PerformanceCounterCategory[] Categories => PerformanceCounterCategory.GetCategories();
71
75 public static string[] CategoryNames => categoryNames;
76
82 public static PerformanceCounterCategory GetCategory(string CategoryName)
83 {
84 if (categories.TryGetValue(CategoryName, out CategoryRec Rec))
85 return Rec.Category;
86 else
87 return null;
88 }
89
95 public static PerformanceCounter[] GetCounters(string CategoryName)
96 {
97 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
98 return System.Array.Empty<PerformanceCounter>();
99
100 Rec.Counters ??= Rec.Category.GetCounters();
101
102 return Rec.Counters;
103 }
104
110 public static string[] GetCounterNames(string CategoryName)
111 {
112 PerformanceCounter[] Counters = GetCounters(CategoryName);
113 int i, c = Counters.Length;
114 string[] Names = new string[c];
115
116 for (i = 0; i < c; i++)
117 Names[i] = Counters[i].CounterName;
118
119 return Names;
120 }
121
128 public static PerformanceCounter GetCounter(string CategoryName, string CounterName)
129 {
130 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
131 return null;
132
133 if (Rec.CountersByName is null)
134 {
135 Rec.Counters ??= Rec.Category.GetCounters();
136
137 Dictionary<string, PerformanceCounter> ByName = new();
138
139 foreach (PerformanceCounter Counter in Rec.Counters)
140 ByName[Counter.CounterName] = Counter;
141
142 Rec.CountersByName = ByName;
143 }
144
145 if (Rec.CountersByName.TryGetValue(CounterName, out PerformanceCounter Result))
146 return Result;
147 else
148 return null;
149 }
150
157 public static double? GetCounterValue(string CategoryName, string CounterName)
158 {
159 PerformanceCounter C = GetCounter(CategoryName, CounterName);
160 return C?.NextValue();
161 }
162
168 public static string[] GetInstanceNames(string CategoryName)
169 {
170 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
171 return System.Array.Empty<string>();
172
173 Rec.InstanceNames ??= Rec.Category.GetInstanceNames();
174
175 return Rec.InstanceNames;
176 }
177
184 public static PerformanceCounter[] GetCounters(string CategoryName, string InstanceName)
185 {
186 if (!categories.TryGetValue(CategoryName, out CategoryRec CategoryRec))
187 return System.Array.Empty<PerformanceCounter>();
188
189 if (CategoryRec.Instances is null)
190 {
191 Dictionary<string, InstanceRec> Instances = new();
192
193 CategoryRec.InstanceNames ??= CategoryRec.Category.GetInstanceNames();
194
195 foreach (string Name in CategoryRec.InstanceNames)
196 {
197 Instances[Name] = new InstanceRec()
198 {
199 Counters = CategoryRec.Category.GetCounters(Name)
200 };
201 }
202
203 CategoryRec.Instances = Instances;
204 }
205
206 if (!CategoryRec.Instances.TryGetValue(InstanceName, out InstanceRec InstanceRec))
207 return System.Array.Empty<PerformanceCounter>();
208
209 return InstanceRec.Counters;
210 }
211
217 public static string[] GetCounterNames(string CategoryName, string InstanceName)
218 {
219 PerformanceCounter[] Counters = GetCounters(CategoryName, InstanceName);
220 int i, c = Counters.Length;
221 string[] Names = new string[c];
222
223 for (i = 0; i < c; i++)
224 Names[i] = Counters[i].CounterName;
225
226 return Names;
227 }
228
236 public static PerformanceCounter GetCounter(string CategoryName, string InstanceName, string CounterName)
237 {
238 if (!categories.TryGetValue(CategoryName, out CategoryRec CategoryRec))
239 return null;
240
241 if (CategoryRec.Instances is null)
242 {
243 Dictionary<string, InstanceRec> Instances = new();
244
245 CategoryRec.InstanceNames ??= CategoryRec.Category.GetInstanceNames();
246
247 foreach (string Name in CategoryRec.InstanceNames)
248 {
249 Instances[Name] = new InstanceRec()
250 {
251 Counters = CategoryRec.Category.GetCounters(Name)
252 };
253 }
254
255 CategoryRec.Instances = Instances;
256 }
257
258 if (!CategoryRec.Instances.TryGetValue(InstanceName, out InstanceRec InstanceRec))
259 return null;
260
261 if (InstanceRec.CountersByName is null)
262 {
263 InstanceRec.Counters ??= CategoryRec.Category.GetCounters(InstanceName);
264
265 Dictionary<string, PerformanceCounter> ByName = new();
266
267 foreach (PerformanceCounter Counter in InstanceRec.Counters)
268 ByName[Counter.CounterName] = Counter;
269
270 InstanceRec.CountersByName = ByName;
271 }
272
273 if (InstanceRec.CountersByName.TryGetValue(CounterName, out PerformanceCounter Result))
274 return Result;
275 else
276 return null;
277 }
278
286 public static double? GetCounterValue(string CategoryName, string InstanceName, string CounterName)
287 {
288 PerformanceCounter C = GetCounter(CategoryName, InstanceName, CounterName);
289 return C?.NextValue();
290 }
291
292 }
293}
294
295#pragma warning restore CA1416 // Validate platform compatibility
Static interface for accessing performance counters.
static string[] GetCounterNames(string CategoryName, string InstanceName)
Gets available performance counter names, given their category and instance names.
static PerformanceCounter GetCounter(string CategoryName, string CounterName)
Gets a performance counter, given its category name and counter name, and that the category does not ...
static string[] GetCounterNames(string CategoryName)
Gets available performance counters names, given their category name, and that the category does not ...
static string[] GetInstanceNames(string CategoryName)
Gets available instance name, given a performance category name.
static string[] CategoryNames
Available category names
static PerformanceCounter[] GetCounters(string CategoryName, string InstanceName)
Gets available performance counters, given their category and instance names.
static PerformanceCounter[] GetCounters(string CategoryName)
Gets available performance counters, given their category name, and that the category does not consis...
static PerformanceCounterCategory GetCategory(string CategoryName)
Gets a performance category, given its name
static ? double GetCounterValue(string CategoryName, string CounterName)
Gets a performance counter, given its category, instance and counter names.
static PerformanceCounter GetCounter(string CategoryName, string InstanceName, string CounterName)
Gets a performance counter, given its category, instance and counter names.
static ? double GetCounterValue(string CategoryName, string InstanceName, string CounterName)
Gets a performance counter, given its category, instance and counter names.
static PerformanceCounterCategory[] Categories
Available categories