@cryptotaxi247 / netdata-1 / commits / ce1c1fb57

Remove compilation warning (Windows) (#22091)

thiagoftsm committed Mar 31, 2026 at 21:53 UTC ce1c1fb57e3af4aeb1bc9e6c9ec07d21407dc576
2 files changed +945 -736
src/collectors/apps.plugin/apps_functions.c
+908 -723
@@ -75,845 +75,517 @@ static void apps_plugin_function_processes_help(const char *transaction) {
75 buffer_json_add_array_item_double(wb, _tmp); \
76 } while(0)
77
78 -void function_processes(const char *transaction, char *function,
79 - usec_t *stop_monotonic_ut __maybe_unused, bool *cancelled __maybe_unused,
80 - BUFFER *payload __maybe_unused, HTTP_ACCESS access,
81 - const char *source __maybe_unused, void *data __maybe_unused) {
82 - time_t now_s = now_realtime_sec();
83 - struct pid_stat *p;
84 -
85 - bool show_cmdline = http_access_user_has_enough_access_level_for_endpoint(
86 - access, HTTP_ACCESS_SIGNED_ID | HTTP_ACCESS_SAME_SPACE | HTTP_ACCESS_SENSITIVE_DATA | HTTP_ACCESS_VIEW_AGENT_CONFIG) || enable_function_cmdline;
87 -
88 - char *words[PLUGINSD_MAX_WORDS] = { NULL };
89 - size_t num_words = quoted_strings_splitter_whitespace(function, words, PLUGINSD_MAX_WORDS);
90 -
91 - struct target *category = NULL, *user = NULL, *group = NULL; (void)category; (void)user; (void)group;
92 -#if (PROCESSES_HAVE_UID == 1)
93 - struct target *users_sid_root = users_root_target;
94 -#endif
95 -#if (PROCESSES_HAVE_SID == 1)
96 - struct target *users_sid_root = sids_root_target;
97 -#endif
98 - const char *process_name = NULL;
99 - pid_t pid = 0;
100 - uid_t uid = 0; (void)uid;
101 - gid_t gid = 0; (void)gid;
102 - bool info = false;
103 -
104 - bool filter_pid = false, filter_uid = false, filter_gid = false;
105 - (void)filter_uid; (void)filter_gid;
106 -
107 - for(int i = 1; i < PLUGINSD_MAX_WORDS ;i++) {
108 - const char *keyword = get_word(words, num_words, i);
109 - if(!keyword) break;
110 -
111 - if(!category && strncmp(keyword, PROCESS_FILTER_CATEGORY, strlen(PROCESS_FILTER_CATEGORY)) == 0) {
112 - category = find_target_by_name(apps_groups_root_target, &keyword[strlen(PROCESS_FILTER_CATEGORY)]);
113 - if(!category) {
114 - pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
115 - "No category with that name found.");
116 - return;
117 - }
118 - }
119 -#if (PROCESSES_HAVE_UID == 1) || (PROCESSES_HAVE_SID == 1)
120 - else if(!user && strncmp(keyword, PROCESS_FILTER_USER, strlen(PROCESS_FILTER_USER)) == 0) {
121 - user = find_target_by_name(users_sid_root, &keyword[strlen(PROCESS_FILTER_USER)]);
122 - if(!user) {
123 - pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
124 - "No user with that name found.");
125 - return;
126 - }
127 - }
128 -#endif
129 -#if (PROCESSES_HAVE_GID == 1)
130 - else if(strncmp(keyword, PROCESS_FILTER_GROUP, strlen(PROCESS_FILTER_GROUP)) == 0) {
131 - group = find_target_by_name(groups_root_target, &keyword[strlen(PROCESS_FILTER_GROUP)]);
132 - if(!group) {
133 - pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
134 - "No group with that name found.");
135 - return;
136 - }
137 - }
138 -#endif
139 - else if(!process_name && strncmp(keyword, PROCESS_FILTER_PROCESS, strlen(PROCESS_FILTER_PROCESS)) == 0) {
140 - process_name = &keyword[strlen(PROCESS_FILTER_PROCESS)];
141 - }
142 - else if(!pid && strncmp(keyword, PROCESS_FILTER_PID, strlen(PROCESS_FILTER_PID)) == 0) {
143 - pid = str2i(&keyword[strlen(PROCESS_FILTER_PID)]);
144 - filter_pid = true;
145 - }
146 -#if (PROCESSES_HAVE_UID == 1)
147 - else if(!uid && strncmp(keyword, PROCESS_FILTER_UID, strlen(PROCESS_FILTER_UID)) == 0) {
148 - uid = str2i(&keyword[strlen(PROCESS_FILTER_UID)]);
149 - filter_uid = true;
150 - }
151 -#endif
152 -#if (PROCESSES_HAVE_GID == 1)
153 - else if(!gid && strncmp(keyword, PROCESS_FILTER_GID, strlen(PROCESS_FILTER_GID)) == 0) {
154 - gid = str2i(&keyword[strlen(PROCESS_FILTER_GID)]);
155 - filter_gid = true;
156 - }
157 -#endif
158 - else if(strcmp(keyword, "help") == 0) {
159 - apps_plugin_function_processes_help(transaction);
160 - return;
161 - }
162 - else if(strcmp(keyword, "info") == 0) {
163 - info = true;
164 - }
165 - }
166 -
167 - BUFFER *wb = buffer_create(4096, NULL);
168 - buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_MINIFY);
169 - buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
170 - buffer_json_member_add_string(wb, "type", "table");
171 - buffer_json_member_add_time_t(wb, "update_every", update_every);
172 - buffer_json_member_add_boolean(wb, "has_history", false);
173 - buffer_json_member_add_string(wb, "help", APPS_PLUGIN_PROCESSES_FUNCTION_DESCRIPTION);
174 -
175 - if(info)
176 - goto close_and_send;
177 -
178 - buffer_json_member_add_array(wb, "data");
179 -
180 - uint64_t cpu_divisor = NSEC_PER_SEC / 100;
181 - unsigned int memory_divisor = 1024 * 1024;
182 - unsigned int io_divisor = 1024 * RATES_DETAIL;
183 -
184 - uint64_t total_memory_bytes = OS_FUNCTION(apps_os_get_total_memory)();
185 -
186 - NETDATA_DOUBLE
187 - UserCPU_max = 0.0
188 - , SysCPU_max = 0.0
78 +// Holds per-field maximums computed during the data collection loop.
79 +// Passed to fp_emit_columns() so that section can live in its own function,
80 +// keeping function_processes() below GCC's -fvar-tracking-assignments limit.
81 +struct fp_maxvals {
82 + NETDATA_DOUBLE UserCPU_max;
83 + NETDATA_DOUBLE SysCPU_max;
84 #if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
190 - , GuestCPU_max = 0.0
85 + NETDATA_DOUBLE GuestCPU_max;
86 #endif
87 #if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
193 - , CUserCPU_max = 0.0
194 - , CSysCPU_max = 0.0
88 + NETDATA_DOUBLE CUserCPU_max;
89 + NETDATA_DOUBLE CSysCPU_max;
90 #if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
196 - , CGuestCPU_max = 0.0
91 + NETDATA_DOUBLE CGuestCPU_max;
92 #endif
93 #endif
199 - , CPU_max = 0.0
200 - , VMSize_max = 0.0
201 - , RSS_max = 0.0
94 + NETDATA_DOUBLE CPU_max;
95 + NETDATA_DOUBLE VMSize_max;
96 + NETDATA_DOUBLE RSS_max;
97 #if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
203 - , Estimated_max = 0.0
204 - , Pss_max = 0.0
205 - , PssAge_max = 0.0
206 - , SharedRatio_max = 0.0
98 + NETDATA_DOUBLE Estimated_max;
99 + NETDATA_DOUBLE Pss_max;
100 + NETDATA_DOUBLE PssAge_max;
101 + NETDATA_DOUBLE SharedRatio_max;
102 #endif
103 #if (PROCESSES_HAVE_VMSHARED == 1)
209 - , Shared_max = 0.0
104 + NETDATA_DOUBLE Shared_max;
105 #endif
211 - , Swap_max = 0.0
212 - , Memory_max = 0.0
106 + NETDATA_DOUBLE Swap_max;
107 #if (PROCESSES_HAVE_FDS == 1) && (PROCESSES_HAVE_PID_LIMITS == 1)
214 - , FDsLimitPercent_max = 0.0
108 + NETDATA_DOUBLE FDsLimitPercent_max;
109 #endif
216 - ;
217 -
218 - unsigned long long
219 - Processes_max = 0
220 - , Threads_max = 0
110 + unsigned long long Processes_max;
111 + unsigned long long Threads_max;
112 #if (PROCESSES_HAVE_VOLCTX == 1)
222 - , VoluntaryCtxtSwitches_max = 0
113 + unsigned long long VoluntaryCtxtSwitches_max;
114 #endif
115 #if (PROCESSES_HAVE_NVOLCTX == 1)
225 - , NonVoluntaryCtxtSwitches_max = 0
116 + unsigned long long NonVoluntaryCtxtSwitches_max;
117 #endif
227 - , Uptime_max = 0
228 - , MinFlt_max = 0
118 + unsigned long long Uptime_max;
119 + unsigned long long MinFlt_max;
120 #if (PROCESSES_HAVE_MAJFLT == 1)
230 - , MajFlt_max = 0
121 + unsigned long long MajFlt_max;
122 #endif
123 #if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
233 - , CMinFlt_max = 0
234 - , CMajFlt_max = 0
235 - , TMinFlt_max = 0
236 - , TMajFlt_max = 0
124 + unsigned long long CMinFlt_max;
125 + unsigned long long CMajFlt_max;
126 + unsigned long long TMinFlt_max;
127 + unsigned long long TMajFlt_max;
128 #endif
129 #if (PROCESSES_HAVE_LOGICAL_IO == 1)
239 - , LReads_max = 0
240 - , LWrites_max = 0
130 + unsigned long long LReads_max;
131 + unsigned long long LWrites_max;
132 #endif
133 #if (PROCESSES_HAVE_PHYSICAL_IO == 1)
243 - , PReads_max = 0
244 - , PWrites_max = 0
134 + unsigned long long PReads_max;
135 + unsigned long long PWrites_max;
136 #endif
137 #if (PROCESSES_HAVE_IO_CALLS == 1)
247 - , ROps_max = 0
248 - , WOps_max = 0
138 + unsigned long long ROps_max;
139 + unsigned long long WOps_max;
140 #endif
141 #if (PROCESSES_HAVE_FDS == 1)
251 - , Files_max = 0
252 - , Pipes_max = 0
253 - , Sockets_max = 0
254 - , iNotiFDs_max = 0
255 - , EventFDs_max = 0
256 - , TimerFDs_max = 0
257 - , SigFDs_max = 0
258 - , EvPollFDs_max = 0
259 - , OtherFDs_max = 0
260 - , FDs_max = 0
142 + unsigned long long Files_max;
143 + unsigned long long Pipes_max;
144 + unsigned long long Sockets_max;
145 + unsigned long long iNotiFDs_max;
146 + unsigned long long EventFDs_max;
147 + unsigned long long TimerFDs_max;
148 + unsigned long long SigFDs_max;
149 + unsigned long long EvPollFDs_max;
150 + unsigned long long OtherFDs_max;
151 + unsigned long long FDs_max;
152 #endif
153 #if (PROCESSES_HAVE_HANDLES == 1)
263 - , Handles_max = 0
154 + unsigned long long Handles_max;
155 #endif
265 - ;
266 -
267 - netdata_mutex_lock(&apps_and_stdout_mutex);
156 +};
157
269 - int rows= 0;
270 - for(p = root_of_pids(); p ; p = p->next) {
271 - if(!p->updated)
272 - continue;
158 +static void fp_emit_columns(BUFFER *wb, struct fp_maxvals *mv, bool show_cmdline, uint64_t total_memory_bytes) {
159 + buffer_json_member_add_object(wb, "columns");
160 + {
161 + int field_id = 0;
162
274 - if(category && p->target != category)
275 - continue;
163 + // IMPORTANT!
164 + // THE ORDER SHOULD BE THE SAME WITH THE VALUES!
165 + // wb, key, name, visible, type, visualization, transform, decimal_points, units, max, sort, sortable, sticky, unique_key, pointer_to, summary, range
166 + buffer_rrdf_table_add_field(wb, field_id++, "PID", "Process ID", RRDF_FIELD_TYPE_INTEGER,
167 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
168 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
169 + RRDF_FIELD_FILTER_MULTISELECT,
170 + RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY |
171 + RRDF_FIELD_OPTS_UNIQUE_KEY, NULL);
172
277 -#if (PROCESSES_HAVE_UID == 1)
278 - if(user && p->uid_target != user)
279 - continue;
280 -#endif
173 + buffer_rrdf_table_add_field(wb, field_id++, "Cmd", "Process Name", RRDF_FIELD_TYPE_STRING,
174 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
175 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
176 + RRDF_FIELD_FILTER_MULTISELECT,
177 + RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
178
282 -#if (PROCESSES_HAVE_GID == 1)
283 - if(group && p->gid_target != group)
284 - continue;
179 +#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
180 + buffer_rrdf_table_add_field(wb, field_id++, "Name", "Process Friendly Name", RRDF_FIELD_TYPE_STRING,
181 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
182 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
183 + RRDF_FIELD_FILTER_MULTISELECT,
184 + RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
185 #endif
186
287 -#if (PROCESSES_HAVE_SID == 1)
288 - if(user && p->sid_target != user)
289 - continue;
290 -#endif
187 + if (show_cmdline) {
188 + buffer_rrdf_table_add_field(wb, field_id++, "CmdLine", "Command Line", RRDF_FIELD_TYPE_STRING,
189 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0,
190 + NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
191 + RRDF_FIELD_FILTER_MULTISELECT,
192 + RRDF_FIELD_OPTS_NONE, NULL);
193 + }
194
292 - if(process_name && ((strcmp(pid_stat_comm(p), process_name) != 0 && !p->parent) || (p->parent && strcmp(pid_stat_comm(p), process_name) != 0 && strcmp(pid_stat_comm(p->parent), process_name) != 0)))
293 - continue;
195 + buffer_rrdf_table_add_field(wb, field_id++, "PPID", "Parent Process ID", RRDF_FIELD_TYPE_INTEGER,
196 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL,
197 + NAN, RRDF_FIELD_SORT_ASCENDING, "PID", RRDF_FIELD_SUMMARY_COUNT,
198 + RRDF_FIELD_FILTER_MULTISELECT,
199 + RRDF_FIELD_OPTS_NONE, NULL);
200
295 - if(filter_pid && p->pid != pid && p->ppid != pid)
296 - continue;
201 + buffer_rrdf_table_add_field(wb, field_id++, "Category", "Category (apps_groups.conf)", RRDF_FIELD_TYPE_STRING,
202 + RRDF_FIELD_VISUAL_VALUE,
203 + RRDF_FIELD_TRANSFORM_NONE,
204 + 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
205 + RRDF_FIELD_FILTER_MULTISELECT,
206 + RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
207
208 +#if (PROCESSES_HAVE_UID == 1) || (PROCESSES_HAVE_SID == 1)
209 + buffer_rrdf_table_add_field(wb, field_id++, "User", "User Owner", RRDF_FIELD_TYPE_STRING,
210 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
211 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
212 + RRDF_FIELD_FILTER_MULTISELECT,
213 + RRDF_FIELD_OPTS_VISIBLE, NULL);
214 +#endif
215 #if (PROCESSES_HAVE_UID == 1)
299 - if(filter_uid && p->uid != uid)
300 - continue;
216 + buffer_rrdf_table_add_field(wb, field_id++, "Uid", "User ID", RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE,
217 + RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
218 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
219 + RRDF_FIELD_FILTER_MULTISELECT,
220 + RRDF_FIELD_OPTS_NONE, NULL);
221 #endif
222
223 #if (PROCESSES_HAVE_GID == 1)
304 - if(filter_gid && p->gid != gid)
305 - continue;
224 + buffer_rrdf_table_add_field(wb, field_id++, "Group", "Group Owner", RRDF_FIELD_TYPE_STRING,
225 + RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
226 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
227 + RRDF_FIELD_FILTER_MULTISELECT,
228 + RRDF_FIELD_OPTS_NONE, NULL);
229 + buffer_rrdf_table_add_field(wb, field_id++, "Gid", "Group ID", RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE,
230 + RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
231 + RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
232 + RRDF_FIELD_FILTER_MULTISELECT,
233 + RRDF_FIELD_OPTS_NONE, NULL);
234 #endif
235
308 - rows++;
309 -
310 - buffer_json_add_array_item_array(wb); // for each pid
236 + // CPU utilization
237 + buffer_rrdf_table_add_field(wb, field_id++, "CPU", "Total CPU Time (100% = 1 core)",
238 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
239 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->CPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
240 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
241 + RRDF_FIELD_OPTS_VISIBLE, NULL);
242
312 - // IMPORTANT!
313 - // THE ORDER SHOULD BE THE SAME WITH THE FIELDS!
314 -
315 - // pid
316 - buffer_json_add_array_item_uint64(wb, p->pid);
317 -
318 - // cmd
319 - buffer_json_add_array_item_string(wb, string2str(p->comm));
320 -
321 -#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
322 - // name
323 - buffer_json_add_array_item_string(wb, string2str(p->name ? p->name : p->comm));
324 -#endif
325 -
326 - // cmdline
327 - if (show_cmdline) {
328 - buffer_json_add_array_item_string(wb, (string_strlen(p->cmdline)) ? pid_stat_cmdline(p) : pid_stat_comm(p));
329 - }
330 -
331 - // ppid
332 - buffer_json_add_array_item_uint64(wb, p->ppid);
333 -
334 - // category
335 - buffer_json_add_array_item_string(wb, p->target ? string2str(p->target->name) : "-");
336 -
337 -#if (PROCESSES_HAVE_UID == 1)
338 - // user
339 - buffer_json_add_array_item_string(wb, p->uid_target ? string2str(p->uid_target->name) : "-");
340 -
341 - // uid
342 - buffer_json_add_array_item_uint64(wb, p->uid);
343 -#endif
344 -#if (PROCESSES_HAVE_SID == 1)
345 - // account
346 - buffer_json_add_array_item_string(wb, p->sid_target ? string2str(p->sid_target->name) : "-");
347 -#endif
348 -
349 -#if (PROCESSES_HAVE_GID == 1)
350 - // group
351 - buffer_json_add_array_item_string(wb, p->gid_target ? string2str(p->gid_target->name) : "-");
352 -
353 - // gid
354 - buffer_json_add_array_item_uint64(wb, p->gid);
355 -#endif
356 -
357 - // CPU utilization %
358 - kernel_uint_t total_cpu = p->values[PDF_UTIME] + p->values[PDF_STIME];
359 -
360 -#if (PROCESSES_HAVE_CPU_GUEST_TIME)
361 - total_cpu += p->values[PDF_GTIME];
362 -#endif
363 -#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
364 - total_cpu += p->values[PDF_CUTIME] + p->values[PDF_CSTIME];
365 -#if (PROCESSES_HAVE_CPU_GUEST_TIME)
366 - total_cpu += p->values[PDF_CGTIME];
367 -#endif
368 -#endif
369 - add_value_field_ndd_with_max(wb, CPU, (NETDATA_DOUBLE)(total_cpu) / cpu_divisor);
370 -
371 - add_value_field_ndd_with_max(wb, UserCPU, (NETDATA_DOUBLE)(p->values[PDF_UTIME]) / cpu_divisor);
372 - add_value_field_ndd_with_max(wb, SysCPU, (NETDATA_DOUBLE)(p->values[PDF_STIME]) / cpu_divisor);
373 -#if (PROCESSES_HAVE_CPU_GUEST_TIME)
374 - add_value_field_ndd_with_max(wb, GuestCPU, (NETDATA_DOUBLE)(p->values[PDF_GTIME]) / cpu_divisor);
243 + buffer_rrdf_table_add_field(wb, field_id++, "UserCPU", "User CPU time (100% = 1 core)",
244 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
245 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->UserCPU_max,
246 + RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
247 + RRDF_FIELD_OPTS_NONE, NULL);
248 + buffer_rrdf_table_add_field(wb, field_id++, "SysCPU", "System CPU Time (100% = 1 core)",
249 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
250 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->SysCPU_max,
251 + RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
252 + RRDF_FIELD_OPTS_NONE, NULL);
253 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
254 + buffer_rrdf_table_add_field(wb, field_id++, "GuestCPU", "Guest CPU Time (100% = 1 core)",
255 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
256 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->GuestCPU_max,
257 + RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
258 + RRDF_FIELD_OPTS_NONE, NULL);
259 #endif
376 -#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
377 - add_value_field_ndd_with_max(wb, CUserCPU, (NETDATA_DOUBLE)(p->values[PDF_CUTIME]) / cpu_divisor);
378 - add_value_field_ndd_with_max(wb, CSysCPU, (NETDATA_DOUBLE)(p->values[PDF_CSTIME]) / cpu_divisor);
379 -#if (PROCESSES_HAVE_CPU_GUEST_TIME)
380 - add_value_field_ndd_with_max(wb, CGuestCPU, (NETDATA_DOUBLE)(p->values[PDF_CGTIME]) / cpu_divisor);
260 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
261 + buffer_rrdf_table_add_field(wb, field_id++, "CUserCPU", "Children User CPU Time (100% = 1 core)",
262 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
263 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->CUserCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
264 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
265 + RRDF_FIELD_OPTS_NONE, NULL);
266 + buffer_rrdf_table_add_field(wb, field_id++, "CSysCPU", "Children System CPU Time (100% = 1 core)",
267 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
268 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->CSysCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
269 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
270 + RRDF_FIELD_OPTS_NONE, NULL);
271 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
272 + buffer_rrdf_table_add_field(wb, field_id++, "CGuestCPU", "Children Guest CPU Time (100% = 1 core)",
273 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
274 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->CGuestCPU_max, RRDF_FIELD_SORT_DESCENDING,
275 + NULL,
276 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
277 #endif
278 #endif
279
280 #if (PROCESSES_HAVE_VOLCTX == 1)
385 - add_value_field_llu_with_max(wb, VoluntaryCtxtSwitches, p->values[PDF_VOLCTX] / RATES_DETAIL);
281 + // CPU context switches
282 + buffer_rrdf_table_add_field(wb, field_id++, "vCtxSwitch", "Voluntary Context Switches",
283 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
284 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
285 + mv->VoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
286 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
287 #endif
288 #if (PROCESSES_HAVE_NVOLCTX == 1)
388 - add_value_field_llu_with_max(wb, NonVoluntaryCtxtSwitches, p->values[PDF_NVOLCTX] / RATES_DETAIL);
289 + buffer_rrdf_table_add_field(wb, field_id++, "iCtxSwitch", "Involuntary Context Switches",
290 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
291 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
292 + mv->NonVoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
293 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
294 #endif
295
391 - // memory MiB
392 - if(total_memory_bytes)
393 - add_value_field_ndd_with_max(wb, Memory, (NETDATA_DOUBLE)p->values[PDF_VMRSS] * 100.0 / (NETDATA_DOUBLE)total_memory_bytes);
296 + // memory
297 + if (total_memory_bytes)
298 + buffer_rrdf_table_add_field(wb, field_id++, "Memory", "Memory Percentage", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
299 + RRDF_FIELD_VISUAL_BAR,
300 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", 100.0, RRDF_FIELD_SORT_DESCENDING, NULL,
301 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
302 + RRDF_FIELD_OPTS_VISIBLE, NULL);
303
395 - add_value_field_ndd_with_max(wb, RSS, (NETDATA_DOUBLE)p->values[PDF_VMRSS] / memory_divisor);
304 + buffer_rrdf_table_add_field(wb, field_id++, "Resident", "Resident Set Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
305 + RRDF_FIELD_VISUAL_BAR,
306 + RRDF_FIELD_TRANSFORM_NUMBER,
307 + 2, "MiB", mv->RSS_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
308 + RRDF_FIELD_FILTER_RANGE,
309 + RRDF_FIELD_OPTS_VISIBLE, NULL);
310 #if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
311 if(pss_refresh_period > 0) {
398 - add_value_field_ndd_with_max(wb, Estimated, (NETDATA_DOUBLE)p->values[PDF_MEM_ESTIMATED] / memory_divisor);
399 - add_value_field_ndd_with_max(wb, Pss, (NETDATA_DOUBLE)p->values[PDF_PSS] / memory_divisor);
400 - NETDATA_DOUBLE pss_age;
401 - if(p->last_pss_iteration == 0)
402 - pss_age = NAN;
403 - else if(global_iterations_counter >= p->last_pss_iteration)
404 - pss_age = (NETDATA_DOUBLE)(global_iterations_counter - p->last_pss_iteration) * update_every;
405 - else
406 - pss_age = NAN;
407 - add_value_field_ndd_with_max(wb, PssAge, pss_age);
408 - NETDATA_DOUBLE shared_ratio = p->pss_total_ratio * 100.0;
409 - add_value_field_ndd_with_max(wb, SharedRatio, shared_ratio);
312 + buffer_rrdf_table_add_field(wb, field_id++, "Estimated", "Estimated Memory Usage", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
313 + RRDF_FIELD_VISUAL_BAR,
314 + RRDF_FIELD_TRANSFORM_NUMBER,
315 + 2, "MiB", mv->Estimated_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
316 + RRDF_FIELD_FILTER_RANGE,
317 + RRDF_FIELD_OPTS_VISIBLE, NULL);
318 + buffer_rrdf_table_add_field(wb, field_id++, "Pss", "Proportional Set Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
319 + RRDF_FIELD_VISUAL_BAR,
320 + RRDF_FIELD_TRANSFORM_NUMBER,
321 + 2, "MiB", mv->Pss_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
322 + RRDF_FIELD_FILTER_RANGE,
323 + RRDF_FIELD_OPTS_NONE, NULL);
324 + buffer_rrdf_table_add_field(wb, field_id++, "PssAge", "Time since last smaps sample", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
325 + RRDF_FIELD_VISUAL_BAR,
326 + RRDF_FIELD_TRANSFORM_NUMBER,
327 + 2, "s", mv->PssAge_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MAX,
328 + RRDF_FIELD_FILTER_RANGE,
329 + RRDF_FIELD_OPTS_NONE, NULL);
330 + buffer_rrdf_table_add_field(wb, field_id++, "SharedRatio", "Shared Memory Ratio", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
331 + RRDF_FIELD_VISUAL_BAR,
332 + RRDF_FIELD_TRANSFORM_NUMBER,
333 + 2, "%", mv->SharedRatio_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MEAN,
334 + RRDF_FIELD_FILTER_RANGE,
335 + RRDF_FIELD_OPTS_NONE, NULL);
336 }
337 #endif
338 #if (PROCESSES_HAVE_VMSHARED == 1)
413 - add_value_field_ndd_with_max(wb, Shared, (NETDATA_DOUBLE)p->values[PDF_VMSHARED] / memory_divisor);
339 + buffer_rrdf_table_add_field(wb, field_id++, "Shared", "Shared Pages", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
340 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
341 + "MiB", mv->Shared_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
342 + RRDF_FIELD_FILTER_RANGE,
343 + RRDF_FIELD_OPTS_VISIBLE, NULL);
344 #endif
345
416 - add_value_field_ndd_with_max(wb, VMSize, (NETDATA_DOUBLE)p->values[PDF_VMSIZE] / memory_divisor);
346 + buffer_rrdf_table_add_field(wb, field_id++, "Virtual", "Virtual Memory Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
347 + RRDF_FIELD_VISUAL_BAR,
348 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "MiB", mv->VMSize_max, RRDF_FIELD_SORT_DESCENDING, NULL,
349 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
350 + RRDF_FIELD_OPTS_VISIBLE, NULL);
351
352 #if (PROCESSES_HAVE_VMSWAP == 1)
419 - add_value_field_ndd_with_max(wb, Swap, (NETDATA_DOUBLE)p->values[PDF_VMSWAP] / memory_divisor);
353 + buffer_rrdf_table_add_field(wb, field_id++, "Swap", "Swap Memory", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
354 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
355 + "MiB",
356 + mv->Swap_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
357 + RRDF_FIELD_FILTER_RANGE,
358 + RRDF_FIELD_OPTS_NONE, NULL);
359 #endif
360
361 #if (PROCESSES_HAVE_PHYSICAL_IO == 1)
362 // Physical I/O
424 - add_value_field_llu_with_max(wb, PReads, p->values[PDF_PREAD] / io_divisor);
425 - add_value_field_llu_with_max(wb, PWrites, p->values[PDF_PWRITE] / io_divisor);
363 + buffer_rrdf_table_add_field(wb, field_id++, "PReads", "Physical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
364 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
365 + 2, "KiB/s", mv->PReads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
366 + RRDF_FIELD_FILTER_RANGE,
367 + RRDF_FIELD_OPTS_VISIBLE, NULL);
368 + buffer_rrdf_table_add_field(wb, field_id++, "PWrites", "Physical I/O Writes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
369 + RRDF_FIELD_VISUAL_BAR,
370 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "KiB/s", mv->PWrites_max, RRDF_FIELD_SORT_DESCENDING,
371 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
372 + RRDF_FIELD_OPTS_VISIBLE, NULL);
373 #endif
374
375 #if (PROCESSES_HAVE_LOGICAL_IO == 1)
376 +#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
377 + RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_NONE;
378 +#else
379 + RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_VISIBLE;
380 +#endif
381 // Logical I/O
430 - add_value_field_llu_with_max(wb, LReads, p->values[PDF_LREAD] / io_divisor);
431 - add_value_field_llu_with_max(wb, LWrites, p->values[PDF_LWRITE] / io_divisor);
382 + buffer_rrdf_table_add_field(wb, field_id++, "LReads", "Logical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
383 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
384 + 2, "KiB/s", mv->LReads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
385 + RRDF_FIELD_FILTER_RANGE,
386 + logical_io_options, NULL);
387 + buffer_rrdf_table_add_field(wb, field_id++, "LWrites", "Logical I/O Writes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
388 + RRDF_FIELD_VISUAL_BAR,
389 + RRDF_FIELD_TRANSFORM_NUMBER,
390 + 2, "KiB/s", mv->LWrites_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
391 + RRDF_FIELD_FILTER_RANGE,
392 + logical_io_options, NULL);
393 #endif
394
395 #if (PROCESSES_HAVE_IO_CALLS == 1)
396 // I/O calls
436 - add_value_field_llu_with_max(wb, ROps, p->values[PDF_OREAD] / RATES_DETAIL);
437 - add_value_field_llu_with_max(wb, WOps, p->values[PDF_OWRITE] / RATES_DETAIL);
397 + buffer_rrdf_table_add_field(wb, field_id++, "ROps", "I/O Read Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
398 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
399 + "ops/s", mv->ROps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
400 + RRDF_FIELD_FILTER_RANGE,
401 + RRDF_FIELD_OPTS_NONE, NULL);
402 + buffer_rrdf_table_add_field(wb, field_id++, "WOps", "I/O Write Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
403 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
404 + "ops/s", mv->WOps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
405 + RRDF_FIELD_FILTER_RANGE,
406 + RRDF_FIELD_OPTS_NONE, NULL);
407 #endif
408
409 // minor page faults
441 - add_value_field_llu_with_max(wb, MinFlt, p->values[PDF_MINFLT] / RATES_DETAIL);
410 + buffer_rrdf_table_add_field(wb, field_id++, "MinFlt", "Minor Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
411 + RRDF_FIELD_VISUAL_BAR,
412 + RRDF_FIELD_TRANSFORM_NUMBER,
413 + 2, "pgflts/s", mv->MinFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
414 + RRDF_FIELD_FILTER_RANGE,
415 + RRDF_FIELD_OPTS_NONE, NULL);
416
417 #if (PROCESSES_HAVE_MAJFLT == 1)
418 // major page faults
445 - add_value_field_llu_with_max(wb, MajFlt, p->values[PDF_MAJFLT] / RATES_DETAIL);
419 + buffer_rrdf_table_add_field(wb, field_id++, "MajFlt", "Major Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
420 + RRDF_FIELD_VISUAL_BAR,
421 + RRDF_FIELD_TRANSFORM_NUMBER,
422 + 2, "pgflts/s", mv->MajFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
423 + RRDF_FIELD_FILTER_RANGE,
424 + RRDF_FIELD_OPTS_NONE, NULL);
425 #endif
426
427 #if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
449 - add_value_field_llu_with_max(wb, CMinFlt, p->values[PDF_CMINFLT] / RATES_DETAIL);
450 - add_value_field_llu_with_max(wb, CMajFlt, p->values[PDF_CMAJFLT] / RATES_DETAIL);
451 - add_value_field_llu_with_max(wb, TMinFlt, (p->values[PDF_MINFLT] + p->values[PDF_CMINFLT]) / RATES_DETAIL);
452 - add_value_field_llu_with_max(wb, TMajFlt, (p->values[PDF_MAJFLT] + p->values[PDF_CMAJFLT]) / RATES_DETAIL);
428 + buffer_rrdf_table_add_field(wb, field_id++, "CMinFlt", "Children Minor Page Faults/s",
429 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
430 + RRDF_FIELD_VISUAL_BAR,
431 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", mv->CMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
432 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
433 + RRDF_FIELD_OPTS_NONE, NULL);
434 + buffer_rrdf_table_add_field(wb, field_id++, "CMajFlt", "Children Major Page Faults/s",
435 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
436 + RRDF_FIELD_VISUAL_BAR,
437 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", mv->CMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
438 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
439 + RRDF_FIELD_OPTS_NONE, NULL);
440 + buffer_rrdf_table_add_field(wb, field_id++, "TMinFlt", "Total Minor Page Faults/s",
441 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
442 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", mv->TMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
443 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
444 + RRDF_FIELD_OPTS_NONE, NULL);
445 + buffer_rrdf_table_add_field(wb, field_id++, "TMajFlt", "Total Major Page Faults/s",
446 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
447 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", mv->TMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
448 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
449 + RRDF_FIELD_OPTS_NONE, NULL);
450 #endif
451
452 #if (PROCESSES_HAVE_FDS == 1)
453 // open file descriptors
454 #if (PROCESSES_HAVE_PID_LIMITS == 1)
458 - add_value_field_ndd_with_max(wb, FDsLimitPercent, p->openfds_limits_percent);
455 + buffer_rrdf_table_add_field(wb, field_id++, "FDsLimitPercent", "Percentage of Open Descriptors vs Limits",
456 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
457 + RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", mv->FDsLimitPercent_max, RRDF_FIELD_SORT_DESCENDING, NULL,
458 + RRDF_FIELD_SUMMARY_MAX, RRDF_FIELD_FILTER_RANGE,
459 + RRDF_FIELD_OPTS_NONE, NULL);
460 #endif
460 - add_value_field_llu_with_max(wb, FDs, pid_openfds_sum(p));
461 + buffer_rrdf_table_add_field(wb, field_id++, "FDs", "All Open File Descriptors",
462 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
463 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->FDs_max, RRDF_FIELD_SORT_DESCENDING, NULL,
464 + RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
465 + RRDF_FIELD_OPTS_NONE, NULL);
466
462 - add_value_field_llu_with_max(wb, Files, p->openfds.files);
463 - add_value_field_llu_with_max(wb, Pipes, p->openfds.pipes);
464 - add_value_field_llu_with_max(wb, Sockets, p->openfds.sockets);
465 - add_value_field_llu_with_max(wb, iNotiFDs, p->openfds.inotifies);
466 - add_value_field_llu_with_max(wb, EventFDs, p->openfds.eventfds);
467 - add_value_field_llu_with_max(wb, TimerFDs, p->openfds.timerfds);
468 - add_value_field_llu_with_max(wb, SigFDs, p->openfds.signalfds);
469 - add_value_field_llu_with_max(wb, EvPollFDs, p->openfds.eventpolls);
470 - add_value_field_llu_with_max(wb, OtherFDs, p->openfds.other);
471 -#endif
472 -
473 -#if (PROCESSES_HAVE_HANDLES == 1)
474 - add_value_field_llu_with_max(wb, Handles, p->values[PDF_HANDLES]);
475 -#endif
476 -
477 - // processes, threads, uptime
478 - add_value_field_llu_with_max(wb, Processes, p->values[PDF_PROCESSES]);
479 - add_value_field_llu_with_max(wb, Threads, p->values[PDF_THREADS]);
480 - add_value_field_llu_with_max(wb, Uptime, p->values[PDF_UPTIME]);
481 -
482 - buffer_json_array_close(wb); // for each pid
483 - }
484 -
485 - buffer_json_array_close(wb); // data
486 - buffer_json_member_add_object(wb, "columns");
487 -
488 - {
489 - int field_id = 0;
490 -
491 - // IMPORTANT!
492 - // THE ORDER SHOULD BE THE SAME WITH THE VALUES!
493 - // wb, key, name, visible, type, visualization, transform, decimal_points, units, max, sort, sortable, sticky, unique_key, pointer_to, summary, range
494 - buffer_rrdf_table_add_field(wb, field_id++, "PID", "Process ID", RRDF_FIELD_TYPE_INTEGER,
495 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
496 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
497 - RRDF_FIELD_FILTER_MULTISELECT,
498 - RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY |
499 - RRDF_FIELD_OPTS_UNIQUE_KEY, NULL);
500 -
501 - buffer_rrdf_table_add_field(wb, field_id++, "Cmd", "Process Name", RRDF_FIELD_TYPE_STRING,
502 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
503 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
504 - RRDF_FIELD_FILTER_MULTISELECT,
505 - RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
506 -
507 -#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
508 - buffer_rrdf_table_add_field(wb, field_id++, "Name", "Process Friendly Name", RRDF_FIELD_TYPE_STRING,
509 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
510 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
511 - RRDF_FIELD_FILTER_MULTISELECT,
512 - RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
513 -#endif
514 -
515 - if (show_cmdline) {
516 - buffer_rrdf_table_add_field(wb, field_id++, "CmdLine", "Command Line", RRDF_FIELD_TYPE_STRING,
517 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0,
518 - NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
519 - RRDF_FIELD_FILTER_MULTISELECT,
520 - RRDF_FIELD_OPTS_NONE, NULL);
521 - }
522 -
523 - buffer_rrdf_table_add_field(wb, field_id++, "PPID", "Parent Process ID", RRDF_FIELD_TYPE_INTEGER,
524 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL,
525 - NAN, RRDF_FIELD_SORT_ASCENDING, "PID", RRDF_FIELD_SUMMARY_COUNT,
526 - RRDF_FIELD_FILTER_MULTISELECT,
467 + buffer_rrdf_table_add_field(wb, field_id++, "Files", "Open Files", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
468 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
469 + "fds",
470 + mv->Files_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
471 + RRDF_FIELD_FILTER_RANGE,
472 RRDF_FIELD_OPTS_NONE, NULL);
528 -
529 - buffer_rrdf_table_add_field(wb, field_id++, "Category", "Category (apps_groups.conf)", RRDF_FIELD_TYPE_STRING,
530 - RRDF_FIELD_VISUAL_VALUE,
531 - RRDF_FIELD_TRANSFORM_NONE,
532 - 0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
533 - RRDF_FIELD_FILTER_MULTISELECT,
534 - RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
535 -
536 -#if (PROCESSES_HAVE_UID == 1) || (PROCESSES_HAVE_SID == 1)
537 - buffer_rrdf_table_add_field(wb, field_id++, "User", "User Owner", RRDF_FIELD_TYPE_STRING,
538 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
539 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
540 - RRDF_FIELD_FILTER_MULTISELECT,
541 - RRDF_FIELD_OPTS_VISIBLE, NULL);
542 -#endif
543 -#if (PROCESSES_HAVE_UID == 1)
544 - buffer_rrdf_table_add_field(wb, field_id++, "Uid", "User ID", RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE,
545 - RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
546 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
547 - RRDF_FIELD_FILTER_MULTISELECT,
473 + buffer_rrdf_table_add_field(wb, field_id++, "Pipes", "Open Pipes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
474 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
475 + "fds",
476 + mv->Pipes_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
477 + RRDF_FIELD_FILTER_RANGE,
478 RRDF_FIELD_OPTS_NONE, NULL);
549 -#endif
550 -
551 -#if (PROCESSES_HAVE_GID == 1)
552 - buffer_rrdf_table_add_field(wb, field_id++, "Group", "Group Owner", RRDF_FIELD_TYPE_STRING,
553 - RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
554 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
555 - RRDF_FIELD_FILTER_MULTISELECT,
479 + buffer_rrdf_table_add_field(wb, field_id++, "Sockets", "Open Sockets", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
480 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
481 + "fds", mv->Sockets_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
482 + RRDF_FIELD_FILTER_RANGE,
483 RRDF_FIELD_OPTS_NONE, NULL);
557 - buffer_rrdf_table_add_field(wb, field_id++, "Gid", "Group ID", RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE,
558 - RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
559 - RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
560 - RRDF_FIELD_FILTER_MULTISELECT,
484 + buffer_rrdf_table_add_field(wb, field_id++, "iNotiFDs", "Open iNotify Descriptors",
485 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
486 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->iNotiFDs_max, RRDF_FIELD_SORT_DESCENDING,
487 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
488 RRDF_FIELD_OPTS_NONE, NULL);
562 -#endif
563 -
564 - // CPU utilization
565 - buffer_rrdf_table_add_field(wb, field_id++, "CPU", "Total CPU Time (100% = 1 core)",
489 + buffer_rrdf_table_add_field(wb, field_id++, "EventFDs", "Open Event Descriptors",
490 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
491 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->EventFDs_max, RRDF_FIELD_SORT_DESCENDING,
492 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
493 + RRDF_FIELD_OPTS_NONE, NULL);
494 + buffer_rrdf_table_add_field(wb, field_id++, "TimerFDs", "Open Timer Descriptors",
495 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
496 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->TimerFDs_max, RRDF_FIELD_SORT_DESCENDING,
497 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
498 + RRDF_FIELD_OPTS_NONE, NULL);
499 + buffer_rrdf_table_add_field(wb, field_id++, "SigFDs", "Open Signal Descriptors",
500 RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
567 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
501 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->SigFDs_max, RRDF_FIELD_SORT_DESCENDING, NULL,
502 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
569 - RRDF_FIELD_OPTS_VISIBLE, NULL);
570 -
571 - buffer_rrdf_table_add_field(wb, field_id++, "UserCPU", "User CPU time (100% = 1 core)",
572 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
573 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", UserCPU_max,
574 - RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
503 RRDF_FIELD_OPTS_NONE, NULL);
576 - buffer_rrdf_table_add_field(wb, field_id++, "SysCPU", "System CPU Time (100% = 1 core)",
504 + buffer_rrdf_table_add_field(wb, field_id++, "EvPollFDs", "Open Event Poll Descriptors",
505 RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
578 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", SysCPU_max,
506 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->EvPollFDs_max,
507 RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
508 RRDF_FIELD_OPTS_NONE, NULL);
581 -#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
582 - buffer_rrdf_table_add_field(wb, field_id++, "GuestCPU", "Guest CPU Time (100% = 1 core)",
583 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
584 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", GuestCPU_max,
585 - RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
509 + buffer_rrdf_table_add_field(wb, field_id++, "OtherFDs", "Other Open Descriptors",
510 + RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
511 + RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", mv->OtherFDs_max, RRDF_FIELD_SORT_DESCENDING,
512 + NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
513 RRDF_FIELD_OPTS_NONE, NULL);
514 #endif
588 -#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
589 - buffer_rrdf_table_add_field(wb, field_id++, "CUserCPU", "Children User CPU Time (100% = 1 core)",
590 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
591 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CUserCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
515 +
516 +#if (PROCESSES_HAVE_HANDLES == 1)
517 + buffer_rrdf_table_add_field(wb, field_id++, "Handles", "Open Handles", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
518 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
519 + "handles",
520 + mv->Handles_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
521 + RRDF_FIELD_FILTER_RANGE,
522 + RRDF_FIELD_OPTS_VISIBLE, NULL);
523 +#endif
524 +
525 + // processes, threads, uptime
526 + buffer_rrdf_table_add_field(wb, field_id++, "Processes", "Processes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
527 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
528 + "processes", mv->Processes_max, RRDF_FIELD_SORT_DESCENDING, NULL,
529 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
530 RRDF_FIELD_OPTS_NONE, NULL);
594 - buffer_rrdf_table_add_field(wb, field_id++, "CSysCPU", "Children System CPU Time (100% = 1 core)",
595 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
596 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CSysCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
597 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
531 + buffer_rrdf_table_add_field(wb, field_id++, "Threads", "Threads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
532 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
533 + "threads", mv->Threads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
534 + RRDF_FIELD_FILTER_RANGE,
535 RRDF_FIELD_OPTS_NONE, NULL);
536 + buffer_rrdf_table_add_field(wb, field_id++, "Uptime", "Uptime in seconds", RRDF_FIELD_TYPE_DURATION,
537 + RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_DURATION_S, 2,
538 + "seconds", mv->Uptime_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MAX,
539 + RRDF_FIELD_FILTER_RANGE,
540 + RRDF_FIELD_OPTS_VISIBLE, NULL);
541 + }
542 + buffer_json_object_close(wb); // columns
543 +}
544 +
545 +static void fp_emit_charts(BUFFER *wb, uint64_t total_memory_bytes) {
546 + buffer_json_member_add_object(wb, "charts");
547 + {
548 + // CPU chart
549 + buffer_json_member_add_object(wb, "CPU");
550 + {
551 + buffer_json_member_add_string(wb, "name", "CPU Utilization");
552 + buffer_json_member_add_string(wb, "type", "stacked-bar");
553 + buffer_json_member_add_array(wb, "columns");
554 + {
555 + buffer_json_add_array_item_string(wb, "UserCPU");
556 + buffer_json_add_array_item_string(wb, "SysCPU");
557 #if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
600 - buffer_rrdf_table_add_field(wb, field_id++, "CGuestCPU", "Children Guest CPU Time (100% = 1 core)",
601 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
602 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CGuestCPU_max, RRDF_FIELD_SORT_DESCENDING,
603 - NULL,
604 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
558 + buffer_json_add_array_item_string(wb, "GuestCPU");
559 +#endif
560 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
561 + buffer_json_add_array_item_string(wb, "CUserCPU");
562 + buffer_json_add_array_item_string(wb, "CSysCPU");
563 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
564 + buffer_json_add_array_item_string(wb, "CGuestCPU");
565 #endif
566 #endif
567 + }
568 + buffer_json_array_close(wb);
569 + }
570 + buffer_json_object_close(wb);
571
572 +#if (PROCESSES_HAVE_VOLCTX == 1) || (PROCESSES_HAVE_NVOLCTX == 1)
573 + buffer_json_member_add_object(wb, "CPUCtxSwitches");
574 + {
575 + buffer_json_member_add_string(wb, "name", "CPU Context Switches");
576 + buffer_json_member_add_string(wb, "type", "stacked-bar");
577 + buffer_json_member_add_array(wb, "columns");
578 + {
579 #if (PROCESSES_HAVE_VOLCTX == 1)
609 - // CPU context switches
610 - buffer_rrdf_table_add_field(wb, field_id++, "vCtxSwitch", "Voluntary Context Switches",
611 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
612 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
613 - VoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
614 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
580 + buffer_json_add_array_item_string(wb, "vCtxSwitch");
581 #endif
582 #if (PROCESSES_HAVE_NVOLCTX == 1)
617 - buffer_rrdf_table_add_field(wb, field_id++, "iCtxSwitch", "Involuntary Context Switches",
618 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
619 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
620 - NonVoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
621 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
583 + buffer_json_add_array_item_string(wb, "iCtxSwitch");
584 #endif
623 -
624 - // memory
625 - if (total_memory_bytes)
626 - buffer_rrdf_table_add_field(wb, field_id++, "Memory", "Memory Percentage", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
627 - RRDF_FIELD_VISUAL_BAR,
628 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", 100.0, RRDF_FIELD_SORT_DESCENDING, NULL,
629 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
630 - RRDF_FIELD_OPTS_VISIBLE, NULL);
631 -
632 - buffer_rrdf_table_add_field(wb, field_id++, "Resident", "Resident Set Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
633 - RRDF_FIELD_VISUAL_BAR,
634 - RRDF_FIELD_TRANSFORM_NUMBER,
635 - 2, "MiB", RSS_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
636 - RRDF_FIELD_FILTER_RANGE,
637 - RRDF_FIELD_OPTS_VISIBLE, NULL);
638 -#if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
639 - if(pss_refresh_period > 0) {
640 - buffer_rrdf_table_add_field(wb, field_id++, "Estimated", "Estimated Memory Usage", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
641 - RRDF_FIELD_VISUAL_BAR,
642 - RRDF_FIELD_TRANSFORM_NUMBER,
643 - 2, "MiB", Estimated_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
644 - RRDF_FIELD_FILTER_RANGE,
645 - RRDF_FIELD_OPTS_VISIBLE, NULL);
646 - buffer_rrdf_table_add_field(wb, field_id++, "Pss", "Proportional Set Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
647 - RRDF_FIELD_VISUAL_BAR,
648 - RRDF_FIELD_TRANSFORM_NUMBER,
649 - 2, "MiB", Pss_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
650 - RRDF_FIELD_FILTER_RANGE,
651 - RRDF_FIELD_OPTS_NONE, NULL);
652 - buffer_rrdf_table_add_field(wb, field_id++, "PssAge", "Time since last smaps sample", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
653 - RRDF_FIELD_VISUAL_BAR,
654 - RRDF_FIELD_TRANSFORM_NUMBER,
655 - 2, "s", PssAge_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MAX,
656 - RRDF_FIELD_FILTER_RANGE,
657 - RRDF_FIELD_OPTS_NONE, NULL);
658 - buffer_rrdf_table_add_field(wb, field_id++, "SharedRatio", "Shared Memory Ratio", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
659 - RRDF_FIELD_VISUAL_BAR,
660 - RRDF_FIELD_TRANSFORM_NUMBER,
661 - 2, "%", SharedRatio_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MEAN,
662 - RRDF_FIELD_FILTER_RANGE,
663 - RRDF_FIELD_OPTS_NONE, NULL);
585 + }
586 + buffer_json_array_close(wb);
587 }
665 -#endif
666 -#if (PROCESSES_HAVE_VMSHARED == 1)
667 - buffer_rrdf_table_add_field(wb, field_id++, "Shared", "Shared Pages", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
668 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
669 - "MiB", Shared_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
670 - RRDF_FIELD_FILTER_RANGE,
671 - RRDF_FIELD_OPTS_VISIBLE, NULL);
672 -#endif
673 -
674 - buffer_rrdf_table_add_field(wb, field_id++, "Virtual", "Virtual Memory Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
675 - RRDF_FIELD_VISUAL_BAR,
676 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "MiB", VMSize_max, RRDF_FIELD_SORT_DESCENDING, NULL,
677 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
678 - RRDF_FIELD_OPTS_VISIBLE, NULL);
679 -
680 -#if (PROCESSES_HAVE_VMSWAP == 1)
681 - buffer_rrdf_table_add_field(wb, field_id++, "Swap", "Swap Memory", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
682 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
683 - "MiB",
684 - Swap_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
685 - RRDF_FIELD_FILTER_RANGE,
686 - RRDF_FIELD_OPTS_NONE, NULL);
687 -#endif
688 -
689 -#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
690 - // Physical I/O
691 - buffer_rrdf_table_add_field(wb, field_id++, "PReads", "Physical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
692 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
693 - 2, "KiB/s", PReads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
694 - RRDF_FIELD_FILTER_RANGE,
695 - RRDF_FIELD_OPTS_VISIBLE, NULL);
696 - buffer_rrdf_table_add_field(wb, field_id++, "PWrites", "Physical I/O Writes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
697 - RRDF_FIELD_VISUAL_BAR,
698 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "KiB/s", PWrites_max, RRDF_FIELD_SORT_DESCENDING,
699 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
700 - RRDF_FIELD_OPTS_VISIBLE, NULL);
701 -#endif
702 -
703 -#if (PROCESSES_HAVE_LOGICAL_IO == 1)
704 -#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
705 - RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_NONE;
706 -#else
707 - RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_VISIBLE;
708 -#endif
709 - // Logical I/O
710 - buffer_rrdf_table_add_field(wb, field_id++, "LReads", "Logical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
711 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
712 - 2, "KiB/s", LReads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
713 - RRDF_FIELD_FILTER_RANGE,
714 - logical_io_options, NULL);
715 - buffer_rrdf_table_add_field(wb, field_id++, "LWrites", "Logical I/O Writes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
716 - RRDF_FIELD_VISUAL_BAR,
717 - RRDF_FIELD_TRANSFORM_NUMBER,
718 - 2, "KiB/s", LWrites_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
719 - RRDF_FIELD_FILTER_RANGE,
720 - logical_io_options, NULL);
721 -#endif
722 -
723 -#if (PROCESSES_HAVE_IO_CALLS == 1)
724 - // I/O calls
725 - buffer_rrdf_table_add_field(wb, field_id++, "ROps", "I/O Read Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
726 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
727 - "ops/s", ROps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
728 - RRDF_FIELD_FILTER_RANGE,
729 - RRDF_FIELD_OPTS_NONE, NULL);
730 - buffer_rrdf_table_add_field(wb, field_id++, "WOps", "I/O Write Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
731 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
732 - "ops/s", WOps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
733 - RRDF_FIELD_FILTER_RANGE,
734 - RRDF_FIELD_OPTS_NONE, NULL);
735 -#endif
736 -
737 - // minor page faults
738 - buffer_rrdf_table_add_field(wb, field_id++, "MinFlt", "Minor Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
739 - RRDF_FIELD_VISUAL_BAR,
740 - RRDF_FIELD_TRANSFORM_NUMBER,
741 - 2, "pgflts/s", MinFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
742 - RRDF_FIELD_FILTER_RANGE,
743 - RRDF_FIELD_OPTS_NONE, NULL);
744 -
745 -#if (PROCESSES_HAVE_MAJFLT == 1)
746 - // major page faults
747 - buffer_rrdf_table_add_field(wb, field_id++, "MajFlt", "Major Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
748 - RRDF_FIELD_VISUAL_BAR,
749 - RRDF_FIELD_TRANSFORM_NUMBER,
750 - 2, "pgflts/s", MajFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
751 - RRDF_FIELD_FILTER_RANGE,
752 - RRDF_FIELD_OPTS_NONE, NULL);
753 -#endif
754 -
755 -#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
756 - buffer_rrdf_table_add_field(wb, field_id++, "CMinFlt", "Children Minor Page Faults/s",
757 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
758 - RRDF_FIELD_VISUAL_BAR,
759 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", CMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
760 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
761 - RRDF_FIELD_OPTS_NONE, NULL);
762 - buffer_rrdf_table_add_field(wb, field_id++, "CMajFlt", "Children Major Page Faults/s",
763 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
764 - RRDF_FIELD_VISUAL_BAR,
765 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", CMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
766 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
767 - RRDF_FIELD_OPTS_NONE, NULL);
768 - buffer_rrdf_table_add_field(wb, field_id++, "TMinFlt", "Total Minor Page Faults/s",
769 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
770 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", TMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
771 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
772 - RRDF_FIELD_OPTS_NONE, NULL);
773 - buffer_rrdf_table_add_field(wb, field_id++, "TMajFlt", "Total Major Page Faults/s",
774 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
775 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", TMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
776 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
777 - RRDF_FIELD_OPTS_NONE, NULL);
778 -#endif
779 -
780 -#if (PROCESSES_HAVE_FDS == 1)
781 - // open file descriptors
782 -#if (PROCESSES_HAVE_PID_LIMITS == 1)
783 - buffer_rrdf_table_add_field(wb, field_id++, "FDsLimitPercent", "Percentage of Open Descriptors vs Limits",
784 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
785 - RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", FDsLimitPercent_max, RRDF_FIELD_SORT_DESCENDING, NULL,
786 - RRDF_FIELD_SUMMARY_MAX, RRDF_FIELD_FILTER_RANGE,
787 - RRDF_FIELD_OPTS_NONE, NULL);
788 -#endif
789 - buffer_rrdf_table_add_field(wb, field_id++, "FDs", "All Open File Descriptors",
790 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
791 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", FDs_max, RRDF_FIELD_SORT_DESCENDING, NULL,
792 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
793 - RRDF_FIELD_OPTS_NONE, NULL);
794 -
795 - buffer_rrdf_table_add_field(wb, field_id++, "Files", "Open Files", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
796 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
797 - "fds",
798 - Files_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
799 - RRDF_FIELD_FILTER_RANGE,
800 - RRDF_FIELD_OPTS_NONE, NULL);
801 - buffer_rrdf_table_add_field(wb, field_id++, "Pipes", "Open Pipes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
802 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
803 - "fds",
804 - Pipes_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
805 - RRDF_FIELD_FILTER_RANGE,
806 - RRDF_FIELD_OPTS_NONE, NULL);
807 - buffer_rrdf_table_add_field(wb, field_id++, "Sockets", "Open Sockets", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
808 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
809 - "fds", Sockets_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
810 - RRDF_FIELD_FILTER_RANGE,
811 - RRDF_FIELD_OPTS_NONE, NULL);
812 - buffer_rrdf_table_add_field(wb, field_id++, "iNotiFDs", "Open iNotify Descriptors",
813 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
814 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", iNotiFDs_max, RRDF_FIELD_SORT_DESCENDING,
815 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
816 - RRDF_FIELD_OPTS_NONE, NULL);
817 - buffer_rrdf_table_add_field(wb, field_id++, "EventFDs", "Open Event Descriptors",
818 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
819 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", EventFDs_max, RRDF_FIELD_SORT_DESCENDING,
820 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
821 - RRDF_FIELD_OPTS_NONE, NULL);
822 - buffer_rrdf_table_add_field(wb, field_id++, "TimerFDs", "Open Timer Descriptors",
823 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
824 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", TimerFDs_max, RRDF_FIELD_SORT_DESCENDING,
825 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
826 - RRDF_FIELD_OPTS_NONE, NULL);
827 - buffer_rrdf_table_add_field(wb, field_id++, "SigFDs", "Open Signal Descriptors",
828 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
829 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", SigFDs_max, RRDF_FIELD_SORT_DESCENDING, NULL,
830 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
831 - RRDF_FIELD_OPTS_NONE, NULL);
832 - buffer_rrdf_table_add_field(wb, field_id++, "EvPollFDs", "Open Event Poll Descriptors",
833 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
834 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", EvPollFDs_max,
835 - RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
836 - RRDF_FIELD_OPTS_NONE, NULL);
837 - buffer_rrdf_table_add_field(wb, field_id++, "OtherFDs", "Other Open Descriptors",
838 - RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
839 - RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", OtherFDs_max, RRDF_FIELD_SORT_DESCENDING,
840 - NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
841 - RRDF_FIELD_OPTS_NONE, NULL);
842 -#endif
843 -
844 -#if (PROCESSES_HAVE_HANDLES == 1)
845 - buffer_rrdf_table_add_field(wb, field_id++, "Handles", "Open Handles", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
846 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
847 - "handles",
848 - Handles_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
849 - RRDF_FIELD_FILTER_RANGE,
850 - RRDF_FIELD_OPTS_VISIBLE, NULL);
851 -#endif
852 -
853 - // processes, threads, uptime
854 - buffer_rrdf_table_add_field(wb, field_id++, "Processes", "Processes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
855 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
856 - "processes", Processes_max, RRDF_FIELD_SORT_DESCENDING, NULL,
857 - RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
858 - RRDF_FIELD_OPTS_NONE, NULL);
859 - buffer_rrdf_table_add_field(wb, field_id++, "Threads", "Threads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
860 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
861 - "threads", Threads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
862 - RRDF_FIELD_FILTER_RANGE,
863 - RRDF_FIELD_OPTS_NONE, NULL);
864 - buffer_rrdf_table_add_field(wb, field_id++, "Uptime", "Uptime in seconds", RRDF_FIELD_TYPE_DURATION,
865 - RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_DURATION_S, 2,
866 - "seconds", Uptime_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MAX,
867 - RRDF_FIELD_FILTER_RANGE,
868 - RRDF_FIELD_OPTS_VISIBLE, NULL);
869 - }
870 - buffer_json_object_close(wb); // columns
871 -
872 - buffer_json_member_add_string(wb, "default_sort_column", "CPU");
873 -
874 - buffer_json_member_add_object(wb, "charts");
875 - {
876 - // CPU chart
877 - buffer_json_member_add_object(wb, "CPU");
878 - {
879 - buffer_json_member_add_string(wb, "name", "CPU Utilization");
880 - buffer_json_member_add_string(wb, "type", "stacked-bar");
881 - buffer_json_member_add_array(wb, "columns");
882 - {
883 - buffer_json_add_array_item_string(wb, "UserCPU");
884 - buffer_json_add_array_item_string(wb, "SysCPU");
885 -#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
886 - buffer_json_add_array_item_string(wb, "GuestCPU");
887 -#endif
888 -#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
889 - buffer_json_add_array_item_string(wb, "CUserCPU");
890 - buffer_json_add_array_item_string(wb, "CSysCPU");
891 -#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
892 - buffer_json_add_array_item_string(wb, "CGuestCPU");
893 -#endif
894 -#endif
895 - }
896 - buffer_json_array_close(wb);
897 - }
898 - buffer_json_object_close(wb);
899 -
900 -#if (PROCESSES_HAVE_VOLCTX == 1) || (PROCESSES_HAVE_NVOLCTX == 1)
901 - buffer_json_member_add_object(wb, "CPUCtxSwitches");
902 - {
903 - buffer_json_member_add_string(wb, "name", "CPU Context Switches");
904 - buffer_json_member_add_string(wb, "type", "stacked-bar");
905 - buffer_json_member_add_array(wb, "columns");
906 - {
907 -#if (PROCESSES_HAVE_VOLCTX == 1)
908 - buffer_json_add_array_item_string(wb, "vCtxSwitch");
909 -#endif
910 -#if (PROCESSES_HAVE_NVOLCTX == 1)
911 - buffer_json_add_array_item_string(wb, "iCtxSwitch");
912 -#endif
913 - }
914 - buffer_json_array_close(wb);
915 - }
916 - buffer_json_object_close(wb);
588 + buffer_json_object_close(wb);
589 #endif
590
591 // Memory chart
@@ -933,7 +605,6 @@ void function_processes(const char *transaction, char *function,
605 buffer_json_object_close(wb);
606
607 if(total_memory_bytes) {
936 - // Memory chart
608 buffer_json_member_add_object(wb, "MemoryPercent");
609 {
610 buffer_json_member_add_string(wb, "name", "Memory Percentage");
@@ -1087,6 +758,7 @@ void function_processes(const char *transaction, char *function,
758 }
759 buffer_json_object_close(wb);
760
761 +#if (PROCESSES_HAVE_FDS == 1)
762 // FDs chart
763 buffer_json_member_add_object(wb, "FDs");
764 {
@@ -1107,9 +779,27 @@ void function_processes(const char *transaction, char *function,
779 buffer_json_array_close(wb);
780 }
781 buffer_json_object_close(wb);
782 +#endif
783 +
784 +#if (PROCESSES_HAVE_HANDLES == 1)
785 + // Handles chart
786 + buffer_json_member_add_object(wb, "Handles");
787 + {
788 + buffer_json_member_add_string(wb, "name", "Handles");
789 + buffer_json_member_add_string(wb, "type", "stacked-bar");
790 + buffer_json_member_add_array(wb, "columns");
791 + {
792 + buffer_json_add_array_item_string(wb, "Handles");
793 + }
794 + buffer_json_array_close(wb);
795 + }
796 + buffer_json_object_close(wb);
797 +#endif
798 }
799 buffer_json_object_close(wb); // charts
800 +}
801
802 +static void fp_emit_groupby(BUFFER *wb) {
803 buffer_json_member_add_array(wb, "default_charts");
804 {
805 buffer_json_add_array_item_array(wb);
@@ -1195,6 +885,501 @@ void function_processes(const char *transaction, char *function,
885 #endif
886 }
887 buffer_json_object_close(wb); // group_by
888 +}
889 +
890 +void function_processes(const char *transaction, char *function,
891 + usec_t *stop_monotonic_ut __maybe_unused, bool *cancelled __maybe_unused,
892 + BUFFER *payload __maybe_unused, HTTP_ACCESS access,
893 + const char *source __maybe_unused, void *data __maybe_unused) {
894 + time_t now_s = now_realtime_sec();
895 + struct pid_stat *p;
896 +
897 + bool show_cmdline = http_access_user_has_enough_access_level_for_endpoint(
898 + access, HTTP_ACCESS_SIGNED_ID | HTTP_ACCESS_SAME_SPACE | HTTP_ACCESS_SENSITIVE_DATA | HTTP_ACCESS_VIEW_AGENT_CONFIG) || enable_function_cmdline;
899 +
900 + char *words[PLUGINSD_MAX_WORDS] = { NULL };
901 + size_t num_words = quoted_strings_splitter_whitespace(function, words, PLUGINSD_MAX_WORDS);
902 +
903 + struct target *category = NULL, *user = NULL, *group = NULL; (void)category; (void)user; (void)group;
904 +#if (PROCESSES_HAVE_UID == 1)
905 + struct target *users_sid_root = users_root_target;
906 +#endif
907 +#if (PROCESSES_HAVE_SID == 1)
908 + struct target *users_sid_root = sids_root_target;
909 +#endif
910 + const char *process_name = NULL;
911 + pid_t pid = 0;
912 + uid_t uid = 0; (void)uid;
913 + gid_t gid = 0; (void)gid;
914 + bool info = false;
915 +
916 + bool filter_pid = false, filter_uid = false, filter_gid = false;
917 + (void)filter_uid; (void)filter_gid;
918 +
919 + for(int i = 1; i < PLUGINSD_MAX_WORDS ;i++) {
920 + const char *keyword = get_word(words, num_words, i);
921 + if(!keyword) break;
922 +
923 + if(!category && strncmp(keyword, PROCESS_FILTER_CATEGORY, strlen(PROCESS_FILTER_CATEGORY)) == 0) {
924 + category = find_target_by_name(apps_groups_root_target, &keyword[strlen(PROCESS_FILTER_CATEGORY)]);
925 + if(!category) {
926 + pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
927 + "No category with that name found.");
928 + return;
929 + }
930 + }
931 +#if (PROCESSES_HAVE_UID == 1) || (PROCESSES_HAVE_SID == 1)
932 + else if(!user && strncmp(keyword, PROCESS_FILTER_USER, strlen(PROCESS_FILTER_USER)) == 0) {
933 + user = find_target_by_name(users_sid_root, &keyword[strlen(PROCESS_FILTER_USER)]);
934 + if(!user) {
935 + pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
936 + "No user with that name found.");
937 + return;
938 + }
939 + }
940 +#endif
941 +#if (PROCESSES_HAVE_GID == 1)
942 + else if(strncmp(keyword, PROCESS_FILTER_GROUP, strlen(PROCESS_FILTER_GROUP)) == 0) {
943 + group = find_target_by_name(groups_root_target, &keyword[strlen(PROCESS_FILTER_GROUP)]);
944 + if(!group) {
945 + pluginsd_function_json_error_to_stdout(transaction, HTTP_RESP_BAD_REQUEST,
946 + "No group with that name found.");
947 + return;
948 + }
949 + }
950 +#endif
951 + else if(!process_name && strncmp(keyword, PROCESS_FILTER_PROCESS, strlen(PROCESS_FILTER_PROCESS)) == 0) {
952 + process_name = &keyword[strlen(PROCESS_FILTER_PROCESS)];
953 + }
954 + else if(!pid && strncmp(keyword, PROCESS_FILTER_PID, strlen(PROCESS_FILTER_PID)) == 0) {
955 + pid = str2i(&keyword[strlen(PROCESS_FILTER_PID)]);
956 + filter_pid = true;
957 + }
958 +#if (PROCESSES_HAVE_UID == 1)
959 + else if(!uid && strncmp(keyword, PROCESS_FILTER_UID, strlen(PROCESS_FILTER_UID)) == 0) {
960 + uid = str2i(&keyword[strlen(PROCESS_FILTER_UID)]);
961 + filter_uid = true;
962 + }
963 +#endif
964 +#if (PROCESSES_HAVE_GID == 1)
965 + else if(!gid && strncmp(keyword, PROCESS_FILTER_GID, strlen(PROCESS_FILTER_GID)) == 0) {
966 + gid = str2i(&keyword[strlen(PROCESS_FILTER_GID)]);
967 + filter_gid = true;
968 + }
969 +#endif
970 + else if(strcmp(keyword, "help") == 0) {
971 + apps_plugin_function_processes_help(transaction);
972 + return;
973 + }
974 + else if(strcmp(keyword, "info") == 0) {
975 + info = true;
976 + }
977 + }
978 +
979 + BUFFER *wb = buffer_create(4096, NULL);
980 + buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_MINIFY);
981 + buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
982 + buffer_json_member_add_string(wb, "type", "table");
983 + buffer_json_member_add_time_t(wb, "update_every", update_every);
984 + buffer_json_member_add_boolean(wb, "has_history", false);
985 + buffer_json_member_add_string(wb, "help", APPS_PLUGIN_PROCESSES_FUNCTION_DESCRIPTION);
986 +
987 + if(info)
988 + goto close_and_send;
989 +
990 + buffer_json_member_add_array(wb, "data");
991 +
992 + uint64_t cpu_divisor = NSEC_PER_SEC / 100;
993 + unsigned int memory_divisor = 1024 * 1024;
994 + unsigned int io_divisor = 1024 * RATES_DETAIL;
995 +
996 + uint64_t total_memory_bytes = OS_FUNCTION(apps_os_get_total_memory)();
997 +
998 + NETDATA_DOUBLE
999 + UserCPU_max = 0.0
1000 + , SysCPU_max = 0.0
1001 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
1002 + , GuestCPU_max = 0.0
1003 +#endif
1004 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
1005 + , CUserCPU_max = 0.0
1006 + , CSysCPU_max = 0.0
1007 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
1008 + , CGuestCPU_max = 0.0
1009 +#endif
1010 +#endif
1011 + , CPU_max = 0.0
1012 + , VMSize_max = 0.0
1013 + , RSS_max = 0.0
1014 +#if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
1015 + , Estimated_max = 0.0
1016 + , Pss_max = 0.0
1017 + , PssAge_max = 0.0
1018 + , SharedRatio_max = 0.0
1019 +#endif
1020 +#if (PROCESSES_HAVE_VMSHARED == 1)
1021 + , Shared_max = 0.0
1022 +#endif
1023 + , Swap_max = 0.0
1024 + , Memory_max = 0.0
1025 +#if (PROCESSES_HAVE_FDS == 1) && (PROCESSES_HAVE_PID_LIMITS == 1)
1026 + , FDsLimitPercent_max = 0.0
1027 +#endif
1028 + ;
1029 +
1030 + unsigned long long
1031 + Processes_max = 0
1032 + , Threads_max = 0
1033 +#if (PROCESSES_HAVE_VOLCTX == 1)
1034 + , VoluntaryCtxtSwitches_max = 0
1035 +#endif
1036 +#if (PROCESSES_HAVE_NVOLCTX == 1)
1037 + , NonVoluntaryCtxtSwitches_max = 0
1038 +#endif
1039 + , Uptime_max = 0
1040 + , MinFlt_max = 0
1041 +#if (PROCESSES_HAVE_MAJFLT == 1)
1042 + , MajFlt_max = 0
1043 +#endif
1044 +#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
1045 + , CMinFlt_max = 0
1046 + , CMajFlt_max = 0
1047 + , TMinFlt_max = 0
1048 + , TMajFlt_max = 0
1049 +#endif
1050 +#if (PROCESSES_HAVE_LOGICAL_IO == 1)
1051 + , LReads_max = 0
1052 + , LWrites_max = 0
1053 +#endif
1054 +#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
1055 + , PReads_max = 0
1056 + , PWrites_max = 0
1057 +#endif
1058 +#if (PROCESSES_HAVE_IO_CALLS == 1)
1059 + , ROps_max = 0
1060 + , WOps_max = 0
1061 +#endif
1062 +#if (PROCESSES_HAVE_FDS == 1)
1063 + , Files_max = 0
1064 + , Pipes_max = 0
1065 + , Sockets_max = 0
1066 + , iNotiFDs_max = 0
1067 + , EventFDs_max = 0
1068 + , TimerFDs_max = 0
1069 + , SigFDs_max = 0
1070 + , EvPollFDs_max = 0
1071 + , OtherFDs_max = 0
1072 + , FDs_max = 0
1073 +#endif
1074 +#if (PROCESSES_HAVE_HANDLES == 1)
1075 + , Handles_max = 0
1076 +#endif
1077 + ;
1078 +
1079 + netdata_mutex_lock(&apps_and_stdout_mutex);
1080 +
1081 + int rows= 0;
1082 + for(p = root_of_pids(); p ; p = p->next) {
1083 + if(!p->updated)
1084 + continue;
1085 +
1086 + if(category && p->target != category)
1087 + continue;
1088 +
1089 +#if (PROCESSES_HAVE_UID == 1)
1090 + if(user && p->uid_target != user)
1091 + continue;
1092 +#endif
1093 +
1094 +#if (PROCESSES_HAVE_GID == 1)
1095 + if(group && p->gid_target != group)
1096 + continue;
1097 +#endif
1098 +
1099 +#if (PROCESSES_HAVE_SID == 1)
1100 + if(user && p->sid_target != user)
1101 + continue;
1102 +#endif
1103 +
1104 + if(process_name && ((strcmp(pid_stat_comm(p), process_name) != 0 && !p->parent) || (p->parent && strcmp(pid_stat_comm(p), process_name) != 0 && strcmp(pid_stat_comm(p->parent), process_name) != 0)))
1105 + continue;
1106 +
1107 + if(filter_pid && p->pid != pid && p->ppid != pid)
1108 + continue;
1109 +
1110 +#if (PROCESSES_HAVE_UID == 1)
1111 + if(filter_uid && p->uid != uid)
1112 + continue;
1113 +#endif
1114 +
1115 +#if (PROCESSES_HAVE_GID == 1)
1116 + if(filter_gid && p->gid != gid)
1117 + continue;
1118 +#endif
1119 +
1120 + rows++;
1121 +
1122 + buffer_json_add_array_item_array(wb); // for each pid
1123 +
1124 + // IMPORTANT!
1125 + // THE ORDER SHOULD BE THE SAME WITH THE FIELDS!
1126 +
1127 + // pid
1128 + buffer_json_add_array_item_uint64(wb, p->pid);
1129 +
1130 + // cmd
1131 + buffer_json_add_array_item_string(wb, string2str(p->comm));
1132 +
1133 +#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
1134 + // name
1135 + buffer_json_add_array_item_string(wb, string2str(p->name ? p->name : p->comm));
1136 +#endif
1137 +
1138 + // cmdline
1139 + if (show_cmdline) {
1140 + buffer_json_add_array_item_string(wb, (string_strlen(p->cmdline)) ? pid_stat_cmdline(p) : pid_stat_comm(p));
1141 + }
1142 +
1143 + // ppid
1144 + buffer_json_add_array_item_uint64(wb, p->ppid);
1145 +
1146 + // category
1147 + buffer_json_add_array_item_string(wb, p->target ? string2str(p->target->name) : "-");
1148 +
1149 +#if (PROCESSES_HAVE_UID == 1)
1150 + // user
1151 + buffer_json_add_array_item_string(wb, p->uid_target ? string2str(p->uid_target->name) : "-");
1152 +
1153 + // uid
1154 + buffer_json_add_array_item_uint64(wb, p->uid);
1155 +#endif
1156 +#if (PROCESSES_HAVE_SID == 1)
1157 + // account
1158 + buffer_json_add_array_item_string(wb, p->sid_target ? string2str(p->sid_target->name) : "-");
1159 +#endif
1160 +
1161 +#if (PROCESSES_HAVE_GID == 1)
1162 + // group
1163 + buffer_json_add_array_item_string(wb, p->gid_target ? string2str(p->gid_target->name) : "-");
1164 +
1165 + // gid
1166 + buffer_json_add_array_item_uint64(wb, p->gid);
1167 +#endif
1168 +
1169 + // CPU utilization %
1170 + kernel_uint_t total_cpu = p->values[PDF_UTIME] + p->values[PDF_STIME];
1171 +
1172 +#if (PROCESSES_HAVE_CPU_GUEST_TIME)
1173 + total_cpu += p->values[PDF_GTIME];
1174 +#endif
1175 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
1176 + total_cpu += p->values[PDF_CUTIME] + p->values[PDF_CSTIME];
1177 +#if (PROCESSES_HAVE_CPU_GUEST_TIME)
1178 + total_cpu += p->values[PDF_CGTIME];
1179 +#endif
1180 +#endif
1181 + add_value_field_ndd_with_max(wb, CPU, (NETDATA_DOUBLE)(total_cpu) / cpu_divisor);
1182 +
1183 + add_value_field_ndd_with_max(wb, UserCPU, (NETDATA_DOUBLE)(p->values[PDF_UTIME]) / cpu_divisor);
1184 + add_value_field_ndd_with_max(wb, SysCPU, (NETDATA_DOUBLE)(p->values[PDF_STIME]) / cpu_divisor);
1185 +#if (PROCESSES_HAVE_CPU_GUEST_TIME)
1186 + add_value_field_ndd_with_max(wb, GuestCPU, (NETDATA_DOUBLE)(p->values[PDF_GTIME]) / cpu_divisor);
1187 +#endif
1188 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
1189 + add_value_field_ndd_with_max(wb, CUserCPU, (NETDATA_DOUBLE)(p->values[PDF_CUTIME]) / cpu_divisor);
1190 + add_value_field_ndd_with_max(wb, CSysCPU, (NETDATA_DOUBLE)(p->values[PDF_CSTIME]) / cpu_divisor);
1191 +#if (PROCESSES_HAVE_CPU_GUEST_TIME)
1192 + add_value_field_ndd_with_max(wb, CGuestCPU, (NETDATA_DOUBLE)(p->values[PDF_CGTIME]) / cpu_divisor);
1193 +#endif
1194 +#endif
1195 +
1196 +#if (PROCESSES_HAVE_VOLCTX == 1)
1197 + add_value_field_llu_with_max(wb, VoluntaryCtxtSwitches, p->values[PDF_VOLCTX] / RATES_DETAIL);
1198 +#endif
1199 +#if (PROCESSES_HAVE_NVOLCTX == 1)
1200 + add_value_field_llu_with_max(wb, NonVoluntaryCtxtSwitches, p->values[PDF_NVOLCTX] / RATES_DETAIL);
1201 +#endif
1202 +
1203 + // memory MiB
1204 + if(total_memory_bytes)
1205 + add_value_field_ndd_with_max(wb, Memory, (NETDATA_DOUBLE)p->values[PDF_VMRSS] * 100.0 / (NETDATA_DOUBLE)total_memory_bytes);
1206 +
1207 + add_value_field_ndd_with_max(wb, RSS, (NETDATA_DOUBLE)p->values[PDF_VMRSS] / memory_divisor);
1208 +#if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
1209 + if(pss_refresh_period > 0) {
1210 + add_value_field_ndd_with_max(wb, Estimated, (NETDATA_DOUBLE)p->values[PDF_MEM_ESTIMATED] / memory_divisor);
1211 + add_value_field_ndd_with_max(wb, Pss, (NETDATA_DOUBLE)p->values[PDF_PSS] / memory_divisor);
1212 + NETDATA_DOUBLE pss_age;
1213 + if(p->last_pss_iteration == 0)
1214 + pss_age = NAN;
1215 + else if(global_iterations_counter >= p->last_pss_iteration)
1216 + pss_age = (NETDATA_DOUBLE)(global_iterations_counter - p->last_pss_iteration) * update_every;
1217 + else
1218 + pss_age = NAN;
1219 + add_value_field_ndd_with_max(wb, PssAge, pss_age);
1220 + NETDATA_DOUBLE shared_ratio = p->pss_total_ratio * 100.0;
1221 + add_value_field_ndd_with_max(wb, SharedRatio, shared_ratio);
1222 + }
1223 +#endif
1224 +#if (PROCESSES_HAVE_VMSHARED == 1)
1225 + add_value_field_ndd_with_max(wb, Shared, (NETDATA_DOUBLE)p->values[PDF_VMSHARED] / memory_divisor);
1226 +#endif
1227 +
1228 + add_value_field_ndd_with_max(wb, VMSize, (NETDATA_DOUBLE)p->values[PDF_VMSIZE] / memory_divisor);
1229 +
1230 +#if (PROCESSES_HAVE_VMSWAP == 1)
1231 + add_value_field_ndd_with_max(wb, Swap, (NETDATA_DOUBLE)p->values[PDF_VMSWAP] / memory_divisor);
1232 +#endif
1233 +
1234 +#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
1235 + // Physical I/O
1236 + add_value_field_llu_with_max(wb, PReads, p->values[PDF_PREAD] / io_divisor);
1237 + add_value_field_llu_with_max(wb, PWrites, p->values[PDF_PWRITE] / io_divisor);
1238 +#endif
1239 +
1240 +#if (PROCESSES_HAVE_LOGICAL_IO == 1)
1241 + // Logical I/O
1242 + add_value_field_llu_with_max(wb, LReads, p->values[PDF_LREAD] / io_divisor);
1243 + add_value_field_llu_with_max(wb, LWrites, p->values[PDF_LWRITE] / io_divisor);
1244 +#endif
1245 +
1246 +#if (PROCESSES_HAVE_IO_CALLS == 1)
1247 + // I/O calls
1248 + add_value_field_llu_with_max(wb, ROps, p->values[PDF_OREAD] / RATES_DETAIL);
1249 + add_value_field_llu_with_max(wb, WOps, p->values[PDF_OWRITE] / RATES_DETAIL);
1250 +#endif
1251 +
1252 + // minor page faults
1253 + add_value_field_llu_with_max(wb, MinFlt, p->values[PDF_MINFLT] / RATES_DETAIL);
1254 +
1255 +#if (PROCESSES_HAVE_MAJFLT == 1)
1256 + // major page faults
1257 + add_value_field_llu_with_max(wb, MajFlt, p->values[PDF_MAJFLT] / RATES_DETAIL);
1258 +#endif
1259 +
1260 +#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
1261 + add_value_field_llu_with_max(wb, CMinFlt, p->values[PDF_CMINFLT] / RATES_DETAIL);
1262 + add_value_field_llu_with_max(wb, CMajFlt, p->values[PDF_CMAJFLT] / RATES_DETAIL);
1263 + add_value_field_llu_with_max(wb, TMinFlt, (p->values[PDF_MINFLT] + p->values[PDF_CMINFLT]) / RATES_DETAIL);
1264 + add_value_field_llu_with_max(wb, TMajFlt, (p->values[PDF_MAJFLT] + p->values[PDF_CMAJFLT]) / RATES_DETAIL);
1265 +#endif
1266 +
1267 +#if (PROCESSES_HAVE_FDS == 1)
1268 + // open file descriptors
1269 +#if (PROCESSES_HAVE_PID_LIMITS == 1)
1270 + add_value_field_ndd_with_max(wb, FDsLimitPercent, p->openfds_limits_percent);
1271 +#endif
1272 + add_value_field_llu_with_max(wb, FDs, pid_openfds_sum(p));
1273 +
1274 + add_value_field_llu_with_max(wb, Files, p->openfds.files);
1275 + add_value_field_llu_with_max(wb, Pipes, p->openfds.pipes);
1276 + add_value_field_llu_with_max(wb, Sockets, p->openfds.sockets);
1277 + add_value_field_llu_with_max(wb, iNotiFDs, p->openfds.inotifies);
1278 + add_value_field_llu_with_max(wb, EventFDs, p->openfds.eventfds);
1279 + add_value_field_llu_with_max(wb, TimerFDs, p->openfds.timerfds);
1280 + add_value_field_llu_with_max(wb, SigFDs, p->openfds.signalfds);
1281 + add_value_field_llu_with_max(wb, EvPollFDs, p->openfds.eventpolls);
1282 + add_value_field_llu_with_max(wb, OtherFDs, p->openfds.other);
1283 +#endif
1284 +
1285 +#if (PROCESSES_HAVE_HANDLES == 1)
1286 + add_value_field_llu_with_max(wb, Handles, p->values[PDF_HANDLES]);
1287 +#endif
1288 +
1289 + // processes, threads, uptime
1290 + add_value_field_llu_with_max(wb, Processes, p->values[PDF_PROCESSES]);
1291 + add_value_field_llu_with_max(wb, Threads, p->values[PDF_THREADS]);
1292 + add_value_field_llu_with_max(wb, Uptime, p->values[PDF_UPTIME]);
1293 +
1294 + buffer_json_array_close(wb); // for each pid
1295 + }
1296 +
1297 + buffer_json_array_close(wb); // data
1298 +
1299 + struct fp_maxvals mv = {
1300 + .UserCPU_max = UserCPU_max,
1301 + .SysCPU_max = SysCPU_max,
1302 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
1303 + .GuestCPU_max = GuestCPU_max,
1304 +#endif
1305 +#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
1306 + .CUserCPU_max = CUserCPU_max,
1307 + .CSysCPU_max = CSysCPU_max,
1308 +#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
1309 + .CGuestCPU_max = CGuestCPU_max,
1310 +#endif
1311 +#endif
1312 + .CPU_max = CPU_max,
1313 + .VMSize_max = VMSize_max,
1314 + .RSS_max = RSS_max,
1315 +#if (PROCESSES_HAVE_SMAPS_ROLLUP == 1)
1316 + .Estimated_max = Estimated_max,
1317 + .Pss_max = Pss_max,
1318 + .PssAge_max = PssAge_max,
1319 + .SharedRatio_max = SharedRatio_max,
1320 +#endif
1321 +#if (PROCESSES_HAVE_VMSHARED == 1)
1322 + .Shared_max = Shared_max,
1323 +#endif
1324 + .Swap_max = Swap_max,
1325 +#if (PROCESSES_HAVE_FDS == 1) && (PROCESSES_HAVE_PID_LIMITS == 1)
1326 + .FDsLimitPercent_max = FDsLimitPercent_max,
1327 +#endif
1328 + .Processes_max = Processes_max,
1329 + .Threads_max = Threads_max,
1330 +#if (PROCESSES_HAVE_VOLCTX == 1)
1331 + .VoluntaryCtxtSwitches_max = VoluntaryCtxtSwitches_max,
1332 +#endif
1333 +#if (PROCESSES_HAVE_NVOLCTX == 1)
1334 + .NonVoluntaryCtxtSwitches_max = NonVoluntaryCtxtSwitches_max,
1335 +#endif
1336 + .Uptime_max = Uptime_max,
1337 + .MinFlt_max = MinFlt_max,
1338 +#if (PROCESSES_HAVE_MAJFLT == 1)
1339 + .MajFlt_max = MajFlt_max,
1340 +#endif
1341 +#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
1342 + .CMinFlt_max = CMinFlt_max,
1343 + .CMajFlt_max = CMajFlt_max,
1344 + .TMinFlt_max = TMinFlt_max,
1345 + .TMajFlt_max = TMajFlt_max,
1346 +#endif
1347 +#if (PROCESSES_HAVE_LOGICAL_IO == 1)
1348 + .LReads_max = LReads_max,
1349 + .LWrites_max = LWrites_max,
1350 +#endif
1351 +#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
1352 + .PReads_max = PReads_max,
1353 + .PWrites_max = PWrites_max,
1354 +#endif
1355 +#if (PROCESSES_HAVE_IO_CALLS == 1)
1356 + .ROps_max = ROps_max,
1357 + .WOps_max = WOps_max,
1358 +#endif
1359 +#if (PROCESSES_HAVE_FDS == 1)
1360 + .Files_max = Files_max,
1361 + .Pipes_max = Pipes_max,
1362 + .Sockets_max = Sockets_max,
1363 + .iNotiFDs_max = iNotiFDs_max,
1364 + .EventFDs_max = EventFDs_max,
1365 + .TimerFDs_max = TimerFDs_max,
1366 + .SigFDs_max = SigFDs_max,
1367 + .EvPollFDs_max = EvPollFDs_max,
1368 + .OtherFDs_max = OtherFDs_max,
1369 + .FDs_max = FDs_max,
1370 +#endif
1371 +#if (PROCESSES_HAVE_HANDLES == 1)
1372 + .Handles_max = Handles_max,
1373 +#endif
1374 + };
1375 +
1376 + fp_emit_columns(wb, &mv, show_cmdline, total_memory_bytes);
1377 +
1378 + buffer_json_member_add_string(wb, "default_sort_column", "CPU");
1379 +
1380 + fp_emit_charts(wb, total_memory_bytes);
1381 +
1382 + fp_emit_groupby(wb);
1383
1384 netdata_mutex_unlock(&apps_and_stdout_mutex);
1385
src/daemon/status-file.c
+37 -13
@@ -93,16 +93,10 @@ static void fill_dmi_info(DAEMON_STATUS_FILE *ds) {
93
94 // --------------------------------------------------------------------------------------------------------------------
95 // json generation
96 +// Each section is a separate function to stay within GCC's -fvar-tracking-assignments size limit.
97 +// IMPORTANT: ALL functions here are called from signal handlers — no locks, no allocations.
98
97 -static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
98 - // IMPORTANT: NO LOCKS OR ALLOCATIONS HERE, THIS FUNCTION IS CALLED FROM SIGNAL HANDLERS
99 - // THIS FUNCTION MUST USE ONLY ASYNC-SIGNAL-SAFE OPERATIONS
100 -
101 - dsf_acquire(*ds);
102 -
103 - buffer_json_member_add_string(wb, "@timestamp", ds->timestamp_ut_rfc3339);
104 - buffer_json_member_add_uint64(wb, "version", STATUS_FILE_VERSION);
105 -
99 +static void dsf_json_agent(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
100 buffer_json_member_add_object(wb, "agent");
101 {
102 buffer_json_member_add_uuid(wb, "id", ds->host_id.uuid.uuid);
@@ -121,7 +115,7 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
115
116 if(ds->v >= 24)
117 buffer_json_member_add_uint64(wb, "crashes", ds->crashes);
124 -
118 +
119 // Only include PID if we're at version 27 or later
120 if(ds->v >= 27)
121 buffer_json_member_add_uint64(wb, "pid", (uint64_t)ds->pid);
@@ -159,7 +153,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
153 buffer_json_object_close(wb);
154 }
155 buffer_json_object_close(wb);
156 +}
157
158 +static void dsf_json_metrics(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
159 // Add metrics stats as a top-level node
160 buffer_json_member_add_object(wb, "metrics");
161 {
@@ -194,7 +190,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
190 buffer_json_object_close(wb);
191 }
192 buffer_json_object_close(wb);
193 +}
194
195 +static void dsf_json_host(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
196 buffer_json_member_add_object(wb, "host");
197 {
198 buffer_json_member_add_uuid_compact(wb, "id", ds->machine_id.uuid);
@@ -209,7 +207,7 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
207 buffer_json_member_add_string_or_empty(wb, "cloud_instance", ds->cloud_instance_type);
208 buffer_json_member_add_string_or_empty(wb, "cloud_region", ds->cloud_instance_region);
209 }
212 -
210 +
211 buffer_json_member_add_uint64(wb, "system_cpus", ds->system_cpus);
212
213 buffer_json_member_add_object(wb, "boot");
@@ -241,7 +239,7 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
239 buffer_json_member_add_boolean(wb, "read_only", ds->var_cache.is_read_only);
240 }
241 buffer_json_object_close(wb);
244 -
242 +
243 buffer_json_member_add_object(wb, "netdata");
244 buffer_json_member_add_uint64(wb, "dbengine", ds->disk_footprint.dbengine);
245 buffer_json_member_add_uint64(wb, "sqlite", ds->disk_footprint.sqlite);
@@ -252,7 +250,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
250 buffer_json_object_close(wb);
251 }
252 buffer_json_object_close(wb);
255 -
253 +}
254 +
255 +static void dsf_json_os(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
256 buffer_json_member_add_object(wb, "os");
257 {
258 buffer_json_member_add_string(wb, "type", DAEMON_OS_TYPE_2str(ds->os_type));
@@ -263,7 +263,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
263 buffer_json_member_add_string_or_empty(wb, "platform", ds->os_id_like);
264 }
265 buffer_json_object_close(wb);
266 +}
267
268 +static void dsf_json_hw(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
269 buffer_json_member_add_object(wb, "hw");
270 {
271 buffer_json_member_add_object(wb, "sys");
@@ -314,7 +316,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
316 buffer_json_object_close(wb);
317 }
318 buffer_json_object_close(wb);
319 +}
320
321 +static void dsf_json_product(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
322 buffer_json_member_add_object(wb, "product");
323 {
324 buffer_json_member_add_string(wb, "vendor", ds->product.vendor);
@@ -322,7 +326,9 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
326 buffer_json_member_add_string(wb, "type", ds->product.type);
327 }
328 buffer_json_object_close(wb);
329 +}
330
331 +static void dsf_json_fatal(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
332 buffer_json_member_add_object(wb, "fatal");
333 {
334 buffer_json_member_add_uint64(wb, "line", ds->fatal.line);
@@ -358,6 +364,24 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
364 buffer_json_member_add_uint64(wb, "worker_job_id", ds->fatal.worker_job_id);
365 }
366 buffer_json_object_close(wb);
367 +}
368 +
369 +static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
370 + // IMPORTANT: NO LOCKS OR ALLOCATIONS HERE, THIS FUNCTION IS CALLED FROM SIGNAL HANDLERS
371 + // THIS FUNCTION MUST USE ONLY ASYNC-SIGNAL-SAFE OPERATIONS
372 +
373 + dsf_acquire(*ds);
374 +
375 + buffer_json_member_add_string(wb, "@timestamp", ds->timestamp_ut_rfc3339);
376 + buffer_json_member_add_uint64(wb, "version", STATUS_FILE_VERSION);
377 +
378 + dsf_json_agent(wb, ds);
379 + dsf_json_metrics(wb, ds);
380 + dsf_json_host(wb, ds);
381 + dsf_json_os(wb, ds);
382 + dsf_json_hw(wb, ds);
383 + dsf_json_product(wb, ds);
384 + dsf_json_fatal(wb, ds);
385
386 dsf_release(*ds);
387 }