|
@@ -24,24 +24,35 @@ static void apps_plugin_function_processes_help(const char *transaction) {
|
|
|
" category:NAME\n"
|
|
|
" Shows only processes that are assigned the category `NAME` in apps_groups.conf\n"
|
|
|
"\n"
|
|
|
+ " parent:NAME\n"
|
|
|
+ " Shows only processes that are aggregated under parent `NAME`\n"
|
|
|
+ "\n"
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
" user:NAME\n"
|
|
|
" Shows only processes that are running as user name `NAME`.\n"
|
|
|
"\n"
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
" group:NAME\n"
|
|
|
" Shows only processes that are running as group name `NAME`.\n"
|
|
|
"\n"
|
|
|
+#endif
|
|
|
" process:NAME\n"
|
|
|
" Shows only processes that their Command is `NAME` or their parent's Command is `NAME`.\n"
|
|
|
"\n"
|
|
|
" pid:NUMBER\n"
|
|
|
" Shows only processes that their PID is `NUMBER` or their parent's PID is `NUMBER`\n"
|
|
|
"\n"
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
" uid:NUMBER\n"
|
|
|
" Shows only processes that their UID is `NUMBER`\n"
|
|
|
"\n"
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
" gid:NUMBER\n"
|
|
|
" Shows only processes that their GID is `NUMBER`\n"
|
|
|
"\n"
|
|
|
+#endif
|
|
|
"Filters can be combined. Each filter can be given only one time.\n"
|
|
|
);
|
|
|
|
|
@@ -72,21 +83,20 @@ void function_processes(const char *transaction, char *function,
|
|
|
struct pid_stat *p;
|
|
|
|
|
|
bool show_cmdline = http_access_user_has_enough_access_level_for_endpoint(
|
|
|
- access,
|
|
|
- HTTP_ACCESS_SIGNED_ID | HTTP_ACCESS_SAME_SPACE | HTTP_ACCESS_SENSITIVE_DATA |
|
|
|
- HTTP_ACCESS_VIEW_AGENT_CONFIG) || enable_function_cmdline;
|
|
|
+ access, HTTP_ACCESS_SIGNED_ID | HTTP_ACCESS_SAME_SPACE | HTTP_ACCESS_SENSITIVE_DATA | HTTP_ACCESS_VIEW_AGENT_CONFIG) || enable_function_cmdline;
|
|
|
|
|
|
char *words[PLUGINSD_MAX_WORDS] = { NULL };
|
|
|
size_t num_words = quoted_strings_splitter_pluginsd(function, words, PLUGINSD_MAX_WORDS);
|
|
|
|
|
|
- struct target *category = NULL, *user = NULL, *group = NULL;
|
|
|
+ struct target *category = NULL, *user = NULL, *group = NULL; (void)category; (void)user; (void)group;
|
|
|
const char *process_name = NULL;
|
|
|
pid_t pid = 0;
|
|
|
- uid_t uid = 0;
|
|
|
- gid_t gid = 0;
|
|
|
+ uid_t uid = 0; (void)uid;
|
|
|
+ gid_t gid = 0; (void)gid;
|
|
|
bool info = false;
|
|
|
|
|
|
bool filter_pid = false, filter_uid = false, filter_gid = false;
|
|
|
+ (void)filter_uid; (void)filter_gid;
|
|
|
|
|
|
for(int i = 1; i < PLUGINSD_MAX_WORDS ;i++) {
|
|
|
const char *keyword = get_word(words, num_words, i);
|
|
@@ -100,6 +110,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
else if(!user && strncmp(keyword, PROCESS_FILTER_USER, strlen(PROCESS_FILTER_USER)) == 0) {
|
|
|
user = find_target_by_name(users_root_target, &keyword[strlen(PROCESS_FILTER_USER)]);
|
|
|
if(!user) {
|
|
@@ -108,6 +119,8 @@ void function_processes(const char *transaction, char *function,
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
else if(strncmp(keyword, PROCESS_FILTER_GROUP, strlen(PROCESS_FILTER_GROUP)) == 0) {
|
|
|
group = find_target_by_name(groups_root_target, &keyword[strlen(PROCESS_FILTER_GROUP)]);
|
|
|
if(!group) {
|
|
@@ -116,6 +129,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
else if(!process_name && strncmp(keyword, PROCESS_FILTER_PROCESS, strlen(PROCESS_FILTER_PROCESS)) == 0) {
|
|
|
process_name = &keyword[strlen(PROCESS_FILTER_PROCESS)];
|
|
|
}
|
|
@@ -123,14 +137,18 @@ void function_processes(const char *transaction, char *function,
|
|
|
pid = str2i(&keyword[strlen(PROCESS_FILTER_PID)]);
|
|
|
filter_pid = true;
|
|
|
}
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
else if(!uid && strncmp(keyword, PROCESS_FILTER_UID, strlen(PROCESS_FILTER_UID)) == 0) {
|
|
|
uid = str2i(&keyword[strlen(PROCESS_FILTER_UID)]);
|
|
|
filter_uid = true;
|
|
|
}
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
else if(!gid && strncmp(keyword, PROCESS_FILTER_GID, strlen(PROCESS_FILTER_GID)) == 0) {
|
|
|
gid = str2i(&keyword[strlen(PROCESS_FILTER_GID)]);
|
|
|
filter_gid = true;
|
|
|
}
|
|
|
+#endif
|
|
|
else if(strcmp(keyword, "help") == 0) {
|
|
|
apps_plugin_function_processes_help(transaction);
|
|
|
return;
|
|
@@ -140,10 +158,6 @@ void function_processes(const char *transaction, char *function,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- unsigned int cpu_divisor = time_factor * RATES_DETAIL / 100;
|
|
|
- unsigned int memory_divisor = 1024;
|
|
|
- unsigned int io_divisor = 1024 * RATES_DETAIL;
|
|
|
-
|
|
|
BUFFER *wb = buffer_create(4096, NULL);
|
|
|
buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_MINIFY);
|
|
|
buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
|
|
@@ -156,38 +170,71 @@ void function_processes(const char *transaction, char *function,
|
|
|
if(info)
|
|
|
goto close_and_send;
|
|
|
|
|
|
+ uint64_t cpu_divisor = NSEC_PER_SEC / 100;
|
|
|
+ unsigned int memory_divisor = 1024 * 1024;
|
|
|
+ unsigned int io_divisor = 1024 * RATES_DETAIL;
|
|
|
+
|
|
|
+ uint64_t total_memory_bytes = OS_FUNCTION(apps_os_get_total_memory)();
|
|
|
+
|
|
|
NETDATA_DOUBLE
|
|
|
- UserCPU_max = 0.0
|
|
|
+ UserCPU_max = 0.0
|
|
|
, SysCPU_max = 0.0
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
, GuestCPU_max = 0.0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
|
|
|
, CUserCPU_max = 0.0
|
|
|
, CSysCPU_max = 0.0
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
, CGuestCPU_max = 0.0
|
|
|
+#endif
|
|
|
+#endif
|
|
|
, CPU_max = 0.0
|
|
|
, VMSize_max = 0.0
|
|
|
, RSS_max = 0.0
|
|
|
+#if (PROCESSES_HAVE_VMSHARED == 1)
|
|
|
, Shared_max = 0.0
|
|
|
+#endif
|
|
|
, Swap_max = 0.0
|
|
|
, Memory_max = 0.0
|
|
|
+#if (PROCESSES_HAVE_FDS == 1) && (PROCESSES_HAVE_PID_LIMITS == 1)
|
|
|
, FDsLimitPercent_max = 0.0
|
|
|
+#endif
|
|
|
;
|
|
|
|
|
|
unsigned long long
|
|
|
Processes_max = 0
|
|
|
, Threads_max = 0
|
|
|
+#if (PROCESSES_HAVE_VOLCTX == 1)
|
|
|
, VoluntaryCtxtSwitches_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_NVOLCTX == 1)
|
|
|
, NonVoluntaryCtxtSwitches_max = 0
|
|
|
+#endif
|
|
|
, Uptime_max = 0
|
|
|
, MinFlt_max = 0
|
|
|
- , CMinFlt_max = 0
|
|
|
- , TMinFlt_max = 0
|
|
|
+#if (PROCESSES_HAVE_MAJFLT == 1)
|
|
|
, MajFlt_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
|
|
|
+ , CMinFlt_max = 0
|
|
|
, CMajFlt_max = 0
|
|
|
+ , TMinFlt_max = 0
|
|
|
, TMajFlt_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
+ , LReads_max = 0
|
|
|
+ , LWrites_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
, PReads_max = 0
|
|
|
, PWrites_max = 0
|
|
|
- , RCalls_max = 0
|
|
|
- , WCalls_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_IO_CALLS == 1)
|
|
|
+ , ROps_max = 0
|
|
|
+ , WOps_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_FDS == 1)
|
|
|
, Files_max = 0
|
|
|
, Pipes_max = 0
|
|
|
, Sockets_max = 0
|
|
@@ -198,40 +245,47 @@ void function_processes(const char *transaction, char *function,
|
|
|
, EvPollFDs_max = 0
|
|
|
, OtherFDs_max = 0
|
|
|
, FDs_max = 0
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_HANDLES == 1)
|
|
|
+ , Handles_max = 0
|
|
|
+#endif
|
|
|
;
|
|
|
|
|
|
-#if !defined(__FreeBSD__) && !defined(__APPLE__)
|
|
|
- unsigned long long
|
|
|
- LReads_max = 0
|
|
|
- , LWrites_max = 0
|
|
|
- ;
|
|
|
-#endif // !__FreeBSD__ !__APPLE_
|
|
|
+ netdata_mutex_lock(&apps_and_stdout_mutex);
|
|
|
|
|
|
int rows= 0;
|
|
|
- for(p = root_of_pids; p ; p = p->next) {
|
|
|
+ for(p = root_of_pids(); p ; p = p->next) {
|
|
|
if(!p->updated)
|
|
|
continue;
|
|
|
|
|
|
if(category && p->target != category)
|
|
|
continue;
|
|
|
|
|
|
- if(user && p->user_target != user)
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
+ if(user && p->uid_target != user)
|
|
|
continue;
|
|
|
+#endif
|
|
|
|
|
|
- if(group && p->group_target != group)
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
+ if(group && p->gid_target != group)
|
|
|
continue;
|
|
|
+#endif
|
|
|
|
|
|
- if(process_name && ((strcmp(p->comm, process_name) != 0 && !p->parent) || (p->parent && strcmp(p->comm, process_name) != 0 && strcmp(p->parent->comm, process_name) != 0)))
|
|
|
+ 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)))
|
|
|
continue;
|
|
|
|
|
|
if(filter_pid && p->pid != pid && p->ppid != pid)
|
|
|
continue;
|
|
|
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
if(filter_uid && p->uid != uid)
|
|
|
continue;
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
if(filter_gid && p->gid != gid)
|
|
|
continue;
|
|
|
+#endif
|
|
|
|
|
|
rows++;
|
|
|
|
|
@@ -244,80 +298,126 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_add_array_item_uint64(wb, p->pid);
|
|
|
|
|
|
// cmd
|
|
|
- buffer_json_add_array_item_string(wb, p->comm);
|
|
|
+ buffer_json_add_array_item_string(wb, string2str(p->comm));
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
|
|
|
+ // name
|
|
|
+ buffer_json_add_array_item_string(wb, string2str(p->name ? p->name : p->comm));
|
|
|
+#endif
|
|
|
|
|
|
// cmdline
|
|
|
if (show_cmdline) {
|
|
|
- buffer_json_add_array_item_string(wb, (p->cmdline && *p->cmdline) ? p->cmdline : p->comm);
|
|
|
+ buffer_json_add_array_item_string(wb, (string_strlen(p->cmdline)) ? pid_stat_cmdline(p) : pid_stat_comm(p));
|
|
|
}
|
|
|
|
|
|
// ppid
|
|
|
buffer_json_add_array_item_uint64(wb, p->ppid);
|
|
|
|
|
|
// category
|
|
|
- buffer_json_add_array_item_string(wb, p->target ? p->target->name : "-");
|
|
|
+ buffer_json_add_array_item_string(wb, p->target ? string2str(p->target->name) : "-");
|
|
|
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
// user
|
|
|
- buffer_json_add_array_item_string(wb, p->user_target ? p->user_target->name : "-");
|
|
|
+ buffer_json_add_array_item_string(wb, p->uid_target ? string2str(p->uid_target->name) : "-");
|
|
|
|
|
|
// uid
|
|
|
buffer_json_add_array_item_uint64(wb, p->uid);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
// group
|
|
|
- buffer_json_add_array_item_string(wb, p->group_target ? p->group_target->name : "-");
|
|
|
+ buffer_json_add_array_item_string(wb, p->gid_target ? string2str(p->gid_target->name) : "-");
|
|
|
|
|
|
// gid
|
|
|
buffer_json_add_array_item_uint64(wb, p->gid);
|
|
|
+#endif
|
|
|
|
|
|
// CPU utilization %
|
|
|
- add_value_field_ndd_with_max(wb, CPU, (NETDATA_DOUBLE)(p->utime + p->stime + p->gtime + p->cutime + p->cstime + p->cgtime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, UserCPU, (NETDATA_DOUBLE)(p->utime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, SysCPU, (NETDATA_DOUBLE)(p->stime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, GuestCPU, (NETDATA_DOUBLE)(p->gtime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, CUserCPU, (NETDATA_DOUBLE)(p->cutime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, CSysCPU, (NETDATA_DOUBLE)(p->cstime) / cpu_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, CGuestCPU, (NETDATA_DOUBLE)(p->cgtime) / cpu_divisor);
|
|
|
+ kernel_uint_t total_cpu = p->values[PDF_UTIME] + p->values[PDF_STIME];
|
|
|
|
|
|
- add_value_field_llu_with_max(wb, VoluntaryCtxtSwitches, p->status_voluntary_ctxt_switches / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, NonVoluntaryCtxtSwitches, p->status_nonvoluntary_ctxt_switches / RATES_DETAIL);
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME)
|
|
|
+ total_cpu += p->values[PDF_GTIME];
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
|
|
|
+ total_cpu += p->values[PDF_CUTIME] + p->values[PDF_CSTIME];
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME)
|
|
|
+ total_cpu += p->values[PDF_CGTIME];
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+ add_value_field_ndd_with_max(wb, CPU, (NETDATA_DOUBLE)(total_cpu) / cpu_divisor);
|
|
|
+ add_value_field_ndd_with_max(wb, UserCPU, (NETDATA_DOUBLE)(p->values[PDF_UTIME]) / cpu_divisor);
|
|
|
+ add_value_field_ndd_with_max(wb, SysCPU, (NETDATA_DOUBLE)(p->values[PDF_STIME]) / cpu_divisor);
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME)
|
|
|
+ add_value_field_ndd_with_max(wb, GuestCPU, (NETDATA_DOUBLE)(p->values[PDF_GTIME]) / cpu_divisor);
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CPU_CHILDREN_TIME)
|
|
|
+ add_value_field_ndd_with_max(wb, CUserCPU, (NETDATA_DOUBLE)(p->values[PDF_CUTIME]) / cpu_divisor);
|
|
|
+ add_value_field_ndd_with_max(wb, CSysCPU, (NETDATA_DOUBLE)(p->values[PDF_CSTIME]) / cpu_divisor);
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME)
|
|
|
+ add_value_field_ndd_with_max(wb, CGuestCPU, (NETDATA_DOUBLE)(p->values[PDF_CGTIME]) / cpu_divisor);
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_VOLCTX == 1)
|
|
|
+ add_value_field_llu_with_max(wb, VoluntaryCtxtSwitches, p->values[PDF_VOLCTX] / RATES_DETAIL);
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_NVOLCTX == 1)
|
|
|
+ add_value_field_llu_with_max(wb, NonVoluntaryCtxtSwitches, p->values[PDF_NVOLCTX] / RATES_DETAIL);
|
|
|
+#endif
|
|
|
|
|
|
// memory MiB
|
|
|
- if(MemTotal)
|
|
|
- add_value_field_ndd_with_max(wb, Memory, (NETDATA_DOUBLE)p->status_vmrss * 100.0 / (NETDATA_DOUBLE)MemTotal);
|
|
|
+ if(total_memory_bytes)
|
|
|
+ add_value_field_ndd_with_max(wb, Memory, (NETDATA_DOUBLE)p->values[PDF_VMRSS] * 100.0 / (NETDATA_DOUBLE)total_memory_bytes);
|
|
|
+
|
|
|
+ add_value_field_ndd_with_max(wb, RSS, (NETDATA_DOUBLE)p->values[PDF_VMRSS] / memory_divisor);
|
|
|
|
|
|
- add_value_field_ndd_with_max(wb, RSS, (NETDATA_DOUBLE)p->status_vmrss / memory_divisor);
|
|
|
- add_value_field_ndd_with_max(wb, Shared, (NETDATA_DOUBLE)p->status_vmshared / memory_divisor);
|
|
|
-#if !defined(__APPLE__)
|
|
|
- add_value_field_ndd_with_max(wb, VMSize, (NETDATA_DOUBLE)p->status_vmsize / memory_divisor);
|
|
|
+#if (PROCESSES_HAVE_VMSHARED == 1)
|
|
|
+ add_value_field_ndd_with_max(wb, Shared, (NETDATA_DOUBLE)p->values[PDF_VMSHARED] / memory_divisor);
|
|
|
#endif
|
|
|
- add_value_field_ndd_with_max(wb, Swap, (NETDATA_DOUBLE)p->status_vmswap / memory_divisor);
|
|
|
|
|
|
+ add_value_field_ndd_with_max(wb, VMSize, (NETDATA_DOUBLE)p->values[PDF_VMSIZE] / memory_divisor);
|
|
|
+#if (PROCESSES_HAVE_VMSWAP == 1)
|
|
|
+ add_value_field_ndd_with_max(wb, Swap, (NETDATA_DOUBLE)p->values[PDF_VMSWAP] / memory_divisor);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
// Physical I/O
|
|
|
- add_value_field_llu_with_max(wb, PReads, p->io_storage_bytes_read / io_divisor);
|
|
|
- add_value_field_llu_with_max(wb, PWrites, p->io_storage_bytes_written / io_divisor);
|
|
|
+ add_value_field_llu_with_max(wb, PReads, p->values[PDF_PREAD] / io_divisor);
|
|
|
+ add_value_field_llu_with_max(wb, PWrites, p->values[PDF_PWRITE] / io_divisor);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
// Logical I/O
|
|
|
-#if !defined(__FreeBSD__) && !defined(__APPLE__)
|
|
|
- add_value_field_llu_with_max(wb, LReads, p->io_logical_bytes_read / io_divisor);
|
|
|
- add_value_field_llu_with_max(wb, LWrites, p->io_logical_bytes_written / io_divisor);
|
|
|
+ add_value_field_llu_with_max(wb, LReads, p->values[PDF_LREAD] / io_divisor);
|
|
|
+ add_value_field_llu_with_max(wb, LWrites, p->values[PDF_LWRITE] / io_divisor);
|
|
|
#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_IO_CALLS == 1)
|
|
|
// I/O calls
|
|
|
- add_value_field_llu_with_max(wb, RCalls, p->io_read_calls / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, WCalls, p->io_write_calls / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, ROps, p->values[PDF_OREAD] / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, WOps, p->values[PDF_OWRITE] / RATES_DETAIL);
|
|
|
+#endif
|
|
|
|
|
|
// minor page faults
|
|
|
- add_value_field_llu_with_max(wb, MinFlt, p->minflt / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, CMinFlt, p->cminflt / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, TMinFlt, (p->minflt + p->cminflt) / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, MinFlt, p->values[PDF_MINFLT] / RATES_DETAIL);
|
|
|
|
|
|
+#if (PROCESSES_HAVE_MAJFLT == 1)
|
|
|
// major page faults
|
|
|
- add_value_field_llu_with_max(wb, MajFlt, p->majflt / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, CMajFlt, p->cmajflt / RATES_DETAIL);
|
|
|
- add_value_field_llu_with_max(wb, TMajFlt, (p->majflt + p->cmajflt) / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, MajFlt, p->values[PDF_MAJFLT] / RATES_DETAIL);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
|
|
|
+ add_value_field_llu_with_max(wb, CMinFlt, p->values[PDF_CMINFLT] / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, CMajFlt, p->values[PDF_CMAJFLT] / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, TMinFlt, (p->values[PDF_MINFLT] + p->values[PDF_CMINFLT]) / RATES_DETAIL);
|
|
|
+ add_value_field_llu_with_max(wb, TMajFlt, (p->values[PDF_MAJFLT] + p->values[PDF_CMAJFLT]) / RATES_DETAIL);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_FDS == 1)
|
|
|
// open file descriptors
|
|
|
+#if (PROCESSES_HAVE_PID_LIMITS == 1)
|
|
|
add_value_field_ndd_with_max(wb, FDsLimitPercent, p->openfds_limits_percent);
|
|
|
+#endif
|
|
|
add_value_field_llu_with_max(wb, FDs, pid_openfds_sum(p));
|
|
|
add_value_field_llu_with_max(wb, Files, p->openfds.files);
|
|
|
add_value_field_llu_with_max(wb, Pipes, p->openfds.pipes);
|
|
@@ -328,12 +428,16 @@ void function_processes(const char *transaction, char *function,
|
|
|
add_value_field_llu_with_max(wb, SigFDs, p->openfds.signalfds);
|
|
|
add_value_field_llu_with_max(wb, EvPollFDs, p->openfds.eventpolls);
|
|
|
add_value_field_llu_with_max(wb, OtherFDs, p->openfds.other);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_HANDLES == 1)
|
|
|
+ add_value_field_llu_with_max(wb, Handles, p->values[PDF_HANDLES]);
|
|
|
+#endif
|
|
|
|
|
|
// processes, threads, uptime
|
|
|
- add_value_field_llu_with_max(wb, Processes, p->children_count);
|
|
|
- add_value_field_llu_with_max(wb, Threads, p->num_threads);
|
|
|
- add_value_field_llu_with_max(wb, Uptime, p->uptime);
|
|
|
+ add_value_field_llu_with_max(wb, Processes, p->values[PDF_PROCESSES]);
|
|
|
+ add_value_field_llu_with_max(wb, Threads, p->values[PDF_THREADS]);
|
|
|
+ add_value_field_llu_with_max(wb, Uptime, p->values[PDF_UPTIME]);
|
|
|
|
|
|
buffer_json_array_close(wb); // for each pid
|
|
|
}
|
|
@@ -360,6 +464,14 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
|
|
|
|
|
|
+#if (PROCESSES_HAVE_COMM_AND_NAME == 1)
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "Name", "Process Friendly Name", RRDF_FIELD_TYPE_STRING,
|
|
|
+ RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
|
|
|
+ RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
|
+ RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
|
|
|
+#endif
|
|
|
+
|
|
|
if (show_cmdline) {
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "CmdLine", "Command Line", RRDF_FIELD_TYPE_STRING,
|
|
|
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0,
|
|
@@ -373,12 +485,15 @@ void function_processes(const char *transaction, char *function,
|
|
|
NAN, RRDF_FIELD_SORT_ASCENDING, "PID", RRDF_FIELD_SUMMARY_COUNT,
|
|
|
RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Category", "Category (apps_groups.conf)", RRDF_FIELD_TYPE_STRING,
|
|
|
RRDF_FIELD_VISUAL_VALUE,
|
|
|
RRDF_FIELD_TRANSFORM_NONE,
|
|
|
0, NULL, NAN, RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
|
RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "User", "User Owner", RRDF_FIELD_TYPE_STRING,
|
|
|
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
|
|
|
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
@@ -389,6 +504,9 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
|
RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Group", "Group Owner", RRDF_FIELD_TYPE_STRING,
|
|
|
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
|
|
|
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
@@ -399,6 +517,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
|
|
|
RRDF_FIELD_FILTER_MULTISELECT,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
// CPU utilization
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "CPU", "Total CPU Time (100% = 1 core)",
|
|
@@ -416,11 +535,14 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", SysCPU_max,
|
|
|
RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "GuestCPU", "Guest CPU Time (100% = 1 core)",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", GuestCPU_max,
|
|
|
RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "CUserCPU", "Children User CPU Time (100% = 1 core)",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CUserCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
@@ -431,26 +553,33 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CSysCPU_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
|
RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "CGuestCPU", "Children Guest CPU Time (100% = 1 core)",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", CGuestCPU_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
NULL,
|
|
|
RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_VOLCTX == 1)
|
|
|
// CPU context switches
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "vCtxSwitch", "Voluntary Context Switches",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
|
|
|
VoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
|
RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_NVOLCTX == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "iCtxSwitch", "Involuntary Context Switches",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2, "switches/s",
|
|
|
NonVoluntaryCtxtSwitches_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
|
RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE, RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
// memory
|
|
|
- if (MemTotal)
|
|
|
+ if (total_memory_bytes)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Memory", "Memory Percentage", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", 100.0, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
@@ -463,25 +592,30 @@ void function_processes(const char *transaction, char *function,
|
|
|
2, "MiB", RSS_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_VISIBLE, NULL);
|
|
|
+#if (PROCESSES_HAVE_VMSHARED == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Shared", "Shared Pages", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
|
|
|
"MiB", Shared_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_VISIBLE, NULL);
|
|
|
-#if !defined(__APPLE__)
|
|
|
+#endif
|
|
|
+
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Virtual", "Virtual Memory Size", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "MiB", VMSize_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
|
RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_VISIBLE, NULL);
|
|
|
-#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_VMSWAP == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Swap", "Swap Memory", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
|
|
|
"MiB",
|
|
|
Swap_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
// Physical I/O
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "PReads", "Physical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
|
|
@@ -493,33 +627,41 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "KiB/s", PWrites_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_VISIBLE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
+ RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_NONE;
|
|
|
+#else
|
|
|
+ RRDF_FIELD_OPTIONS logical_io_options = RRDF_FIELD_OPTS_VISIBLE;
|
|
|
+#endif
|
|
|
// Logical I/O
|
|
|
-#if !defined(__FreeBSD__) && !defined(__APPLE__)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "LReads", "Logical I/O Reads", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
|
|
|
2, "KiB/s", LReads_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
- RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+ logical_io_options, NULL);
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "LWrites", "Logical I/O Writes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER,
|
|
|
2, "KiB/s", LWrites_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
- RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+ logical_io_options, NULL);
|
|
|
#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_IO_CALLS == 1)
|
|
|
// I/O calls
|
|
|
- buffer_rrdf_table_add_field(wb, field_id++, "RCalls", "I/O Read Calls", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "ROps", "I/O Read Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
|
|
|
- "calls/s", RCalls_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
+ "ops/s", ROps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
- buffer_rrdf_table_add_field(wb, field_id++, "WCalls", "I/O Write Calls", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "WOps", "I/O Write Operations", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 2,
|
|
|
- "calls/s", WCalls_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
+ "ops/s", WOps_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
// minor page faults
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "MinFlt", "Minor Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
@@ -528,18 +670,8 @@ void function_processes(const char *transaction, char *function,
|
|
|
2, "pgflts/s", MinFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
- buffer_rrdf_table_add_field(wb, field_id++, "CMinFlt", "Children Minor Page Faults/s",
|
|
|
- RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
- RRDF_FIELD_VISUAL_BAR,
|
|
|
- RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", CMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
- NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
- RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
- buffer_rrdf_table_add_field(wb, field_id++, "TMinFlt", "Total Minor Page Faults/s",
|
|
|
- RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
- RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", TMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
- NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
- RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
|
|
|
+#if (PROCESSES_HAVE_MAJFLT == 1)
|
|
|
// major page faults
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "MajFlt", "Major Page Faults/s", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR,
|
|
@@ -547,24 +679,42 @@ void function_processes(const char *transaction, char *function,
|
|
|
2, "pgflts/s", MajFlt_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_CHILDREN_FLTS == 1)
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "CMinFlt", "Children Minor Page Faults/s",
|
|
|
+ RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
+ RRDF_FIELD_VISUAL_BAR,
|
|
|
+ RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", CMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
+ NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
+ RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "CMajFlt", "Children Major Page Faults/s",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", CMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "TMinFlt", "Total Minor Page Faults/s",
|
|
|
+ RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
+ RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", TMinFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
+ NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
+ RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "TMajFlt", "Total Major Page Faults/s",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "pgflts/s", TMajFlt_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_FDS == 1)
|
|
|
// open file descriptors
|
|
|
+#if (PROCESSES_HAVE_PID_LIMITS == 1)
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "FDsLimitPercent", "Percentage of Open Descriptors vs Limits",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 2, "%", FDsLimitPercent_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
|
RRDF_FIELD_SUMMARY_MAX, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "FDs", "All Open File Descriptors",
|
|
|
RRDF_FIELD_TYPE_BAR_WITH_INTEGER, RRDF_FIELD_VISUAL_BAR,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", FDs_max, RRDF_FIELD_SORT_DESCENDING, NULL,
|
|
@@ -617,6 +767,16 @@ void function_processes(const char *transaction, char *function,
|
|
|
RRDF_FIELD_TRANSFORM_NUMBER, 0, "fds", OtherFDs_max, RRDF_FIELD_SORT_DESCENDING,
|
|
|
NULL, RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
|
|
|
RRDF_FIELD_OPTS_NONE, NULL);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if (PROCESSES_HAVE_HANDLES == 1)
|
|
|
+ buffer_rrdf_table_add_field(wb, field_id++, "Handles", "Open Handles", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
|
+ RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER, 0,
|
|
|
+ "handles",
|
|
|
+ Handles_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
|
|
|
+ RRDF_FIELD_FILTER_RANGE,
|
|
|
+ RRDF_FIELD_OPTS_VISIBLE, NULL);
|
|
|
+#endif
|
|
|
|
|
|
// processes, threads, uptime
|
|
|
buffer_rrdf_table_add_field(wb, field_id++, "Processes", "Processes", RRDF_FIELD_TYPE_BAR_WITH_INTEGER,
|
|
@@ -650,27 +810,39 @@ void function_processes(const char *transaction, char *function,
|
|
|
{
|
|
|
buffer_json_add_array_item_string(wb, "UserCPU");
|
|
|
buffer_json_add_array_item_string(wb, "SysCPU");
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
buffer_json_add_array_item_string(wb, "GuestCPU");
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_CPU_CHILDREN_TIME == 1)
|
|
|
buffer_json_add_array_item_string(wb, "CUserCPU");
|
|
|
buffer_json_add_array_item_string(wb, "CSysCPU");
|
|
|
+#if (PROCESSES_HAVE_CPU_GUEST_TIME == 1)
|
|
|
buffer_json_add_array_item_string(wb, "CGuestCPU");
|
|
|
+#endif
|
|
|
+#endif
|
|
|
}
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
|
|
|
+#if (PROCESSES_HAVE_VOLCTX == 1) || (PROCESSES_HAVE_NVOLCTX == 1)
|
|
|
buffer_json_member_add_object(wb, "CPUCtxSwitches");
|
|
|
{
|
|
|
buffer_json_member_add_string(wb, "name", "CPU Context Switches");
|
|
|
buffer_json_member_add_string(wb, "type", "stacked-bar");
|
|
|
buffer_json_member_add_array(wb, "columns");
|
|
|
{
|
|
|
+#if (PROCESSES_HAVE_VOLCTX == 1)
|
|
|
buffer_json_add_array_item_string(wb, "vCtxSwitch");
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_NVOLCTX == 1)
|
|
|
buffer_json_add_array_item_string(wb, "iCtxSwitch");
|
|
|
+#endif
|
|
|
}
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
|
|
|
// Memory chart
|
|
|
buffer_json_member_add_object(wb, "Memory");
|
|
@@ -688,7 +860,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
|
|
|
- if(MemTotal) {
|
|
|
+ if(total_memory_bytes) {
|
|
|
// Memory chart
|
|
|
buffer_json_member_add_object(wb, "MemoryPercent");
|
|
|
{
|
|
@@ -703,7 +875,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_object_close(wb);
|
|
|
}
|
|
|
|
|
|
-#if !defined(__FreeBSD__) && !defined(__APPLE__)
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1) || (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
// I/O Reads chart
|
|
|
buffer_json_member_add_object(wb, "Reads");
|
|
|
{
|
|
@@ -711,8 +883,12 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_member_add_string(wb, "type", "stacked-bar");
|
|
|
buffer_json_member_add_array(wb, "columns");
|
|
|
{
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
buffer_json_add_array_item_string(wb, "LReads");
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
buffer_json_add_array_item_string(wb, "PReads");
|
|
|
+#endif
|
|
|
}
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
@@ -725,13 +901,19 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_member_add_string(wb, "type", "stacked-bar");
|
|
|
buffer_json_member_add_array(wb, "columns");
|
|
|
{
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
buffer_json_add_array_item_string(wb, "LWrites");
|
|
|
+#endif
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
buffer_json_add_array_item_string(wb, "PWrites");
|
|
|
+#endif
|
|
|
}
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_LOGICAL_IO == 1)
|
|
|
// Logical I/O chart
|
|
|
buffer_json_member_add_object(wb, "LogicalIO");
|
|
|
{
|
|
@@ -747,6 +929,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_object_close(wb);
|
|
|
#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_PHYSICAL_IO == 1)
|
|
|
// Physical I/O chart
|
|
|
buffer_json_member_add_object(wb, "PhysicalIO");
|
|
|
{
|
|
@@ -760,7 +943,9 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_IO_CALLS == 1)
|
|
|
// I/O Calls chart
|
|
|
buffer_json_member_add_object(wb, "IOCalls");
|
|
|
{
|
|
@@ -768,12 +953,13 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_member_add_string(wb, "type", "stacked-bar");
|
|
|
buffer_json_member_add_array(wb, "columns");
|
|
|
{
|
|
|
- buffer_json_add_array_item_string(wb, "RCalls");
|
|
|
+ buffer_json_add_array_item_string(wb, "ROps");
|
|
|
buffer_json_add_array_item_string(wb, "WCalls");
|
|
|
}
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
|
|
|
// Minor Page Faults chart
|
|
|
buffer_json_member_add_object(wb, "MinFlt");
|
|
@@ -893,6 +1079,7 @@ void function_processes(const char *transaction, char *function,
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
|
|
|
+#if (PROCESSES_HAVE_UID == 1)
|
|
|
// group by User
|
|
|
buffer_json_member_add_object(wb, "User");
|
|
|
{
|
|
@@ -905,7 +1092,9 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
|
|
|
+#if (PROCESSES_HAVE_GID == 1)
|
|
|
// group by Group
|
|
|
buffer_json_member_add_object(wb, "Group");
|
|
|
{
|
|
@@ -918,9 +1107,12 @@ void function_processes(const char *transaction, char *function,
|
|
|
buffer_json_array_close(wb);
|
|
|
}
|
|
|
buffer_json_object_close(wb);
|
|
|
+#endif
|
|
|
}
|
|
|
buffer_json_object_close(wb); // group_by
|
|
|
|
|
|
+ netdata_mutex_unlock(&apps_and_stdout_mutex);
|
|
|
+
|
|
|
close_and_send:
|
|
|
buffer_json_member_add_time_t(wb, "expires", now_s + update_every);
|
|
|
buffer_json_finalize(wb);
|