Skip to content

Commit 5e4de73

Browse files
committed
[metrics] Add metrics-specific varlink sockets in /run/systemd/metrics
1 parent 45793ce commit 5e4de73

5 files changed

Lines changed: 66 additions & 0 deletions

File tree

src/core/manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,8 @@ typedef struct Manager {
463463
* systemd-oomd to report changes in ManagedOOM settings (systemd client - oomd server). */
464464
sd_varlink *managed_oom_varlink;
465465

466+
sd_varlink_server *metrics_varlink_server;
467+
466468
/* Reference to RestrictFileSystems= BPF program */
467469
struct restrict_fs_bpf *restrict_fs;
468470

src/core/varlink.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "errno-util.h"
77
#include "json-util.h"
88
#include "manager.h"
9+
#include "mkdir-label.h"
10+
#include "metrics.h"
911
#include "path-util.h"
1012
#include "pidref.h"
1113
#include "string-util.h"
@@ -402,6 +404,22 @@ int manager_setup_varlink_server(Manager *m) {
402404
return 1;
403405
}
404406

407+
static int vl_method_list(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
408+
Manager *m = ASSERT_PTR(userdata);
409+
int r;
410+
411+
assert(link);
412+
assert(m->units);
413+
414+
r = sd_varlink_dispatch(link, parameters, /* dispatch_table= */ NULL, /* userdata= */ NULL);
415+
if (r != 0)
416+
return r;
417+
418+
return sd_varlink_replybo(
419+
link,
420+
SD_JSON_BUILD_PAIR("units.active_units", SD_JSON_BUILD_INTEGER(hashmap_size(m->units))));
421+
}
422+
405423
static int manager_varlink_init_system(Manager *m) {
406424
int r;
407425

@@ -430,6 +448,11 @@ static int manager_varlink_init_system(Manager *m) {
430448
}
431449
}
432450

451+
(void) mkdir_label("/run/systemd/metrics", 0755);
452+
r = metrics_setup_varlink_server(&m->metrics_varlink_server, m->event, vl_method_list, m, "/run/systemd/metrics/io.systemd.Manager");
453+
if (r < 0)
454+
return log_error_errno(r, "Failed to set up metrics varlink server: %m");
455+
433456
return 1;
434457
}
435458

@@ -464,6 +487,7 @@ static int manager_varlink_init_user(Manager *m) {
464487
return log_error_errno(r, "Failed to bind to varlink socket '%s': %m", address);
465488
}
466489

490+
// TODO: Make metrics server work for user manager
467491
return manager_varlink_managed_oom_connect(m);
468492
}
469493

@@ -482,4 +506,5 @@ void manager_varlink_done(Manager *m) {
482506

483507
m->varlink_server = sd_varlink_server_unref(m->varlink_server);
484508
m->managed_oom_varlink = sd_varlink_close_unref(m->managed_oom_varlink);
509+
m->metrics_varlink_server = sd_varlink_server_unref(m->metrics_varlink_server);
485510
}

src/shared/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ shared_sources = files(
125125
'machine-pool.c',
126126
'macvlan-util.c',
127127
'main-func.c',
128+
'metrics.c',
128129
'mkdir-label.c',
129130
'mkfs-util.c',
130131
'module-util.c',

src/shared/metrics.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "log.h"
2+
#include "metrics.h"
3+
#include "varlink-io.systemd.Metrics.h"
4+
#include "varlink-util.h"
5+
6+
int metrics_setup_varlink_server(sd_varlink_server **m, sd_event *event, sd_varlink_method_t vl_method_list_cb, void *userdata, const char *socket) {
7+
_cleanup_(sd_varlink_server_unrefp) sd_varlink_server *s = NULL;
8+
int r;
9+
10+
r = varlink_server_new(&s, SD_VARLINK_SERVER_INHERIT_USERDATA, userdata);
11+
if (r < 0)
12+
return log_error_errno(r, "Failed to allocate varlink server object: %m");
13+
14+
r = sd_varlink_server_add_interface(s, &vl_interface_io_systemd_Metrics);
15+
if (r < 0)
16+
return log_error_errno(r, "Failed to add Metrics interface to varlink server: %m");
17+
18+
r = sd_varlink_server_bind_method(
19+
s, "io.systemd.Metrics.List", vl_method_list_cb);
20+
if (r < 0)
21+
return r;
22+
23+
r = sd_varlink_server_listen_address(s, socket, 0600);
24+
if (r < 0)
25+
return r;
26+
27+
r = sd_varlink_server_attach_event(s, event, SD_EVENT_PRIORITY_NORMAL);
28+
if (r < 0)
29+
return r;
30+
31+
*m = TAKE_PTR(s);
32+
return 0;
33+
}

src/shared/metrics.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#pragma once
2+
3+
#include "sd-varlink.h"
4+
5+
int metrics_setup_varlink_server(sd_varlink_server **m, sd_event *event, sd_varlink_method_t vl_method_list_cb, void *userdata, const char *socket);

0 commit comments

Comments
 (0)