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
}