1 /*
2  * This file and its contents are licensed under the Timescale License.
3  * Please see the included NOTICE for copyright information and
4  * LICENSE-TIMESCALE for a copy of the license.
5  */
6 #include <postgres.h>
7 #include "telemetry.h"
8 #include <utils/builtins.h>
9 #include <jsonb_utils.h>
10 #include "hypertable.h"
11 #include "telemetry/telemetry.h"
12 #include "dist_util.h"
13 #include "data_node.h"
14 
15 #define DISTRIBUTED_DB_KEY "distributed_db"
16 #define DISTRIBUTED_MEMBER_KEY "distributed_member"
17 #define NUM_DISTRIBUTED_HYPERTABLES_KEY "num_distributed_hypertables"
18 #define NUM_DISTRIBUTED_HYPERTABLES_MEMBERS_KEY "num_distributed_hypertables_members"
19 #define NUM_REPLICATED_DISTRIBUTED_HYPERTABLES_KEY "num_replicated_distributed_hypertables"
20 #define NUM_DATA_NODES_KEY "num_data_nodes"
21 
22 static void
tsl_telemetry_add_distributed_database_info(JsonbParseState * parse_state)23 tsl_telemetry_add_distributed_database_info(JsonbParseState *parse_state)
24 {
25 	DistUtilMembershipStatus status = dist_util_membership();
26 	HypertablesStat stat;
27 
28 	ts_jsonb_add_str(parse_state, DISTRIBUTED_MEMBER_KEY, dist_util_membership_str(status));
29 
30 	if (status == DIST_MEMBER_NONE)
31 		return;
32 
33 	memset(&stat, 0, sizeof(stat));
34 	ts_number_of_hypertables(&stat);
35 
36 	ts_jsonb_add_str(parse_state,
37 					 NUM_DATA_NODES_KEY,
38 					 psprintf("%d", list_length(data_node_get_node_name_list())));
39 
40 	ts_jsonb_add_str(parse_state,
41 					 NUM_DISTRIBUTED_HYPERTABLES_KEY,
42 					 psprintf("%d", stat.num_hypertables_distributed));
43 
44 	ts_jsonb_add_str(parse_state,
45 					 NUM_REPLICATED_DISTRIBUTED_HYPERTABLES_KEY,
46 					 psprintf("%d", stat.num_hypertables_distributed_and_replicated));
47 
48 	ts_jsonb_add_str(parse_state,
49 					 NUM_DISTRIBUTED_HYPERTABLES_MEMBERS_KEY,
50 					 psprintf("%d", stat.num_hypertables_distributed_members));
51 }
52 
53 void
tsl_telemetry_add_info(JsonbParseState ** parse_state)54 tsl_telemetry_add_info(JsonbParseState **parse_state)
55 {
56 	JsonbValue distributed_db_key;
57 
58 	/* distributed_db */
59 	distributed_db_key.type = jbvString;
60 	distributed_db_key.val.string.val = DISTRIBUTED_DB_KEY;
61 	distributed_db_key.val.string.len = strlen(DISTRIBUTED_DB_KEY);
62 	pushJsonbValue(parse_state, WJB_KEY, &distributed_db_key);
63 	pushJsonbValue(parse_state, WJB_BEGIN_OBJECT, NULL);
64 	tsl_telemetry_add_distributed_database_info(*parse_state);
65 	pushJsonbValue(parse_state, WJB_END_OBJECT, NULL);
66 }
67