Add JSON output option for buildinfo. (#10706)
* Add JSON output option for buildinfo. * use JSON bools * fix wrong quoting Co-authored-by: Timotej Šiškovič <timotej@netdata.cloud>
Austin S. Hemmelgarn committed
Mar 4, 2021 at 13:01 UTC
9014acf01f4b0ce7597410d9e50124fc6707348c
3 files changed
+157
-84
daemon/buildinfo.c
+151
-84
@@ -6,224 +6,291 @@
6
// Optional features
7
8
#ifdef ENABLE_ACLK
9
-#define FEAT_CLOUD "YES"
9
+#define FEAT_CLOUD 1
10
+#define FEAT_CLOUD_MSG ""
11
#else
12
#ifdef DISABLE_CLOUD
12
-#define FEAT_CLOUD "NO (by user request e.g. '--disable-cloud')"
13
+#define FEAT_CLOUD 0
14
+#define FEAT_CLOUD_MSG "(by user request)"
15
#else
14
-#define FEAT_CLOUD "NO"
16
+#define FEAT_CLOUD 0
17
+#define FEAT_CLOUD_MSG ""
18
#endif
19
#endif
20
21
#ifdef ENABLE_DBENGINE
19
-#define FEAT_DBENGINE "YES"
22
+#define FEAT_DBENGINE 1
23
#else
21
-#define FEAT_DBENGINE "NO"
24
+#define FEAT_DBENGINE 0
25
#endif
26
27
#if defined(HAVE_X509_VERIFY_PARAM_set1_host) && HAVE_X509_VERIFY_PARAM_set1_host == 1
25
-#define FEAT_TLS_HOST_VERIFY "YES"
28
+#define FEAT_TLS_HOST_VERIFY 1
29
#else
27
-#define FEAT_TLS_HOST_VERIFY "NO"
30
+#define FEAT_TLS_HOST_VERIFY 0
31
#endif
32
33
#ifdef ENABLE_HTTPS
31
-#define FEAT_NATIVE_HTTPS "YES"
34
+#define FEAT_NATIVE_HTTPS 1
35
#else
33
-#define FEAT_NATIVE_HTTPS "NO"
36
+#define FEAT_NATIVE_HTTPS 0
37
#endif
38
39
// Optional libraries
40
41
#ifdef ENABLE_JSONC
39
-#define FEAT_JSONC "YES"
42
+#define FEAT_JSONC 1
43
#else
41
-#define FEAT_JSONC "NO"
44
+#define FEAT_JSONC 0
45
#endif
46
47
#ifdef ENABLE_JEMALLOC
45
-#define FEAT_JEMALLOC "YES"
48
+#define FEAT_JEMALLOC 1
49
#else
47
-#define FEAT_JEMALLOC "NO"
50
+#define FEAT_JEMALLOC 0
51
#endif
52
53
#ifdef ENABLE_TCMALLOC
51
-#define FEAT_TCMALLOC "YES"
54
+#define FEAT_TCMALLOC 1
55
#else
53
-#define FEAT_TCMALLOC "NO"
56
+#define FEAT_TCMALLOC 0
57
#endif
58
59
#ifdef HAVE_CAPABILITY
57
-#define FEAT_LIBCAP "YES"
60
+#define FEAT_LIBCAP 1
61
#else
59
-#define FEAT_LIBCAP "NO"
62
+#define FEAT_LIBCAP 0
63
#endif
64
65
#ifdef ACLK_NO_LIBMOSQ
63
-#define FEAT_MOSQUITTO "NO"
66
+#define FEAT_MOSQUITTO 0
67
#else
65
-#define FEAT_MOSQUITTO "YES"
68
+#define FEAT_MOSQUITTO 1
69
#endif
70
71
#ifdef ACLK_NO_LWS
69
-#define FEAT_LWS "NO"
72
+#define FEAT_LWS 0
73
+#define FEAT_LWS_MSG ""
74
#else
75
#ifdef ENABLE_ACLK
76
#include <libwebsockets.h>
77
#endif
78
#ifdef BUNDLED_LWS
75
-#define FEAT_LWS "YES static"
79
+#define FEAT_LWS 1
80
+#define FEAT_LWS_MSG "static"
81
#else
77
-#define FEAT_LWS "YES shared-lib"
82
+#define FEAT_LWS 1
83
+#define FEAT_LWS_MSG "shared-lib"
84
#endif
85
#endif
86
87
#ifdef NETDATA_WITH_ZLIB
82
-#define FEAT_ZLIB "YES"
88
+#define FEAT_ZLIB 1
89
#else
84
-#define FEAT_ZLIB "NO"
90
+#define FEAT_ZLIB 0
91
#endif
92
93
#ifdef STORAGE_WITH_MATH
88
-#define FEAT_LIBM "YES"
94
+#define FEAT_LIBM 1
95
#else
90
-#define FEAT_LIBM "NO"
96
+#define FEAT_LIBM 0
97
#endif
98
99
#ifdef HAVE_CRYPTO
94
-#define FEAT_CRYPTO "YES"
100
+#define FEAT_CRYPTO 1
101
#else
96
-#define FEAT_CRYPTO "NO"
102
+#define FEAT_CRYPTO 0
103
#endif
104
105
// Optional plugins
106
107
#ifdef ENABLE_APPS_PLUGIN
102
-#define FEAT_APPS_PLUGIN "YES"
108
+#define FEAT_APPS_PLUGIN 1
109
#else
104
-#define FEAT_APPS_PLUGIN "NO"
110
+#define FEAT_APPS_PLUGIN 0
111
#endif
112
113
#ifdef HAVE_FREEIPMI
108
-#define FEAT_IPMI "YES"
114
+#define FEAT_IPMI 1
115
#else
110
-#define FEAT_IPMI "NO"
116
+#define FEAT_IPMI 0
117
#endif
118
119
#ifdef HAVE_CUPS
114
-#define FEAT_CUPS "YES"
120
+#define FEAT_CUPS 1
121
#else
116
-#define FEAT_CUPS "NO"
122
+#define FEAT_CUPS 0
123
#endif
124
125
#ifdef HAVE_NFACCT
120
-#define FEAT_NFACCT "YES"
126
+#define FEAT_NFACCT 1
127
#else
122
-#define FEAT_NFACCT "NO"
128
+#define FEAT_NFACCT 0
129
#endif
130
131
#ifdef HAVE_LIBXENSTAT
126
-#define FEAT_XEN "YES"
132
+#define FEAT_XEN 1
133
#else
128
-#define FEAT_XEN "NO"
134
+#define FEAT_XEN 0
135
#endif
136
137
#ifdef HAVE_XENSTAT_VBD_ERROR
132
-#define FEAT_XEN_VBD_ERROR "YES"
138
+#define FEAT_XEN_VBD_ERROR 1
139
#else
134
-#define FEAT_XEN_VBD_ERROR "NO"
140
+#define FEAT_XEN_VBD_ERROR 0
141
#endif
142
143
#ifdef HAVE_LIBBPF
138
-#define FEAT_EBPF "YES"
144
+#define FEAT_EBPF 1
145
#else
140
-#define FEAT_EBPF "NO"
146
+#define FEAT_EBPF 0
147
#endif
148
149
#ifdef HAVE_SETNS
144
-#define FEAT_CGROUP_NET "YES"
150
+#define FEAT_CGROUP_NET 1
151
#else
146
-#define FEAT_CGROUP_NET "NO"
152
+#define FEAT_CGROUP_NET 0
153
#endif
154
155
#ifdef ENABLE_PERF_PLUGIN
150
-#define FEAT_PERF "YES"
156
+#define FEAT_PERF 1
157
#else
152
-#define FEAT_PERF "NO"
158
+#define FEAT_PERF 0
159
#endif
160
161
#ifdef ENABLE_SLABINFO
156
-#define FEAT_SLABINFO "YES"
162
+#define FEAT_SLABINFO 1
163
#else
158
-#define FEAT_SLABINFO "NO"
164
+#define FEAT_SLABINFO 0
165
#endif
166
167
// Optional Exporters
168
169
#ifdef HAVE_KINESIS
164
-#define FEAT_KINESIS "YES"
170
+#define FEAT_KINESIS 1
171
#else
166
-#define FEAT_KINESIS "NO"
172
+#define FEAT_KINESIS 0
173
#endif
174
175
#ifdef ENABLE_EXPORTING_PUBSUB
170
-#define FEAT_PUBSUB "YES"
176
+#define FEAT_PUBSUB 1
177
#else
172
-#define FEAT_PUBSUB "NO"
178
+#define FEAT_PUBSUB 0
179
#endif
180
181
#ifdef HAVE_MONGOC
176
-#define FEAT_MONGO "YES"
182
+#define FEAT_MONGO 1
183
#else
178
-#define FEAT_MONGO "NO"
184
+#define FEAT_MONGO 0
185
#endif
186
187
#ifdef ENABLE_PROMETHEUS_REMOTE_WRITE
182
-#define FEAT_REMOTE_WRITE "YES"
188
+#define FEAT_REMOTE_WRITE 1
189
#else
184
-#define FEAT_REMOTE_WRITE "NO"
190
+#define FEAT_REMOTE_WRITE 0
191
#endif
192
193
+#define FEAT_YES_NO(x) ((x) ? "YES" : "NO")
194
195
void print_build_info(void) {
196
printf("Configure options: %s\n", CONFIGURE_COMMAND);
197
198
printf("Features:\n");
192
- printf(" dbengine: %s\n", FEAT_DBENGINE);
193
- printf(" Native HTTPS: %s\n", FEAT_NATIVE_HTTPS);
194
- printf(" Netdata Cloud: %s\n", FEAT_CLOUD);
195
- printf(" TLS Host Verification: %s\n", FEAT_TLS_HOST_VERIFY);
199
+ printf(" dbengine: %s\n", FEAT_YES_NO(FEAT_DBENGINE));
200
+ printf(" Native HTTPS: %s\n", FEAT_YES_NO(FEAT_NATIVE_HTTPS));
201
+ printf(" Netdata Cloud: %s %s\n", FEAT_YES_NO(FEAT_CLOUD), FEAT_CLOUD_MSG);
202
+ printf(" TLS Host Verification: %s\n", FEAT_YES_NO(FEAT_TLS_HOST_VERIFY));
203
204
printf("Libraries:\n");
198
- printf(" jemalloc: %s\n", FEAT_JEMALLOC);
199
- printf(" JSON-C: %s\n", FEAT_JSONC);
200
- printf(" libcap: %s\n", FEAT_LIBCAP);
201
- printf(" libcrypto: %s\n", FEAT_CRYPTO);
202
- printf(" libm: %s\n", FEAT_LIBM);
205
+ printf(" jemalloc: %s\n", FEAT_YES_NO(FEAT_JEMALLOC));
206
+ printf(" JSON-C: %s\n", FEAT_YES_NO(FEAT_JSONC));
207
+ printf(" libcap: %s\n", FEAT_YES_NO(FEAT_LIBCAP));
208
+ printf(" libcrypto: %s\n", FEAT_YES_NO(FEAT_CRYPTO));
209
+ printf(" libm: %s\n", FEAT_YES_NO(FEAT_LIBM));
210
#if defined(ENABLE_ACLK)
204
- printf(" LWS: %s v%d.%d.%d\n", FEAT_LWS, LWS_LIBRARY_VERSION_MAJOR, LWS_LIBRARY_VERSION_MINOR, LWS_LIBRARY_VERSION_PATCH);
211
+ printf(" LWS: %s %s v%d.%d.%d\n", FEAT_YES_NO(FEAT_LWS), FEAT_LWS_MSG, LWS_LIBRARY_VERSION_MAJOR, LWS_LIBRARY_VERSION_MINOR, LWS_LIBRARY_VERSION_PATCH);
212
#else
206
- printf(" LWS: %s\n", FEAT_LWS);
213
+ printf(" LWS: %s %s\n", FEAT_YES_NO(FEAT_LWS), FEAT_LWS_MSG);
214
#endif
208
- printf(" mosquitto: %s\n", FEAT_MOSQUITTO);
209
- printf(" tcalloc: %s\n", FEAT_TCMALLOC);
210
- printf(" zlib: %s\n", FEAT_ZLIB);
215
+ printf(" mosquitto: %s\n", FEAT_YES_NO(FEAT_MOSQUITTO));
216
+ printf(" tcalloc: %s\n", FEAT_YES_NO(FEAT_TCMALLOC));
217
+ printf(" zlib: %s\n", FEAT_YES_NO(FEAT_ZLIB));
218
219
printf("Plugins:\n");
213
- printf(" apps: %s\n", FEAT_APPS_PLUGIN);
214
- printf(" cgroup Network Tracking: %s\n", FEAT_CGROUP_NET);
215
- printf(" CUPS: %s\n", FEAT_CUPS);
216
- printf(" EBPF: %s\n", FEAT_EBPF);
217
- printf(" IPMI: %s\n", FEAT_IPMI);
218
- printf(" NFACCT: %s\n", FEAT_NFACCT);
219
- printf(" perf: %s\n", FEAT_PERF);
220
- printf(" slabinfo: %s\n", FEAT_SLABINFO);
221
- printf(" Xen: %s\n", FEAT_XEN);
222
- printf(" Xen VBD Error Tracking: %s\n", FEAT_XEN_VBD_ERROR);
220
+ printf(" apps: %s\n", FEAT_YES_NO(FEAT_APPS_PLUGIN));
221
+ printf(" cgroup Network Tracking: %s\n", FEAT_YES_NO(FEAT_CGROUP_NET));
222
+ printf(" CUPS: %s\n", FEAT_YES_NO(FEAT_CUPS));
223
+ printf(" EBPF: %s\n", FEAT_YES_NO(FEAT_EBPF));
224
+ printf(" IPMI: %s\n", FEAT_YES_NO(FEAT_IPMI));
225
+ printf(" NFACCT: %s\n", FEAT_YES_NO(FEAT_NFACCT));
226
+ printf(" perf: %s\n", FEAT_YES_NO(FEAT_PERF));
227
+ printf(" slabinfo: %s\n", FEAT_YES_NO(FEAT_SLABINFO));
228
+ printf(" Xen: %s\n", FEAT_YES_NO(FEAT_XEN));
229
+ printf(" Xen VBD Error Tracking: %s\n", FEAT_YES_NO(FEAT_XEN_VBD_ERROR));
230
231
printf("Exporters:\n");
225
- printf(" AWS Kinesis: %s\n", FEAT_KINESIS);
226
- printf(" GCP PubSub: %s\n", FEAT_PUBSUB);
227
- printf(" MongoDB: %s\n", FEAT_MONGO);
228
- printf(" Prometheus Remote Write: %s\n", FEAT_REMOTE_WRITE);
232
+ printf(" AWS Kinesis: %s\n", FEAT_YES_NO(FEAT_KINESIS));
233
+ printf(" GCP PubSub: %s\n", FEAT_YES_NO(FEAT_PUBSUB));
234
+ printf(" MongoDB: %s\n", FEAT_YES_NO(FEAT_MONGO));
235
+ printf(" Prometheus Remote Write: %s\n", FEAT_YES_NO(FEAT_REMOTE_WRITE));
236
+};
237
+
238
+
239
+#define FEAT_JSON_BOOL(x) ((x) ? "true" : "false")
240
+// This intentionally does not use JSON-C so it works even if JSON-C is not present
241
+// This is used for anonymous statistics reporting, so it intentionally
242
+// does not include the configure options, which would be very easy to use
243
+// for tracking custom builds (and complicate outputting valid JSON).
244
+void print_build_info_json(void) {
245
+ printf("{\n");
246
+ printf(" \"features\": {\n");
247
+ printf(" \"dbengine\": %s,\n", FEAT_JSON_BOOL(FEAT_DBENGINE));
248
+ printf(" \"native-https\": %s,\n", FEAT_JSON_BOOL(FEAT_NATIVE_HTTPS));
249
+ printf(" \"cloud\": %s,\n", FEAT_JSON_BOOL(FEAT_CLOUD));
250
+#ifdef DISABLE_CLOUD
251
+ printf(" \"cloud-disabled\": true,\n");
252
+#else
253
+ printf(" \"cloud-disabled\": false,\n");
254
+#endif
255
+ printf(" \"tls-host-verify\": %s\n", FEAT_JSON_BOOL(FEAT_TLS_HOST_VERIFY));
256
+ printf(" },\n");
257
+
258
+ printf(" \"libs\": {\n");
259
+ printf(" \"jemalloc\": %s,\n", FEAT_JSON_BOOL(FEAT_JEMALLOC));
260
+ printf(" \"jsonc\": %s,\n", FEAT_JSON_BOOL(FEAT_JSONC));
261
+ printf(" \"libcap\": %s,\n", FEAT_JSON_BOOL(FEAT_LIBCAP));
262
+ printf(" \"libcrypto\": %s,\n", FEAT_JSON_BOOL(FEAT_CRYPTO));
263
+ printf(" \"libm\": %s,\n", FEAT_JSON_BOOL(FEAT_LIBM));
264
+#if defined(ENABLE_ACLK)
265
+ printf(" \"lws\": %s,\n", FEAT_JSON_BOOL(FEAT_LWS));
266
+ printf(" \"lws-version\": \"%d.%d.%d\",\n", LWS_LIBRARY_VERSION_MAJOR, LWS_LIBRARY_VERSION_MINOR, LWS_LIBRARY_VERSION_PATCH);
267
+ printf(" \"lws-type\": \"%s\",\n", FEAT_LWS_MSG);
268
+#else
269
+ printf(" \"lws\": %s,\n", FEAT_JSON_BOOL(FEAT_LWS));
270
+#endif
271
+ printf(" \"mosquitto\": %s,\n", FEAT_JSON_BOOL(FEAT_MOSQUITTO));
272
+ printf(" \"tcmalloc\": %s,\n", FEAT_JSON_BOOL(FEAT_TCMALLOC));
273
+ printf(" \"zlib\": %s\n", FEAT_JSON_BOOL(FEAT_ZLIB));
274
+ printf(" },\n");
275
+
276
+ printf(" \"plugins\": {\n");
277
+ printf(" \"apps\": %s,\n", FEAT_JSON_BOOL(FEAT_APPS_PLUGIN));
278
+ printf(" \"cgroup-net\": %s,\n", FEAT_JSON_BOOL(FEAT_CGROUP_NET));
279
+ printf(" \"cups\": %s,\n", FEAT_JSON_BOOL(FEAT_CUPS));
280
+ printf(" \"ebpf\": %s,\n", FEAT_JSON_BOOL(FEAT_EBPF));
281
+ printf(" \"ipmi\": %s,\n", FEAT_JSON_BOOL(FEAT_IPMI));
282
+ printf(" \"nfacct\": %s,\n", FEAT_JSON_BOOL(FEAT_NFACCT));
283
+ printf(" \"perf\": %s,\n", FEAT_JSON_BOOL(FEAT_PERF));
284
+ printf(" \"slabinfo\": %s,\n", FEAT_JSON_BOOL(FEAT_SLABINFO));
285
+ printf(" \"xen\": %s,\n", FEAT_JSON_BOOL(FEAT_XEN));
286
+ printf(" \"xen-vbd-error\": %s\n", FEAT_JSON_BOOL(FEAT_XEN_VBD_ERROR));
287
+ printf(" },\n");
288
+
289
+ printf(" \"exporters\": {\n");
290
+ printf(" \"kinesis\": %s,\n", FEAT_JSON_BOOL(FEAT_KINESIS));
291
+ printf(" \"pubsub\": %s,\n", FEAT_JSON_BOOL(FEAT_PUBSUB));
292
+ printf(" \"mongodb\": %s,\n", FEAT_JSON_BOOL(FEAT_MONGO));
293
+ printf(" \"prom-remote-write\": %s\n", FEAT_JSON_BOOL(FEAT_REMOTE_WRITE));
294
+ printf(" }\n");
295
+ printf("}\n");
296
};
daemon/buildinfo.h
+2
@@ -5,4 +5,6 @@
5
6
extern void print_build_info(void);
7
8
+extern void print_build_info_json(void);
9
+
10
#endif // NETDATA_BUILDINFO_H
daemon/main.c
+4
@@ -1258,6 +1258,10 @@ int main(int argc, char **argv) {
1258
print_build_info();
1259
return 0;
1260
}
1261
+ else if(strcmp(optarg, "buildinfojson") == 0) {
1262
+ print_build_info_json();
1263
+ return 0;
1264
+ }
1265
else {
1266
fprintf(stderr, "Unknown -W parameter '%s'\n", optarg);
1267
return help(1);