report: add cgroup metrics in a separate varlink service (#41489)
Add CpuUsage, MemoryUsage, IOReadBytes, IOReadOperations, and TasksCurrent in a standalone socket-activated varlink service. These metrics are gathered from the kernel via cgroup files and PID1's only role is mapping unit names to cgroup paths — a separate process can query PID1 once for that mapping and then read the cgroup files directly, minimizing PID1 involvement. The new systemd-report-cgroup-metrics service listens at /run/systemd/report/io.systemd.CGroup and exposes: - io.systemd.CGroup.CpuUsage - io.systemd.CGroup.IOReadBytes - io.systemd.CGroup.IOReadOperations - io.systemd.CGroup.MemoryUsage (with type=current/available/peak) - io.systemd.CGroup.TasksCurrent This is spun out of #41078 and based on top of it. Will rebase once that's merged.
This commit is contained in:
@@ -1560,6 +1560,24 @@ fail:
|
||||
return r;
|
||||
}
|
||||
|
||||
int cg_get_keyed_attribute_uint64(const char *path, const char *attribute, const char *key, uint64_t *ret) {
|
||||
_cleanup_free_ char *val = NULL;
|
||||
int r;
|
||||
|
||||
assert(key);
|
||||
assert(ret);
|
||||
|
||||
r = cg_get_keyed_attribute(path, attribute, STRV_MAKE(key), &val);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = safe_atou64(val, ret);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to parse value '%s' of key '%s' in cgroup attribute '%s': %m", val, key, attribute);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cg_mask_to_string(CGroupMask mask, char **ret) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
bool space = false;
|
||||
|
||||
@@ -165,6 +165,7 @@ int cg_get_attribute_as_uint64(const char *path, const char *attribute, uint64_t
|
||||
int cg_get_attribute_as_bool(const char *path, const char *attribute);
|
||||
|
||||
int cg_get_keyed_attribute(const char *path, const char *attribute, char * const *keys, char **values);
|
||||
int cg_get_keyed_attribute_uint64(const char *path, const char *attribute, const char *key, uint64_t *ret);
|
||||
|
||||
int cg_get_owner(const char *path, uid_t *ret_uid);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user