Add NetFramework Metrics (part II) (#19008)
thiagoftsm committed
Jan 31, 2025 at 09:17 UTC
6bac7e728316eb430c2fe5a5dc4bb1a9df9bfa44
2 files changed
+738
-4
src/collectors/windows.plugin/perflib-netframework.c
+720
-4
@@ -8,6 +8,9 @@ enum netdata_netframework_metrics {
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
};
@@ -64,6 +67,51 @@ struct net_framework_instances {
67
RRDSET *st_clrloading_class_load_failure;
68
RRDDIM *rd_clrloading_class_load_failure;
69
70
+ RRDSET *st_clrremoting_channels;
71
+ RRDDIM *rd_clrremoting_channels;
72
+
73
+ RRDSET *st_clrremoting_context_bound_classes_loaded;
74
+ RRDDIM *rd_clrremoting_context_bound_classes_loaded;
75
+
76
+ RRDSET *st_clrremoting_context_bound_objects;
77
+ RRDDIM *rd_clrremoting_context_bound_objects;
78
+
79
+ RRDSET *st_clrremoting_context_proxies;
80
+ RRDDIM *rd_clrremoting_context_proxies;
81
+
82
+ RRDSET *st_clrremoting_contexts;
83
+ RRDDIM *rd_clrremoting_contexts;
84
+
85
+ RRDSET *st_clrremoting_remote_calls;
86
+ RRDDIM *rd_clrremoting_remote_calls;
87
+
88
+ RRDSET *st_clrsecurity_link_time_checks;
89
+ RRDDIM *rd_clrsecurity_link_time_checks;
90
+
91
+ RRDSET *st_clrsecurity_rt_checks_time;
92
+ RRDDIM *rd_clrsecurity_rt_checks_time;
93
+
94
+ RRDSET *st_clrsecurity_stack_walk_depth;
95
+ RRDDIM *rd_clrsecurity_stack_walk_depth;
96
+
97
+ RRDSET *st_clrsecurity_run_time_checks;
98
+ RRDDIM *rd_clrsecurity_run_time_checks;
99
+
100
+ RRDSET *st_clrlocksandthreads_queue_length;
101
+ RRDDIM *rd_locksandthreads_queue_length;
102
+
103
+ RRDSET *st_clrlocksandthreads_current_logical_threads;
104
+ RRDDIM *rd_locksandthreads_current_logical_threads;
105
+
106
+ RRDSET *st_clrlocksandthreads_current_physical_threads;
107
+ RRDDIM *rd_locksandthreads_current_physical_threads;
108
+
109
+ RRDSET *st_clrlocksandthreads_recognized_threads;
110
+ RRDDIM *rd_locksandthreads_recognized_threads;
111
+
112
+ RRDSET *st_clrlocksandthreads_contentions;
113
+ RRDDIM *rd_locksandthreads_contentions;
114
+
115
COUNTER_DATA NETFrameworkCLRExceptionThrown;
116
COUNTER_DATA NETFrameworkCLRExceptionFilters;
117
COUNTER_DATA NETFrameworkCLRExceptionFinallys;
@@ -85,6 +133,25 @@ struct net_framework_instances {
133
COUNTER_DATA NETFrameworkCLRLoadingAssembliesLoaded;
134
COUNTER_DATA NETFrameworkCLRLoadingClassesLoaded;
135
COUNTER_DATA NETFrameworkCLRLoadingClassLoadFailure;
136
+
137
+ COUNTER_DATA NETFrameworkCLRRemotingChannels;
138
+ COUNTER_DATA NETFrameworkCLRRemotingContextBoundClassesLoaded;
139
+ COUNTER_DATA NETFrameworkCLRRemotingContextBoundObjects;
140
+ COUNTER_DATA NETFrameworkCLRRemotingContextProxies;
141
+ COUNTER_DATA NETFrameworkCLRRemotingContexts;
142
+ COUNTER_DATA NETFrameworkCLRRemotingRemoteCalls;
143
+
144
+ COUNTER_DATA NETFrameworkCLRSecurityLinkTimeChecks;
145
+ COUNTER_DATA NETFrameworkCLRSecurityPercentTimeinRTChecks;
146
+ COUNTER_DATA NETFrameworkCLRSecurityFrequency_PerfTime;
147
+ COUNTER_DATA NETFrameworkCLRSecurityStackWalkDepth;
148
+ COUNTER_DATA NETFrameworkCLRSecurityRunTimeChecks;
149
+
150
+ COUNTER_DATA NETFrameworkCLRLocksAndThreadsQueueLength;
151
+ COUNTER_DATA NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads;
152
+ COUNTER_DATA NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads;
153
+ COUNTER_DATA NETFrameworkCLRLocksAndThreadsRecognizedThreads;
154
+ COUNTER_DATA NETFrameworkCLRLocksAndThreadsContentions;
155
};
156
157
static inline void initialize_net_framework_processes_keys(struct net_framework_instances *p) {
@@ -109,6 +176,25 @@ static inline void initialize_net_framework_processes_keys(struct net_framework_
176
p->NETFrameworkCLRLoadingAssembliesLoaded.key = "Total Assemblies";
177
p->NETFrameworkCLRLoadingClassesLoaded.key = "Total Classes Loaded";
178
p->NETFrameworkCLRLoadingClassLoadFailure.key = "Total # of Load Failures";
179
+
180
+ p->NETFrameworkCLRRemotingChannels.key = "Channels";
181
+ p->NETFrameworkCLRRemotingContextBoundClassesLoaded.key = "Context-Bound Classes Loaded";
182
+ p->NETFrameworkCLRRemotingContextBoundObjects.key = "Context-Bound Objects Alloc / sec";
183
+ p->NETFrameworkCLRRemotingContextProxies.key = "Context Proxies";
184
+ p->NETFrameworkCLRRemotingContexts.key = "Contexts";
185
+ p->NETFrameworkCLRRemotingRemoteCalls.key = "Total Remote Calls";
186
+
187
+ p->NETFrameworkCLRSecurityLinkTimeChecks.key = "# Link Time Checks";
188
+ p->NETFrameworkCLRSecurityPercentTimeinRTChecks.key = "% Time Sig. Authenticating";
189
+ p->NETFrameworkCLRSecurityFrequency_PerfTime.key = "% Time in RT checks";
190
+ p->NETFrameworkCLRSecurityStackWalkDepth.key = "Stack Walk Depth";
191
+ p->NETFrameworkCLRSecurityRunTimeChecks.key = "Total Runtime Checks";
192
+
193
+ p->NETFrameworkCLRLocksAndThreadsQueueLength.key = "Queue Length / sec";
194
+ p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads.key = "# of current logical Threads";
195
+ p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads.key = "# of current physical Threads";
196
+ p->NETFrameworkCLRLocksAndThreadsRecognizedThreads.key = "# of total recognized threads";
197
+ p->NETFrameworkCLRLocksAndThreadsContentions.key = "Total # of Contentions";
198
}
199
200
void dict_net_framework_processes_insert_cb(
@@ -758,14 +844,644 @@ static void netdata_framework_clr_loading(PERF_DATA_BLOCK *pDataBlock, PERF_OBJE
844
}
845
}
846
847
+static void netdata_framework_clr_remoting(PERF_DATA_BLOCK *pDataBlock,
848
+ PERF_OBJECT_TYPE *pObjectType,
849
+ int update_every)
850
+{
851
+ char id[RRD_ID_LENGTH_MAX + 1];
852
+ PERF_INSTANCE_DEFINITION *pi = NULL;
853
+ for (LONG i = 0; i < pObjectType->NumInstances; i++) {
854
+ pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
855
+ if (!pi)
856
+ break;
857
+
858
+ if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
859
+ strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
860
+
861
+ if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
862
+ continue;
863
+
864
+ netdata_fix_chart_name(windows_shared_buffer);
865
+ struct net_framework_instances *p = dictionary_set(processes, windows_shared_buffer, NULL, sizeof(*p));
866
+
867
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingChannels)) {
868
+ if (!p->st_clrremoting_channels) {
869
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_channels", windows_shared_buffer);
870
+ p->st_clrremoting_channels = rrdset_create_localhost("netframework"
871
+ , id, NULL
872
+ , "remoting"
873
+ , "netframework.clrremoting_channels"
874
+ , "Registered channels"
875
+ , "channels/s"
876
+ , PLUGIN_WINDOWS_NAME
877
+ , "PerflibNetFramework"
878
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_CHANNELS
879
+ , update_every
880
+ , RRDSET_TYPE_LINE
881
+ );
882
+
883
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_channels_total", windows_shared_buffer);
884
+ p->rd_clrremoting_channels = rrddim_add(p->st_clrremoting_channels,
885
+ id,
886
+ "registered",
887
+ 1,
888
+ 1,
889
+ RRD_ALGORITHM_INCREMENTAL);
890
+
891
+ rrdlabels_add(p->st_clrremoting_channels->rrdlabels,
892
+ "process",
893
+ windows_shared_buffer,
894
+ RRDLABEL_SRC_AUTO);
895
+ }
896
+
897
+ rrddim_set_by_pointer(p->st_clrremoting_channels,
898
+ p->rd_clrremoting_channels,
899
+ (collected_number)p->NETFrameworkCLRRemotingChannels.current.Data);
900
+ rrdset_done(p->st_clrremoting_channels);
901
+ }
902
+
903
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextBoundClassesLoaded)) {
904
+ if (!p->st_clrremoting_context_bound_classes_loaded) {
905
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_bound_classes_loaded", windows_shared_buffer);
906
+ p->st_clrremoting_context_bound_classes_loaded = rrdset_create_localhost("netframework"
907
+ , id, NULL
908
+ , "remoting"
909
+ , "netframework.clrremoting_context_bound_classes_loaded"
910
+ , "Loaded context-bound classes"
911
+ , "classes"
912
+ , PLUGIN_WINDOWS_NAME
913
+ , "PerflibNetFramework"
914
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_CLASSES_LOADED
915
+ , update_every
916
+ , RRDSET_TYPE_LINE
917
+ );
918
+
919
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_context_bound_classes_loaded", windows_shared_buffer);
920
+ p->rd_clrremoting_context_bound_classes_loaded = rrddim_add(p->st_clrremoting_context_bound_classes_loaded,
921
+ id,
922
+ "loaded",
923
+ 1,
924
+ 1,
925
+ RRD_ALGORITHM_ABSOLUTE);
926
+
927
+ rrdlabels_add(p->st_clrremoting_context_bound_classes_loaded->rrdlabels,
928
+ "process",
929
+ windows_shared_buffer,
930
+ RRDLABEL_SRC_AUTO);
931
+ }
932
+
933
+ rrddim_set_by_pointer(p->st_clrremoting_context_bound_classes_loaded,
934
+ p->rd_clrremoting_context_bound_classes_loaded,
935
+ (collected_number)p->NETFrameworkCLRRemotingContextBoundClassesLoaded.current.Data);
936
+ rrdset_done(p->st_clrremoting_context_bound_classes_loaded);
937
+ }
938
+
939
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextBoundObjects)) {
940
+ if (!p->st_clrremoting_context_bound_objects) {
941
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_bound_objects", windows_shared_buffer);
942
+ p->st_clrremoting_context_bound_objects = rrdset_create_localhost("netframework"
943
+ , id, NULL
944
+ , "remoting"
945
+ , "netframework.clrremoting_context_bound_objects"
946
+ , "Allocated context-bound objects"
947
+ , "objects/s"
948
+ , PLUGIN_WINDOWS_NAME
949
+ , "PerflibNetFramework"
950
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_OBJECTS
951
+ , update_every
952
+ , RRDSET_TYPE_LINE
953
+ );
954
+
955
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_context_bound_objects_total", windows_shared_buffer);
956
+ p->rd_clrremoting_context_bound_objects = rrddim_add(p->st_clrremoting_context_bound_objects,
957
+ id,
958
+ "allocated",
959
+ 1,
960
+ 1,
961
+ RRD_ALGORITHM_INCREMENTAL);
962
+
963
+ rrdlabels_add(p->st_clrremoting_context_bound_objects->rrdlabels,
964
+ "process",
965
+ windows_shared_buffer,
966
+ RRDLABEL_SRC_AUTO);
967
+ }
968
+
969
+ rrddim_set_by_pointer(p->st_clrremoting_context_bound_objects,
970
+ p->rd_clrremoting_context_bound_objects,
971
+ (collected_number)p->NETFrameworkCLRRemotingContextBoundObjects.current.Data);
972
+ rrdset_done(p->st_clrremoting_context_bound_objects);
973
+ }
974
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContextProxies)) {
975
+ if (!p->st_clrremoting_context_proxies) {
976
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_context_proxies", windows_shared_buffer);
977
+ p->st_clrremoting_context_proxies = rrdset_create_localhost("netframework"
978
+ , id, NULL
979
+ , "remoting"
980
+ , "netframework.clrremoting_context_proxies"
981
+ , "Remoting proxy objects"
982
+ , "objects/s"
983
+ , PLUGIN_WINDOWS_NAME
984
+ , "PerflibNetFramework"
985
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS_PROXIES
986
+ , update_every
987
+ , RRDSET_TYPE_LINE
988
+ );
989
+
990
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_context_proxies_total", windows_shared_buffer);
991
+ p->rd_clrremoting_context_proxies = rrddim_add(p->st_clrremoting_context_proxies,
992
+ id,
993
+ "objects",
994
+ 1,
995
+ 1,
996
+ RRD_ALGORITHM_INCREMENTAL);
997
+
998
+ rrdlabels_add(p->st_clrremoting_context_proxies->rrdlabels,
999
+ "process",
1000
+ windows_shared_buffer,
1001
+ RRDLABEL_SRC_AUTO);
1002
+ }
1003
+
1004
+ rrddim_set_by_pointer(p->st_clrremoting_context_proxies,
1005
+ p->rd_clrremoting_context_proxies,
1006
+ (collected_number)p->NETFrameworkCLRRemotingContextProxies.current.Data);
1007
+ rrdset_done(p->st_clrremoting_context_proxies);
1008
+ }
1009
+
1010
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingContexts)) {
1011
+ if (!p->st_clrremoting_contexts) {
1012
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_contexts", windows_shared_buffer);
1013
+ p->st_clrremoting_contexts = rrdset_create_localhost("netframework"
1014
+ , id, NULL
1015
+ , "remoting"
1016
+ , "netframework.clrremoting_contexts"
1017
+ , "Total of remoting contexts"
1018
+ , "contexts"
1019
+ , PLUGIN_WINDOWS_NAME
1020
+ , "PerflibNetFramework"
1021
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS
1022
+ , update_every
1023
+ , RRDSET_TYPE_LINE
1024
+ );
1025
+
1026
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_contexts", windows_shared_buffer);
1027
+ p->rd_clrremoting_contexts = rrddim_add(p->st_clrremoting_contexts,
1028
+ id,
1029
+ "contexts",
1030
+ 1,
1031
+ 1,
1032
+ RRD_ALGORITHM_ABSOLUTE);
1033
+
1034
+ rrdlabels_add(p->st_clrremoting_contexts->rrdlabels,
1035
+ "process",
1036
+ windows_shared_buffer,
1037
+ RRDLABEL_SRC_AUTO);
1038
+ }
1039
+
1040
+ rrddim_set_by_pointer(p->st_clrremoting_contexts,
1041
+ p->rd_clrremoting_contexts,
1042
+ (collected_number)p->NETFrameworkCLRRemotingContexts.current.Data);
1043
+ rrdset_done(p->st_clrremoting_contexts);
1044
+ }
1045
+
1046
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRRemotingRemoteCalls)) {
1047
+ if (!p->st_clrremoting_remote_calls) {
1048
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrremoting_calls", windows_shared_buffer);
1049
+ p->st_clrremoting_remote_calls = rrdset_create_localhost("netframework"
1050
+ , id, NULL
1051
+ , "remoting"
1052
+ , "netframework.clrremoting_remote_calls"
1053
+ , "Remote Procedure Calls (RPC) invoked"
1054
+ , "calls/s"
1055
+ , PLUGIN_WINDOWS_NAME
1056
+ , "PerflibNetFramework"
1057
+ , PRIO_NETFRAMEWORK_CLR_REMOTING_REMOTE_CALLS
1058
+ , update_every
1059
+ , RRDSET_TYPE_LINE
1060
+ );
1061
+
1062
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrremoting_remote_calls_total", windows_shared_buffer);
1063
+ p->rd_clrremoting_remote_calls = rrddim_add(p->st_clrremoting_remote_calls,
1064
+ id,
1065
+ "contexts",
1066
+ 1,
1067
+ 1,
1068
+ RRD_ALGORITHM_INCREMENTAL);
1069
+
1070
+ rrdlabels_add(p->st_clrremoting_remote_calls->rrdlabels,
1071
+ "process",
1072
+ windows_shared_buffer,
1073
+ RRDLABEL_SRC_AUTO);
1074
+ }
1075
+
1076
+ rrddim_set_by_pointer(p->st_clrremoting_remote_calls,
1077
+ p->rd_clrremoting_remote_calls,
1078
+ (collected_number)p->NETFrameworkCLRRemotingContexts.current.Data);
1079
+ rrdset_done(p->st_clrremoting_remote_calls);
1080
+ }
1081
+ }
1082
+}
1083
+
1084
+static void netdata_framework_clr_security(PERF_DATA_BLOCK *pDataBlock,
1085
+ PERF_OBJECT_TYPE *pObjectType,
1086
+ int update_every)
1087
+{
1088
+ char id[RRD_ID_LENGTH_MAX + 1];
1089
+ PERF_INSTANCE_DEFINITION *pi = NULL;
1090
+ for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1091
+ pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1092
+ if (!pi)
1093
+ break;
1094
+
1095
+ if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1096
+ strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1097
+
1098
+ if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
1099
+ continue;
1100
+
1101
+ netdata_fix_chart_name(windows_shared_buffer);
1102
+ struct net_framework_instances *p = dictionary_set(processes, windows_shared_buffer, NULL, sizeof(*p));
1103
+
1104
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityLinkTimeChecks)) {
1105
+ if (!p->st_clrsecurity_link_time_checks) {
1106
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_link_time_checks", windows_shared_buffer);
1107
+ p->st_clrsecurity_link_time_checks = rrdset_create_localhost("netframework"
1108
+ , id, NULL
1109
+ , "security"
1110
+ , "netframework.clrsecurity_link_time_checks"
1111
+ , "Link-time code access security checks"
1112
+ , "checks/s"
1113
+ , PLUGIN_WINDOWS_NAME
1114
+ , "PerflibNetFramework"
1115
+ , PRIO_NETFRAMEWORK_CLR_SECURITY_LINK_TIME_CHECKS
1116
+ , update_every
1117
+ , RRDSET_TYPE_LINE
1118
+ );
1119
+
1120
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrsecurity_link_time_checks_total", windows_shared_buffer);
1121
+ p->rd_clrsecurity_link_time_checks = rrddim_add(p->st_clrsecurity_link_time_checks,
1122
+ id,
1123
+ "linktime",
1124
+ 1,
1125
+ 1,
1126
+ RRD_ALGORITHM_INCREMENTAL);
1127
+
1128
+ rrdlabels_add(p->st_clrsecurity_link_time_checks->rrdlabels,
1129
+ "process",
1130
+ windows_shared_buffer,
1131
+ RRDLABEL_SRC_AUTO);
1132
+ }
1133
+
1134
+ rrddim_set_by_pointer(p->st_clrsecurity_link_time_checks,
1135
+ p->rd_clrsecurity_link_time_checks,
1136
+ (collected_number)p->NETFrameworkCLRSecurityLinkTimeChecks.current.Data);
1137
+ rrdset_done(p->st_clrsecurity_link_time_checks);
1138
+ }
1139
+
1140
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityPercentTimeinRTChecks) &&
1141
+ perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityFrequency_PerfTime)) {
1142
+ if (!p->st_clrsecurity_link_time_checks) {
1143
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_checks_time", windows_shared_buffer);
1144
+ p->st_clrsecurity_link_time_checks = rrdset_create_localhost("netframework"
1145
+ , id, NULL
1146
+ , "security"
1147
+ , "netframework.clrsecurity_checks_time"
1148
+ , "Time spent performing runtime code access security checks."
1149
+ , "percentage"
1150
+ , PLUGIN_WINDOWS_NAME
1151
+ , "PerflibNetFramework"
1152
+ , PRIO_NETFRAMEWORK_CLR_SECURITY_RT_CHECKS_TIME
1153
+ , update_every
1154
+ , RRDSET_TYPE_LINE
1155
+ );
1156
+
1157
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrsecurity_checks_time_percent", windows_shared_buffer);
1158
+ p->rd_clrsecurity_link_time_checks = rrddim_add(p->st_clrsecurity_link_time_checks,
1159
+ id,
1160
+ "time",
1161
+ 1,
1162
+ 100,
1163
+ RRD_ALGORITHM_ABSOLUTE);
1164
+
1165
+ rrdlabels_add(p->st_clrsecurity_link_time_checks->rrdlabels,
1166
+ "process",
1167
+ windows_shared_buffer,
1168
+ RRDLABEL_SRC_AUTO);
1169
+ }
1170
+
1171
+ NETDATA_DOUBLE value = (NETDATA_DOUBLE)p->NETFrameworkCLRSecurityPercentTimeinRTChecks.current.Data;
1172
+ value /= (NETDATA_DOUBLE)p->NETFrameworkCLRSecurityFrequency_PerfTime.current.Data;
1173
+
1174
+ rrddim_set_by_pointer(p->st_clrsecurity_link_time_checks,
1175
+ p->rd_clrsecurity_link_time_checks,
1176
+ (collected_number)(value * 100.0));
1177
+ rrdset_done(p->st_clrsecurity_link_time_checks);
1178
+ }
1179
+
1180
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityStackWalkDepth)) {
1181
+ if (!p->st_clrsecurity_stack_walk_depth) {
1182
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_stack_walk_depth", windows_shared_buffer);
1183
+ p->st_clrsecurity_stack_walk_depth = rrdset_create_localhost("netframework"
1184
+ , id, NULL
1185
+ , "security"
1186
+ , "netframework.clrsecurity_stack_walk_depth"
1187
+ , "Depth of the stack"
1188
+ , "depth"
1189
+ , PLUGIN_WINDOWS_NAME
1190
+ , "PerflibNetFramework"
1191
+ , PRIO_NETFRAMEWORK_CLR_SECURITY_STACK_WALK_DEPTH
1192
+ , update_every
1193
+ , RRDSET_TYPE_LINE
1194
+ );
1195
+
1196
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrsecurity_stack_walk_depth", windows_shared_buffer);
1197
+ p->rd_clrsecurity_stack_walk_depth = rrddim_add(p->st_clrsecurity_stack_walk_depth,
1198
+ id,
1199
+ "stack",
1200
+ 1,
1201
+ 1,
1202
+ RRD_ALGORITHM_ABSOLUTE);
1203
+
1204
+ rrdlabels_add(p->st_clrsecurity_stack_walk_depth->rrdlabels,
1205
+ "process",
1206
+ windows_shared_buffer,
1207
+ RRDLABEL_SRC_AUTO);
1208
+ }
1209
+
1210
+ rrddim_set_by_pointer(p->st_clrsecurity_stack_walk_depth,
1211
+ p->rd_clrsecurity_stack_walk_depth,
1212
+ (collected_number)p->NETFrameworkCLRSecurityStackWalkDepth.current.Data);
1213
+ rrdset_done(p->st_clrsecurity_stack_walk_depth);
1214
+ }
1215
+
1216
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRSecurityRunTimeChecks)) {
1217
+ if (!p->st_clrsecurity_stack_walk_depth) {
1218
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrsecurity_runtime_checks", windows_shared_buffer);
1219
+ p->st_clrsecurity_stack_walk_depth = rrdset_create_localhost("netframework"
1220
+ , id, NULL
1221
+ , "security"
1222
+ , "netframework.clrsecurity_runtime_checks"
1223
+ , "Runtime code access security checks performed"
1224
+ , "checks/s"
1225
+ , PLUGIN_WINDOWS_NAME
1226
+ , "PerflibNetFramework"
1227
+ , PRIO_NETFRAMEWORK_CLR_SECURITY_RUNTIME_CHECKS
1228
+ , update_every
1229
+ , RRDSET_TYPE_LINE
1230
+ );
1231
+
1232
+ snprintfz(id, RRD_ID_LENGTH_MAX, "netframework_%s_clrsecurity_runtime_checks_total", windows_shared_buffer);
1233
+ p->rd_clrsecurity_stack_walk_depth = rrddim_add(p->st_clrsecurity_stack_walk_depth,
1234
+ id,
1235
+ "runtime",
1236
+ 1,
1237
+ 1,
1238
+ RRD_ALGORITHM_INCREMENTAL);
1239
+
1240
+ rrdlabels_add(p->st_clrsecurity_stack_walk_depth->rrdlabels,
1241
+ "process",
1242
+ windows_shared_buffer,
1243
+ RRDLABEL_SRC_AUTO);
1244
+ }
1245
+
1246
+ rrddim_set_by_pointer(p->st_clrsecurity_stack_walk_depth,
1247
+ p->rd_clrsecurity_stack_walk_depth,
1248
+ (collected_number)p->NETFrameworkCLRSecurityRunTimeChecks.current.Data);
1249
+ rrdset_done(p->st_clrsecurity_stack_walk_depth);
1250
+ }
1251
+ }
1252
+}
1253
+
1254
+static void netdata_framework_clr_locks_and_threads(PERF_DATA_BLOCK *pDataBlock,
1255
+ PERF_OBJECT_TYPE *pObjectType,
1256
+ int update_every)
1257
+{
1258
+ char id[RRD_ID_LENGTH_MAX + 1];
1259
+ PERF_INSTANCE_DEFINITION *pi = NULL;
1260
+ for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1261
+ pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1262
+ if (!pi)
1263
+ break;
1264
+
1265
+ if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1266
+ strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1267
+
1268
+ if (strcasecmp(windows_shared_buffer, "_Global_") == 0)
1269
+ continue;
1270
+
1271
+ netdata_fix_chart_name(windows_shared_buffer);
1272
+ struct net_framework_instances *p = dictionary_set(processes, windows_shared_buffer, NULL, sizeof(*p));
1273
+
1274
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsQueueLength)) {
1275
+ if (!p->st_clrlocksandthreads_queue_length) {
1276
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_queue_length", windows_shared_buffer);
1277
+ p->st_clrlocksandthreads_queue_length = rrdset_create_localhost(
1278
+ "netframework",
1279
+ id,
1280
+ NULL,
1281
+ "locks threads",
1282
+ "netframework.clrlocksandthreads_queue_length",
1283
+ "Threads waited to acquire a managed lock",
1284
+ "threads/s",
1285
+ PLUGIN_WINDOWS_NAME,
1286
+ "PerflibNetFramework",
1287
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_QUEUE_LENGTH,
1288
+ update_every,
1289
+ RRDSET_TYPE_LINE);
1290
+
1291
+ snprintfz(
1292
+ id,
1293
+ RRD_ID_LENGTH_MAX,
1294
+ "netframework_%s_clrlocksandthreads_recognized_threads_total",
1295
+ windows_shared_buffer);
1296
+ p->rd_locksandthreads_queue_length =
1297
+ rrddim_add(p->st_clrlocksandthreads_queue_length, id, "threads", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1298
+
1299
+ rrdlabels_add(
1300
+ p->st_clrlocksandthreads_queue_length->rrdlabels,
1301
+ "process",
1302
+ windows_shared_buffer,
1303
+ RRDLABEL_SRC_AUTO);
1304
+ }
1305
+
1306
+ rrddim_set_by_pointer(
1307
+ p->st_clrlocksandthreads_queue_length,
1308
+ p->rd_locksandthreads_queue_length,
1309
+ (collected_number)p->NETFrameworkCLRLocksAndThreadsQueueLength.current.Data);
1310
+ rrdset_done(p->st_clrlocksandthreads_queue_length);
1311
+ }
1312
+
1313
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads)) {
1314
+ if (!p->st_clrlocksandthreads_current_logical_threads) {
1315
+ snprintfz(
1316
+ id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_current_logical_threads", windows_shared_buffer);
1317
+ p->st_clrlocksandthreads_current_logical_threads = rrdset_create_localhost(
1318
+ "netframework",
1319
+ id,
1320
+ NULL,
1321
+ "locks threads",
1322
+ "netframework.clrlocksandthreads_current_logical_threads",
1323
+ "Logical threads",
1324
+ "threads",
1325
+ PLUGIN_WINDOWS_NAME,
1326
+ "PerflibNetFramework",
1327
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_LOGICAL_THREADS,
1328
+ update_every,
1329
+ RRDSET_TYPE_LINE);
1330
+
1331
+ snprintfz(
1332
+ id,
1333
+ RRD_ID_LENGTH_MAX,
1334
+ "netframework_%s_clrlocksandthreads_current_logical_threads",
1335
+ windows_shared_buffer);
1336
+ p->rd_locksandthreads_current_logical_threads = rrddim_add(
1337
+ p->st_clrlocksandthreads_current_logical_threads, id, "logical", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1338
+
1339
+ rrdlabels_add(
1340
+ p->st_clrlocksandthreads_current_logical_threads->rrdlabels,
1341
+ "process",
1342
+ windows_shared_buffer,
1343
+ RRDLABEL_SRC_AUTO);
1344
+ }
1345
+
1346
+ rrddim_set_by_pointer(
1347
+ p->st_clrlocksandthreads_current_logical_threads,
1348
+ p->rd_locksandthreads_current_logical_threads,
1349
+ (collected_number)p->NETFrameworkCLRLocksAndThreadsCurrentLogicalThreads.current.Data);
1350
+ rrdset_done(p->st_clrlocksandthreads_current_logical_threads);
1351
+ }
1352
+
1353
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads)) {
1354
+ if (!p->st_clrlocksandthreads_current_physical_threads) {
1355
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_current_physical_threads", windows_shared_buffer);
1356
+ p->st_clrlocksandthreads_current_physical_threads = rrdset_create_localhost("netframework",
1357
+ id,
1358
+ NULL,
1359
+ "locks threads",
1360
+ "netframework.clrlocksandthreads_current_physical_threads",
1361
+ "Physical threads",
1362
+ "threads",
1363
+ PLUGIN_WINDOWS_NAME,
1364
+ "PerflibNetFramework",
1365
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CURRENT_PHYSICAL_THREADS,
1366
+ update_every,
1367
+ RRDSET_TYPE_LINE);
1368
+
1369
+ snprintfz(id,
1370
+ RRD_ID_LENGTH_MAX,
1371
+ "netframework_%s_clrlocksandthreads_physical_threads_current",
1372
+ windows_shared_buffer);
1373
+ p->rd_locksandthreads_current_physical_threads = rrddim_add(p->st_clrlocksandthreads_current_physical_threads,
1374
+ id,
1375
+ "physical",
1376
+ 1,
1377
+ 1,
1378
+ RRD_ALGORITHM_ABSOLUTE);
1379
+
1380
+ rrdlabels_add(p->st_clrlocksandthreads_current_physical_threads->rrdlabels,
1381
+ "process",
1382
+ windows_shared_buffer,
1383
+ RRDLABEL_SRC_AUTO);
1384
+ }
1385
+
1386
+ rrddim_set_by_pointer(p->st_clrlocksandthreads_current_physical_threads,
1387
+ p->rd_locksandthreads_current_physical_threads,
1388
+ (collected_number)p->NETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads.current.Data);
1389
+ rrdset_done(p->st_clrlocksandthreads_current_physical_threads);
1390
+ }
1391
+
1392
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsRecognizedThreads)) {
1393
+ if (!p->st_clrlocksandthreads_recognized_threads) {
1394
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_recognized_threads", windows_shared_buffer);
1395
+ p->st_clrlocksandthreads_recognized_threads = rrdset_create_localhost("netframework",
1396
+ id,
1397
+ NULL,
1398
+ "locks threads",
1399
+ "netframework.clrlocksandthreads_recognized_threads",
1400
+ "Threads recognized by the runtime",
1401
+ "threads/s",
1402
+ PLUGIN_WINDOWS_NAME,
1403
+ "PerflibNetFramework",
1404
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_RECOGNIZED_THREADS,
1405
+ update_every,
1406
+ RRDSET_TYPE_LINE);
1407
+
1408
+ snprintfz(id,
1409
+ RRD_ID_LENGTH_MAX,
1410
+ "netframework_%s_clrlocksandthreads_recognized_threads_total",
1411
+ windows_shared_buffer);
1412
+ p->rd_locksandthreads_recognized_threads = rrddim_add(p->st_clrlocksandthreads_recognized_threads,
1413
+ id,
1414
+ "threads",
1415
+ 1,
1416
+ 1,
1417
+ RRD_ALGORITHM_ABSOLUTE);
1418
+
1419
+ rrdlabels_add(p->st_clrlocksandthreads_recognized_threads->rrdlabels,
1420
+ "process",
1421
+ windows_shared_buffer,
1422
+ RRDLABEL_SRC_AUTO);
1423
+ }
1424
+
1425
+ rrddim_set_by_pointer(p->st_clrlocksandthreads_recognized_threads,
1426
+ p->rd_locksandthreads_recognized_threads,
1427
+ (collected_number)p->NETFrameworkCLRLocksAndThreadsRecognizedThreads.current.Data);
1428
+ rrdset_done(p->st_clrlocksandthreads_recognized_threads);
1429
+ }
1430
+
1431
+ if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->NETFrameworkCLRLocksAndThreadsContentions)) {
1432
+ if (!p->st_clrlocksandthreads_contentions) {
1433
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_clrlocksandthreads_contentions", windows_shared_buffer);
1434
+ p->st_clrlocksandthreads_contentions = rrdset_create_localhost("netframework",
1435
+ id,
1436
+ NULL,
1437
+ "locks threads",
1438
+ "netframework.clrlocksandthreads_contentions",
1439
+ "Fails to acquire a managed lock",
1440
+ "contentions/s",
1441
+ PLUGIN_WINDOWS_NAME,
1442
+ "PerflibNetFramework",
1443
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CONTENTIONS,
1444
+ update_every,
1445
+ RRDSET_TYPE_LINE);
1446
+
1447
+ snprintfz(id,
1448
+ RRD_ID_LENGTH_MAX,
1449
+ "netframework_%s_clrlocksandthreads_contentions_total",
1450
+ windows_shared_buffer);
1451
+ p->rd_locksandthreads_contentions = rrddim_add(p->st_clrlocksandthreads_contentions,
1452
+ id,
1453
+ "contentions",
1454
+ 1,
1455
+ 1,
1456
+ RRD_ALGORITHM_INCREMENTAL);
1457
+
1458
+ rrdlabels_add(p->st_clrlocksandthreads_contentions->rrdlabels,
1459
+ "process",
1460
+ windows_shared_buffer,
1461
+ RRDLABEL_SRC_AUTO);
1462
+ }
1463
+
1464
+ rrddim_set_by_pointer(p->st_clrlocksandthreads_contentions,
1465
+ p->rd_locksandthreads_contentions,
1466
+ (collected_number)p->NETFrameworkCLRLocksAndThreadsContentions.current.Data);
1467
+ rrdset_done(p->st_clrlocksandthreads_contentions);
1468
+ }
1469
+ }
1470
+}
1471
+
1472
struct netdata_netframework_objects {
1473
char *object;
1474
void (*fnct)(PERF_DATA_BLOCK *, PERF_OBJECT_TYPE *, int);
1475
} netframewrk_obj[NETDATA_NETFRAMEWORK_END] = {
765
- {.fnct = netdata_framework_clr_exceptions, .object = ".NET CLR Exceptions"},
766
- {.fnct = netdata_framework_clr_interop, .object = ".NET CLR Interop"},
767
- {.fnct = netdata_framework_clr_jit, .object = ".NET CLR Jit"},
768
- {.fnct = netdata_framework_clr_loading, .object = ".NET CLR Loading"}};
1476
+ {.fnct = netdata_framework_clr_exceptions, .object = ".NET CLR Exceptions" },
1477
+ {.fnct = netdata_framework_clr_interop, .object = ".NET CLR Interop" },
1478
+ {.fnct = netdata_framework_clr_jit, .object = ".NET CLR Jit" },
1479
+ {.fnct = netdata_framework_clr_loading, .object = ".NET CLR Loading" },
1480
+ {.fnct = netdata_framework_clr_remoting, .object = ".NET CLR Remoting" },
1481
+ {.fnct = netdata_framework_clr_security, .object = ".NET CLR Security" },
1482
+ {.fnct = netdata_framework_clr_locks_and_threads, .object = ".NET CLR LocksAndThreads" }
1483
+
1484
+};
1485
1486
int do_PerflibNetFramework(int update_every, usec_t dt __maybe_unused) {
1487
static bool initialized = false;
src/collectors/windows.plugin/windows_plugin.h
+18
@@ -100,6 +100,24 @@ enum PERFLIB_PRIO {
100
PRIO_NETFRAMEWORK_CLR_LOADING_CLASSES_LOADED,
101
PRIO_NETFRAMEWORK_CLR_LOADING_CLASS_LOAD_FAILURE,
102
103
+ PRIO_NETFRAMEWORK_CLR_REMOTING_CHANNELS,
104
+ PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_CLASSES_LOADED,
105
+ PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXT_BOUND_OBJECTS,
106
+ PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS_PROXIES,
107
+ PRIO_NETFRAMEWORK_CLR_REMOTING_CONTEXTS,
108
+ PRIO_NETFRAMEWORK_CLR_REMOTING_REMOTE_CALLS,
109
+
110
+ PRIO_NETFRAMEWORK_CLR_SECURITY_LINK_TIME_CHECKS,
111
+ PRIO_NETFRAMEWORK_CLR_SECURITY_RT_CHECKS_TIME,
112
+ PRIO_NETFRAMEWORK_CLR_SECURITY_STACK_WALK_DEPTH,
113
+ PRIO_NETFRAMEWORK_CLR_SECURITY_RUNTIME_CHECKS,
114
+
115
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_QUEUE_LENGTH,
116
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_LOGICAL_THREADS,
117
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CURRENT_PHYSICAL_THREADS,
118
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_RECOGNIZED_THREADS,
119
+ PRIO_NETFRAMEWORK_CLR_LOCKS_AND_THREADS_CONTENTIONS,
120
+
121
PRIO_AD_OPERATIONS_TOTAL,
122
PRIO_AD_DIROPERATIONS_TOTAL,
123
PRIO_AD_CACHE_LOOKUP_TOTAL,