diff options
Diffstat (limited to '')
-rw-r--r-- | src/claim/cloud-status.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/claim/cloud-status.c b/src/claim/cloud-status.c new file mode 100644 index 00000000..45db177e --- /dev/null +++ b/src/claim/cloud-status.c @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "claim.h" + +const char *cloud_status_to_string(CLOUD_STATUS status) { + switch(status) { + default: + case CLOUD_STATUS_AVAILABLE: + return "available"; + + case CLOUD_STATUS_BANNED: + return "banned"; + + case CLOUD_STATUS_OFFLINE: + return "offline"; + + case CLOUD_STATUS_ONLINE: + return "online"; + + case CLOUD_STATUS_INDIRECT: + return "indirect"; + } +} + +CLOUD_STATUS cloud_status(void) { + if(unlikely(aclk_disable_runtime)) + return CLOUD_STATUS_BANNED; + + if(likely(aclk_online())) + return CLOUD_STATUS_ONLINE; + + if(localhost->sender && + rrdhost_flag_check(localhost, RRDHOST_FLAG_RRDPUSH_SENDER_READY_4_METRICS) && + stream_has_capability(localhost->sender, STREAM_CAP_NODE_ID) && + !UUIDiszero(localhost->node_id) && + !UUIDiszero(localhost->aclk.claim_id_of_parent)) + return CLOUD_STATUS_INDIRECT; + + if(is_agent_claimed()) + return CLOUD_STATUS_OFFLINE; + + return CLOUD_STATUS_AVAILABLE; +} + +time_t cloud_last_change(void) { + time_t ret = MAX(last_conn_time_mqtt, last_disconnect_time); + if(!ret) ret = netdata_start_time; + return ret; +} + +time_t cloud_next_connection_attempt(void) { + return next_connection_attempt; +} + +size_t cloud_connection_id(void) { + return aclk_connection_counter; +} + +const char *cloud_status_aclk_offline_reason() { + if(aclk_disable_runtime) + return "banned"; + + return aclk_status_to_string(); +} + +const char *cloud_status_aclk_base_url() { + return aclk_cloud_base_url; +} + +CLOUD_STATUS buffer_json_cloud_status(BUFFER *wb, time_t now_s) { + CLOUD_STATUS status = cloud_status(); + + buffer_json_member_add_object(wb, "cloud"); + { + size_t id = cloud_connection_id(); + time_t last_change = cloud_last_change(); + time_t next_connect = cloud_next_connection_attempt(); + buffer_json_member_add_uint64(wb, "id", id); + buffer_json_member_add_string(wb, "status", cloud_status_to_string(status)); + buffer_json_member_add_time_t(wb, "since", last_change); + buffer_json_member_add_time_t(wb, "age", now_s - last_change); + + switch(status) { + default: + case CLOUD_STATUS_AVAILABLE: + // the agent is not claimed + buffer_json_member_add_string(wb, "url", cloud_config_url_get()); + buffer_json_member_add_string(wb, "reason", claim_agent_failure_reason_get()); + break; + + case CLOUD_STATUS_BANNED: { + // the agent is claimed, but has been banned from NC + CLAIM_ID claim_id = claim_id_get(); + buffer_json_member_add_string(wb, "claim_id", claim_id.str); + buffer_json_member_add_string(wb, "url", cloud_status_aclk_base_url()); + buffer_json_member_add_string(wb, "reason", "Agent is banned from Netdata Cloud"); + buffer_json_member_add_string(wb, "url", cloud_config_url_get()); + break; + } + + case CLOUD_STATUS_OFFLINE: { + // the agent is claimed, but cannot get online + CLAIM_ID claim_id = claim_id_get(); + buffer_json_member_add_string(wb, "claim_id", claim_id.str); + buffer_json_member_add_string(wb, "url", cloud_status_aclk_base_url()); + buffer_json_member_add_string(wb, "reason", cloud_status_aclk_offline_reason()); + if (next_connect > now_s) { + buffer_json_member_add_time_t(wb, "next_check", next_connect); + buffer_json_member_add_time_t(wb, "next_in", next_connect - now_s); + } + break; + } + + case CLOUD_STATUS_ONLINE: { + // the agent is claimed and online + CLAIM_ID claim_id = claim_id_get(); + buffer_json_member_add_string(wb, "claim_id", claim_id.str); + buffer_json_member_add_string(wb, "url", cloud_status_aclk_base_url()); + buffer_json_member_add_string(wb, "reason", ""); + break; + } + + case CLOUD_STATUS_INDIRECT: { + CLAIM_ID claim_id = rrdhost_claim_id_get(localhost); + buffer_json_member_add_string(wb, "claim_id", claim_id.str); + buffer_json_member_add_string(wb, "url", cloud_config_url_get()); + break; + } + } + } + buffer_json_object_close(wb); // cloud + + return status; +} |