diff options
Diffstat (limited to 'collectors/apps.plugin')
-rw-r--r-- | collectors/apps.plugin/README.md | 17 | ||||
-rw-r--r-- | collectors/apps.plugin/apps_plugin.c | 134 | ||||
-rw-r--r-- | collectors/apps.plugin/metadata.yaml (renamed from collectors/apps.plugin/multi_metadata.yaml) | 129 | ||||
-rw-r--r-- | collectors/apps.plugin/metrics.csv | 81 |
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 |