summaryrefslogtreecommitdiffstats
path: root/collectors/proc.plugin
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2022-06-09 04:52:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2022-06-09 04:52:39 +0000
commit89f3604407aff8f4cb2ed958252c61e23c767e24 (patch)
tree7fbf408102cab051557d38193524d8c6e991d070 /collectors/proc.plugin
parentAdding upstream version 1.34.1. (diff)
downloadnetdata-89f3604407aff8f4cb2ed958252c61e23c767e24.tar.xz
netdata-89f3604407aff8f4cb2ed958252c61e23c767e24.zip
Adding upstream version 1.35.0.upstream/1.35.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'collectors/proc.plugin')
-rw-r--r--collectors/proc.plugin/plugin_proc.c138
-rw-r--r--collectors/proc.plugin/plugin_proc.h5
-rw-r--r--collectors/proc.plugin/proc_meminfo.c4
-rw-r--r--collectors/proc.plugin/proc_net_dev.c77
-rw-r--r--collectors/proc.plugin/proc_pressure.c189
-rw-r--r--collectors/proc.plugin/proc_pressure.h34
-rw-r--r--collectors/proc.plugin/proc_spl_kstat_zfs.c14
-rw-r--r--collectors/proc.plugin/proc_stat.c9
-rw-r--r--collectors/proc.plugin/sys_block_zram.c14
9 files changed, 258 insertions, 226 deletions
diff --git a/collectors/proc.plugin/plugin_proc.c b/collectors/proc.plugin/plugin_proc.c
index 190811e24..5033aa5e2 100644
--- a/collectors/proc.plugin/plugin_proc.c
+++ b/collectors/proc.plugin/plugin_proc.c
@@ -9,7 +9,6 @@ static struct proc_module {
int enabled;
int (*func)(int update_every, usec_t dt);
- usec_t duration;
RRDDIM *rd;
@@ -38,7 +37,6 @@ static struct proc_module {
{.name = "/proc/pagetypeinfo", .dim = "pagetypeinfo", .func = do_proc_pagetypeinfo},
// network metrics
- {.name = "/proc/net/dev", .dim = "netdev", .func = do_proc_net_dev},
{.name = "/proc/net/wireless", .dim = "netwireless", .func = do_proc_net_wireless},
{.name = "/proc/net/sockstat", .dim = "sockstat", .func = do_proc_net_sockstat},
{.name = "/proc/net/sockstat6", .dim = "sockstat6", .func = do_proc_net_sockstat6},
@@ -66,9 +64,7 @@ static struct proc_module {
// ZFS metrics
{.name = "/proc/spl/kstat/zfs/arcstats", .dim = "zfs_arcstats", .func = do_proc_spl_kstat_zfs_arcstats},
- {.name = "/proc/spl/kstat/zfs/pool/state",
- .dim = "zfs_pool_state",
- .func = do_proc_spl_kstat_zfs_pool_state},
+ {.name = "/proc/spl/kstat/zfs/pool/state",.dim = "zfs_pool_state",.func = do_proc_spl_kstat_zfs_pool_state},
// BTRFS metrics
{.name = "/sys/fs/btrfs", .dim = "btrfs", .func = do_sys_fs_btrfs},
@@ -83,6 +79,12 @@ static struct proc_module {
{.name = NULL, .dim = NULL, .func = NULL}
};
+#if WORKER_UTILIZATION_MAX_JOB_TYPES < 36
+#error WORKER_UTILIZATION_MAX_JOB_TYPES has to be at least 36
+#endif
+
+static netdata_thread_t *netdev_thread = NULL;
+
static void proc_main_cleanup(void *ptr)
{
struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
@@ -90,14 +92,28 @@ static void proc_main_cleanup(void *ptr)
info("cleaning up...");
+ if (netdev_thread) {
+ netdata_thread_join(*netdev_thread, NULL);
+ freez(netdev_thread);
+ }
+
static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
+
+ worker_unregister();
}
void *proc_main(void *ptr)
{
- netdata_thread_cleanup_push(proc_main_cleanup, ptr);
+ worker_register("PROC");
- int vdo_cpu_netdata = config_get_boolean("plugin:proc", "netdata server resources", CONFIG_BOOLEAN_YES);
+ if (config_get_boolean("plugin:proc", "/proc/net/dev", CONFIG_BOOLEAN_YES)) {
+ netdev_thread = mallocz(sizeof(netdata_thread_t));
+ debug(D_SYSTEM, "Starting thread %s.", THREAD_NETDEV_NAME);
+ netdata_thread_create(
+ netdev_thread, THREAD_NETDEV_NAME, NETDATA_THREAD_OPTION_JOINABLE, netdev_main, netdev_thread);
+ }
+
+ netdata_thread_cleanup_push(proc_main_cleanup, ptr);
config_get_boolean("plugin:proc", "/proc/pagetypeinfo", CONFIG_BOOLEAN_NO);
@@ -107,128 +123,34 @@ void *proc_main(void *ptr)
struct proc_module *pm = &proc_modules[i];
pm->enabled = config_get_boolean("plugin:proc", pm->name, CONFIG_BOOLEAN_YES);
- pm->duration = 0ULL;
pm->rd = NULL;
+
+ worker_register_job_name(i, proc_modules[i].dim);
}
usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
heartbeat_t hb;
heartbeat_init(&hb);
- size_t iterations = 0;
while (!netdata_exit) {
- iterations++;
- (void)iterations;
-
+ worker_is_idle();
usec_t hb_dt = heartbeat_next(&hb, step);
- usec_t duration = 0ULL;
if (unlikely(netdata_exit))
break;
- // BEGIN -- the job to be done
-
for (i = 0; proc_modules[i].name; i++) {
+ if (unlikely(netdata_exit))
+ break;
+
struct proc_module *pm = &proc_modules[i];
if (unlikely(!pm->enabled))
continue;
debug(D_PROCNETDEV_LOOP, "PROC calling %s.", pm->name);
-//#ifdef NETDATA_LOG_ALLOCATIONS
-// if(pm->func == do_proc_interrupts)
-// log_thread_memory_allocations = iterations;
-//#endif
+ worker_is_busy(i);
pm->enabled = !pm->func(localhost->rrd_update_every, hb_dt);
- pm->duration = heartbeat_monotonic_dt_to_now_usec(&hb) - duration;
- duration += pm->duration;
-
-//#ifdef NETDATA_LOG_ALLOCATIONS
-// if(pm->func == do_proc_interrupts)
-// log_thread_memory_allocations = 0;
-//#endif
-
- if (unlikely(netdata_exit))
- break;
- }
-
- // END -- the job is done
-
- if (vdo_cpu_netdata) {
- static RRDSET *st_cpu_thread = NULL, *st_duration = NULL;
- static RRDDIM *rd_user = NULL, *rd_system = NULL;
-
- // ----------------------------------------------------------------
-
- struct rusage thread;
- getrusage(RUSAGE_THREAD, &thread);
-
- if (unlikely(!st_cpu_thread)) {
- st_cpu_thread = rrdset_create_localhost(
- "netdata",
- "plugin_proc_cpu",
- NULL,
- "proc",
- NULL,
- "Netdata proc plugin CPU usage",
- "milliseconds/s",
- "proc",
- "stats",
- 132000,
- localhost->rrd_update_every,
- RRDSET_TYPE_STACKED);
-
- rd_user = rrddim_add(st_cpu_thread, "user", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
- rd_system = rrddim_add(st_cpu_thread, "system", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
- } else {
- rrdset_next(st_cpu_thread);
- }
-
- rrddim_set_by_pointer(
- st_cpu_thread, rd_user, thread.ru_utime.tv_sec * USEC_PER_SEC + thread.ru_utime.tv_usec);
- rrddim_set_by_pointer(
- st_cpu_thread, rd_system, thread.ru_stime.tv_sec * USEC_PER_SEC + thread.ru_stime.tv_usec);
- rrdset_done(st_cpu_thread);
-
- // ----------------------------------------------------------------
-
- if (unlikely(!st_duration)) {
- st_duration = rrdset_find_active_bytype_localhost("netdata", "plugin_proc_modules");
-
- if (!st_duration) {
- st_duration = rrdset_create_localhost(
- "netdata",
- "plugin_proc_modules",
- NULL,
- "proc",
- NULL,
- "Netdata proc plugin modules durations",
- "milliseconds/run",
- "proc",
- "stats",
- 132001,
- localhost->rrd_update_every,
- RRDSET_TYPE_STACKED);
-
- for (i = 0; proc_modules[i].name; i++) {
- struct proc_module *pm = &proc_modules[i];
- if (unlikely(!pm->enabled))
- continue;
-
- pm->rd = rrddim_add(st_duration, pm->dim, NULL, 1, USEC_PER_MS, RRD_ALGORITHM_ABSOLUTE);
- }
- }
- } else
- rrdset_next(st_duration);
-
- for (i = 0; proc_modules[i].name; i++) {
- struct proc_module *pm = &proc_modules[i];
- if (unlikely(!pm->enabled))
- continue;
-
- rrddim_set_by_pointer(st_duration, pm->rd, pm->duration);
- }
- rrdset_done(st_duration);
}
}
diff --git a/collectors/proc.plugin/plugin_proc.h b/collectors/proc.plugin/plugin_proc.h
index 60a5a78a2..1e3b82965 100644
--- a/collectors/proc.plugin/plugin_proc.h
+++ b/collectors/proc.plugin/plugin_proc.h
@@ -8,7 +8,9 @@
#define PLUGIN_PROC_CONFIG_NAME "proc"
#define PLUGIN_PROC_NAME PLUGIN_PROC_CONFIG_NAME ".plugin"
-extern int do_proc_net_dev(int update_every, usec_t dt);
+#define THREAD_NETDEV_NAME "PLUGIN[proc netdev]"
+extern void *netdev_main(void *ptr);
+
extern int do_proc_net_wireless(int update_every, usec_t dt);
extern int do_proc_diskstats(int update_every, usec_t dt);
extern int do_proc_mdstat(int update_every, usec_t dt);
@@ -48,6 +50,7 @@ extern int get_numa_node_count(void);
// metrics that need to be shared among data collectors
extern unsigned long long tcpext_TCPSynRetrans;
+extern unsigned long long zfs_arcstats_shrinkable_cache_size_bytes;
// netdev renames
extern void netdev_rename_device_add(
diff --git a/collectors/proc.plugin/proc_meminfo.c b/collectors/proc.plugin/proc_meminfo.c
index 5b402caaf..f89ddd8d4 100644
--- a/collectors/proc.plugin/proc_meminfo.c
+++ b/collectors/proc.plugin/proc_meminfo.c
@@ -159,6 +159,10 @@ int do_proc_meminfo(int update_every, usec_t dt) {
// http://calimeroteknik.free.fr/blag/?article20/really-used-memory-on-gnu-linux
unsigned long long MemCached = Cached + SReclaimable - Shmem;
unsigned long long MemUsed = MemTotal - MemFree - MemCached - Buffers;
+ // The Linux kernel doesn't report ZFS ARC usage as cache memory (the ARC is included in the total used system memory)
+ MemCached += (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
+ MemUsed -= (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
+ MemAvailable += (zfs_arcstats_shrinkable_cache_size_bytes / 1024);
if(do_ram) {
{
diff --git a/collectors/proc.plugin/proc_net_dev.c b/collectors/proc.plugin/proc_net_dev.c
index 2d1ae93ae..74076ff76 100644
--- a/collectors/proc.plugin/proc_net_dev.c
+++ b/collectors/proc.plugin/proc_net_dev.c
@@ -655,7 +655,7 @@ int do_proc_net_dev(int update_every, usec_t dt) {
do_carrier = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETDEV, "carrier for all interfaces", CONFIG_BOOLEAN_AUTO);
do_mtu = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETDEV, "mtu for all interfaces", CONFIG_BOOLEAN_AUTO);
- disabled_list = simple_pattern_create(config_get(CONFIG_SECTION_PLUGIN_PROC_NETDEV, "disable by default interfaces matching", "lo fireqos* *-ifb"), NULL, SIMPLE_PATTERN_EXACT);
+ disabled_list = simple_pattern_create(config_get(CONFIG_SECTION_PLUGIN_PROC_NETDEV, "disable by default interfaces matching", "lo fireqos* *-ifb fwpr* fwbr* fwln*"), NULL, SIMPLE_PATTERN_EXACT);
}
if(unlikely(!ff)) {
@@ -792,7 +792,18 @@ int do_proc_net_dev(int update_every, usec_t dt) {
d->tcarrier = str2kernel_uint_t(procfile_lineword(ff, l, 15));
}
- if (d->do_duplex != CONFIG_BOOLEAN_NO && d->filename_duplex) {
+ if ((d->do_carrier != CONFIG_BOOLEAN_NO ||
+ d->do_duplex != CONFIG_BOOLEAN_NO ||
+ d->do_speed != CONFIG_BOOLEAN_NO) &&
+ d->filename_carrier) {
+ if (read_single_number_file(d->filename_carrier, &d->carrier)) {
+ error("Cannot refresh interface %s carrier state by reading '%s'. Stop updating it.", d->name, d->filename_carrier);
+ freez(d->filename_carrier);
+ d->filename_carrier = NULL;
+ }
+ }
+
+ if (d->do_duplex != CONFIG_BOOLEAN_NO && d->filename_duplex && (d->carrier || !d->filename_carrier)) {
char buffer[STATE_LENGTH_MAX + 1];
if (read_file(d->filename_duplex, buffer, STATE_LENGTH_MAX)) {
@@ -808,6 +819,8 @@ int do_proc_net_dev(int update_every, usec_t dt) {
else
d->duplex = 0;
}
+ } else {
+ d->duplex = 0;
}
if(d->do_operstate != CONFIG_BOOLEAN_NO && d->filename_operstate) {
@@ -825,19 +838,11 @@ int do_proc_net_dev(int update_every, usec_t dt) {
}
}
- if (d->do_carrier != CONFIG_BOOLEAN_NO && d->filename_carrier) {
- if (read_single_number_file(d->filename_carrier, &d->carrier)) {
- error("Cannot refresh interface %s carrier state by reading '%s'. Stop updating it.", d->name, d->filename_carrier);
- freez(d->filename_carrier);
- d->filename_carrier = NULL;
- }
- }
-
if (d->do_mtu != CONFIG_BOOLEAN_NO && d->filename_mtu) {
if (read_single_number_file(d->filename_mtu, &d->mtu)) {
- error("Cannot refresh mtu for interface %s by reading '%s'. Stop updating it.", d->name, d->filename_carrier);
- freez(d->filename_carrier);
- d->filename_carrier = NULL;
+ error("Cannot refresh mtu for interface %s by reading '%s'. Stop updating it.", d->name, d->filename_mtu);
+ freez(d->filename_mtu);
+ d->filename_mtu = NULL;
}
}
@@ -907,7 +912,15 @@ int do_proc_net_dev(int update_every, usec_t dt) {
}
if(d->filename_speed && d->chart_var_speed) {
- if(read_single_number_file(d->filename_speed, (unsigned long long *) &d->speed)) {
+ int ret = 0;
+
+ if (d->carrier || !d->filename_carrier) {
+ ret = read_single_number_file(d->filename_speed, (unsigned long long *) &d->speed);
+ } else {
+ d->speed = 0;
+ }
+
+ if(ret) {
error("Cannot refresh interface %s speed by reading '%s'. Will not update its speed anymore.", d->name, d->filename_speed);
freez(d->filename_speed);
d->filename_speed = NULL;
@@ -1384,3 +1397,39 @@ int do_proc_net_dev(int update_every, usec_t dt) {
return 0;
}
+
+static void netdev_main_cleanup(void *ptr)
+{
+ UNUSED(ptr);
+
+ info("cleaning up...");
+
+ worker_unregister();
+}
+
+void *netdev_main(void *ptr)
+{
+ worker_register("NETDEV");
+ worker_register_job_name(0, "netdev");
+
+ netdata_thread_cleanup_push(netdev_main_cleanup, ptr);
+
+ usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
+ heartbeat_t hb;
+ heartbeat_init(&hb);
+
+ while (!netdata_exit) {
+ worker_is_idle();
+ usec_t hb_dt = heartbeat_next(&hb, step);
+
+ if (unlikely(netdata_exit))
+ break;
+
+ worker_is_busy(0);
+ if(do_proc_net_dev(localhost->rrd_update_every, hb_dt))
+ break;
+ }
+
+ netdata_thread_cleanup_pop(1);
+ return NULL;
+}
diff --git a/collectors/proc.plugin/proc_pressure.c b/collectors/proc.plugin/proc_pressure.c
index 4a40b4aaf..66884dbcb 100644
--- a/collectors/proc.plugin/proc_pressure.c
+++ b/collectors/proc.plugin/proc_pressure.c
@@ -8,22 +8,36 @@
// linux calculates this every 2 seconds, see kernel/sched/psi.c PSI_FREQ
#define MIN_PRESSURE_UPDATE_EVERY 2
+static int pressure_update_every = 0;
static struct pressure resources[PRESSURE_NUM_RESOURCES] = {
- {
- .some = { .id = "cpu_pressure", .title = "CPU Pressure" },
- },
- {
- .some = { .id = "memory_some_pressure", .title = "Memory Pressure" },
- .full = { .id = "memory_full_pressure", .title = "Memory Full Pressure" },
- },
- {
- .some = { .id = "io_some_pressure", .title = "I/O Pressure" },
- .full = { .id = "io_full_pressure", .title = "I/O Full Pressure" },
- },
+ {
+ .some =
+ {.share_time = {.id = "cpu_some_pressure", .title = "CPU some pressure"},
+ .total_time = {.id = "cpu_some_pressure_stall_time", .title = "CPU some pressure stall time"}},
+ .full =
+ {.share_time = {.id = "cpu_full_pressure", .title = "CPU full pressure"},
+ .total_time = {.id = "cpu_full_pressure_stall_time", .title = "CPU full pressure stall time"}},
+ },
+ {
+ .some =
+ {.share_time = {.id = "memory_some_pressure", .title = "Memory some pressure"},
+ .total_time = {.id = "memory_some_pressure_stall_time", .title = "Memory some pressure stall time"}},
+ .full =
+ {.share_time = {.id = "memory_full_pressure", .title = "Memory full pressure"},
+ .total_time = {.id = "memory_full_pressure_stall_time", .title = "Memory full pressure stall time"}},
+ },
+ {
+ .some =
+ {.share_time = {.id = "io_some_pressure", .title = "I/O some pressure"},
+ .total_time = {.id = "io_some_pressure_stall_time", .title = "I/O some pressure stall time"}},
+ .full =
+ {.share_time = {.id = "io_full_pressure", .title = "I/O full pressure"},
+ .total_time = {.id = "io_full_pressure_stall_time", .title = "I/O full pressure stall time"}},
+ },
};
-static struct {
+static struct resource_info {
procfile *pf;
const char *name; // metric file name
const char *family; // webui section name
@@ -34,12 +48,83 @@ static struct {
{ .name = "io", .family = "disk", .section_priority = NETDATA_CHART_PRIO_SYSTEM_IO },
};
-void update_pressure_chart(struct pressure_chart *chart) {
- rrddim_set_by_pointer(chart->st, chart->rd10, (collected_number)(chart->value10 * 100));
- rrddim_set_by_pointer(chart->st, chart->rd60, (collected_number) (chart->value60 * 100));
- rrddim_set_by_pointer(chart->st, chart->rd300, (collected_number) (chart->value300 * 100));
+void update_pressure_charts(struct pressure_charts *pcs) {
+ if (pcs->share_time.st) {
+ rrddim_set_by_pointer(
+ pcs->share_time.st, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
+ rrddim_set_by_pointer(
+ pcs->share_time.st, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
+ rrddim_set_by_pointer(
+ pcs->share_time.st, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
+ rrdset_done(pcs->share_time.st);
+ }
+ if (pcs->total_time.st) {
+ rrddim_set_by_pointer(
+ pcs->total_time.st, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
+ rrdset_done(pcs->total_time.st);
+ }
+}
+
+static void proc_pressure_do_resource(procfile *ff, int res_idx, int some) {
+ struct pressure_charts *pcs;
+ struct resource_info ri;
+ pcs = some ? &resources[res_idx].some : &resources[res_idx].full;
+ ri = resource_info[res_idx];
+
+ if (unlikely(!pcs->share_time.st)) {
+ pcs->share_time.st = rrdset_create_localhost(
+ "system",
+ pcs->share_time.id,
+ NULL,
+ ri.family,
+ NULL,
+ pcs->share_time.title,
+ "percentage",
+ PLUGIN_PROC_NAME,
+ PLUGIN_PROC_MODULE_PRESSURE_NAME,
+ ri.section_priority + (some ? 40 : 50),
+ pressure_update_every,
+ RRDSET_TYPE_LINE);
+ pcs->share_time.rd10 =
+ rrddim_add(pcs->share_time.st, some ? "some 10" : "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
+ pcs->share_time.rd60 =
+ rrddim_add(pcs->share_time.st, some ? "some 60" : "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
+ pcs->share_time.rd300 =
+ rrddim_add(pcs->share_time.st, some ? "some 300" : "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
+ } else {
+ rrdset_next(pcs->share_time.st);
+ }
+ pcs->share_time.value10 = strtod(procfile_lineword(ff, some ? 0 : 1, 2), NULL);
+ pcs->share_time.value60 = strtod(procfile_lineword(ff, some ? 0 : 1, 4), NULL);
+ pcs->share_time.value300 = strtod(procfile_lineword(ff, some ? 0 : 1, 6), NULL);
+
+ if (unlikely(!pcs->total_time.st)) {
+ pcs->total_time.st = rrdset_create_localhost(
+ "system",
+ pcs->total_time.id,
+ NULL,
+ ri.family,
+ NULL,
+ pcs->total_time.title,
+ "ms",
+ PLUGIN_PROC_NAME,
+ PLUGIN_PROC_MODULE_PRESSURE_NAME,
+ ri.section_priority + (some ? 45 : 55),
+ pressure_update_every,
+ RRDSET_TYPE_LINE);
+ pcs->total_time.rdtotal = rrddim_add(pcs->total_time.st, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+ } else {
+ rrdset_next(pcs->total_time.st);
+ }
+ pcs->total_time.value_total = str2ull(procfile_lineword(ff, some ? 0 : 1, 8)) / 1000;
+}
- rrdset_done(chart->st);
+static void proc_pressure_do_resource_some(procfile *ff, int res_idx) {
+ proc_pressure_do_resource(ff, res_idx, 1);
+}
+
+static void proc_pressure_do_resource_full(procfile *ff, int res_idx) {
+ proc_pressure_do_resource(ff, res_idx, 0);
}
int do_proc_pressure(int update_every, usec_t dt) {
@@ -50,6 +135,7 @@ int do_proc_pressure(int update_every, usec_t dt) {
static char *base_path = NULL;
update_every = (update_every < MIN_PRESSURE_UPDATE_EVERY) ? MIN_PRESSURE_UPDATE_EVERY : update_every;
+ pressure_update_every = update_every;
if (next_pressure_dt <= dt) {
next_pressure_dt = update_every * USEC_PER_SEC;
@@ -80,11 +166,10 @@ int do_proc_pressure(int update_every, usec_t dt) {
snprintfz(config_key, CONFIG_MAX_NAME, "enable %s some pressure", resource_info[i].name);
do_some = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
resources[i].some.enabled = do_some;
- if (resources[i].full.id) {
- snprintfz(config_key, CONFIG_MAX_NAME, "enable %s full pressure", resource_info[i].name);
- do_full = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
- resources[i].full.enabled = do_full;
- }
+
+ snprintfz(config_key, CONFIG_MAX_NAME, "enable %s full pressure", resource_info[i].name);
+ do_full = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_PRESSURE, config_key, CONFIG_BOOLEAN_YES);
+ resources[i].full.enabled = do_full;
ff = procfile_open(filename, " =", PROCFILE_FLAG_DEFAULT);
if (unlikely(!ff)) {
@@ -108,65 +193,13 @@ int do_proc_pressure(int update_every, usec_t dt) {
continue;
}
- struct pressure_chart *chart;
if (do_some) {
- chart = &resources[i].some;
- if (unlikely(!chart->st)) {
- chart->st = rrdset_create_localhost(
- "system"
- , chart->id
- , NULL
- , resource_info[i].family
- , NULL
- , chart->title
- , "percentage"
- , PLUGIN_PROC_NAME
- , PLUGIN_PROC_MODULE_PRESSURE_NAME
- , resource_info[i].section_priority + 40
- , update_every
- , RRDSET_TYPE_LINE
- );
- chart->rd10 = rrddim_add(chart->st, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- chart->rd60 = rrddim_add(chart->st, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- chart->rd300 = rrddim_add(chart->st, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- } else {
- rrdset_next(chart->st);
- }
-
- chart->value10 = strtod(procfile_lineword(ff, 0, 2), NULL);
- chart->value60 = strtod(procfile_lineword(ff, 0, 4), NULL);
- chart->value300 = strtod(procfile_lineword(ff, 0, 6), NULL);
- update_pressure_chart(chart);
+ proc_pressure_do_resource_some(ff, i);
+ update_pressure_charts(&resources[i].some);
}
-
if (do_full && lines > 2) {
- chart = &resources[i].full;
- if (unlikely(!chart->st)) {
- chart->st = rrdset_create_localhost(
- "system"
- , chart->id
- , NULL
- , resource_info[i].family
- , NULL
- , chart->title
- , "percentage"
- , PLUGIN_PROC_NAME
- , PLUGIN_PROC_MODULE_PRESSURE_NAME
- , resource_info[i].section_priority + 45
- , update_every
- , RRDSET_TYPE_LINE
- );
- chart->rd10 = rrddim_add(chart->st, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- chart->rd60 = rrddim_add(chart->st, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- chart->rd300 = rrddim_add(chart->st, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
- } else {
- rrdset_next(chart->st);
- }
-
- chart->value10 = strtod(procfile_lineword(ff, 1, 2), NULL);
- chart->value60 = strtod(procfile_lineword(ff, 1, 4), NULL);
- chart->value300 = strtod(procfile_lineword(ff, 1, 6), NULL);
- update_pressure_chart(chart);
+ proc_pressure_do_resource_full(ff, i);
+ update_pressure_charts(&resources[i].full);
}
}
diff --git a/collectors/proc.plugin/proc_pressure.h b/collectors/proc.plugin/proc_pressure.h
index 333021866..a421cf8a4 100644
--- a/collectors/proc.plugin/proc_pressure.h
+++ b/collectors/proc.plugin/proc_pressure.h
@@ -9,23 +9,35 @@ struct pressure {
int updated;
char *filename;
- struct pressure_chart {
+ struct pressure_charts {
int enabled;
- const char *id;
- const char *title;
+ struct pressure_share_time_chart {
+ const char *id;
+ const char *title;
- double value10;
- double value60;
- double value300;
+ double value10;
+ double value60;
+ double value300;
- RRDSET *st;
- RRDDIM *rd10;
- RRDDIM *rd60;
- RRDDIM *rd300;
+ RRDSET *st;
+ RRDDIM *rd10;
+ RRDDIM *rd60;
+ RRDDIM *rd300;
+ } share_time;
+
+ struct pressure_total_time_chart {
+ const char *id;
+ const char *title;
+
+ unsigned long long value_total;
+
+ RRDSET *st;
+ RRDDIM *rdtotal;
+ } total_time;
} some, full;
};
-extern void update_pressure_chart(struct pressure_chart *chart);
+extern void update_pressure_charts(struct pressure_charts *charts);
#endif //NETDATA_PROC_PRESSURE_H
diff --git a/collectors/proc.plugin/proc_spl_kstat_zfs.c b/collectors/proc.plugin/proc_spl_kstat_zfs.c
index fedc03436..fae112249 100644
--- a/collectors/proc.plugin/proc_spl_kstat_zfs.c
+++ b/collectors/proc.plugin/proc_spl_kstat_zfs.c
@@ -11,6 +11,8 @@
extern struct arcstats arcstats;
+unsigned long long zfs_arcstats_shrinkable_cache_size_bytes = 0;
+
int do_proc_spl_kstat_zfs_arcstats(int update_every, usec_t dt) {
(void)dt;
@@ -190,6 +192,12 @@ int do_proc_spl_kstat_zfs_arcstats(int update_every, usec_t dt) {
if(unlikely(arl_check(arl_base, key, value))) break;
}
+ if (arcstats.size > arcstats.c_min) {
+ zfs_arcstats_shrinkable_cache_size_bytes = arcstats.size - arcstats.c_min;
+ } else {
+ zfs_arcstats_shrinkable_cache_size_bytes = 0;
+ }
+
if(unlikely(arcstats.l2exist == -1))
arcstats.l2exist = 0;
@@ -244,7 +252,7 @@ void disable_zfs_pool_state(struct zfs_pool *pool)
pool->disabled = 1;
}
-int update_zfs_pool_state_chart(char *name, void *pool_p, void *update_every_p)
+int update_zfs_pool_state_chart(const char *name, void *pool_p, void *update_every_p)
{
struct zfs_pool *pool = (struct zfs_pool *)pool_p;
int update_every = *(int *)update_every_p;
@@ -290,7 +298,7 @@ int update_zfs_pool_state_chart(char *name, void *pool_p, void *update_every_p)
}
} else {
disable_zfs_pool_state(pool);
- struct deleted_zfs_pool *new = calloc(1, sizeof(struct deleted_zfs_pool));
+ struct deleted_zfs_pool *new = callocz(1, sizeof(struct deleted_zfs_pool));
new->name = strdupz(name);
new->next = deleted_zfs_pools;
deleted_zfs_pools = new;
@@ -400,7 +408,7 @@ int do_proc_spl_kstat_zfs_pool_state(int update_every, usec_t dt)
}
if (do_zfs_pool_state)
- dictionary_get_all_name_value(zfs_pools, update_zfs_pool_state_chart, &update_every);
+ dictionary_walkthrough_read(zfs_pools, update_zfs_pool_state_chart, &update_every);
while (deleted_zfs_pools) {
struct deleted_zfs_pool *current_pool = deleted_zfs_pools;
diff --git a/collectors/proc.plugin/proc_stat.c b/collectors/proc.plugin/proc_stat.c
index 373a06770..c889f0736 100644
--- a/collectors/proc.plugin/proc_stat.c
+++ b/collectors/proc.plugin/proc_stat.c
@@ -1029,7 +1029,7 @@ int do_proc_stat(int update_every, usec_t dt) {
, cpuidle_chart_id
, NULL
, "cpuidle"
- , "cpuidle.cpuidle"
+ , "cpuidle.cpu_cstate_residency_time"
, "C-state residency time"
, "percentage"
, PLUGIN_PROC_NAME
@@ -1040,10 +1040,11 @@ int do_proc_stat(int update_every, usec_t dt) {
);
char cpuidle_dim_id[RRD_ID_LENGTH_MAX + 1];
- snprintfz(cpuidle_dim_id, RRD_ID_LENGTH_MAX, "cpu%zu_active_time", core);
- cpuidle_charts[core].active_time_rd = rrddim_add(cpuidle_charts[core].st, cpuidle_dim_id, "C0 (active)", 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
+ cpuidle_charts[core].active_time_rd = rrddim_add(cpuidle_charts[core].st, "active", "C0 (active)", 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
for(state = 0; state < cpuidle_charts[core].cpuidle_state_len; state++) {
- snprintfz(cpuidle_dim_id, RRD_ID_LENGTH_MAX, "cpu%zu_cpuidle_state%zu_time", core, state);
+ strncpyz(cpuidle_dim_id, cpuidle_charts[core].cpuidle_state[state].name, RRD_ID_LENGTH_MAX);
+ for(int i = 0; cpuidle_dim_id[i]; i++)
+ cpuidle_dim_id[i] = tolower(cpuidle_dim_id[i]);
cpuidle_charts[core].cpuidle_state[state].rd = rrddim_add(cpuidle_charts[core].st, cpuidle_dim_id,
cpuidle_charts[core].cpuidle_state[state].name,
1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
diff --git a/collectors/proc.plugin/sys_block_zram.c b/collectors/proc.plugin/sys_block_zram.c
index 170c72062..3a39b3b66 100644
--- a/collectors/proc.plugin/sys_block_zram.c
+++ b/collectors/proc.plugin/sys_block_zram.c
@@ -165,7 +165,7 @@ static int init_devices(DICTIONARY *devices, unsigned int zram_id, int update_ev
return count;
}
-static void free_device(DICTIONARY *dict, char *name)
+static void free_device(DICTIONARY *dict, const char *name)
{
ZRAM_DEVICE *d = (ZRAM_DEVICE*)dictionary_get(dict, name);
info("ZRAM : Disabling monitoring of device %s", name);
@@ -173,7 +173,7 @@ static void free_device(DICTIONARY *dict, char *name)
rrdset_obsolete_and_pointer_null(d->st_savings);
rrdset_obsolete_and_pointer_null(d->st_alloc_efficiency);
rrdset_obsolete_and_pointer_null(d->st_comp_ratio);
- dictionary_del(dict, name);
+ dictionary_del_having_write_lock(dict, name);
}
// --------------------------------------------------------------------
@@ -200,7 +200,7 @@ static inline int read_mm_stat(procfile *ff, MM_STAT *stats) {
return 0;
}
-static inline int _collect_zram_metrics(char* name, ZRAM_DEVICE *d, int advance, DICTIONARY* dict) {
+static inline int _collect_zram_metrics(const char* name, ZRAM_DEVICE *d, int advance, DICTIONARY* dict) {
MM_STAT mm;
int value;
if (unlikely(read_mm_stat(d->file, &mm) < 0))
@@ -235,12 +235,12 @@ static inline int _collect_zram_metrics(char* name, ZRAM_DEVICE *d, int advance,
return 0;
}
-static int collect_first_zram_metrics(char *name, void *entry, void *data) {
+static int collect_first_zram_metrics(const char *name, void *entry, void *data) {
// collect without calling rrdset_next (init only)
return _collect_zram_metrics(name, (ZRAM_DEVICE *)entry, 0, (DICTIONARY *)data);
}
-static int collect_zram_metrics(char *name, void *entry, void *data) {
+static int collect_zram_metrics(const char *name, void *entry, void *data) {
(void)name;
// collect with calling rrdset_next
return _collect_zram_metrics(name, (ZRAM_DEVICE *)entry, 1, (DICTIONARY *)data);
@@ -280,13 +280,13 @@ int do_sys_block_zram(int update_every, usec_t dt) {
device_count = init_devices(devices, (unsigned int)zram_id, update_every);
if (device_count < 1)
return 1;
- dictionary_get_all_name_value(devices, collect_first_zram_metrics, devices);
+ dictionary_walkthrough_write(devices, collect_first_zram_metrics, devices);
}
else
{
if (unlikely(device_count < 1))
return 1;
- dictionary_get_all_name_value(devices, collect_zram_metrics, devices);
+ dictionary_walkthrough_write(devices, collect_zram_metrics, devices);
}
return 0;
} \ No newline at end of file