• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemd / systemd / 25893429527

14 May 2026 09:08PM UTC coverage: 72.364% (-0.2%) from 72.584%
25893429527

push

github

bluca
ci: switch SUSE mkosi mirror to cdn.o.o

The cdn mirror is preferred by SUSE for clouds/CIs. There have been issues with some
mirrors, which fail to download from GHA quite often lately, so hopefully this will
make it reliable again.

328159 of 453485 relevant lines covered (72.36%)

1405869.02 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/report/report-basic.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include <sys/utsname.h>
4

5
#include "sd-id128.h"
6
#include "sd-json.h"
7
#include "sd-varlink.h"
8

9
#include "alloc-util.h"
10
#include "architecture.h"
11
#include "cpu-set-util.h"
12
#include "hostname-setup.h"
13
#include "limits-util.h"
14
#include "log.h"
15
#include "metrics.h"
16
#include "os-util.h"
17
#include "report-basic.h"
18
#include "virt.h"
19

20
static int architecture_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
21
        assert(mf && mf->name);
×
22
        assert(link);
×
23

24
        return metric_build_send_string(
×
25
                        mf,
26
                        link,
27
                        /* object= */ NULL,
28
                        architecture_to_string(uname_architecture()),
29
                        /* fields= */ NULL);
30
}
31

32
static int boot_id_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
33
        sd_id128_t id;
×
34
        int r;
×
35

36
        assert(mf && mf->name);
×
37
        assert(link);
×
38

39
        r = sd_id128_get_boot(&id);
×
40
        if (r < 0)
×
41
                return r;
×
42

43
        return metric_build_send_string(
×
44
                        mf,
45
                        link,
46
                        /* object= */ NULL,
47
                        SD_ID128_TO_STRING(id),
×
48
                        /* fields= */ NULL);
49
}
50

51
static int hostname_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
52
        _cleanup_free_ char *hostname = NULL;
×
53
        int r;
×
54

55
        assert(mf && mf->name);
×
56
        assert(link);
×
57

58
        r = gethostname_full(GET_HOSTNAME_ALLOW_LOCALHOST | GET_HOSTNAME_FALLBACK_DEFAULT, &hostname);
×
59
        if (r < 0)
×
60
                return r;
61

62
        return metric_build_send_string(
×
63
                        mf,
64
                        link,
65
                        /* object= */ NULL,
66
                        hostname,
67
                        /* fields= */ NULL);
68
}
69

70
static int kernel_version_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
71
        struct utsname u;
×
72

73
        assert(mf && mf->name);
×
74
        assert(link);
×
75

76
        assert_se(uname(&u) >= 0);
×
77

78
        return metric_build_send_string(
×
79
                        mf,
80
                        link,
81
                        /* object= */ NULL,
82
                        u.release,
83
                        /* fields= */ NULL);
84
}
85

86
static int machine_id_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
87
        sd_id128_t id;
×
88
        int r;
×
89

90
        assert(mf && mf->name);
×
91
        assert(link);
×
92

93
        r = sd_id128_get_machine(&id);
×
94
        if (r < 0)
×
95
                return r;
×
96

97
        return metric_build_send_string(
×
98
                        mf,
99
                        link,
100
                        /* object= */ NULL,
101
                        SD_ID128_TO_STRING(id),
×
102
                        /* fields= */ NULL);
103
}
104

105
static int physical_memory_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
106
        assert(mf && mf->name);
×
107
        assert(link);
×
108

109
        return metric_build_send_unsigned(
×
110
                        mf,
111
                        link,
112
                        /* object= */ NULL,
113
                        physical_memory(),
114
                        /* fields= */ NULL);
115
}
116

117
static int cpus_online_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
118
        int r;
×
119

120
        assert(mf && mf->name);
×
121
        assert(link);
×
122

123
        unsigned n_cpus;
×
124
        r = cpus_online(&n_cpus);
×
125
        if (r < 0)
×
126
                return r;
×
127

128
        return metric_build_send_unsigned(
×
129
                        mf,
130
                        link,
131
                        /* object= */ NULL,
132
                        n_cpus,
133
                        /* fields= */ NULL);
134
}
135

136
enum {
137
        FIELD_PRETTY_NAME,
138
        FIELD_NAME,
139
        FIELD_ID,
140
        FIELD_CPE_NAME,
141
        FIELD_VARIANT_ID,
142
        FIELD_VERSION_ID,
143
        FIELD_BUILD_ID,
144
        FIELD_IMAGE_VERSION,
145
        FIELD_IMAGE_ID,
146
        FIELD_SUPPORT_END,
147
        FIELD_EXPERIMENT,
148
        FIELD_SYSEXT_LEVEL,
149
        FIELD_CONFEXT_LEVEL,
150
        _FIELD_MAX,
151
};
152

153
static int os_release_generate(const MetricFamily mf[static _FIELD_MAX - 1], sd_varlink *link, void *userdata) {
×
154
        char* values[_FIELD_MAX] = {};
×
155
        CLEANUP_ELEMENTS(values, free_many_charp);
×
156
        int r;
×
157

158
        assert(mf && mf->name);
×
159
        assert(link);
×
160

161
        r = parse_os_release(NULL,
×
162
                             "PRETTY_NAME",   &values[FIELD_PRETTY_NAME],
163
                             "NAME",          &values[FIELD_NAME],
164
                             "ID",            &values[FIELD_ID],
165
                             "CPE_NAME",      &values[FIELD_CPE_NAME],
166
                             "VARIANT_ID",    &values[FIELD_VARIANT_ID],
167
                             "VERSION_ID",    &values[FIELD_VERSION_ID],
168
                             "BUILD_ID",      &values[FIELD_BUILD_ID],
169
                             "IMAGE_VERSION", &values[FIELD_IMAGE_VERSION],
170
                             "IMAGE_ID",      &values[FIELD_IMAGE_ID],
171
                             "SUPPORT_END",   &values[FIELD_SUPPORT_END],
172
                             "EXPERIMENT",    &values[FIELD_EXPERIMENT],
173
                             "SYSEXT_LEVEL",  &values[FIELD_SYSEXT_LEVEL],
174
                             "CONFEXT_LEVEL", &values[FIELD_CONFEXT_LEVEL]);
175
        if (r < 0) {
×
176
                log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, r,
×
177
                               "Failed to read os-release file, ignoring: %m");
178
                return 0;
179
        }
180

181
        for (size_t i = 1; i < _FIELD_MAX; i++) {
×
182
                const char *v = values[i];
×
183
                if (i == FIELD_NAME && values[FIELD_PRETTY_NAME])
×
184
                        v = values[FIELD_PRETTY_NAME];  /* Prefer PRETTY_NAME to NAME */
×
185

186
                if (v) {
×
187
                        r = metric_build_send_string(
×
188
                                        mf + i - 1,
×
189
                                        link,
190
                                        /* object= */ NULL,
191
                                        v,
192
                                        /* fields= */ NULL);
193
                        if (r < 0)
×
194
                                return r;
195
                }
196
        }
197

198
        return 0;
199
}
200

201
static int virtualization_generate(const MetricFamily *mf, sd_varlink *link, void *userdata) {
×
202
        assert(mf && mf->name);
×
203
        assert(link);
×
204

205
        Virtualization v = detect_virtualization();
×
206
        if (v < 0)
×
207
                return v;
208

209
        return metric_build_send_string(
×
210
                        mf,
211
                        link,
212
                        /* object= */ NULL,
213
                        virtualization_to_string(v),
214
                        /* fields= */ NULL);
215
}
216

217
#define OS_RELEASE_STANDARD_FIELD(name)                                 \
218
        {                                                               \
219
                METRIC_IO_SYSTEMD_BASIC_PREFIX "OSRelease." name,       \
220
                "Operating system identification (" name "= field from os-release)", \
221
                METRIC_FAMILY_TYPE_STRING,                              \
222
                .generate = NULL,                                       \
223
        }
224

225
static const MetricFamily metric_family_table[] = {
226
        /* Keep entries ordered alphabetically */
227
        {
228
                METRIC_IO_SYSTEMD_BASIC_PREFIX "Architecture",
229
                "CPU architecture",
230
                METRIC_FAMILY_TYPE_STRING,
231
                .generate = architecture_generate,
232
        },
233
        {
234
                METRIC_IO_SYSTEMD_BASIC_PREFIX "BootID",
235
                "Current boot ID",
236
                METRIC_FAMILY_TYPE_STRING,
237
                .generate = boot_id_generate,
238
        },
239
        {
240
                METRIC_IO_SYSTEMD_BASIC_PREFIX "CPUsOnline",
241
                "Number of CPUs currently online",
242
                METRIC_FAMILY_TYPE_GAUGE,
243
                .generate = cpus_online_generate,
244
        },
245
        {
246
                METRIC_IO_SYSTEMD_BASIC_PREFIX "Hostname",
247
                "System hostname",
248
                METRIC_FAMILY_TYPE_STRING,
249
                .generate = hostname_generate,
250
        },
251
        {
252
                METRIC_IO_SYSTEMD_BASIC_PREFIX "KernelVersion",
253
                "Kernel version",
254
                METRIC_FAMILY_TYPE_STRING,
255
                .generate = kernel_version_generate,
256
        },
257
        {
258
                METRIC_IO_SYSTEMD_BASIC_PREFIX "MachineID",
259
                "Machine ID",
260
                METRIC_FAMILY_TYPE_STRING,
261
                .generate = machine_id_generate,
262
        },
263
        {
264
                METRIC_IO_SYSTEMD_BASIC_PREFIX "OSRelease.NAME",
265
                "Operating system human-readable name (PRETTY_NAME= or NAME= field from os-release)",
266
                METRIC_FAMILY_TYPE_STRING,
267
                .generate = os_release_generate,
268
        },
269
        OS_RELEASE_STANDARD_FIELD("ID"),
270
        OS_RELEASE_STANDARD_FIELD("CPE_NAME"),
271
        OS_RELEASE_STANDARD_FIELD("VARIANT_ID"),
272
        OS_RELEASE_STANDARD_FIELD("VERSION_ID"),
273
        OS_RELEASE_STANDARD_FIELD("BUILD_ID"),
274
        OS_RELEASE_STANDARD_FIELD("IMAGE_VERSION"),
275
        OS_RELEASE_STANDARD_FIELD("IMAGE_ID"),
276
        OS_RELEASE_STANDARD_FIELD("SUPPORT_END"),
277
        OS_RELEASE_STANDARD_FIELD("EXPERIMENT"),
278
        OS_RELEASE_STANDARD_FIELD("SYSEXT_LEVEL"),
279
        OS_RELEASE_STANDARD_FIELD("CONFEXT_LEVEL"),
280
        /* Keep those ↑ in sync with os_release_generate(). */
281
        {
282
                METRIC_IO_SYSTEMD_BASIC_PREFIX "PhysicalMemoryBytes",
283
                "Installed physical memory in bytes",
284
                METRIC_FAMILY_TYPE_GAUGE,
285
                .generate = physical_memory_generate,
286
        },
287
        {
288
                METRIC_IO_SYSTEMD_BASIC_PREFIX "Virtualization",
289
                "Virtualization type",
290
                METRIC_FAMILY_TYPE_STRING,
291
                .generate = virtualization_generate,
292
        },
293
        {}
294
};
295

296
int vl_method_describe_metrics(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
×
297
        return metrics_method_describe(metric_family_table, link, parameters, flags, userdata);
×
298
}
299

300
int vl_method_list_metrics(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
×
301
        return metrics_method_list(metric_family_table, link, parameters, flags, userdata);
×
302
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc