summaryrefslogtreecommitdiffstats
path: root/collectors/apps.plugin
diff options
context:
space:
mode:
Diffstat (limited to 'collectors/apps.plugin')
-rw-r--r--collectors/apps.plugin/README.md17
-rw-r--r--collectors/apps.plugin/apps_plugin.c134
-rw-r--r--collectors/apps.plugin/metadata.yaml (renamed from collectors/apps.plugin/multi_metadata.yaml)129
-rw-r--r--collectors/apps.plugin/metrics.csv81
4 files changed, 179 insertions, 182 deletions
diff --git a/collectors/apps.plugin/README.md b/collectors/apps.plugin/README.md
index ad4e0882..fd5371f0 100644
--- a/collectors/apps.plugin/README.md
+++ b/collectors/apps.plugin/README.md
@@ -30,7 +30,7 @@ a predefined set of members (of course, only process groups found running are re
Unlike traditional process monitoring tools (like `top`), `apps.plugin` is able to account the resource
utilization of exit processes. Their utilization is accounted at their currently running parents.
So, `apps.plugin` is perfectly able to measure the resources used by shell scripts and other processes
-that fork/spawn other short lived processes hundreds of times per second.
+that fork/spawn other short-lived processes hundreds of times per second.
## Charts
@@ -75,7 +75,7 @@ The above are reported:
- For **Applications** per target configured.
- For **Users** per username or UID (when the username is not available).
-- For **User Groups** per groupname or GID (when groupname is not available).
+- For **User Groups** per group name or GID (when group name is not available).
## Performance
@@ -183,8 +183,7 @@ If this fails (i.e. `setcap` fails), `apps.plugin` is setuid to `root`.
There are a few cases, like `docker` and `virtuozzo` containers, where `setcap` succeeds, but the capabilities
are silently ignored (in `lxc` containers `setcap` fails).
-In these cases ()`setcap` succeeds but capabilities do not work), you will have to setuid
-to root `apps.plugin` by running these commands:
+In this case, you will have to setuid to root `apps.plugin` by running these commands:
```sh
chown root:netdata /usr/libexec/netdata/plugins.d/apps.plugin
@@ -200,7 +199,7 @@ iterating forever, collecting metrics for each running process and sending them
This is a one-way communication, from `apps.plugin` to Netdata.
So, since `apps.plugin` cannot be instructed by Netdata for the actions it performs,
-we think it is pretty safe to allow it have these increased privileges.
+we think it is pretty safe to allow it to have these increased privileges.
Keep in mind that `apps.plugin` will still run without escalated permissions,
but it will not be able to collect all the information.
@@ -219,7 +218,7 @@ Here is an example for the process group `sql` at `https://registry.my-netdata.i
![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.processes&dimensions=sql&value_color=green%3E0%7Cred)
-Netdata is able give you a lot more badges for your app.
+Netdata is able to give you a lot more badges for your app.
Examples below for process group `sql`:
- CPU usage: ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.cpu&dimensions=sql&value_color=green=0%7Corange%3C50%7Cred)
@@ -227,7 +226,7 @@ Examples below for process group `sql`:
- Disk Physical Writes ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.pwrites&dimensions=sql&value_color=green%3C100%7Corange%3C1000%7Cred)
- Disk Logical Reads ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.lreads&dimensions=sql&value_color=green%3C100%7Corange%3C1000%7Cred)
- Disk Logical Writes ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.lwrites&dimensions=sql&value_color=green%3C100%7Corange%3C1000%7Cred)
-- Open Files ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.files&dimensions=sql&value_color=green%3E30%7Cred)
+- Open Files ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.fds_files&dimensions=sql&value_color=green%3E30%7Cred)
- Real Memory ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.mem&dimensions=sql&value_color=green%3C100%7Corange%3C200%7Cred)
- Virtual Memory ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.vmem&dimensions=sql&value_color=green%3C100%7Corange%3C1000%7Cred)
- Swap Memory ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.swap&dimensions=sql&value_color=green=0%7Cred)
@@ -235,8 +234,8 @@ Examples below for process group `sql`:
- Processes ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.processes&dimensions=sql&value_color=green%3E0%7Cred)
- Threads ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.threads&dimensions=sql&value_color=green%3E=28%7Cred)
- Major Faults (swap activity) ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.major_faults&dimensions=sql&value_color=green=0%7Cred)
-- Open Pipes ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.pipes&dimensions=sql&value_color=green=0%7Cred)
-- Open Sockets ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.sockets&dimensions=sql&value_color=green%3E=3%7Cred)
+- Open Pipes ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.fds_pipes&dimensions=sql&value_color=green=0%7Cred)
+- Open Sockets ![image](https://registry.my-netdata.io/api/v1/badge.svg?chart=apps.fds_sockets&dimensions=sql&value_color=green%3E=3%7Cred)
For more information about badges check [Generating Badges](https://github.com/netdata/netdata/blob/master/web/api/badges/README.md)
diff --git a/collectors/apps.plugin/apps_plugin.c b/collectors/apps.plugin/apps_plugin.c
index 105c5426..94f997e8 100644
--- a/collectors/apps.plugin/apps_plugin.c
+++ b/collectors/apps.plugin/apps_plugin.c
@@ -13,7 +13,7 @@
#define APPS_PLUGIN_PROCESSES_FUNCTION_DESCRIPTION "Detailed information on the currently running processes."
#define APPS_PLUGIN_FUNCTIONS() do { \
- fprintf(stdout, PLUGINSD_KEYWORD_FUNCTION " \"processes\" 10 \"%s\"\n", APPS_PLUGIN_PROCESSES_FUNCTION_DESCRIPTION); \
+ fprintf(stdout, PLUGINSD_KEYWORD_FUNCTION " \"processes\" %d \"%s\"\n", PLUGINS_FUNCTIONS_TIMEOUT_DEFAULT, APPS_PLUGIN_PROCESSES_FUNCTION_DESCRIPTION); \
} while(0)
@@ -144,12 +144,13 @@ static const char *proc_states[] = {
// log each problem once per process
// log flood protection flags (log_thrown)
typedef enum __attribute__((packed)) {
- PID_LOG_IO = (1 << 0),
- PID_LOG_STATUS = (1 << 1),
- PID_LOG_CMDLINE = (1 << 2),
- PID_LOG_FDS = (1 << 3),
- PID_LOG_STAT = (1 << 4),
- PID_LOG_LIMITS = (1 << 5),
+ PID_LOG_IO = (1 << 0),
+ PID_LOG_STATUS = (1 << 1),
+ PID_LOG_CMDLINE = (1 << 2),
+ PID_LOG_FDS = (1 << 3),
+ PID_LOG_STAT = (1 << 4),
+ PID_LOG_LIMITS = (1 << 5),
+ PID_LOG_LIMITS_DETAIL = (1 << 6),
} PID_LOG;
static int
@@ -1362,6 +1363,9 @@ static inline kernel_uint_t get_proc_pid_limits_limit(char *buf, const char *key
char *v = &line[key_len];
while(isspace(*v)) v++;
+ if(strcmp(v, "unlimited") == 0)
+ return 0;
+
return str2ull(v, NULL);
}
@@ -1373,11 +1377,17 @@ static inline int read_proc_pid_limits(struct pid_stat *p, void *ptr) {
#else
static char proc_pid_limits_buffer[MAX_PROC_PID_LIMITS + 1];
int ret = 0;
+ bool read_limits = false;
+
+ errno = 0;
+ proc_pid_limits_buffer[0] = '\0';
kernel_uint_t all_fds = pid_openfds_sum(p);
- if(all_fds < p->limits.max_open_files / 2 && p->io_collected_usec > p->last_limits_collected_usec && p->io_collected_usec - p->last_limits_collected_usec <= 60 * USEC_PER_SEC)
+ if(all_fds < p->limits.max_open_files / 2 && p->io_collected_usec > p->last_limits_collected_usec && p->io_collected_usec - p->last_limits_collected_usec <= 60 * USEC_PER_SEC) {
// too frequent, we want to collect limits once per minute
+ ret = 1;
goto cleanup;
+ }
if(unlikely(!p->limits_filename)) {
char filename[FILENAME_MAX + 1];
@@ -1394,8 +1404,25 @@ static inline int read_proc_pid_limits(struct pid_stat *p, void *ptr) {
if(bytes <= 0)
goto cleanup;
+ // make it '\0' terminated
+ if(bytes < MAX_PROC_PID_LIMITS)
+ proc_pid_limits_buffer[bytes] = '\0';
+ else
+ proc_pid_limits_buffer[MAX_PROC_PID_LIMITS - 1] = '\0';
+
p->limits.max_open_files = get_proc_pid_limits_limit(proc_pid_limits_buffer, PROC_PID_LIMITS_MAX_OPEN_FILES_KEY, sizeof(PROC_PID_LIMITS_MAX_OPEN_FILES_KEY) - 1, 0);
+ if(p->limits.max_open_files == 1) {
+ // it seems a bug in the kernel or something similar
+ // it sets max open files to 1 but the number of files
+ // the process has open are more than 1...
+ // https://github.com/netdata/netdata/issues/15443
+ p->limits.max_open_files = 0;
+ ret = 1;
+ goto cleanup;
+ }
+
p->last_limits_collected_usec = p->io_collected_usec;
+ read_limits = true;
ret = 1;
@@ -1405,6 +1432,62 @@ cleanup:
else
p->openfds_limits_percent = 0.0;
+ if(p->openfds_limits_percent > 100.0) {
+ if(!(p->log_thrown & PID_LOG_LIMITS_DETAIL)) {
+ char *line;
+
+ if(!read_limits) {
+ proc_pid_limits_buffer[0] = '\0';
+ line = "NOT READ";
+ }
+ else {
+ line = strstr(proc_pid_limits_buffer, PROC_PID_LIMITS_MAX_OPEN_FILES_KEY);
+ if (line) {
+ line++; // skip the initial newline
+
+ char *end = strchr(line, '\n');
+ if (end)
+ *end = '\0';
+ }
+ }
+
+ netdata_log_info(
+ "FDS_LIMITS: PID %d (%s) is using "
+ "%0.2f %% of its fds limits, "
+ "open fds = %llu ("
+ "files = %llu, "
+ "pipes = %llu, "
+ "sockets = %llu, "
+ "inotifies = %llu, "
+ "eventfds = %llu, "
+ "timerfds = %llu, "
+ "signalfds = %llu, "
+ "eventpolls = %llu "
+ "other = %llu "
+ "), open fds limit = %llu, "
+ "%s, "
+ "original line [%s]",
+ p->pid, p->comm, p->openfds_limits_percent, all_fds,
+ p->openfds.files,
+ p->openfds.pipes,
+ p->openfds.sockets,
+ p->openfds.inotifies,
+ p->openfds.eventfds,
+ p->openfds.timerfds,
+ p->openfds.signalfds,
+ p->openfds.eventpolls,
+ p->openfds.other,
+ p->limits.max_open_files,
+ read_limits ? "and we have read the limits AFTER counting the fds"
+ : "but we have read the limits BEFORE counting the fds",
+ line);
+
+ p->log_thrown |= PID_LOG_LIMITS_DETAIL;
+ }
+ }
+ else
+ p->log_thrown &= ~PID_LOG_LIMITS_DETAIL;
+
return ret;
#endif
}
@@ -4489,7 +4572,7 @@ static int check_capabilities() {
}
#endif
-netdata_mutex_t mutex = NETDATA_MUTEX_INITIALIZER;
+static netdata_mutex_t mutex = NETDATA_MUTEX_INITIALIZER;
#define PROCESS_FILTER_CATEGORY "category:"
#define PROCESS_FILTER_USER "user:"
@@ -4542,15 +4625,6 @@ static void get_MemTotal(void) {
#endif
}
-static void apps_plugin_function_error(const char *transaction, int code, const char *msg) {
- char buffer[PLUGINSD_LINE_MAX + 1];
- json_escape_string(buffer, msg, PLUGINSD_LINE_MAX);
-
- pluginsd_function_result_begin_to_stdout(transaction, code, "application/json", now_realtime_sec());
- fprintf(stdout, "{\"status\":%d,\"error_message\":\"%s\"}", code, buffer);
- pluginsd_function_result_end_to_stdout();
-}
-
static void apps_plugin_function_processes_help(const char *transaction) {
pluginsd_function_result_begin_to_stdout(transaction, HTTP_RESP_OK, "text/plain", now_realtime_sec() + 3600);
fprintf(stdout, "%s",
@@ -4598,7 +4672,7 @@ static void apps_plugin_function_processes_help(const char *transaction) {
buffer_json_add_array_item_double(wb, _tmp); \
} while(0)
-static void apps_plugin_function_processes(const char *transaction, char *function __maybe_unused, char *line_buffer __maybe_unused, int line_max __maybe_unused, int timeout __maybe_unused) {
+static void function_processes(const char *transaction, char *function __maybe_unused, char *line_buffer __maybe_unused, int line_max __maybe_unused, int timeout __maybe_unused) {
struct pid_stat *p;
char *words[PLUGINSD_MAX_WORDS] = { NULL };
@@ -4619,21 +4693,21 @@ static void apps_plugin_function_processes(const char *transaction, char *functi
if(!category && strncmp(keyword, PROCESS_FILTER_CATEGORY, strlen(PROCESS_FILTER_CATEGORY)) == 0) {
category = find_target_by_name(apps_groups_root_target, &keyword[strlen(PROCESS_FILTER_CATEGORY)]);
if(!category) {
- apps_plugin_function_error(transaction, HTTP_RESP_BAD_REQUEST, "No category with that name found.");
+ pluginsd_function_json_error(transaction, HTTP_RESP_BAD_REQUEST, "No category with that name found.");
return;
}
}
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) {
- apps_plugin_function_error(transaction, HTTP_RESP_BAD_REQUEST, "No user with that name found.");
+ pluginsd_function_json_error(transaction, HTTP_RESP_BAD_REQUEST, "No user with that name found.");
return;
}
}
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) {
- apps_plugin_function_error(transaction, HTTP_RESP_BAD_REQUEST, "No group with that name found.");
+ pluginsd_function_json_error(transaction, HTTP_RESP_BAD_REQUEST, "No group with that name found.");
return;
}
}
@@ -4659,7 +4733,7 @@ static void apps_plugin_function_processes(const char *transaction, char *functi
else {
char msg[PLUGINSD_LINE_MAX];
snprintfz(msg, PLUGINSD_LINE_MAX, "Invalid parameter '%s'", keyword);
- apps_plugin_function_error(transaction, HTTP_RESP_BAD_REQUEST, msg);
+ pluginsd_function_json_error(transaction, HTTP_RESP_BAD_REQUEST, msg);
return;
}
}
@@ -4672,7 +4746,7 @@ static void apps_plugin_function_processes(const char *transaction, char *functi
unsigned int io_divisor = 1024 * RATES_DETAIL;
BUFFER *wb = buffer_create(PLUGINSD_LINE_MAX, NULL);
- buffer_json_initialize(wb, "\"", "\"", 0, true, false);
+ buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_NEWLINE_ON_ARRAY_ITEMS);
buffer_json_member_add_uint64(wb, "status", HTTP_RESP_OK);
buffer_json_member_add_string(wb, "type", "table");
buffer_json_member_add_time_t(wb, "update_every", update_every);
@@ -5149,7 +5223,7 @@ static void apps_plugin_function_processes(const char *transaction, char *functi
RRDF_FIELD_FILTER_RANGE,
RRDF_FIELD_OPTS_VISIBLE, NULL);
buffer_rrdf_table_add_field(wb, field_id++, "Uptime", "Uptime in seconds", RRDF_FIELD_TYPE_DURATION,
- RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_DURATION, 2,
+ RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_DURATION_S, 2,
"seconds", Uptime_max, RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_MAX,
RRDF_FIELD_FILTER_RANGE,
RRDF_FIELD_OPTS_VISIBLE, NULL);
@@ -5449,9 +5523,9 @@ static void apps_plugin_function_processes(const char *transaction, char *functi
pluginsd_function_result_end_to_stdout();
}
-bool apps_plugin_exit = false;
+static bool apps_plugin_exit = false;
-void *reader_main(void *arg __maybe_unused) {
+static void *reader_main(void *arg __maybe_unused) {
char buffer[PLUGINSD_LINE_MAX + 1];
char *s = NULL;
@@ -5483,9 +5557,9 @@ void *reader_main(void *arg __maybe_unused) {
netdata_mutex_lock(&mutex);
if(strncmp(function, "processes", strlen("processes")) == 0)
- apps_plugin_function_processes(transaction, function, buffer, PLUGINSD_LINE_MAX + 1, timeout);
+ function_processes(transaction, function, buffer, PLUGINSD_LINE_MAX + 1, timeout);
else
- apps_plugin_function_error(transaction, HTTP_RESP_NOT_FOUND, "No function with this name found in apps.plugin.");
+ pluginsd_function_json_error(transaction, HTTP_RESP_NOT_FOUND, "No function with this name found in apps.plugin.");
fflush(stdout);
netdata_mutex_unlock(&mutex);
@@ -5613,6 +5687,8 @@ int main(int argc, char **argv) {
netdata_thread_create(&reader_thread, "APPS_READER", NETDATA_THREAD_OPTION_DONT_LOG, reader_main, NULL);
netdata_mutex_lock(&mutex);
+ APPS_PLUGIN_FUNCTIONS();
+
usec_t step = update_every * USEC_PER_SEC;
global_iterations_counter = 1;
heartbeat_t hb;
diff --git a/collectors/apps.plugin/multi_metadata.yaml b/collectors/apps.plugin/metadata.yaml
index 2bdb3dbf..9794a5ea 100644
--- a/collectors/apps.plugin/multi_metadata.yaml
+++ b/collectors/apps.plugin/metadata.yaml
@@ -1,4 +1,4 @@
-name: apps.plugin
+plugin_name: apps.plugin
modules:
# removed system.processes_state
- meta:
@@ -6,54 +6,55 @@ modules:
module_name: apps
monitored_instance:
name: Applications
- link: ''
- categories: []
- icon_filename: ''
+ link: ""
+ categories:
+ - data-collection.processes-and-system-services
+ icon_filename: "applications.svg"
related_resources:
integrations:
list: []
info_provided_to_referring_integrations:
- description: ''
+ description: ""
keywords:
- - applications
- - processes
- - os
- - host monitoring
+ - applications
+ - processes
+ - os
+ - host monitoring
most_popular: false
overview:
data_collection:
- metrics_description: ''
- method_description: ''
+ metrics_description: "Monitor Applications for optimal software performance and resource usage."
+ method_description: ""
supported_platforms:
include: []
exclude: []
- multi-instance: true
+ multi_instance: true
additional_permissions:
- description: ''
+ description: ""
default_behavior:
auto_detection:
- description: ''
+ description: ""
limits:
- description: ''
+ description: ""
performance_impact:
- description: ''
+ description: ""
setup:
prerequisites:
list: []
configuration:
file:
- name: ''
- description: ''
+ name: ""
+ description: ""
options:
- description: ''
+ description: ""
folding:
- title: ''
+ title: ""
enabled: true
list: []
examples:
folding:
enabled: true
- title: ''
+ title: ""
list: []
troubleshooting:
problems:
@@ -225,56 +226,57 @@ modules:
module_name: groups
monitored_instance:
name: User Groups
- link: ''
- categories: []
- icon_filename: ''
+ link: ""
+ categories:
+ - data-collection.processes-and-system-services
+ icon_filename: "user.svg"
related_resources:
integrations:
list: []
info_provided_to_referring_integrations:
- description: ''
+ description: ""
keywords:
- - groups
- - processes
- - user auditing
- - authorization
- - os
- - host monitoring
+ - groups
+ - processes
+ - user auditing
+ - authorization
+ - os
+ - host monitoring
most_popular: false
overview:
data_collection:
- metrics_description: ''
- method_description: ''
+ metrics_description: "This integration monitors resource utilization on a user groups context."
+ method_description: ""
supported_platforms:
include: []
exclude: []
- multi-instance: true
+ multi_instance: true
additional_permissions:
- description: ''
+ description: ""
default_behavior:
auto_detection:
- description: ''
+ description: ""
limits:
- description: ''
+ description: ""
performance_impact:
- description: ''
+ description: ""
setup:
prerequisites:
list: []
configuration:
file:
- name: ''
- description: ''
+ name: ""
+ description: ""
options:
- description: ''
+ description: ""
folding:
- title: ''
+ title: ""
enabled: true
list: []
examples:
folding:
enabled: true
- title: ''
+ title: ""
list: []
troubleshooting:
problems:
@@ -446,54 +448,55 @@ modules:
module_name: users
monitored_instance:
name: Users
- link: ''
- categories: []
- icon_filename: ''
+ link: ""
+ categories:
+ - data-collection.processes-and-system-services
+ icon_filename: "users.svg"
related_resources:
integrations:
list: []
info_provided_to_referring_integrations:
- description: ''
+ description: ""
keywords:
- - users
- - processes
- - os
- - host monitoring
+ - users
+ - processes
+ - os
+ - host monitoring
most_popular: false
overview:
data_collection:
- metrics_description: ''
- method_description: ''
+ metrics_description: "This integration monitors resource utilization on a user context."
+ method_description: ""
supported_platforms:
include: []
exclude: []
- multi-instance: true
+ multi_instance: true
additional_permissions:
- description: ''
+ description: ""
default_behavior:
auto_detection:
- description: ''
+ description: ""
limits:
- description: ''
+ description: ""
performance_impact:
- description: ''
+ description: ""
setup:
prerequisites:
list: []
configuration:
file:
- name: ''
- description: ''
+ name: ""
+ description: ""
options:
- description: ''
+ description: ""
folding:
- title: ''
+ title: ""
enabled: true
list: []
examples:
folding:
enabled: true
- title: ''
+ title: ""
list: []
troubleshooting:
problems:
diff --git a/collectors/apps.plugin/metrics.csv b/collectors/apps.plugin/metrics.csv
deleted file mode 100644
index afda7a86..00000000
--- a/collectors/apps.plugin/metrics.csv
+++ /dev/null
@@ -1,81 +0,0 @@
-metric,scope,dimensions,unit,description,chart_type,labels,plugin,module
-system.processes_state,,"running, sleeping_interruptible, sleeping_uninterruptible, zombie, stopped",processes,"System Processes State",line,,apps.plugin,system
-apps.cpu,,a dimension per app group,percentage,"Apps CPU Time (100% = 1 core)",stacked,,apps.plugin,apps
-apps.cpu_user,,a dimension per app group,percentage,"Apps CPU User Time (100% = 1 core)",stacked,,apps.plugin,apps
-apps.cpu_system,,a dimension per app group,percentage,"Apps CPU System Time (100% = 1 core)",stacked,,apps.plugin,apps
-apps.cpu_guest,,a dimension per app group,percentage,"Apps CPU Guest Time (100% = 1 core)",stacked,,apps.plugin,apps
-apps.mem,,a dimension per app group,MiB,"Apps Real Memory (w/o shared)",stacked,,apps.plugin,apps
-apps.rss,,a dimension per app group,MiB,"Apps Resident Set Size (w/shared)",stacked,,apps.plugin,apps
-apps.vmem,,a dimension per app group,MiB,"Apps Virtual Memory Size",stacked,,apps.plugin,apps
-apps.swap,,a dimension per app group,MiB,"Apps Swap Memory",stacked,,apps.plugin,apps
-apps.major_faults,,a dimension per app group,"page faults/s","Apps Major Page Faults (swap read)",stacked,,apps.plugin,apps
-apps.minor_faults,,a dimension per app group,"page faults/s","Apps Minor Page Faults (swap read)",stacked,,apps.plugin,apps
-apps.preads,,a dimension per app group,"KiB/s","Apps Disk Reads",stacked,,apps.plugin,apps
-apps.pwrites,,a dimension per app group,"KiB/s","Apps Disk Writes",stacked,,apps.plugin,apps
-apps.lreads,,a dimension per app group,"KiB/s","Apps Disk Logical Reads",stacked,,apps.plugin,apps
-apps.lwrites,,a dimension per app group,"KiB/s","Apps I/O Logical Writes",stacked,,apps.plugin,apps
-apps.threads,,a dimension per app group,threads,"Apps Threads",stacked,,apps.plugin,apps
-apps.processes,,a dimension per app group,processes,"Apps Processes",stacked,,apps.plugin,apps
-apps.voluntary_ctxt_switches,,a dimension per app group,processes,"Apps Voluntary Context Switches",stacked,,apps.plugin,apps
-apps.involuntary_ctxt_switches,,a dimension per app group,processes,"Apps Involuntary Context Switches",stacked,,apps.plugin,apps
-apps.uptime,,a dimension per app group,seconds,"Apps Carried Over Uptime",line,,apps.plugin,apps
-apps.uptime_min,,a dimension per app group,seconds,"Apps Minimum Uptime",line,,apps.plugin,apps
-apps.uptime_avg,,a dimension per app group,seconds,"Apps Average Uptime",line,,apps.plugin,apps
-apps.uptime_max,,a dimension per app group,seconds,"Apps Maximum Uptime",line,,apps.plugin,apps
-apps.files,,a dimension per app group,"open files","Apps Open Files",stacked,,apps.plugin,apps
-apps.sockets,,a dimension per app group,"open sockets","Apps Open Sockets",stacked,,apps.plugin,apps
-apps.pipes,,a dimension per app group,"open pipes","Apps Open Pipes",stacked,,apps.plugin,apps
-groups.cpu,,a dimension per user group,percentage,"User Groups CPU Time (100% = 1 core)",stacked,,apps.plugin,groups
-groups.cpu_user,,a dimension per user group,percentage,"User Groups CPU User Time (100% = 1 core)",stacked,,apps.plugin,groups
-groups.cpu_system,,a dimension per user group,percentage,"User Groups CPU System Time (100% = 1 core)",stacked,,apps.plugin,groups
-groups.cpu_guest,,a dimension per user group,percentage,"User Groups CPU Guest Time (100% = 1 core)",stacked,,apps.plugin,groups
-groups.mem,,a dimension per user group,MiB,"User Groups Real Memory (w/o shared)",stacked,,apps.plugin,groups
-groups.rss,,a dimension per user group,MiB,"User Groups Resident Set Size (w/shared)",stacked,,apps.plugin,groups
-groups.vmem,,a dimension per user group,MiB,"User Groups Virtual Memory Size",stacked,,apps.plugin,groups
-groups.swap,,a dimension per user group,MiB,"User Groups Swap Memory",stacked,,apps.plugin,groups
-groups.major_faults,,a dimension per user group,"page faults/s","User Groups Major Page Faults (swap read)",stacked,,apps.plugin,groups
-groups.minor_faults,,a dimension per user group,"page faults/s","User Groups Page Faults (swap read)",stacked,,apps.plugin,groups
-groups.preads,,a dimension per user group,"KiB/s","User Groups Disk Reads",stacked,,apps.plugin,groups
-groups.pwrites,,a dimension per user group,"KiB/s","User Groups Disk Writes",stacked,,apps.plugin,groups
-groups.lreads,,a dimension per user group,"KiB/s","User Groups Disk Logical Reads",stacked,,apps.plugin,groups
-groups.lwrites,,a dimension per user group,"KiB/s","User Groups I/O Logical Writes",stacked,,apps.plugin,groups
-groups.threads,,a dimension per user group,threads,"User Groups Threads",stacked,,apps.plugin,groups
-groups.processes,,a dimension per user group,processes,"User Groups Processes",stacked,,apps.plugin,groups
-groups.voluntary_ctxt_switches,,a dimension per app group,processes,"User Groups Voluntary Context Switches",stacked,,apps.plugin,groups
-groups.involuntary_ctxt_switches,,a dimension per app group,processes,"User Groups Involuntary Context Switches",stacked,,apps.plugin,groups
-groups.uptime,,a dimension per user group,seconds,"User Groups Carried Over Uptime",line,,apps.plugin,groups
-groups.uptime_min,,a dimension per user group,seconds,"User Groups Minimum Uptime",line,,apps.plugin,groups
-groups.uptime_avg,,a dimension per user group,seconds,"User Groups Average Uptime",line,,apps.plugin,groups
-groups.uptime_max,,a dimension per user group,seconds,"User Groups Maximum Uptime",line,,apps.plugin,groups
-groups.files,,a dimension per user group,"open files","User Groups Open Files",stacked,,apps.plugin,groups
-groups.sockets,,a dimension per user group,"open sockets","User Groups Open Sockets",stacked,,apps.plugin,groups
-groups.pipes,,a dimension per user group,"open pipes","User Groups Open Pipes",stacked,,apps.plugin,groups
-users.cpu,,a dimension per user,percentage,"Users CPU Time (100% = 1 core)",stacked,,apps.plugin,users
-users.cpu_user,,a dimension per user,percentage,"Users CPU User Time (100% = 1 core)",stacked,,apps.plugin,users
-users.cpu_system,,a dimension per user,percentage,"Users CPU System Time (100% = 1 core)",stacked,,apps.plugin,users
-users.cpu_guest,,a dimension per user,percentage,"Users CPU Guest Time (100% = 1 core)",stacked,,apps.plugin,users
-users.mem,,a dimension per user,MiB,"Users Real Memory (w/o shared)",stacked,,apps.plugin,users
-users.rss,,a dimension per user,MiB,"Users Resident Set Size (w/shared)",stacked,,apps.plugin,users
-users.vmem,,a dimension per user,MiB,"Users Virtual Memory Size",stacked,,apps.plugin,users
-users.swap,,a dimension per user,MiB,"Users Swap Memory",stacked,,apps.plugin,users
-users.major_faults,,a dimension per user,"page faults/s","Users Major Page Faults (swap read)",stacked,,apps.plugin,users
-users.minor_faults,,a dimension per user,"page faults/s","Users Page Faults (swap read)",stacked,,apps.plugin,users
-users.preads,,a dimension per user,"KiB/s","Users Disk Reads",stacked,,apps.plugin,users
-users.pwrites,,a dimension per user,"KiB/s","Users Disk Writes",stacked,,apps.plugin,users
-users.lreads,,a dimension per user,"KiB/s","Users Disk Logical Reads",stacked,,apps.plugin,users
-users.lwrites,,a dimension per user,"KiB/s","Users I/O Logical Writes",stacked,,apps.plugin,users
-users.threads,,a dimension per user,threads,"Users Threads",stacked,,apps.plugin,users
-users.processes,,a dimension per user,processes,"Users Processes",stacked,,apps.plugin,users
-users.voluntary_ctxt_switches,,a dimension per app group,processes,"Users Voluntary Context Switches",stacked,,apps.plugin,users
-users.involuntary_ctxt_switches,,a dimension per app group,processes,"Users Involuntary Context Switches",stacked,,apps.plugin,users
-users.uptime,,a dimension per user,seconds,"Users Carried Over Uptime",line,,apps.plugin,users
-users.uptime_min,,a dimension per user,seconds,"Users Minimum Uptime",line,,apps.plugin,users
-users.uptime_avg,,a dimension per user,seconds,"Users Average Uptime",line,,apps.plugin,users
-users.uptime_max,,a dimension per user,seconds,"Users Maximum Uptime",line,,apps.plugin,users
-users.files,,a dimension per user,"open files","Users Open Files",stacked,,apps.plugin,users
-users.sockets,,a dimension per user,"open sockets","Users Open Sockets",stacked,,apps.plugin,users
-users.pipes,,a dimension per user,"open pipes","Users Open Pipes",stacked,,apps.plugin,users
-netdata.apps_cpu,,"user, system",milliseconds/s,"Apps Plugin CPU",stacked,,apps.plugin,netdata
-netdata.apps_sizes,,"calls, files, filenames, inode_changes, link_changes, pids, fds, targets, new_pids",files/s,"Apps Plugin Files",line,,apps.plugin,netdata
-netdata.apps_fix,,"utime, stime, gtime, minflt, majflt",percentage,"Apps Plugin Normalization Ratios",line,,apps.plugin,netdata
-netdata.apps_children_fix,,"utime, stime, gtime, minflt, majflt",percentage,"Apps Plugin Exited Children Normalization Ratios",line,,apps.plugin,netdata \ No newline at end of file