master
c 1,537 lines 66.9 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "windows_plugin.h"
4 #include "windows-internals.h"
5
6 enum netdata_netframework_metrics {
7 NETDATA_NETFRAMEWORK_EXCEPTIONS,
8 NETDATA_NETFRAMEWORK_INTEROP,
9 NETDATA_NETFRAMEWORK_JIT,
10 NETDATA_NETFRAMEWORK_LOADING,
11 NETDATA_NETFRAMEWORK_REMOTING,
12 NETDATA_NETFRAMEWORK_SECURITY,
13 NETDATA_NETFRAMEWORK_LOCKS_THREADS,
14
15 NETDATA_NETFRAMEWORK_END
16 };
17
18 struct net_framework_instances {
19 usec_t last_collected;
20
21 RRDSET *st_clrexception_thrown;
22 RRDDIM *rd_clrexception_thrown;
23
24 RRDSET *st_clrexception_filters;
25 RRDDIM *rd_clrexception_filters;
26
27 RRDSET *st_clrexception_finallys;
28 RRDDIM *rd_clrexception_finallys;
29
30 RRDSET *st_clrexception_total_catch_depth;
31 RRDDIM *rd_clrexception_total_catch_depth;
32
33 RRDSET *st_clrinterop_com_callable_wrappers;
34 RRDDIM *rd_clrinterop_com_callable_wrappers;
35
36 RRDSET *st_clrinterop_marshalling;
37 RRDDIM *rd_clrinterop_marshalling;
38
39 RRDSET *st_clrinterop_interop_stubs_created;
40 RRDDIM *rd_clrinterop_interop_stubs_created;
41
42 RRDSET *st_clrjit_methods;
43 RRDDIM *rd_clrjit_methods;
44
45 RRDSET *st_clrjit_time;
46 RRDDIM *rd_clrjit_time;
47
48 RRDSET *st_clrjit_standard_failures;
49 RRDDIM *rd_clrjit_standard_failures;
50
51 RRDSET *st_clrjit_il_bytes;
52 RRDDIM *rd_clrjit_il_bytes;
53
54 RRDSET *st_clrloading_heap_size;
55 RRDDIM *rd_clrloading_heap_size;
56
57 RRDSET *st_clrloading_app_domains_loaded;
58 RRDDIM *rd_clrloading_app_domains_loaded;
59
60 RRDSET *st_clrloading_app_domains_unloaded;
61 RRDDIM *rd_clrloading_app_domains_unloaded;
62
63 RRDSET *st_clrloading_assemblies_loaded;
64 RRDDIM *rd_clrloading_assemblies_loaded;
65
66 RRDSET *st_clrloading_classes_loaded;
67 RRDDIM *rd_clrloading_classes_loaded;
68
69 RRDSET *st_clrloading_class_load_failure;
70 RRDDIM *rd_clrloading_class_load_failure;
71
72 RRDSET *st_clrremoting_channels;
73 RRDDIM *rd_clrremoting_channels;
74
75 RRDSET *st_clrremoting_context_bound_classes_loaded;
76 RRDDIM *rd_clrremoting_context_bound_classes_loaded;
77
78 RRDSET *st_clrremoting_context_bound_objects;
79 RRDDIM *rd_clrremoting_context_bound_objects;
80
81 RRDSET *st_clrremoting_context_proxies;
82 RRDDIM *rd_clrremoting_context_proxies;
83
84 RRDSET *st_clrremoting_contexts;
85 RRDDIM *rd_clrremoting_contexts;
86
87 RRDSET *st_clrremoting_remote_calls;
88 RRDDIM *rd_clrremoting_remote_calls;
89
90 RRDSET *st_clrsecurity_link_time_checks;
91 RRDDIM *rd_clrsecurity_link_time_checks;
92
93 RRDSET *st_clrsecurity_rt_checks_time;
94 RRDDIM *rd_clrsecurity_rt_checks_time;
95
96 RRDSET *st_clrsecurity_stack_walk_depth;
97 RRDDIM *rd_clrsecurity_stack_walk_depth;
98
99 RRDSET *st_clrsecurity_run_time_checks;
100 RRDDIM *rd_clrsecurity_run_time_checks;
101
102 RRDSET *st_clrlocksandthreads_queue_length;
103 RRDDIM *rd_locksandthreads_queue_length;
104
105 RRDSET *st_clrlocksandthreads_current_logical_threads;
106 RRDDIM *rd_locksandthreads_current_logical_threads;
107
108 RRDSET *st_clrlocksandthreads_current_physical_threads;
109 RRDDIM *rd_locksandthreads_current_physical_threads;
110
111 RRDSET *st_clrlocksandthreads_recognized_threads;
112 RRDDIM *rd_locksandthreads_recognized_threads;
113
114 RRDSET *st_clrlocksandthreads_contentions;
115 RRDDIM *rd_locksandthreads_contentions;
116
117 COUNTER_DATA NETFrameworkCLRExceptionThrown;
118 COUNTER_DATA NETFrameworkCLRExceptionFilters;
119 COUNTER_DATA NETFrameworkCLRExceptionFinallys;
120 COUNTER_DATA NETFrameworkCLRExceptionTotalCatchDepth;
121
122 COUNTER_DATA NETFrameworkCLRInteropCOMCallableWrappers;
123 COUNTER_DATA NETFrameworkCLRInteropMarshalling;
124 COUNTER_DATA NETFrameworkCLRInteropStubsCreated;
125
126 COUNTER_DATA NETFrameworkCLRJITMethods;
127 COUNTER_DATA NETFrameworkCLRJITPercentTime;
128 COUNTER_DATA NETFrameworkCLRJITFrequencyTime;
129 COUNTER_DATA NETFrameworkCLRJITStandardFailures;
130 COUNTER_DATA NETFrameworkCLRJITIlBytes;
131
132 COUNTER_DATA NETFrameworkCLRLoadingHeapSize;
133 COUNTER_DATA NETFrameworkCLRLoadingAppDomainsLoaded;
134 COUNTER_DATA NETFrameworkCLRLoadingAppDomainsUnloaded;
135 COUNTER_DATA NETFrameworkCLRLoadingAssembliesLoaded;
136 COUNTER_DATA NETFrameworkCLRLoadingClassesLoaded;
137 COUNTER_DATA NETFrameworkCLRLoadingClassLoadFailure;
138
139 COUNTER_DATA NETFrameworkCLRRemotingChannels;
140 COUNTER_DATA NETFrameworkCLRRemotingContextBoundClassesLoaded;
141 COUNTER_DATA NETFrameworkCLRRemotingContextBoundObjects;
142 COUNTER_DATA NETFrameworkCLRRemotingContextProxies;
143 COUNTER_DATA NETFrameworkCLRRemotingContexts;
144 COUNTER_DATA NETFrameworkCLRRemotingRemoteCalls;
145
146 COUNTER_DATA NETFrameworkCLRSecurityLinkTimeChecks;
147 COUNTER_DATA NETFrameworkCLRSecurityPercentTimeinRTChecks;
148 COUNTER_DATA NETFrameworkCLRSecurityFrequency_PerfTime;
149 COUNTER_DATA NETFrameworkCLRSecurityStackWalkDepth;
150 COUNTER_DATA NETFrameworkCLRSecurityRunTimeChecks;
151
152 COUNTER_DATA NETFrameworkCLRLocksAndThreadsQueueLength;
153 COUNTER_DATA NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads;
154 COUNTER_DATA NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads;
155 COUNTER_DATA NETFrameworkCLRLocksAndThreadsRecognizedThreads;
156 COUNTER_DATA NETFrameworkCLRLocksAndThreadsContentions;
157 };
158
159 static usec_t netframework_now_ut = 0;
160 static DICTIONARY *processes = NULL;
161
162 static inline void initialize_net_framework_processes_keys(struct net_framework_instances *p)
163 {
164 p->NETFrameworkCLRExceptionFilters.key = "# of Filters / sec";
165 p->NETFrameworkCLRExceptionFinallys.key = "# of Finallys / sec";
166 p->NETFrameworkCLRExceptionThrown.key = "# of Exceps Thrown / sec";
167 p->NETFrameworkCLRExceptionTotalCatchDepth.key = "Throw To Catch Depth / sec";
168
169 p->NETFrameworkCLRInteropCOMCallableWrappers.key = "# of CCWs";
170 p->NETFrameworkCLRInteropMarshalling.key = "# of Stubs";
171 p->NETFrameworkCLRInteropStubsCreated.key = "# of marshalling";
172
173 p->NETFrameworkCLRJITMethods.key = "# of Methods Jitted";
174 p->NETFrameworkCLRJITPercentTime.key = "% Time in Jit";
175 p->NETFrameworkCLRJITFrequencyTime.key = "IL Bytes Jitted / sec";
176 p->NETFrameworkCLRJITStandardFailures.key = "Standard Jit Failures";
177 p->NETFrameworkCLRJITIlBytes.key = "# of IL Bytes Jitted";
178
179 p->NETFrameworkCLRLoadingHeapSize.key = "Bytes in Loader Heap";
180 p->NETFrameworkCLRLoadingAppDomainsLoaded.key = "Rate of appdomains";
181 p->NETFrameworkCLRLoadingAppDomainsUnloaded.key = "Total appdomains unloaded";
182 p->NETFrameworkCLRLoadingAssembliesLoaded.key = "Total Assemblies";
183 p->NETFrameworkCLRLoadingClassesLoaded.key = "Total Classes Loaded";
184 p->NETFrameworkCLRLoadingClassLoadFailure.key = "Total # of Load Failures";
185
186 p->NETFrameworkCLRRemotingChannels.key = "Channels";
187 p->NETFrameworkCLRRemotingContextBoundClassesLoaded.key = "Context-Bound Classes Loaded";
188 p->NETFrameworkCLRRemotingContextBoundObjects.key = "Context-Bound Objects Alloc / sec";
189 p->NETFrameworkCLRRemotingContextProxies.key = "Context Proxies";
190 p->NETFrameworkCLRRemotingContexts.key = "Contexts";
191 p->NETFrameworkCLRRemotingRemoteCalls.key = "Total Remote Calls";
192
193 p->NETFrameworkCLRSecurityLinkTimeChecks.key = "# Link Time Checks";
194 p->NETFrameworkCLRSecurityPercentTimeinRTChecks.key = "% Time Sig. Authenticating";
195 p->NETFrameworkCLRSecurityFrequency_PerfTime.key = "% Time in RT checks";
196 p->NETFrameworkCLRSecurityStackWalkDepth.key = "Stack Walk Depth";
197 p->NETFrameworkCLRSecurityRunTimeChecks.key = "Total Runtime Checks";
198
199 p->NETFrameworkCLRLocksAndThreadsQueueLength.key = "Queue Length / sec";
200 p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads.key = "# of current logical Threads";
201 p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads.key = "# of current physical Threads";
202 p->NETFrameworkCLRLocksAndThreadsRecognizedThreads.key = "# of total recognized threads";
203 p->NETFrameworkCLRLocksAndThreadsContentions.key = "Total # of Contentions";
204 }
205
206 void dict_net_framework_processes_insert_cb(
207 const DICTIONARY_ITEM *item __maybe_unused,
208 void *value,
209 void *data __maybe_unused)
210 {
211 struct net_framework_instances *p = value;
212 initialize_net_framework_processes_keys(p);
213 }
214
215 static void netframework_mark_chart_obsolete(RRDSET **st)
216 {
217 if (*st)
218 rrdset_is_obsolete___safe_from_collector_thread(*st);
219
220 *st = NULL;
221 }
222
223 static void netframework_process_cleanup(struct net_framework_instances *p)
224 {
225 netframework_mark_chart_obsolete(&p->st_clrexception_thrown);
226 netframework_mark_chart_obsolete(&p->st_clrexception_filters);
227 netframework_mark_chart_obsolete(&p->st_clrexception_finallys);
228 netframework_mark_chart_obsolete(&p->st_clrexception_total_catch_depth);
229 netframework_mark_chart_obsolete(&p->st_clrinterop_com_callable_wrappers);
230 netframework_mark_chart_obsolete(&p->st_clrinterop_marshalling);
231 netframework_mark_chart_obsolete(&p->st_clrinterop_interop_stubs_created);
232 netframework_mark_chart_obsolete(&p->st_clrjit_methods);
233 netframework_mark_chart_obsolete(&p->st_clrjit_time);
234 netframework_mark_chart_obsolete(&p->st_clrjit_standard_failures);
235 netframework_mark_chart_obsolete(&p->st_clrjit_il_bytes);
236 netframework_mark_chart_obsolete(&p->st_clrloading_heap_size);
237 netframework_mark_chart_obsolete(&p->st_clrloading_app_domains_loaded);
238 netframework_mark_chart_obsolete(&p->st_clrloading_app_domains_unloaded);
239 netframework_mark_chart_obsolete(&p->st_clrloading_assemblies_loaded);
240 netframework_mark_chart_obsolete(&p->st_clrloading_classes_loaded);
241 netframework_mark_chart_obsolete(&p->st_clrloading_class_load_failure);
242 netframework_mark_chart_obsolete(&p->st_clrremoting_channels);
243 netframework_mark_chart_obsolete(&p->st_clrremoting_context_bound_classes_loaded);
244 netframework_mark_chart_obsolete(&p->st_clrremoting_context_bound_objects);
245 netframework_mark_chart_obsolete(&p->st_clrremoting_context_proxies);
246 netframework_mark_chart_obsolete(&p->st_clrremoting_contexts);
247 netframework_mark_chart_obsolete(&p->st_clrremoting_remote_calls);
248 netframework_mark_chart_obsolete(&p->st_clrsecurity_link_time_checks);
249 netframework_mark_chart_obsolete(&p->st_clrsecurity_rt_checks_time);
250 netframework_mark_chart_obsolete(&p->st_clrsecurity_stack_walk_depth);
251 netframework_mark_chart_obsolete(&p->st_clrsecurity_run_time_checks);
252 netframework_mark_chart_obsolete(&p->st_clrlocksandthreads_queue_length);
253 netframework_mark_chart_obsolete(&p->st_clrlocksandthreads_current_logical_threads);
254 netframework_mark_chart_obsolete(&p->st_clrlocksandthreads_current_physical_threads);
255 netframework_mark_chart_obsolete(&p->st_clrlocksandthreads_recognized_threads);
256 netframework_mark_chart_obsolete(&p->st_clrlocksandthreads_contentions);
257 }
258
259 static void dict_net_framework_processes_delete_cb(
260 const DICTIONARY_ITEM *item __maybe_unused,
261 void *value,
262 void *data __maybe_unused)
263 {
264 struct net_framework_instances *p = value;
265 netframework_process_cleanup(p);
266 }
267
268 static inline struct net_framework_instances *netframework_process_get(const char *name)
269 {
270 struct net_framework_instances *p = dictionary_set(processes, name, NULL, sizeof(*p));
271 p->last_collected = netframework_now_ut;
272 return p;
273 }
274
275 static void initialize(void)
276 {
277 processes = dictionary_create_advanced(
278 DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct net_framework_instances));
279
280 dictionary_register_insert_callback(processes, dict_net_framework_processes_insert_cb, NULL);
281 dictionary_register_delete_callback(processes, dict_net_framework_processes_delete_cb, NULL);
282 }
283
284 static void
285 netdata_framework_clr_exceptions(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
286 {
287 PERF_INSTANCE_DEFINITION *pi = NULL;
288 char id[RRD_ID_LENGTH_MAX + 1];
289 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
290 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
291 if (!pi)
292 break;
293
294 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
295 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
296
297 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
298 continue;
299
300 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
301
302 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRExceptionThrown)) {
303 if (!p->st_clrexception_thrown) {
304 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrexception_thrown", windows_shared_buffer);
305 netdata_fix_chart_name(id);
306 p->st_clrexception_thrown = rrdset_create_localhost(
307 "netframework",
308 id,
309 NULL,
310 "exceptions",
311 "netframework.clrexception_thrown",
312 "Thrown exceptions",
313 "exceptions/s",
314 PLUGIN_WINDOWS_NAME,
315 "PerflibNetFramework",
316 PRIO_NETFRAMEWORK_CLR_EXCEPTION_THROWN,
317 update_every,
318 RRDSET_TYPE_LINE);
319
320 p->rd_clrexception_thrown =
321 rrddim_add(p->st_clrexception_thrown, "exceptions", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
322
323 rrdlabels_add(
324 p->st_clrexception_thrown->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
325 }
326
327 rrddim_set_by_pointer(
328 p->st_clrexception_thrown,
329 p->rd_clrexception_thrown,
330 (collected_number)p->NETFrameworkCLRExceptionThrown.current.Data);
331 rrdset_done(p->st_clrexception_thrown);
332 }
333
334 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRExceptionFilters)) {
335 if (!p->st_clrexception_filters) {
336 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrexception_filters", windows_shared_buffer);
337 netdata_fix_chart_name(id);
338 p->st_clrexception_filters = rrdset_create_localhost(
339 "netframework",
340 id,
341 NULL,
342 "exceptions",
343 "netframework.clrexception_filters",
344 "Thrown exceptions filters",
345 "filters/s",
346 PLUGIN_WINDOWS_NAME,
347 "PerflibNetFramework",
348 PRIO_NETFRAMEWORK_CLR_EXCEPTION_FILTERS,
349 update_every,
350 RRDSET_TYPE_LINE);
351
352 p->rd_clrexception_filters =
353 rrddim_add(p->st_clrexception_filters, "filters", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
354
355 rrdlabels_add(
356 p->st_clrexception_filters->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
357 }
358
359 rrddim_set_by_pointer(
360 p->st_clrexception_filters,
361 p->rd_clrexception_filters,
362 (collected_number)p->NETFrameworkCLRExceptionFilters.current.Data);
363 rrdset_done(p->st_clrexception_filters);
364 }
365
366 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRExceptionFinallys)) {
367 if (!p->st_clrexception_finallys) {
368 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrexception_finallys", windows_shared_buffer);
369 netdata_fix_chart_name(id);
370 p->st_clrexception_finallys = rrdset_create_localhost(
371 "netframework",
372 id,
373 NULL,
374 "exceptions",
375 "netframework.clrexception_finallys",
376 "Executed finally blocks",
377 "finallys/s",
378 PLUGIN_WINDOWS_NAME,
379 "PerflibNetFramework",
380 PRIO_NETFRAMEWORK_CLR_EXCEPTION_FINALLYS,
381 update_every,
382 RRDSET_TYPE_LINE);
383
384 p->rd_clrexception_finallys =
385 rrddim_add(p->st_clrexception_finallys, "finallys", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
386
387 rrdlabels_add(
388 p->st_clrexception_finallys->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
389 }
390
391 rrddim_set_by_pointer(
392 p->st_clrexception_finallys,
393 p->rd_clrexception_finallys,
394 (collected_number)p->NETFrameworkCLRExceptionFinallys.current.Data);
395 rrdset_done(p->st_clrexception_finallys);
396 }
397
398 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRExceptionTotalCatchDepth)) {
399 if (!p->st_clrexception_total_catch_depth) {
400 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrexception_throw_to_catch_depth", windows_shared_buffer);
401 netdata_fix_chart_name(id);
402 p->st_clrexception_total_catch_depth = rrdset_create_localhost(
403 "netframework",
404 id,
405 NULL,
406 "exceptions",
407 "netframework.clrexception_throw_to_catch_depth",
408 "Traversed stack frames",
409 "stack_frames/s",
410 PLUGIN_WINDOWS_NAME,
411 "PerflibNetFramework",
412 PRIO_NETFRAMEWORK_CLR_EXCEPTION_THROW_TO_CATCH_DEPTH,
413 update_every,
414 RRDSET_TYPE_LINE);
415
416 p->rd_clrexception_total_catch_depth = rrddim_add(
417 p->st_clrexception_total_catch_depth, "traversed", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
418
419 rrdlabels_add(
420 p->st_clrexception_total_catch_depth->rrdlabels,
421 "process",
422 windows_shared_buffer,
423 RRDLABEL_SRC_AUTO);
424 }
425
426 rrddim_set_by_pointer(
427 p->st_clrexception_total_catch_depth,
428 p->rd_clrexception_total_catch_depth,
429 (collected_number)p->NETFrameworkCLRExceptionTotalCatchDepth.current.Data);
430 rrdset_done(p->st_clrexception_total_catch_depth);
431 }
432 }
433 }
434
435 static void netdata_framework_clr_interop(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
436 {
437 PERF_INSTANCE_DEFINITION *pi = NULL;
438 char id[RRD_ID_LENGTH_MAX + 1];
439 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
440 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
441 if (!pi)
442 break;
443
444 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
445 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
446
447 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
448 continue;
449
450 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
451
452 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRInteropCOMCallableWrappers)) {
453 if (!p->st_clrinterop_com_callable_wrappers) {
454 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrinterop_com_callable_wrappers", windows_shared_buffer);
455 netdata_fix_chart_name(id);
456 p->st_clrinterop_com_callable_wrappers = rrdset_create_localhost(
457 "netframework",
458 id,
459 NULL,
460 "interop",
461 "netframework.clrinterop_com_callable_wrappers",
462 "COM callable wrappers (CCW)",
463 "ccw/s",
464 PLUGIN_WINDOWS_NAME,
465 "PerflibNetFramework",
466 PRIO_NETFRAMEWORK_CLR_INTEROP_CCW,
467 update_every,
468 RRDSET_TYPE_LINE);
469
470 p->rd_clrinterop_com_callable_wrappers = rrddim_add(
471 p->st_clrinterop_com_callable_wrappers,
472 "com_callable_wrappers",
473 NULL,
474 1,
475 1,
476 RRD_ALGORITHM_INCREMENTAL);
477
478 rrdlabels_add(
479 p->st_clrinterop_com_callable_wrappers->rrdlabels,
480 "process",
481 windows_shared_buffer,
482 RRDLABEL_SRC_AUTO);
483 }
484
485 rrddim_set_by_pointer(
486 p->st_clrinterop_com_callable_wrappers,
487 p->rd_clrinterop_com_callable_wrappers,
488 (collected_number)p->NETFrameworkCLRInteropCOMCallableWrappers.current.Data);
489 rrdset_done(p->st_clrinterop_com_callable_wrappers);
490 }
491
492 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRInteropMarshalling)) {
493 if (!p->st_clrinterop_marshalling) {
494 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrinterop_interop_marshalling", windows_shared_buffer);
495 netdata_fix_chart_name(id);
496 p->st_clrinterop_marshalling = rrdset_create_localhost(
497 "netframework",
498 id,
499 NULL,
500 "interop",
501 "netframework.clrinterop_interop_marshallings",
502 "Arguments and return values marshallings",
503 "marshalling/s",
504 PLUGIN_WINDOWS_NAME,
505 "PerflibNetFramework",
506 PRIO_NETFRAMEWORK_CLR_INTEROP_MARSHALLING,
507 update_every,
508 RRDSET_TYPE_LINE);
509
510 p->rd_clrinterop_marshalling =
511 rrddim_add(p->st_clrinterop_marshalling, "marshallings", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
512
513 rrdlabels_add(
514 p->st_clrinterop_marshalling->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
515 }
516
517 rrddim_set_by_pointer(
518 p->st_clrinterop_marshalling,
519 p->rd_clrinterop_marshalling,
520 (collected_number)p->NETFrameworkCLRInteropMarshalling.current.Data);
521 rrdset_done(p->st_clrinterop_marshalling);
522 }
523
524 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRInteropStubsCreated)) {
525 if (!p->st_clrinterop_interop_stubs_created) {
526 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrinterop_interop_stubs_created", windows_shared_buffer);
527 netdata_fix_chart_name(id);
528 p->st_clrinterop_interop_stubs_created = rrdset_create_localhost(
529 "netframework",
530 id,
531 NULL,
532 "interop",
533 "netframework.clrinterop_interop_stubs_created",
534 "Created stubs",
535 "stubs/s",
536 PLUGIN_WINDOWS_NAME,
537 "PerflibNetFramework",
538 PRIO_NETFRAMEWORK_CLR_INTEROP_STUBS_CREATED,
539 update_every,
540 RRDSET_TYPE_LINE);
541
542 p->rd_clrinterop_interop_stubs_created = rrddim_add(
543 p->st_clrinterop_interop_stubs_created, "created", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
544
545 rrdlabels_add(
546 p->st_clrinterop_interop_stubs_created->rrdlabels,
547 "process",
548 windows_shared_buffer,
549 RRDLABEL_SRC_AUTO);
550 }
551
552 rrddim_set_by_pointer(
553 p->st_clrinterop_interop_stubs_created,
554 p->rd_clrinterop_interop_stubs_created,
555 (collected_number)p->NETFrameworkCLRInteropStubsCreated.current.Data);
556 rrdset_done(p->st_clrinterop_interop_stubs_created);
557 }
558 }
559 }
560
561 static void netdata_framework_clr_jit(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
562 {
563 PERF_INSTANCE_DEFINITION *pi = NULL;
564 char id[RRD_ID_LENGTH_MAX + 1];
565 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
566 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
567 if (!pi)
568 break;
569
570 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
571 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
572
573 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
574 continue;
575
576 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
577
578 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRJITMethods)) {
579 if (!p->st_clrjit_methods) {
580 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrjit_methods", windows_shared_buffer);
581 netdata_fix_chart_name(id);
582 p->st_clrjit_methods = rrdset_create_localhost(
583 "netframework",
584 id,
585 NULL,
586 "jit",
587 "netframework.clrjit_methods",
588 "JIT-compiled methods",
589 "methods/s",
590 PLUGIN_WINDOWS_NAME,
591 "PerflibNetFramework",
592 PRIO_NETFRAMEWORK_CLR_JIT_METHODS,
593 update_every,
594 RRDSET_TYPE_LINE);
595
596 p->rd_clrjit_methods =
597 rrddim_add(p->st_clrjit_methods, "jit-compiled", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
598
599 rrdlabels_add(p->st_clrjit_methods->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
600 }
601
602 rrddim_set_by_pointer(
603 p->st_clrjit_methods,
604 p->rd_clrjit_methods,
605 (collected_number)p->NETFrameworkCLRJITMethods.current.Data);
606 rrdset_done(p->st_clrjit_methods);
607 }
608
609 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRJITFrequencyTime) &&
610 perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRJITPercentTime)) {
611 if (!p->st_clrjit_time) {
612 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrjit_time", windows_shared_buffer);
613 netdata_fix_chart_name(id);
614 p->st_clrjit_time = rrdset_create_localhost(
615 "netframework",
616 id,
617 NULL,
618 "jit",
619 "netframework.clrjit_time",
620 "Time spent in JIT compilation",
621 "percentage",
622 PLUGIN_WINDOWS_NAME,
623 "PerflibNetFramework",
624 PRIO_NETFRAMEWORK_CLR_JIT_TIME,
625 update_every,
626 RRDSET_TYPE_LINE);
627
628 p->rd_clrjit_time = rrddim_add(p->st_clrjit_time, "time", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
629
630 rrdlabels_add(p->st_clrjit_time->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
631 }
632
633 double percTime = (double)p->NETFrameworkCLRJITPercentTime.current.Data;
634 percTime /= (double)p->NETFrameworkCLRJITFrequencyTime.current.Data;
635 percTime *= 100;
636 rrddim_set_by_pointer(p->st_clrjit_time, p->rd_clrjit_time, (collected_number)percTime);
637 rrdset_done(p->st_clrjit_time);
638 }
639
640 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRJITStandardFailures)) {
641 if (!p->st_clrjit_standard_failures) {
642 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrjit_standard_failures", windows_shared_buffer);
643 netdata_fix_chart_name(id);
644 p->st_clrjit_standard_failures = rrdset_create_localhost(
645 "netframework",
646 id,
647 NULL,
648 "jit",
649 "netframework.clrjit_standard_failures",
650 "JIT compiler failures",
651 "failures/s",
652 PLUGIN_WINDOWS_NAME,
653 "PerflibNetFramework",
654 PRIO_NETFRAMEWORK_CLR_JIT_STANDARD_FAILURES,
655 update_every,
656 RRDSET_TYPE_LINE);
657
658 p->rd_clrjit_standard_failures =
659 rrddim_add(p->st_clrjit_standard_failures, "failures", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
660
661 rrdlabels_add(
662 p->st_clrjit_standard_failures->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
663 }
664
665 rrddim_set_by_pointer(
666 p->st_clrjit_standard_failures,
667 p->rd_clrjit_standard_failures,
668 (collected_number)p->NETFrameworkCLRJITStandardFailures.current.Data);
669 rrdset_done(p->st_clrjit_standard_failures);
670 }
671
672 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRJITIlBytes)) {
673 if (!p->st_clrjit_il_bytes) {
674 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrjit_il_bytes", windows_shared_buffer);
675 netdata_fix_chart_name(id);
676 p->st_clrjit_il_bytes = rrdset_create_localhost(
677 "netframework",
678 id,
679 NULL,
680 "jit",
681 "netframework.clrjit_il_bytes",
682 "Compiled Microsoft intermediate language (MSIL) bytes",
683 "bytes/s",
684 PLUGIN_WINDOWS_NAME,
685 "PerflibNetFramework",
686 PRIO_NETFRAMEWORK_CLR_JIT_IL_BYTES,
687 update_every,
688 RRDSET_TYPE_LINE);
689
690 p->rd_clrjit_il_bytes =
691 rrddim_add(p->st_clrjit_il_bytes, "compiled_msil", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
692
693 rrdlabels_add(p->st_clrjit_il_bytes->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
694 }
695
696 rrddim_set_by_pointer(
697 p->st_clrjit_il_bytes,
698 p->rd_clrjit_il_bytes,
699 (collected_number)p->NETFrameworkCLRJITIlBytes.current.Data);
700 rrdset_done(p->st_clrjit_il_bytes);
701 }
702 }
703 }
704
705 static void netdata_framework_clr_loading(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
706 {
707 char id[RRD_ID_LENGTH_MAX + 1];
708 PERF_INSTANCE_DEFINITION *pi = NULL;
709 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
710 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
711 if (!pi)
712 break;
713
714 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
715 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
716
717 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
718 continue;
719
720 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
721
722 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingHeapSize)) {
723 if (!p->st_clrloading_heap_size) {
724 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_loader_heap_size", windows_shared_buffer);
725 netdata_fix_chart_name(id);
726 p->st_clrloading_heap_size = rrdset_create_localhost(
727 "netframework",
728 id,
729 NULL,
730 "loading",
731 "netframework.clrloading_loader_heap_size",
732 "Memory committed by class loader",
733 "bytes",
734 PLUGIN_WINDOWS_NAME,
735 "PerflibNetFramework",
736 PRIO_NETFRAMEWORK_CLR_LOADING_HEAP_SIZE,
737 update_every,
738 RRDSET_TYPE_LINE);
739
740 p->rd_clrloading_heap_size =
741 rrddim_add(p->st_clrloading_heap_size, "committed", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
742
743 rrdlabels_add(
744 p->st_clrloading_heap_size->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
745 }
746
747 rrddim_set_by_pointer(
748 p->st_clrloading_heap_size,
749 p->rd_clrloading_heap_size,
750 (collected_number)p->NETFrameworkCLRLoadingHeapSize.current.Data);
751 rrdset_done(p->st_clrloading_heap_size);
752 }
753
754 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingAppDomainsLoaded)) {
755 if (!p->st_clrloading_app_domains_loaded) {
756 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_appdomains_loaded", windows_shared_buffer);
757 netdata_fix_chart_name(id);
758 p->st_clrloading_app_domains_loaded = rrdset_create_localhost(
759 "netframework",
760 id,
761 NULL,
762 "loading",
763 "netframework.clrloading_appdomains_loaded",
764 "Loaded application domains",
765 "domain/s",
766 PLUGIN_WINDOWS_NAME,
767 "PerflibNetFramework",
768 PRIO_NETFRAMEWORK_CLR_LOADING_APP_DOMAINS_LOADED,
769 update_every,
770 RRDSET_TYPE_LINE);
771
772 p->rd_clrloading_app_domains_loaded =
773 rrddim_add(p->st_clrloading_app_domains_loaded, "loaded", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
774
775 rrdlabels_add(
776 p->st_clrloading_app_domains_loaded->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
777 }
778
779 rrddim_set_by_pointer(
780 p->st_clrloading_app_domains_loaded,
781 p->rd_clrloading_app_domains_loaded,
782 (collected_number)p->NETFrameworkCLRLoadingAppDomainsLoaded.current.Data);
783 rrdset_done(p->st_clrloading_app_domains_loaded);
784 }
785
786 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingAppDomainsUnloaded)) {
787 if (!p->st_clrloading_app_domains_unloaded) {
788 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_appdomains_unloaded", windows_shared_buffer);
789 netdata_fix_chart_name(id);
790 p->st_clrloading_app_domains_unloaded = rrdset_create_localhost(
791 "netframework",
792 id,
793 NULL,
794 "loading",
795 "netframework.clrloading_appdomains_unloaded",
796 "Unloaded application domains",
797 "domain/s",
798 PLUGIN_WINDOWS_NAME,
799 "PerflibNetFramework",
800 PRIO_NETFRAMEWORK_CLR_LOADING_APP_DOMAINS_UNLOADED,
801 update_every,
802 RRDSET_TYPE_LINE);
803
804 p->rd_clrloading_app_domains_unloaded = rrddim_add(
805 p->st_clrloading_app_domains_unloaded, "unloaded", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
806
807 rrdlabels_add(
808 p->st_clrloading_app_domains_unloaded->rrdlabels,
809 "process",
810 windows_shared_buffer,
811 RRDLABEL_SRC_AUTO);
812 }
813
814 rrddim_set_by_pointer(
815 p->st_clrloading_app_domains_unloaded,
816 p->rd_clrloading_app_domains_unloaded,
817 (collected_number)p->NETFrameworkCLRLoadingAppDomainsUnloaded.current.Data);
818 rrdset_done(p->st_clrloading_app_domains_unloaded);
819 }
820
821 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingAssembliesLoaded)) {
822 if (!p->st_clrloading_assemblies_loaded) {
823 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_assemblies_loaded", windows_shared_buffer);
824 netdata_fix_chart_name(id);
825 p->st_clrloading_assemblies_loaded = rrdset_create_localhost(
826 "netframework",
827 id,
828 NULL,
829 "loading",
830 "netframework.clrloading_assemblies_loaded",
831 "Loaded assemblies",
832 "assemblies/s",
833 PLUGIN_WINDOWS_NAME,
834 "PerflibNetFramework",
835 PRIO_NETFRAMEWORK_CLR_LOADING_ASSEMBLIES_LOADED,
836 update_every,
837 RRDSET_TYPE_LINE);
838
839 p->rd_clrloading_assemblies_loaded =
840 rrddim_add(p->st_clrloading_assemblies_loaded, "loaded", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
841
842 rrdlabels_add(
843 p->st_clrloading_assemblies_loaded->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
844 }
845
846 rrddim_set_by_pointer(
847 p->st_clrloading_assemblies_loaded,
848 p->rd_clrloading_assemblies_loaded,
849 (collected_number)p->NETFrameworkCLRLoadingAssembliesLoaded.current.Data);
850 rrdset_done(p->st_clrloading_assemblies_loaded);
851 }
852
853 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingClassesLoaded)) {
854 if (!p->st_clrloading_classes_loaded) {
855 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_classes_loaded", windows_shared_buffer);
856 netdata_fix_chart_name(id);
857 p->st_clrloading_classes_loaded = rrdset_create_localhost(
858 "netframework",
859 id,
860 NULL,
861 "loading",
862 "netframework.clrloading_classes_loaded",
863 "Loaded classes in all assemblies",
864 "classes/s",
865 PLUGIN_WINDOWS_NAME,
866 "PerflibNetFramework",
867 PRIO_NETFRAMEWORK_CLR_LOADING_CLASSES_LOADED,
868 update_every,
869 RRDSET_TYPE_LINE);
870
871 p->rd_clrloading_classes_loaded =
872 rrddim_add(p->st_clrloading_classes_loaded, "loaded", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
873
874 rrdlabels_add(
875 p->st_clrloading_classes_loaded->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
876 }
877
878 rrddim_set_by_pointer(
879 p->st_clrloading_classes_loaded,
880 p->rd_clrloading_classes_loaded,
881 (collected_number)p->NETFrameworkCLRLoadingClassesLoaded.current.Data);
882 rrdset_done(p->st_clrloading_classes_loaded);
883 }
884
885 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLoadingClassLoadFailure)) {
886 if (!p->st_clrloading_class_load_failure) {
887 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrloading_class_load_failure", windows_shared_buffer);
888 netdata_fix_chart_name(id);
889 p->st_clrloading_class_load_failure = rrdset_create_localhost(
890 "netframework",
891 id,
892 NULL,
893 "loading",
894 "netframework.clrloading_class_load_failures",
895 "Class load failures",
896 "failures/s",
897 PLUGIN_WINDOWS_NAME,
898 "PerflibNetFramework",
899 PRIO_NETFRAMEWORK_CLR_LOADING_CLASS_LOAD_FAILURE,
900 update_every,
901 RRDSET_TYPE_LINE);
902
903 p->rd_clrloading_class_load_failure = rrddim_add(
904 p->st_clrloading_class_load_failure, "class_load", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
905
906 rrdlabels_add(
907 p->st_clrloading_class_load_failure->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
908 }
909
910 rrddim_set_by_pointer(
911 p->st_clrloading_class_load_failure,
912 p->rd_clrloading_class_load_failure,
913 (collected_number)p->NETFrameworkCLRLoadingClassLoadFailure.current.Data);
914 rrdset_done(p->st_clrloading_class_load_failure);
915 }
916 }
917 }
918
919 static void netdata_framework_clr_remoting(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
920 {
921 char id[RRD_ID_LENGTH_MAX + 1];
922 PERF_INSTANCE_DEFINITION *pi = NULL;
923 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
924 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
925 if (!pi)
926 break;
927
928 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
929 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
930
931 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
932 continue;
933
934 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
935
936 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingChannels)) {
937 if (!p->st_clrremoting_channels) {
938 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_channels", windows_shared_buffer);
939 netdata_fix_chart_name(id);
940 p->st_clrremoting_channels = rrdset_create_localhost(
941 "netframework",
942 id,
943 NULL,
944 "remoting",
945 "netframework.clrremoting_channels",
946 "Registered channels",
947 "channels/s",
948 PLUGIN_WINDOWS_NAME,
949 "PerflibNetFramework",
950 PRIO_NETFRAMEWORK_CLR_REMOTING_CHANNELS,
951 update_every,
952 RRDSET_TYPE_LINE);
953
954 p->rd_clrremoting_channels =
955 rrddim_add(p->st_clrremoting_channels, "registered", "registered", 1, 1, RRD_ALGORITHM_INCREMENTAL);
956
957 rrdlabels_add(
958 p->st_clrremoting_channels->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
959 }
960
961 rrddim_set_by_pointer(
962 p->st_clrremoting_channels,
963 p->rd_clrremoting_channels,
964 (collected_number)p->NETFrameworkCLRRemotingChannels.current.Data);
965 rrdset_done(p->st_clrremoting_channels);
966 }
967
968 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextBoundClassesLoaded)) {
969 if (!p->st_clrremoting_context_bound_classes_loaded) {
970 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_bound_classes_loaded", windows_shared_buffer);
971 netdata_fix_chart_name(id);
972 p->st_clrremoting_context_bound_classes_loaded = rrdset_create_localhost(
973 "netframework",
974 id,
975 NULL,
976 "remoting",
977 "netframework.clrremoting_context_bound_classes_loaded",
978 "Loaded context-bound classes",
979 "classes",
980 PLUGIN_WINDOWS_NAME,
981 "PerflibNetFramework",
982 PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_CLASSES_LOADED,
983 update_every,
984 RRDSET_TYPE_LINE);
985
986 p->rd_clrremoting_context_bound_classes_loaded = rrddim_add(
987 p->st_clrremoting_context_bound_classes_loaded, "loaded", "loaded", 1, 1, RRD_ALGORITHM_ABSOLUTE);
988
989 rrdlabels_add(
990 p->st_clrremoting_context_bound_classes_loaded->rrdlabels,
991 "process",
992 windows_shared_buffer,
993 RRDLABEL_SRC_AUTO);
994 }
995
996 rrddim_set_by_pointer(
997 p->st_clrremoting_context_bound_classes_loaded,
998 p->rd_clrremoting_context_bound_classes_loaded,
999 (collected_number)p->NETFrameworkCLRRemotingContextBoundClassesLoaded.current.Data);
1000 rrdset_done(p->st_clrremoting_context_bound_classes_loaded);
1001 }
1002
1003 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextBoundObjects)) {
1004 if (!p->st_clrremoting_context_bound_objects) {
1005 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_bound_objects", windows_shared_buffer);
1006 netdata_fix_chart_name(id);
1007 p->st_clrremoting_context_bound_objects = rrdset_create_localhost(
1008 "netframework",
1009 id,
1010 NULL,
1011 "remoting",
1012 "netframework.clrremoting_context_bound_objects",
1013 "Allocated context-bound objects",
1014 "objects/s",
1015 PLUGIN_WINDOWS_NAME,
1016 "PerflibNetFramework",
1017 PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_OBJECTS,
1018 update_every,
1019 RRDSET_TYPE_LINE);
1020
1021 p->rd_clrremoting_context_bound_objects = rrddim_add(
1022 p->st_clrremoting_context_bound_objects, "allocated", "allocated", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1023
1024 rrdlabels_add(
1025 p->st_clrremoting_context_bound_objects->rrdlabels,
1026 "process",
1027 windows_shared_buffer,
1028 RRDLABEL_SRC_AUTO);
1029 }
1030
1031 rrddim_set_by_pointer(
1032 p->st_clrremoting_context_bound_objects,
1033 p->rd_clrremoting_context_bound_objects,
1034 (collected_number)p->NETFrameworkCLRRemotingContextBoundObjects.current.Data);
1035 rrdset_done(p->st_clrremoting_context_bound_objects);
1036 }
1037 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextProxies)) {
1038 if (!p->st_clrremoting_context_proxies) {
1039 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_proxies", windows_shared_buffer);
1040 netdata_fix_chart_name(id);
1041 p->st_clrremoting_context_proxies = rrdset_create_localhost(
1042 "netframework",
1043 id,
1044 NULL,
1045 "remoting",
1046 "netframework.clrremoting_context_proxies",
1047 "Remoting proxy objects",
1048 "objects/s",
1049 PLUGIN_WINDOWS_NAME,
1050 "PerflibNetFramework",
1051 PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS_PROXIES,
1052 update_every,
1053 RRDSET_TYPE_LINE);
1054
1055 p->rd_clrremoting_context_proxies =
1056 rrddim_add(p->st_clrremoting_context_proxies, "objects", "objects", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1057
1058 rrdlabels_add(
1059 p->st_clrremoting_context_proxies->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1060 }
1061
1062 rrddim_set_by_pointer(
1063 p->st_clrremoting_context_proxies,
1064 p->rd_clrremoting_context_proxies,
1065 (collected_number)p->NETFrameworkCLRRemotingContextProxies.current.Data);
1066 rrdset_done(p->st_clrremoting_context_proxies);
1067 }
1068
1069 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContexts)) {
1070 if (!p->st_clrremoting_contexts) {
1071 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_contexts", windows_shared_buffer);
1072 netdata_fix_chart_name(id);
1073 p->st_clrremoting_contexts = rrdset_create_localhost(
1074 "netframework",
1075 id,
1076 NULL,
1077 "remoting",
1078 "netframework.clrremoting_contexts",
1079 "Total of remoting contexts",
1080 "contexts",
1081 PLUGIN_WINDOWS_NAME,
1082 "PerflibNetFramework",
1083 PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS,
1084 update_every,
1085 RRDSET_TYPE_LINE);
1086
1087 p->rd_clrremoting_contexts =
1088 rrddim_add(p->st_clrremoting_contexts, "contexts", "contexts", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1089
1090 rrdlabels_add(
1091 p->st_clrremoting_contexts->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1092 }
1093
1094 rrddim_set_by_pointer(
1095 p->st_clrremoting_contexts,
1096 p->rd_clrremoting_contexts,
1097 (collected_number)p->NETFrameworkCLRRemotingContexts.current.Data);
1098 rrdset_done(p->st_clrremoting_contexts);
1099 }
1100
1101 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingRemoteCalls)) {
1102 if (!p->st_clrremoting_remote_calls) {
1103 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_calls", windows_shared_buffer);
1104 netdata_fix_chart_name(id);
1105 p->st_clrremoting_remote_calls = rrdset_create_localhost(
1106 "netframework",
1107 id,
1108 NULL,
1109 "remoting",
1110 "netframework.clrremoting_remote_calls",
1111 "Remote Procedure Calls (RPC) invoked",
1112 "calls/s",
1113 PLUGIN_WINDOWS_NAME,
1114 "PerflibNetFramework",
1115 PRIO_NETFRAMEWORK_CLR_REMOTING_REMOTE_CALLS,
1116 update_every,
1117 RRDSET_TYPE_LINE);
1118
1119 p->rd_clrremoting_remote_calls =
1120 rrddim_add(p->st_clrremoting_remote_calls, "calls", "calls", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1121
1122 rrdlabels_add(
1123 p->st_clrremoting_remote_calls->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1124 }
1125
1126 rrddim_set_by_pointer(
1127 p->st_clrremoting_remote_calls,
1128 p->rd_clrremoting_remote_calls,
1129 (collected_number)p->NETFrameworkCLRRemotingRemoteCalls.current.Data);
1130 rrdset_done(p->st_clrremoting_remote_calls);
1131 }
1132 }
1133 }
1134
1135 static void netdata_framework_clr_security(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
1136 {
1137 char id[RRD_ID_LENGTH_MAX + 1];
1138 PERF_INSTANCE_DEFINITION *pi = NULL;
1139 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1140 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1141 if (!pi)
1142 break;
1143
1144 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1145 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1146
1147 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
1148 continue;
1149
1150 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
1151
1152 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityLinkTimeChecks)) {
1153 if (!p->st_clrsecurity_link_time_checks) {
1154 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_link_time_checks", windows_shared_buffer);
1155 netdata_fix_chart_name(id);
1156 p->st_clrsecurity_link_time_checks = rrdset_create_localhost(
1157 "netframework",
1158 id,
1159 NULL,
1160 "security",
1161 "netframework.clrsecurity_link_time_checks",
1162 "Link-time code access security checks",
1163 "checks/s",
1164 PLUGIN_WINDOWS_NAME,
1165 "PerflibNetFramework",
1166 PRIO_NETFRAMEWORK_CLR_SECURITY_LINK_TIME_CHECKS,
1167 update_every,
1168 RRDSET_TYPE_LINE);
1169
1170 p->rd_clrsecurity_link_time_checks =
1171 rrddim_add(p->st_clrsecurity_link_time_checks, "linktime", "linktime", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1172
1173 rrdlabels_add(
1174 p->st_clrsecurity_link_time_checks->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1175 }
1176
1177 rrddim_set_by_pointer(
1178 p->st_clrsecurity_link_time_checks,
1179 p->rd_clrsecurity_link_time_checks,
1180 (collected_number)p->NETFrameworkCLRSecurityLinkTimeChecks.current.Data);
1181 rrdset_done(p->st_clrsecurity_link_time_checks);
1182 }
1183
1184 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityPercentTimeinRTChecks) &&
1185 perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityFrequency_PerfTime)) {
1186 if (!p->st_clrsecurity_rt_checks_time) {
1187 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_checks_time", windows_shared_buffer);
1188 netdata_fix_chart_name(id);
1189 p->st_clrsecurity_rt_checks_time = rrdset_create_localhost(
1190 "netframework",
1191 id,
1192 NULL,
1193 "security",
1194 "netframework.clrsecurity_checks_time",
1195 "Time spent performing runtime code access security checks.",
1196 "percentage",
1197 PLUGIN_WINDOWS_NAME,
1198 "PerflibNetFramework",
1199 PRIO_NETFRAMEWORK_CLR_SECURITY_RT_CHECKS_TIME,
1200 update_every,
1201 RRDSET_TYPE_LINE);
1202
1203 p->rd_clrsecurity_rt_checks_time =
1204 rrddim_add(p->st_clrsecurity_rt_checks_time, "time", "time", 1, 100, RRD_ALGORITHM_ABSOLUTE);
1205
1206 rrdlabels_add(
1207 p->st_clrsecurity_rt_checks_time->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1208 }
1209
1210 NETDATA_DOUBLE value = (NETDATA_DOUBLE)p->NETFrameworkCLRSecurityPercentTimeinRTChecks.current.Data;
1211 value /= (NETDATA_DOUBLE)p->NETFrameworkCLRSecurityFrequency_PerfTime.current.Data;
1212
1213 rrddim_set_by_pointer(
1214 p->st_clrsecurity_rt_checks_time,
1215 p->rd_clrsecurity_rt_checks_time,
1216 (collected_number)(value * 100.0));
1217 rrdset_done(p->st_clrsecurity_rt_checks_time);
1218 }
1219
1220 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityStackWalkDepth)) {
1221 if (!p->st_clrsecurity_stack_walk_depth) {
1222 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_stack_walk_depth", windows_shared_buffer);
1223 netdata_fix_chart_name(id);
1224 p->st_clrsecurity_stack_walk_depth = rrdset_create_localhost(
1225 "netframework",
1226 id,
1227 NULL,
1228 "security",
1229 "netframework.clrsecurity_stack_walk_depth",
1230 "Depth of the stack",
1231 "depth",
1232 PLUGIN_WINDOWS_NAME,
1233 "PerflibNetFramework",
1234 PRIO_NETFRAMEWORK_CLR_SECURITY_STACK_WALK_DEPTH,
1235 update_every,
1236 RRDSET_TYPE_LINE);
1237
1238 p->rd_clrsecurity_stack_walk_depth =
1239 rrddim_add(p->st_clrsecurity_stack_walk_depth, "stack", "stack", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1240
1241 rrdlabels_add(
1242 p->st_clrsecurity_stack_walk_depth->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1243 }
1244
1245 rrddim_set_by_pointer(
1246 p->st_clrsecurity_stack_walk_depth,
1247 p->rd_clrsecurity_stack_walk_depth,
1248 (collected_number)p->NETFrameworkCLRSecurityStackWalkDepth.current.Data);
1249 rrdset_done(p->st_clrsecurity_stack_walk_depth);
1250 }
1251
1252 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityRunTimeChecks)) {
1253 if (!p->st_clrsecurity_run_time_checks) {
1254 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_runtime_checks", windows_shared_buffer);
1255 netdata_fix_chart_name(id);
1256 p->st_clrsecurity_run_time_checks = rrdset_create_localhost(
1257 "netframework",
1258 id,
1259 NULL,
1260 "security",
1261 "netframework.clrsecurity_runtime_checks",
1262 "Runtime code access security checks performed",
1263 "checks/s",
1264 PLUGIN_WINDOWS_NAME,
1265 "PerflibNetFramework",
1266 PRIO_NETFRAMEWORK_CLR_SECURITY_RUNTIME_CHECKS,
1267 update_every,
1268 RRDSET_TYPE_LINE);
1269
1270 p->rd_clrsecurity_run_time_checks =
1271 rrddim_add(p->st_clrsecurity_run_time_checks, "runtime", "runtime", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1272
1273 rrdlabels_add(
1274 p->st_clrsecurity_run_time_checks->rrdlabels, "process", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1275 }
1276
1277 rrddim_set_by_pointer(
1278 p->st_clrsecurity_run_time_checks,
1279 p->rd_clrsecurity_run_time_checks,
1280 (collected_number)p->NETFrameworkCLRSecurityRunTimeChecks.current.Data);
1281 rrdset_done(p->st_clrsecurity_run_time_checks);
1282 }
1283 }
1284 }
1285
1286 static void
1287 netdata_framework_clr_locks_and_threads(PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, int update_every)
1288 {
1289 char id[RRD_ID_LENGTH_MAX + 1];
1290 PERF_INSTANCE_DEFINITION *pi = NULL;
1291 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1292 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1293 if (!pi)
1294 break;
1295
1296 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1297 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1298
1299 if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
1300 continue;
1301
1302 struct net_framework_instances *p = netframework_process_get(windows_shared_buffer);
1303
1304 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsQueueLength)) {
1305 if (!p->st_clrlocksandthreads_queue_length) {
1306 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_queue_length", windows_shared_buffer);
1307 netdata_fix_chart_name(id);
1308 p->st_clrlocksandthreads_queue_length = rrdset_create_localhost(
1309 "netframework",
1310 id,
1311 NULL,
1312 "locks threads",
1313 "netframework.clrlocksandthreads_queue_length",
1314 "Threads waited to acquire a managed lock",
1315 "threads/s",
1316 PLUGIN_WINDOWS_NAME,
1317 "PerflibNetFramework",
1318 PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_QUEUE_LENGTH,
1319 update_every,
1320 RRDSET_TYPE_LINE);
1321
1322 p->rd_locksandthreads_queue_length =
1323 rrddim_add(p->st_clrlocksandthreads_queue_length, "threads", "threads", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1324
1325 rrdlabels_add(
1326 p->st_clrlocksandthreads_queue_length->rrdlabels,
1327 "process",
1328 windows_shared_buffer,
1329 RRDLABEL_SRC_AUTO);
1330 }
1331
1332 rrddim_set_by_pointer(
1333 p->st_clrlocksandthreads_queue_length,
1334 p->rd_locksandthreads_queue_length,
1335 (collected_number)p->NETFrameworkCLRLocksAndThreadsQueueLength.current.Data);
1336 rrdset_done(p->st_clrlocksandthreads_queue_length);
1337 }
1338
1339 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads)) {
1340 if (!p->st_clrlocksandthreads_current_logical_threads) {
1341 snprintfz(
1342 id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_current_logical_threads", windows_shared_buffer);
1343 netdata_fix_chart_name(id);
1344 p->st_clrlocksandthreads_current_logical_threads = rrdset_create_localhost(
1345 "netframework",
1346 id,
1347 NULL,
1348 "locks threads",
1349 "netframework.clrlocksandthreads_current_logical_threads",
1350 "Logical threads",
1351 "threads",
1352 PLUGIN_WINDOWS_NAME,
1353 "PerflibNetFramework",
1354 PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_LOGICAL_THREADS,
1355 update_every,
1356 RRDSET_TYPE_LINE);
1357
1358 p->rd_locksandthreads_current_logical_threads = rrddim_add(
1359 p->st_clrlocksandthreads_current_logical_threads, "logical", "logical", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1360
1361 rrdlabels_add(
1362 p->st_clrlocksandthreads_current_logical_threads->rrdlabels,
1363 "process",
1364 windows_shared_buffer,
1365 RRDLABEL_SRC_AUTO);
1366 }
1367
1368 rrddim_set_by_pointer(
1369 p->st_clrlocksandthreads_current_logical_threads,
1370 p->rd_locksandthreads_current_logical_threads,
1371 (collected_number)p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads.current.Data);
1372 rrdset_done(p->st_clrlocksandthreads_current_logical_threads);
1373 }
1374
1375 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads)) {
1376 if (!p->st_clrlocksandthreads_current_physical_threads) {
1377 snprintfz(
1378 id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_current_physical_threads", windows_shared_buffer);
1379 netdata_fix_chart_name(id);
1380 p->st_clrlocksandthreads_current_physical_threads = rrdset_create_localhost(
1381 "netframework",
1382 id,
1383 NULL,
1384 "locks threads",
1385 "netframework.clrlocksandthreads_current_physical_threads",
1386 "Physical threads",
1387 "threads",
1388 PLUGIN_WINDOWS_NAME,
1389 "PerflibNetFramework",
1390 PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CURRENT_PHYSICAL_THREADS,
1391 update_every,
1392 RRDSET_TYPE_LINE);
1393
1394 p->rd_locksandthreads_current_physical_threads = rrddim_add(
1395 p->st_clrlocksandthreads_current_physical_threads, "physical", "physical", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1396
1397 rrdlabels_add(
1398 p->st_clrlocksandthreads_current_physical_threads->rrdlabels,
1399 "process",
1400 windows_shared_buffer,
1401 RRDLABEL_SRC_AUTO);
1402 }
1403
1404 rrddim_set_by_pointer(
1405 p->st_clrlocksandthreads_current_physical_threads,
1406 p->rd_locksandthreads_current_physical_threads,
1407 (collected_number)p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads.current.Data);
1408 rrdset_done(p->st_clrlocksandthreads_current_physical_threads);
1409 }
1410
1411 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsRecognizedThreads)) {
1412 if (!p->st_clrlocksandthreads_recognized_threads) {
1413 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_recognized_threads", windows_shared_buffer);
1414 netdata_fix_chart_name(id);
1415 p->st_clrlocksandthreads_recognized_threads = rrdset_create_localhost(
1416 "netframework",
1417 id,
1418 NULL,
1419 "locks threads",
1420 "netframework.clrlocksandthreads_recognized_threads",
1421 "Threads recognized by the runtime",
1422 "threads/s",
1423 PLUGIN_WINDOWS_NAME,
1424 "PerflibNetFramework",
1425 PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_RECOGNIZED_THREADS,
1426 update_every,
1427 RRDSET_TYPE_LINE);
1428
1429 p->rd_locksandthreads_recognized_threads = rrddim_add(
1430 p->st_clrlocksandthreads_recognized_threads, "threads", "threads", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1431
1432 rrdlabels_add(
1433 p->st_clrlocksandthreads_recognized_threads->rrdlabels,
1434 "process",
1435 windows_shared_buffer,
1436 RRDLABEL_SRC_AUTO);
1437 }
1438
1439 rrddim_set_by_pointer(
1440 p->st_clrlocksandthreads_recognized_threads,
1441 p->rd_locksandthreads_recognized_threads,
1442 (collected_number)p->NETFrameworkCLRLocksAndThreadsRecognizedThreads.current.Data);
1443 rrdset_done(p->st_clrlocksandthreads_recognized_threads);
1444 }
1445
1446 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsContentions)) {
1447 if (!p->st_clrlocksandthreads_contentions) {
1448 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_contentions", windows_shared_buffer);
1449 netdata_fix_chart_name(id);
1450 p->st_clrlocksandthreads_contentions = rrdset_create_localhost(
1451 "netframework",
1452 id,
1453 NULL,
1454 "locks threads",
1455 "netframework.clrlocksandthreads_contentions",
1456 "Fails to acquire a managed lock",
1457 "contentions/s",
1458 PLUGIN_WINDOWS_NAME,
1459 "PerflibNetFramework",
1460 PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CONTENTIONS,
1461 update_every,
1462 RRDSET_TYPE_LINE);
1463
1464 p->rd_locksandthreads_contentions = rrddim_add(
1465 p->st_clrlocksandthreads_contentions, "contentions", "contentions", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1466
1467 rrdlabels_add(
1468 p->st_clrlocksandthreads_contentions->rrdlabels,
1469 "process",
1470 windows_shared_buffer,
1471 RRDLABEL_SRC_AUTO);
1472 }
1473
1474 rrddim_set_by_pointer(
1475 p->st_clrlocksandthreads_contentions,
1476 p->rd_locksandthreads_contentions,
1477 (collected_number)p->NETFrameworkCLRLocksAndThreadsContentions.current.Data);
1478 rrdset_done(p->st_clrlocksandthreads_contentions);
1479 }
1480 }
1481 }
1482
1483 struct netdata_netframework_objects {
1484 char *object;
1485 void (*fnct)(PERF_DATA_BLOCK *, PERF_OBJECT_TYPE *, int);
1486 } netframewrk_obj[NETDATA_NETFRAMEWORK_END] = {
1487 {.fnct = netdata_framework_clr_exceptions, .object = ".NET CLR Exceptions"},
1488 {.fnct = netdata_framework_clr_interop, .object = ".NET CLR Interop"},
1489 {.fnct = netdata_framework_clr_jit, .object = ".NET CLR Jit"},
1490 {.fnct = netdata_framework_clr_loading, .object = ".NET CLR Loading"},
1491 {.fnct = netdata_framework_clr_remoting, .object = ".NET CLR Remoting"},
1492 {.fnct = netdata_framework_clr_security, .object = ".NET CLR Security"},
1493 {.fnct = netdata_framework_clr_locks_and_threads, .object = ".NET CLR LocksAndThreads"}
1494
1495 };
1496
1497 int do_PerflibNetFramework(int update_every, usec_t dt __maybe_unused)
1498 {
1499 static bool initialized = false;
1500
1501 if (unlikely(!initialized)) {
1502 initialize();
1503 initialized = true;
1504 }
1505
1506 netframework_now_ut = now_monotonic_usec();
1507
1508 int i;
1509 for (i = 0; i < NETDATA_NETFRAMEWORK_END; i++) {
1510 DWORD id = RegistryFindIDByName(netframewrk_obj[i].object);
1511 if (id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
1512 continue;
1513
1514 PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
1515 if (!pDataBlock)
1516 continue;
1517
1518 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, netframewrk_obj[i].object);
1519 if (!pObjectType)
1520 continue;
1521
1522 netframewrk_obj[i].fnct(pDataBlock, pObjectType, update_every);
1523 }
1524
1525 {
1526 struct net_framework_instances *p;
1527 dfe_start_write(processes, p)
1528 {
1529 if (p->last_collected < netframework_now_ut)
1530 dictionary_del(processes, p_dfe.name);
1531 }
1532 dfe_done(p);
1533 dictionary_garbage_collect(processes);
1534 }
1535
1536 return 0;
1537 }