@cryptotaxi247 / netdata-1 / commits / 9014acf01

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);