master
c 177 lines 6.74 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "api_v1_calls.h"
4
5 static void host_collectors(RRDHOST *host, BUFFER *wb) {
6 buffer_json_member_add_array(wb, "collectors");
7
8 DICTIONARY *dict = dictionary_create(DICT_OPTION_SINGLE_THREADED|DICT_OPTION_DONT_OVERWRITE_VALUE);
9 RRDSET *st;
10 char name[500];
11
12 time_t now = now_realtime_sec();
13
14 rrdset_foreach_read(st, host) {
15 if (!rrdset_is_available_for_viewers(st))
16 continue;
17
18 snprintfz(name, sizeof(name), "%s:%s", rrdset_plugin_name(st), rrdset_module_name(st));
19
20 bool old = 0;
21 bool *set = dictionary_set(dict, name, &old, sizeof(bool));
22 if(!*set) {
23 *set = true;
24 st->last_accessed_time_s = now;
25 buffer_json_add_array_item_object(wb);
26 buffer_json_member_add_string(wb, "plugin", rrdset_plugin_name(st));
27 buffer_json_member_add_string(wb, "module", rrdset_module_name(st));
28 buffer_json_object_close(wb);
29 }
30 }
31 rrdset_foreach_done(st);
32 dictionary_destroy(dict);
33
34 buffer_json_array_close(wb);
35 }
36
37 static inline void web_client_api_request_v1_info_mirrored_hosts_status(BUFFER *wb, RRDHOST *host) {
38 buffer_json_add_array_item_object(wb);
39
40 buffer_json_member_add_string(wb, "hostname", rrdhost_hostname(host));
41 buffer_json_member_add_int64(wb, "hops", rrdhost_ingestion_hops(host));
42 buffer_json_member_add_boolean(wb, "reachable", (host == localhost || !rrdhost_flag_check(host, RRDHOST_FLAG_ORPHAN)));
43
44 buffer_json_member_add_string(wb, "guid", host->machine_guid);
45 buffer_json_member_add_uuid(wb, "node_id", host->node_id.uuid);
46 CLAIM_ID claim_id = rrdhost_claim_id_get(host);
47 buffer_json_member_add_string(wb, "claim_id", claim_id_is_set(claim_id) ? claim_id.str : NULL);
48
49 buffer_json_object_close(wb);
50 }
51
52 static inline void web_client_api_request_v1_info_mirrored_hosts(BUFFER *wb) {
53 RRDHOST *host;
54
55 rrd_rdlock();
56
57 buffer_json_member_add_array(wb, "mirrored_hosts");
58 rrdhost_foreach_read(host)
59 buffer_json_add_array_item_string(wb, rrdhost_hostname(host));
60 buffer_json_array_close(wb);
61
62 buffer_json_member_add_array(wb, "mirrored_hosts_status");
63 rrdhost_foreach_read(host) {
64 if ((host == localhost || !rrdhost_flag_check(host, RRDHOST_FLAG_ORPHAN))) {
65 web_client_api_request_v1_info_mirrored_hosts_status(wb, host);
66 }
67 }
68 rrdhost_foreach_read(host) {
69 if ((host != localhost && rrdhost_flag_check(host, RRDHOST_FLAG_ORPHAN))) {
70 web_client_api_request_v1_info_mirrored_hosts_status(wb, host);
71 }
72 }
73 buffer_json_array_close(wb);
74
75 rrd_rdunlock();
76 }
77
78 static void web_client_api_request_v1_info_summary_alarm_statuses(RRDHOST *host, BUFFER *wb, const char *key) {
79 buffer_json_member_add_object(wb, key);
80
81 size_t normal = 0, warning = 0, critical = 0;
82 RRDCALC *rc;
83 foreach_rrdcalc_in_rrdhost_read(host, rc) {
84 if(unlikely(!rc->rrdset || !rc->rrdset->last_collected_time.tv_sec))
85 continue;
86
87 switch(rc->status) {
88 case RRDCALC_STATUS_WARNING:
89 warning++;
90 break;
91 case RRDCALC_STATUS_CRITICAL:
92 critical++;
93 break;
94 default:
95 normal++;
96 }
97 }
98 foreach_rrdcalc_in_rrdhost_done(rc);
99
100 buffer_json_member_add_uint64(wb, "normal", normal);
101 buffer_json_member_add_uint64(wb, "warning", warning);
102 buffer_json_member_add_uint64(wb, "critical", critical);
103
104 buffer_json_object_close(wb);
105 }
106
107 static int web_client_api_request_v1_info_fill_buffer(RRDHOST *host, BUFFER *wb) {
108 buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
109
110 buffer_json_member_add_string(wb, "version", rrdhost_program_version(host));
111 buffer_json_member_add_string(wb, "uid", host->machine_guid);
112
113 buffer_json_member_add_uint64(wb, "hosts-available", rrdhost_hosts_available());
114 web_client_api_request_v1_info_mirrored_hosts(wb);
115
116 web_client_api_request_v1_info_summary_alarm_statuses(host, wb, "alarms");
117
118 rrdhost_system_info_to_json_v1(wb, host->system_info);
119
120 host_labels2json(host, wb, "host_labels");
121 host_functions2json(host, wb);
122 host_collectors(host, wb);
123
124 buffer_json_member_add_boolean(wb, "cloud-enabled", true);
125 buffer_json_member_add_boolean(wb, "cloud-available", true);
126 buffer_json_member_add_boolean(wb, "agent-claimed", is_agent_claimed());
127 buffer_json_member_add_boolean(wb, "aclk-available", aclk_online());
128
129 buffer_json_member_add_string(wb, "memory-mode", rrd_memory_mode_name(host->rrd_memory_mode));
130 #ifdef ENABLE_DBENGINE
131 buffer_json_member_add_uint64(wb, "multidb-disk-quota", default_multidb_disk_quota_mb);
132 buffer_json_member_add_uint64(wb, "page-cache-size", default_rrdeng_page_cache_mb);
133 #endif // ENABLE_DBENGINE
134 buffer_json_member_add_boolean(wb, "web-enabled", web_server_mode != WEB_SERVER_MODE_NONE);
135 buffer_json_member_add_boolean(wb, "stream-enabled", stream_send.enabled);
136
137 buffer_json_member_add_boolean(wb, "stream-compression", stream_sender_has_compression(host));
138
139 buffer_json_member_add_boolean(wb, "https-enabled", true);
140
141 buffer_json_member_add_quoted_string(wb, "buildinfo", analytics_data.netdata_buildinfo);
142 buffer_json_member_add_quoted_string(wb, "release-channel", analytics_data.netdata_config_release_channel);
143 buffer_json_member_add_quoted_string(wb, "notification-methods", analytics_data.netdata_notification_methods);
144
145 buffer_json_member_add_boolean(wb, "exporting-enabled", analytics_data.exporting_enabled);
146 buffer_json_member_add_quoted_string(wb, "exporting-connectors", analytics_data.netdata_exporting_connectors);
147
148 buffer_json_member_add_uint64(wb, "allmetrics-prometheus-used", analytics_data.prometheus_hits);
149 buffer_json_member_add_uint64(wb, "allmetrics-shell-used", analytics_data.shell_hits);
150 buffer_json_member_add_uint64(wb, "allmetrics-json-used", analytics_data.json_hits);
151 buffer_json_member_add_uint64(wb, "dashboard-used", analytics_data.dashboard_hits);
152
153 buffer_json_member_add_uint64(wb, "charts-count", analytics_data.charts_count);
154 buffer_json_member_add_uint64(wb, "metrics-count", analytics_data.metrics_count);
155
156 #if defined(ENABLE_ML)
157 buffer_json_member_add_object(wb, "ml-info");
158 ml_host_get_info(host, wb);
159 buffer_json_object_close(wb);
160 #endif
161
162 buffer_json_finalize(wb);
163 return 0;
164 }
165
166 int api_v1_info(RRDHOST *host, struct web_client *w, char *url) {
167 (void)url;
168 if (!netdata_ready_load()) return HTTP_RESP_SERVICE_UNAVAILABLE;
169 BUFFER *wb = w->response.data;
170 buffer_flush(wb);
171 wb->content_type = CT_APPLICATION_JSON;
172
173 web_client_api_request_v1_info_fill_buffer(host, wb);
174
175 buffer_no_cacheable(wb);
176 return HTTP_RESP_OK;
177 }