Skip to content

Commit 06c0758

Browse files
committed
[metrics] Add metrics-specific varlink sockets in /run/systemd/metrics
1 parent 84b2686 commit 06c0758

6 files changed

Lines changed: 86 additions & 11 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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
/* SPDX-License-Identifier: LGPL-2.1-or-later */
22

3+
#include <assert.h>
4+
35
#include "sd-varlink.h"
46

57
#include "constants.h"
68
#include "errno-util.h"
79
#include "json-util.h"
810
#include "manager.h"
11+
#include "metrics.h"
912
#include "path-util.h"
1013
#include "pidref.h"
1114
#include "string-util.h"
@@ -402,6 +405,21 @@ int manager_setup_varlink_server(Manager *m) {
402405
return 1;
403406
}
404407

408+
static int vl_method_list(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
409+
Manager *m = ASSERT_PTR(userdata);
410+
int r;
411+
412+
assert(link);
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,15 @@ static int manager_varlink_init_system(Manager *m) {
430448
}
431449
}
432450

451+
r = metrics_setup_varlink_server(
452+
&m->metrics_varlink_server,
453+
m->event,
454+
vl_method_list,
455+
m,
456+
"/run/systemd/metrics/io.systemd.Manager");
457+
if (r < 0)
458+
return log_error_errno(r, "Failed to set up metrics varlink server: %m");
459+
433460
return 1;
434461
}
435462

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

494+
// TODO: Make metrics server work for user manager
467495
return manager_varlink_managed_oom_connect(m);
468496
}
469497

@@ -482,4 +510,5 @@ void manager_varlink_done(Manager *m) {
482510

483511
m->varlink_server = sd_varlink_server_unref(m->varlink_server);
484512
m->managed_oom_varlink = sd_varlink_close_unref(m->managed_oom_varlink);
513+
m->metrics_varlink_server = sd_varlink_server_unref(m->metrics_varlink_server);
485514
}

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

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);
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
#include "varlink-io.systemd.Metrics.h"
22

3+
static SD_VARLINK_DEFINE_STRUCT_TYPE(
4+
MetricsStruct,
5+
SD_VARLINK_FIELD_COMMENT("Metric family name"),
6+
SD_VARLINK_DEFINE_FIELD(name, SD_VARLINK_STRING, 0),
7+
SD_VARLINK_FIELD_COMMENT("Value of the metric"),
8+
SD_VARLINK_DEFINE_FIELD(value, SD_VARLINK_INT, 0),
9+
SD_VARLINK_FIELD_COMMENT("fields"),
10+
SD_VARLINK_DEFINE_FIELD(fields, SD_VARLINK_STRUCT, SD_VARLINK_NULLABLE));
311

412
static SD_VARLINK_DEFINE_METHOD(
5-
List,
6-
SD_VARLINK_FIELD_COMMENT("Metric name"),
7-
SD_VARLINK_DEFINE_OUTPUT(name, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
8-
SD_VARLINK_FIELD_COMMENT("Value of the metric"),
9-
SD_VARLINK_DEFINE_OUTPUT(value, SD_VARLINK_INT, 0),
10-
SD_VARLINK_FIELD_COMMENT("fields"),
11-
SD_VARLINK_DEFINE_OUTPUT(fields, SD_VARLINK_STRUCT, SD_VARLINK_NULLABLE));
12-
13+
List,
14+
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(metrics, MetricsStruct, 0));
1315

1416
SD_VARLINK_DEFINE_INTERFACE(
1517
io_systemd_Metrics,
1618
"io.systemd.Metrics",
1719
SD_VARLINK_INTERFACE_COMMENT("Metrics APIs"),
1820
SD_VARLINK_SYMBOL_COMMENT(
19-
"Return key -> value dictionary of relevant metrics, optionally filtered by object."),
20-
&vl_method_List);
21-
21+
"APIs for getting relevant metrics, optionally filtered by object."),
22+
&vl_method_List,
23+
SD_VARLINK_SYMBOL_COMMENT("The metrics object"),
24+
&vl_type_MetricsStruct);

0 commit comments

Comments
 (0)