From dec257ff599d78ec12e58c0527531e8498a15a0a Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Oct 2023 08:59:54 +0000 Subject: [PATCH 001/107] TD-26529 --- include/common/tmsg.h | 9 + include/common/tmsgdef.h | 1 + include/libs/monitor/monitor.h | 2 + include/libs/monitorfw/taos_alloc.h | 47 ++ include/libs/monitorfw/taos_collector.h | 89 ++++ .../libs/monitorfw/taos_collector_registry.h | 123 ++++++ include/libs/monitorfw/taos_counter.h | 102 +++++ include/libs/monitorfw/taos_linked_list.h | 27 ++ include/libs/monitorfw/taos_map.h | 25 ++ include/libs/monitorfw/taos_metric.h | 49 +++ include/libs/monitorfw/taos_metric_sample.h | 59 +++ include/libs/monitorfw/taos_monitor.h | 130 ++++++ include/util/tlog.h | 1 + source/common/src/tmsg.c | 38 ++ source/dnode/mgmt/mgmt_mnode/src/mmHandle.c | 3 +- source/dnode/mgmt/node_mgmt/CMakeLists.txt | 2 +- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 2 + source/dnode/mgmt/node_util/CMakeLists.txt | 2 +- source/dnode/mgmt/node_util/inc/dmUtil.h | 1 + source/dnode/mnode/impl/CMakeLists.txt | 2 +- source/dnode/mnode/impl/src/mndDnode.c | 19 + source/dnode/mnode/impl/src/mndMnode.c | 1 + source/dnode/vnode/src/vnd/vnodeSvr.c | 16 + source/libs/CMakeLists.txt | 1 + source/libs/monitor/CMakeLists.txt | 2 +- source/libs/monitor/src/monMain.c | 28 ++ source/libs/monitorfw/CMakeLists.txt | 9 + source/libs/monitorfw/inc/taos_assert.h | 27 ++ .../monitorfw/inc/taos_collector_registry_i.h | 25 ++ .../monitorfw/inc/taos_collector_registry_t.h | 40 ++ source/libs/monitorfw/inc/taos_collector_t.h | 32 ++ source/libs/monitorfw/inc/taos_errors.h | 25 ++ .../libs/monitorfw/inc/taos_linked_list_i.h | 93 ++++ .../libs/monitorfw/inc/taos_linked_list_t.h | 53 +++ source/libs/monitorfw/inc/taos_log.h | 27 ++ source/libs/monitorfw/inc/taos_map_i.h | 37 ++ source/libs/monitorfw/inc/taos_map_t.h | 44 ++ .../monitorfw/inc/taos_metric_formatter_i.h | 82 ++++ .../monitorfw/inc/taos_metric_formatter_t.h | 26 ++ source/libs/monitorfw/inc/taos_metric_i.h | 43 ++ .../libs/monitorfw/inc/taos_metric_sample_i.h | 48 ++ .../libs/monitorfw/inc/taos_metric_sample_t.h | 28 ++ source/libs/monitorfw/inc/taos_metric_t.h | 54 +++ .../monitorfw/inc/taos_string_builder_i.h | 77 ++++ .../monitorfw/inc/taos_string_builder_t.h | 25 ++ source/libs/monitorfw/src/taos_collector.c | 110 +++++ .../monitorfw/src/taos_collector_registry.c | 200 +++++++++ source/libs/monitorfw/src/taos_counter.c | 65 +++ source/libs/monitorfw/src/taos_linked_list.c | 220 ++++++++++ source/libs/monitorfw/src/taos_map.c | 414 ++++++++++++++++++ source/libs/monitorfw/src/taos_metric.c | 173 ++++++++ .../monitorfw/src/taos_metric_formatter.c | 258 +++++++++++ .../libs/monitorfw/src/taos_metric_sample.c | 96 ++++ .../libs/monitorfw/src/taos_string_builder.c | 152 +++++++ 54 files changed, 3259 insertions(+), 5 deletions(-) create mode 100644 include/libs/monitorfw/taos_alloc.h create mode 100644 include/libs/monitorfw/taos_collector.h create mode 100644 include/libs/monitorfw/taos_collector_registry.h create mode 100644 include/libs/monitorfw/taos_counter.h create mode 100644 include/libs/monitorfw/taos_linked_list.h create mode 100644 include/libs/monitorfw/taos_map.h create mode 100644 include/libs/monitorfw/taos_metric.h create mode 100644 include/libs/monitorfw/taos_metric_sample.h create mode 100644 include/libs/monitorfw/taos_monitor.h create mode 100644 source/libs/monitorfw/CMakeLists.txt create mode 100644 source/libs/monitorfw/inc/taos_assert.h create mode 100644 source/libs/monitorfw/inc/taos_collector_registry_i.h create mode 100644 source/libs/monitorfw/inc/taos_collector_registry_t.h create mode 100644 source/libs/monitorfw/inc/taos_collector_t.h create mode 100644 source/libs/monitorfw/inc/taos_errors.h create mode 100644 source/libs/monitorfw/inc/taos_linked_list_i.h create mode 100644 source/libs/monitorfw/inc/taos_linked_list_t.h create mode 100644 source/libs/monitorfw/inc/taos_log.h create mode 100644 source/libs/monitorfw/inc/taos_map_i.h create mode 100644 source/libs/monitorfw/inc/taos_map_t.h create mode 100644 source/libs/monitorfw/inc/taos_metric_formatter_i.h create mode 100644 source/libs/monitorfw/inc/taos_metric_formatter_t.h create mode 100644 source/libs/monitorfw/inc/taos_metric_i.h create mode 100644 source/libs/monitorfw/inc/taos_metric_sample_i.h create mode 100644 source/libs/monitorfw/inc/taos_metric_sample_t.h create mode 100644 source/libs/monitorfw/inc/taos_metric_t.h create mode 100644 source/libs/monitorfw/inc/taos_string_builder_i.h create mode 100644 source/libs/monitorfw/inc/taos_string_builder_t.h create mode 100644 source/libs/monitorfw/src/taos_collector.c create mode 100644 source/libs/monitorfw/src/taos_collector_registry.c create mode 100644 source/libs/monitorfw/src/taos_counter.c create mode 100644 source/libs/monitorfw/src/taos_linked_list.c create mode 100644 source/libs/monitorfw/src/taos_map.c create mode 100644 source/libs/monitorfw/src/taos_metric.c create mode 100644 source/libs/monitorfw/src/taos_metric_formatter.c create mode 100644 source/libs/monitorfw/src/taos_metric_sample.c create mode 100644 source/libs/monitorfw/src/taos_string_builder.c diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 18b10a1749..6c6bacb6ad 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1544,6 +1544,15 @@ int32_t tSerializeSStatusReq(void* buf, int32_t bufLen, SStatusReq* pReq); int32_t tDeserializeSStatusReq(void* buf, int32_t bufLen, SStatusReq* pReq); void tFreeSStatusReq(SStatusReq* pReq); +typedef struct { + int32_t contLen; + char* pCont; +} SStatisReq; + +int32_t tSerializeSStatisReq(void* buf, int32_t bufLen, SStatisReq* pReq); +int32_t tDeserializeSStatisReq(void* buf, int32_t bufLen, SStatisReq* pReq); +void tFreeSStatisReq(SStatisReq *pReq); + typedef struct { int32_t dnodeId; int64_t clusterId; diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index b92bba831c..2fe7657b7f 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -189,6 +189,7 @@ enum { // WARN: new msg should be appended to segment tail TD_DEF_MSG_TYPE(TDMT_MND_STREAM_NODECHANGE_CHECK, "stream-nodechange-check", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_TRIM_DB_TIMER, "trim-db-tmr", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_GRANT_NOTIFY, "grant-notify", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_STATIS, "statis", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_MAX_MSG, "mnd-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_VND_MSG) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 91b3a54ea1..1f3d21777d 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -222,6 +222,8 @@ void monSetQmInfo(SMonQmInfo *pInfo); void monSetSmInfo(SMonSmInfo *pInfo); void monSetBmInfo(SMonBmInfo *pInfo); void monSendReport(); +void monSendPromReport(); +void monSendContent(char *pCont); void tFreeSMonMmInfo(SMonMmInfo *pInfo); void tFreeSMonVmInfo(SMonVmInfo *pInfo); diff --git a/include/libs/monitorfw/taos_alloc.h b/include/libs/monitorfw/taos_alloc.h new file mode 100644 index 0000000000..893ffc7e9b --- /dev/null +++ b/include/libs/monitorfw/taos_alloc.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_alloc.h + * @brief memory management + */ + +#ifndef TAOS_ALLOC_H +#define TAOS_ALLOC_H + +#include +#include + +/** + * @brief Redefine this macro if you wish to override it. The default value is malloc. + */ +#define taos_malloc malloc + +/** + * @brief Redefine this macro if you wish to override it. The default value is realloc. + */ +#define taos_realloc realloc + +/** + * @brief Redefine this macro if you wish to override it. The default value is strdup. + */ +#define taos_strdup strdup + +/** + * @brief Redefine this macro if you wish to override it. The default value is free. + */ +#define taos_free free + +#endif // TAOS_ALLOC_H diff --git a/include/libs/monitorfw/taos_collector.h b/include/libs/monitorfw/taos_collector.h new file mode 100644 index 0000000000..918395ae72 --- /dev/null +++ b/include/libs/monitorfw/taos_collector.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_COLLECTOR_H +#define TAOS_COLLECTOR_H + +#include "taos_map.h" +#include "taos_metric.h" + +/** + * @file taos_collector.h + * @brief A Prometheus collector returns a collection of metrics + */ + +/** + * @brief A prometheus collector calls collect to prepare metrics and return them to the registry to which it is + * registered. + */ +typedef struct taos_collector taos_collector_t; + +/** + * @brief The function responsible for preparing metric data and returning metrics for a given collector. + * + * If you use the default collector registry, this should not concern you. If you are using a custom collector, you may + * set this function on your collector to do additional work before returning the contained metrics. + * + * @param self The target taos_collector_t* + * @return The taos_map_t* containing the collected metrics + */ +typedef taos_map_t *taos_collect_fn(taos_collector_t *self); + +/** + * @brief Create a collector + * @param name The name of the collector. The name MUST NOT be default or process. + * @return The constructed taos_collector_t* + */ +taos_collector_t *taos_collector_new(const char *name); + +/** + * @brief Destroy a collector. You MUST set self to NULL after destruction. + * @param self The target taos_collector_t* + * @return A non-zero integer value upon failure. + */ +int taos_collector_destroy(taos_collector_t *self); + +/** + * @brief Frees a collector passed as a void pointer. You MUST set self to NULL after destruction. + * @param gen The target taos_collector_t* represented as a void* + */ +void taos_collector_free_generic(void *gen); + +/** + * @brief Destroys a collector passed as a void pointer. You MUST set self to NULL after destruction. + * @param gen The target taos_collector_t* represented as a void* + * @return A non-zero integer value upon failure. + */ +int taos_collector_destroy_generic(void *gen); + +/** + * @brief Add a metric to a collector + * @param self The target taos_collector_t* + * @param metric the taos_metric_t* to add to the taos_collector_t* passed as self. + * @return A non-zero integer value upon failure. + */ +int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric); + +/** + * @brief The collect function is responsible for doing any work involving a set of metrics and then returning them + * for metric exposition. + * @param self The target taos_collector_t* + * @param fn The taos_collect_fn* which will be responsible for handling any metric collection operations before + * returning the collected metrics for exposition. + * @return A non-zero integer value upon failure. + */ +int taos_collector_set_collect_fn(taos_collector_t *self, taos_collect_fn *fn); + +#endif // TAOS_COLLECTOR_H diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h new file mode 100644 index 0000000000..f67deb074b --- /dev/null +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_collector_registry.h + * @brief The collector registry registers collectors for metric exposition. + */ + +#ifndef TAOS_REGISTRY_H +#define TAOS_REGISTRY_H + +#include "taos_collector.h" +#include "taos_metric.h" + +/** + * @brief A taos_registry_t is responsible for registering metrics and briding them to the string exposition format + */ +typedef struct taos_collector_registry taos_collector_registry_t; + +/** + * @brief Initialize the default registry by calling taos_collector_registry_init within your program. You MUST NOT + * modify this value. + */ +extern taos_collector_registry_t *TAOS_COLLECTOR_REGISTRY_DEFAULT; + +/** + * @brief Initializes the default collector registry and enables metric collection on the executing process + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_default_init(void); + +/** + * @brief Constructs a taos_collector_registry_t* + * @param name The name of the collector registry. It MUST NOT be default. + * @return The constructed taos_collector_registry_t* + */ +taos_collector_registry_t *taos_collector_registry_new(const char *name); + +/** + * @brief Destroy a collector registry. You MUST set self to NULL after destruction. + * @param self The target taos_collector_registry_t* + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_destroy(taos_collector_registry_t *self); + +/** + * @brief Enable process metrics on the given collector registry + * @param self The target taos_collector_registry_t* + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_enable_process_metrics(taos_collector_registry_t *self); + +/** + * @brief Registers a metric with the default collector on TAOS_DEFAULT_COLLECTOR_REGISTRY + * + * The metric to be registered MUST NOT already be registered with the given . If so, the program will + * halt. It returns a taos_metric_t* to simplify metric creation and registration. Furthermore, + * TAOS_DEFAULT_COLLECTOR_REGISTRY must be registered via taos_collector_registry_default_init() prior to calling this + * function. The metric will be added to the default registry's default collector. + * + * @param metric The metric to register on TAOS_DEFAULT_COLLECTOR_REGISTRY* + * @return The registered taos_metric_t* + */ +taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metric); + +/** + * @brief Registers a metric with the default collector on TAOS_DEFAULT_COLLECTOR_REGISTRY. Returns an non-zero integer + * value on failure. + * + * See taos_collector_registry_must_register_metric. + * + * @param metric The metric to register on TAOS_DEFAULT_COLLECTOR_REGISTRY* + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_register_metric(taos_metric_t *metric); + +/** + * @brief Register a collector with the given registry. Returns a non-zero integer value on failure. + * @param self The target taos_collector_registry_t* + * @param collector The taos_collector_t* to register onto the taos_collector_registry_t* as self + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_register_collector(taos_collector_registry_t *self, taos_collector_t *collector); + +/** + * @brief Returns a string in the default metric exposition format. The string MUST be freed to avoid unnecessary heap + * memory growth. + * + * Reference: https://prometheus.io/docs/instrumenting/exposition_formats/ + * + * @param self The target taos_collector_registry_t* + * @return The string int he default metric exposition format. + */ +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, int64_t ts); + +int taos_collector_registry_clear_out(taos_collector_registry_t *self); + +/** + *@brief Validates that the given metric name complies with the specification: + * + * Reference: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels + * + * Returns a non-zero integer value on failure. + * + * @param self The target taos_collector_registry_t* + * @param metric_name The metric name to validate + * @return A non-zero integer value upon failure + */ +int taos_collector_registry_validate_metric_name(taos_collector_registry_t *self, const char *metric_name); + +#endif // TAOS_H diff --git a/include/libs/monitorfw/taos_counter.h b/include/libs/monitorfw/taos_counter.h new file mode 100644 index 0000000000..28a9eed41c --- /dev/null +++ b/include/libs/monitorfw/taos_counter.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_COUNTER_H +#define TAOS_COUNTER_H + +#include + +#include "taos_metric.h" + +/** + * @file taos_counter.h + * @brief https://prometheus.io/docs/concepts/metric_types/#counter + */ + +/** + * @brief A prometheus counter. + * + * References + * * See https://prometheus.io/docs/concepts/metric_types/#counter + */ +typedef taos_metric_t taos_counter_t; + +/** + * @brief Construct a taos_counter_t* + * @param name The name of the metric + * @param help The metric description + * @param label_key_count The number of labels associated with the given metric. Pass 0 if the metric does not + * require labels. + * @param label_keys A collection of label keys. The number of keys MUST match the value passed as label_key_count. If + * no labels are required, pass NULL. Otherwise, it may be convenient to pass this value as a + * literal. + * @return The constructed taos_counter_t* + * + * *Example* + * + * // An example with labels + * taos_counter_new("foo", "foo is a counter with labels", 2, (const char**) { "one", "two" }); + * + * // An example without labels + * taos_counter_new("foo", "foo is a counter without labels", 0, NULL); + */ +taos_counter_t *taos_counter_new(const char *name, const char *help, size_t label_key_count, const char **label_keys); + +/** + * @brief Destroys a taos_counter_t*. You must set self to NULL after destruction. A non-zero integer value will be + * returned on failure. + * @param self A taos_counter_t* + * @return A non-zero integer value upon failure. + */ +int taos_counter_destroy(taos_counter_t *self); + +/** + * @brief Increment the taos_counter_t by 1. A non-zero integer value will be returned on failure. + * @param self The target taos_counter_t* + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the counter's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * + * *Example* + * + * // An example with labels + * taos_counter_inc(foo_counter, (const char**) { "bar", "bang" }); + ** + * // An example without labels + * taos_counter_inc(foo_counter, NULL); + */ +int taos_counter_inc(taos_counter_t *self, const char **label_values); + +/** + * @brief Add the value to the taos_counter_t*. A non-zero integer value will be returned on failure. + * @param self The target taos_counter_t* + * @param r_value The double to add to the taos_counter_t passed as self. The value MUST be greater than or equal to 0. + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the counter's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * + * *Example* + * + * // An example with labels + * taos_counter_add(foo_counter, 22, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_counter_add(foo_counter, 22, NULL); + */ +int taos_counter_add(taos_counter_t *self, double r_value, const char **label_values); + +#endif // TAOS_COUNTER_H diff --git a/include/libs/monitorfw/taos_linked_list.h b/include/libs/monitorfw/taos_linked_list.h new file mode 100644 index 0000000000..1fff5e65a6 --- /dev/null +++ b/include/libs/monitorfw/taos_linked_list.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_LIST_H +#define TAOS_LIST_H + +#include + +struct taos_linked_list; +/** + * @brief Provides a generic linked list + */ +typedef struct taos_linked_list taos_linked_list_t; + +#endif // TAOS_LIST_H diff --git a/include/libs/monitorfw/taos_map.h b/include/libs/monitorfw/taos_map.h new file mode 100644 index 0000000000..fa554d569c --- /dev/null +++ b/include/libs/monitorfw/taos_map.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_MAP_H +#define TAOS_MAP_H + +struct taos_map; +typedef struct taos_map taos_map_t; + +struct taos_map_node; +typedef struct taos_map_node taos_map_node_t; + +#endif // TAOS_MAP_H diff --git a/include/libs/monitorfw/taos_metric.h b/include/libs/monitorfw/taos_metric.h new file mode 100644 index 0000000000..a377311fa0 --- /dev/null +++ b/include/libs/monitorfw/taos_metric.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_metric.h + * @brief Functions for retrieving metric samples from metrics given an ordered set of labels + */ + +#ifndef TAOS_METRIC_H +#define TAOS_METRIC_H + +#include "taos_metric_sample.h" + +struct taos_metric; +/** + * @brief A prometheus metric. + * + * Reference: https://prometheus.io/docs/concepts/data_model + */ +typedef struct taos_metric taos_metric_t; + +/** + * @brief Returns a taos_metric_sample_t*. The order of label_values is significant. + * + * You may use this function to cache metric samples to avoid sample lookup. Metric samples are stored in a hash map + * with O(1) lookups in average case; nonethless, caching metric samples and updating them directly might be + * preferrable in performance-sensitive situations. + * + * @param self The target taos_metric_t* + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the counter's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A taos_metric_sample_t* + */ +taos_metric_sample_t *taos_metric_sample_from_labels(taos_metric_t *self, const char **label_values); + +#endif // TAOS_METRIC_H diff --git a/include/libs/monitorfw/taos_metric_sample.h b/include/libs/monitorfw/taos_metric_sample.h new file mode 100644 index 0000000000..1c37f59e32 --- /dev/null +++ b/include/libs/monitorfw/taos_metric_sample.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_metric_sample.h + * @brief Functions for interfacting with metric samples directly + */ + +#ifndef TAOS_METRIC_SAMPLE_H +#define TAOS_METRIC_SAMPLE_H + +struct taos_metric_sample; +/** + * @brief Contains the specific metric and value given the name and label set + * Reference: https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels + */ +typedef struct taos_metric_sample taos_metric_sample_t; + +/** + * @brief Add the r_value to the sample. The value must be greater than or equal to zero. + * @param self The target taos_metric_sample_t* + * @param r_value The double to add to taos_metric_sample_t* provided by self + * @return Non-zero integer value upon failure + */ +int taos_metric_sample_add(taos_metric_sample_t *self, double r_value); + +/** + * @brief Subtract the r_value from the sample. + * + * This operation MUST be called a sample derived from a gauge metric. + * @param self The target taos_metric_sample_t* + * @param r_value The double to subtract from the taos_metric_sample_t* provided by self + * @return Non-zero integer value upon failure + */ +int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value); + +/** + * @brief Set the r_value of the sample. + * + * This operation MUST be called on a sample derived from a gauge metric. + * @param self The target taos_metric_sample_t* + * @param r_value The double which will be set to the taos_metric_sample_t* provided by self + * @return Non-zero integer value upon failure + */ +int taos_metric_sample_set(taos_metric_sample_t *self, double r_value); + +#endif // TAOS_METRIC_SAMPLE_H diff --git a/include/libs/monitorfw/taos_monitor.h b/include/libs/monitorfw/taos_monitor.h new file mode 100644 index 0000000000..ec4f007c45 --- /dev/null +++ b/include/libs/monitorfw/taos_monitor.h @@ -0,0 +1,130 @@ +/* +Copyright 2019 DigitalOcean Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** + * @file taos_monitor.h + * @brief Include taos_monitor.h to include the entire public API + * @mainpage Welcome to the documentation site for prometheus-client-c! + * @tableofcontents + * @section Introduction + * + * prometheus-client-c is a small suite of Prometheus client libraries targeted for the C programming language. + * In this brief tutorial you will learn how to create and register metrics, update metric samples, and expose metrics + * over HTTP. + * + * @section Creating-and-Registering-Metrics Creating and Registering Metrics + * + * prometheus-client-c supports the following metric types: + * + * * [Counter](https://prometheus.io/docs/concepts/metric_types/#counter) + * * [Gauge](https://prometheus.io/docs/concepts/metric_types/#gauge) + * * [Histogram](https://prometheus.io/docs/concepts/metric_types/#histogram) + * + * To get started using one of the metric types, declare the metric at file scope. For example: + * + * @code{.c} + * + * #incldue "taos_monitor.h" + * + * taos_counter_t *my_counter; + * + * @endcode + * + * Next, create a metric initialization function. You can create the metric and register it with the default metric + * collector registry in one chain of functions. A metric collector is responsible for collecting metrics and returning + * them. A metric collector registry is declared in global scope and contains metric collectors. More on this later... + * + * To create a metric and register it with the default metric collector registry in one shot, you may chain the metric + * constructor into the taos_collector_registry_must_register_metric function. For example: + * + * @code{.c} + * + * void foo_metric_init(void) { + * my_counter = taos_collector_registry_must_register_metric(taos_counter_new("my_counter", "counts things", 0, NULL)); + * } + * + * @endcode + * + * The first argument to taos_counter_new is the counter name. The second argument is the counter description. The third + * argument is the number of metric labels. In this case, we will only have one metric sample for this metric so we pass + * 0 to specify that no labels will be used. The 4th argument is an array of strings storing the metric labels. Since we + * have none, we pass NULL. A call to foo_metric_init within the program's main function will initialize the metrics + * for the file we just created to the default prometheus metric collector registery called + * TAOS_COLLECTOR_REGISTRY_DEFAULT + * + * @section Updating-Metric-Sample-Values Updating Metric Sample Values + * + * Now that we have a metric configured for creation and registration, we can update our metric within any of the + * functions of the file in which it was declared. For example: + * + * @code{.c} + * + * void my_lib_do_something(void) { + * printf("I did a really important thing!\n"); + * taos_counter_inc(my_counter, NULL); + * } + * @endcode + * + * This function will increment the default metric sample for my_counter. Since we are not using metric labels, we pass + * NULL as the second argument. + * + * @section Program-Initialization Program Initialization + * + * At the start of the program's main function you need to do two things: + * + * * Initialize the default metric collector registry: + * + * @code{.c} + * + * taos_collector_registry_default_init(); + * + * @endcode + * + * * For each file containing prometheus metrics, call its corresponding metric initialization function + * + * @code{.c} + * + * foo_metric_init() + * + * @endcode + * + * After initialization is complete, you may proceed to do work and update your metrics. + * + * @section Metric-Exposition-Over-HTTP Metric Exposition Over HTTP + * + * @todo Describe how to use libpromhttp to expose metrics over HTTP + * + * @section Where-To-Go-From-Here Where to Go From Here? + * + * Take a look at the [Files](https://github.internal.digitalocean.com/pages/timeseries/prometheus-client-c/files.html) + * tab in this documentation site for more information about the public API available to you. Also, you can take a look + * at the examples directory at the + * [Github repository](https://github.internal.digitalocean.com/timeseries/prometheus-client-c) for inspiration. + */ + +#ifndef TAOS_INCLUDED +#define TAOS_INCLUDED + +#include "taos_alloc.h" +#include "taos_collector.h" +#include "taos_collector_registry.h" +#include "taos_counter.h" +#include "taos_linked_list.h" +#include "taos_map.h" +#include "taos_metric.h" +#include "taos_metric_sample.h" + +#endif // TAOS_INCLUDED \ No newline at end of file diff --git a/include/util/tlog.h b/include/util/tlog.h index a6d146a79e..1d795045ef 100644 --- a/include/util/tlog.h +++ b/include/util/tlog.h @@ -118,6 +118,7 @@ void taosReleaseCrashLogFile(TdFilePtr pFile, bool truncateFile); #define uDebug(...) { if (uDebugFlag & DEBUG_DEBUG) { taosPrintLog("UTL ", DEBUG_DEBUG, uDebugFlag, __VA_ARGS__); }} #define uTrace(...) { if (uDebugFlag & DEBUG_TRACE) { taosPrintLog("UTL ", DEBUG_TRACE, uDebugFlag, __VA_ARGS__); }} #define uDebugL(...) { if (uDebugFlag & DEBUG_DEBUG) { taosPrintLongString("UTL ", DEBUG_DEBUG, uDebugFlag, __VA_ARGS__); }} +#define uInfoL(...) { if (uDebugFlag & DEBUG_INFO) { taosPrintLongString("UTL ", DEBUG_INFO, uDebugFlag, __VA_ARGS__); }} #define pError(...) { taosPrintLog("APP ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); } #define pPrint(...) { taosPrintLog("APP ", DEBUG_INFO, 255, __VA_ARGS__); } diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index bd6eb46bad..d22d4c4cf5 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -1423,6 +1423,44 @@ int32_t tDeserializeSStatusRsp(void *buf, int32_t bufLen, SStatusRsp *pRsp) { void tFreeSStatusRsp(SStatusRsp *pRsp) { taosArrayDestroy(pRsp->pDnodeEps); } +int32_t tSerializeSStatisReq(void *buf, int32_t bufLen, SStatisReq *pReq) { + SEncoder encoder = {0}; + tEncoderInit(&encoder, buf, bufLen); + + if (tStartEncode(&encoder) < 0) return -1; + + if (tEncodeI32(&encoder, pReq->contLen) < 0) return -1; + if (tEncodeCStr(&encoder, pReq->pCont) < 0) return -1; + + tEndEncode(&encoder); + + int32_t tlen = encoder.pos; + tEncoderClear(&encoder); + return tlen; +} + +int32_t tDeserializeSStatisReq(void *buf, int32_t bufLen, SStatisReq *pReq) { + SDecoder decoder = {0}; + tDecoderInit(&decoder, buf, bufLen); + + if (tStartDecode(&decoder) < 0) return -1; + + if (tDecodeI32(&decoder, &pReq->contLen) < 0) return -1; + if (pReq->contLen > 0) { + pReq->pCont = taosMemoryMalloc(pReq->contLen + 1); + if (pReq->pCont == NULL) return -1; + if (tDecodeCStrTo(&decoder, pReq->pCont) < 0) return -1; + } + + tEndDecode(&decoder); + tDecoderClear(&decoder); + return 0; +} + +void tFreeSStatisReq(SStatisReq *pReq) { + taosMemoryFreeClear(pReq->pCont); +} + int32_t tSerializeSCreateAcctReq(void *buf, int32_t bufLen, SCreateAcctReq *pReq) { SEncoder encoder = {0}; tEncoderInit(&encoder, buf, bufLen); diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index d5488da770..8f60a3dc85 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -189,7 +189,8 @@ SArray *mmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_INDEX, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_INDEX, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_MND_RESTORE_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER; - + if (dmSetMgmtHandle(pArray, TDMT_MND_STATIS, mmPutMsgToReadQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SCH_QUERY, mmPutMsgToQueryQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SCH_MERGE_QUERY, mmPutMsgToQueryQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SCH_QUERY_CONTINUE, mmPutMsgToQueryQueue, 1) == NULL) goto _OVER; diff --git a/source/dnode/mgmt/node_mgmt/CMakeLists.txt b/source/dnode/mgmt/node_mgmt/CMakeLists.txt index f1be20289a..3761020560 100644 --- a/source/dnode/mgmt/node_mgmt/CMakeLists.txt +++ b/source/dnode/mgmt/node_mgmt/CMakeLists.txt @@ -1,7 +1,7 @@ aux_source_directory(src IMPLEMENT_SRC) add_library(dnode STATIC ${IMPLEMENT_SRC}) target_link_libraries( - dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode + dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode monitorfw ) target_include_directories( dnode diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index b3db7c3058..c237ce73c0 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -106,6 +106,8 @@ void dmSendMonitorReport() { dmGetQmMonitorInfo(pDnode); dmGetSmMonitorInfo(pDnode); monSendReport(); + + monSendPromReport(); } void dmGetVnodeLoads(SMonVloadInfo *pInfo) { diff --git a/source/dnode/mgmt/node_util/CMakeLists.txt b/source/dnode/mgmt/node_util/CMakeLists.txt index 5c670cbdd3..d882d784de 100644 --- a/source/dnode/mgmt/node_util/CMakeLists.txt +++ b/source/dnode/mgmt/node_util/CMakeLists.txt @@ -6,5 +6,5 @@ target_include_directories( PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) target_link_libraries( - node_util cjson mnode vnode qnode snode wal sync taos_static tfs monitor + node_util cjson mnode vnode qnode snode wal sync taos_static tfs monitor monitorfw ) \ No newline at end of file diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index 0a52c578a5..4c00a48796 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -39,6 +39,7 @@ #include "sync.h" #include "tfs.h" #include "wal.h" +#include "taos_monitor.h" #ifdef __cplusplus extern "C" { diff --git a/source/dnode/mnode/impl/CMakeLists.txt b/source/dnode/mnode/impl/CMakeLists.txt index 48dc71a12b..8f9564b072 100644 --- a/source/dnode/mnode/impl/CMakeLists.txt +++ b/source/dnode/mnode/impl/CMakeLists.txt @@ -16,7 +16,7 @@ target_include_directories( PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) target_link_libraries( - mnode scheduler sdb wal transport cjson sync monitor executor qworker stream parser audit + mnode scheduler sdb wal transport cjson sync monitor executor qworker stream parser audit monitorfw ) IF (TD_GRANT) diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index b53dee7bff..01332472a1 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -73,6 +73,7 @@ static int32_t mndProcessConfigDnodeRsp(SRpcMsg *pRsp); static int32_t mndProcessStatusReq(SRpcMsg *pReq); static int32_t mndProcessNotifyReq(SRpcMsg *pReq); static int32_t mndProcessRestoreDnodeReq(SRpcMsg *pReq); +static int32_t mndProcessStatisReq(SRpcMsg *pReq); static int32_t mndRetrieveConfigs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static void mndCancelGetNextConfig(SMnode *pMnode, void *pIter); @@ -108,6 +109,7 @@ int32_t mndInitDnode(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_MND_DNODE_LIST, mndProcessDnodeListReq); mndSetMsgHandle(pMnode, TDMT_MND_SHOW_VARIABLES, mndProcessShowVariablesReq); mndSetMsgHandle(pMnode, TDMT_MND_RESTORE_DNODE, mndProcessRestoreDnodeReq); + mndSetMsgHandle(pMnode, TDMT_MND_STATIS, mndProcessStatisReq); mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndRetrieveConfigs); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_CONFIGS, mndCancelGetNextConfig); @@ -489,6 +491,23 @@ static bool mndUpdateMnodeState(SMnodeObj *pObj, SMnodeLoad *pMload) { return stateChanged; } +static int32_t mndProcessStatisReq(SRpcMsg *pReq) { + SMnode *pMnode = pReq->info.node; + SStatisReq statisReq = {0}; + int32_t code = -1; + + if (tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq) != 0) { + terrno = TSDB_CODE_INVALID_MSG; + goto _OVER; + } + + monSendContent(pReq->pCont); + +_OVER: + tFreeSStatisReq(&statisReq); + return code; +} + static int32_t mndProcessStatusReq(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; SStatusReq statusReq = {0}; diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index 22b2fec857..a93973fd13 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -23,6 +23,7 @@ #include "mndTrans.h" #include "tmisce.h" #include "audit.h" +#include "taos_monitor.h" #define MNODE_VER_NUMBER 2 #define MNODE_RESERVE_SIZE 64 diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index efa722d41a..c4aa5c6428 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -20,6 +20,7 @@ #include "vnode.h" #include "vnodeInt.h" #include "audit.h" +#include "taos_monitor.h" static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); @@ -40,6 +41,8 @@ static int32_t vnodeProcessDropIndexReq(SVnode *pVnode, int64_t ver, void *pReq, static int32_t vnodeProcessCompactVnodeReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessConfigChangeReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); +taos_counter_t *insert_counter = NULL; + static int32_t vnodePreprocessCreateTableReq(SVnode *pVnode, SDecoder *pCoder, int64_t btime, int64_t *pUid) { int32_t code = 0; int32_t lino = 0; @@ -1613,6 +1616,19 @@ _exit: tdProcessRSmaSubmit(pVnode->pSma, ver, pSubmitReq, pReq, len, STREAM_INPUT__DATA_SUBMIT); } + if(insert_counter == NULL){ + int32_t label_count =1; + const char *sample_labels[] = {"vgid"}; + insert_counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); + insert_counter = taos_collector_registry_must_register_metric(insert_counter); + } + + char vgId[50]; + sprintf(vgId, "%"PRId32, TD_VID(pVnode)); + const char *sample_labels[] = {vgId}; + + taos_counter_inc(insert_counter, sample_labels); + // clear taosArrayDestroy(newTbUids); tDestroySubmitReq(pSubmitReq, 0 == pMsg->version ? TSDB_MSG_FLG_CMPT : TSDB_MSG_FLG_DECODE); diff --git a/source/libs/CMakeLists.txt b/source/libs/CMakeLists.txt index 9f812517c1..6196d30a58 100644 --- a/source/libs/CMakeLists.txt +++ b/source/libs/CMakeLists.txt @@ -8,6 +8,7 @@ add_subdirectory(qcom) add_subdirectory(nodes) add_subdirectory(catalog) add_subdirectory(audit) +add_subdirectory(monitorfw) add_subdirectory(scalar) add_subdirectory(function) diff --git a/source/libs/monitor/CMakeLists.txt b/source/libs/monitor/CMakeLists.txt index 30dce7aaef..13523fd3cc 100644 --- a/source/libs/monitor/CMakeLists.txt +++ b/source/libs/monitor/CMakeLists.txt @@ -6,7 +6,7 @@ target_include_directories( PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -target_link_libraries(monitor os util common transport) +target_link_libraries(monitor os util common transport monitorfw) if(${BUILD_TEST}) add_subdirectory(test) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 56cf0a2b51..93abda1281 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -18,6 +18,7 @@ #include "taoserror.h" #include "thttp.h" #include "ttime.h" +#include "taos_monitor.h" static SMonitor tsMonitor = {0}; static char* tsMonUri = "/report"; @@ -108,6 +109,9 @@ int32_t monInit(const SMonCfg *pCfg) { tsLogFp = monRecordLog; tsMonitor.lastTime = taosGetTimestampMs(); taosThreadMutexInit(&tsMonitor.lock, NULL); + + taos_collector_registry_default_init(); + return 0; } @@ -542,3 +546,27 @@ void monSendReport() { monCleanupMonitorInfo(pMonitor); } + +void monSendPromReport() { + char *pCont = (char *)taos_collector_registry_bridge( + TAOS_COLLECTOR_REGISTRY_DEFAULT, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + uInfoL("report cont:\n%s\n", pCont); + if (pCont != NULL) { + EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + uError("failed to send monitor msg"); + }else{ + taos_collector_registry_clear_out(TAOS_COLLECTOR_REGISTRY_DEFAULT); + } + } +} + +void monSendContent(char *pCont) { + uInfoL("report cont:\n%s\n", pCont); + if (pCont != NULL) { + EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + uError("failed to send monitor msg"); + } + } +} \ No newline at end of file diff --git a/source/libs/monitorfw/CMakeLists.txt b/source/libs/monitorfw/CMakeLists.txt new file mode 100644 index 0000000000..610cd63985 --- /dev/null +++ b/source/libs/monitorfw/CMakeLists.txt @@ -0,0 +1,9 @@ +aux_source_directory(src MONITOR2_SRC) +add_library(monitorfw STATIC ${MONITOR2_SRC}) +target_include_directories( + monitorfw + PUBLIC "${TD_SOURCE_DIR}/include/libs/monitorfw" + PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" +) + +target_link_libraries(monitorfw os util common transport) diff --git a/source/libs/monitorfw/inc/taos_assert.h b/source/libs/monitorfw/inc/taos_assert.h new file mode 100644 index 0000000000..d3226eed26 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_assert.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +#ifndef TAOS_ASSERT_H +#define TAOS_ASSERT_H + +#ifdef TAOS_ASSERT_ENABLE +#define TAOS_ASSERT(i) assert(i); +#else +#define TAOS_ASSERT(i) +#endif // TAOS_TEST + +#endif // TAOS_ASSERT_H diff --git a/source/libs/monitorfw/inc/taos_collector_registry_i.h b/source/libs/monitorfw/inc/taos_collector_registry_i.h new file mode 100644 index 0000000000..ed5bb1fe19 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_collector_registry_i.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "taos_collector_registry_t.h" + +#ifndef TAOS_COLLECTOR_REGISTRY_I_INCLUDED +#define TAOS_COLLECTOR_REGISTRY_I_INCLUDED + +int taos_collector_registry_enable_custom_process_metrics(taos_collector_registry_t *self, + const char *process_limits_path, + const char *process_stats_path); + +#endif // TAOS_COLLECTOR_REGISTRY_I_INCLUDED diff --git a/source/libs/monitorfw/inc/taos_collector_registry_t.h b/source/libs/monitorfw/inc/taos_collector_registry_t.h new file mode 100644 index 0000000000..2264d18081 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_collector_registry_t.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_REGISTRY_T_H +#define TAOS_REGISTRY_T_H + +#include +#include + +// Public +#include "taos_collector_registry.h" + +// Private +#include "taos_map_t.h" +#include "taos_metric_formatter_t.h" +#include "taos_string_builder_t.h" + +struct taos_collector_registry { + const char *name; + bool disable_process_metrics; /**< Disables the collection of process metrics */ + taos_map_t *collectors; /**< Map of collectors keyed by name */ + taos_string_builder_t *string_builder; /**< Enables string building */ + taos_metric_formatter_t *metric_formatter; /**< metric formatter for metric exposition on bridge call */ + pthread_rwlock_t *lock; /**< mutex for safety against concurrent registration */ + taos_string_builder_t *out; +}; + +#endif // TAOS_REGISTRY_T_H diff --git a/source/libs/monitorfw/inc/taos_collector_t.h b/source/libs/monitorfw/inc/taos_collector_t.h new file mode 100644 index 0000000000..264e8e9ad9 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_collector_t.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_COLLECTOR_T_H +#define TAOS_COLLECTOR_T_H + +#include "taos_collector.h" +#include "taos_map_t.h" +#include "taos_string_builder_t.h" + +struct taos_collector { + const char *name; + taos_map_t *metrics; + taos_collect_fn *collect_fn; + taos_string_builder_t *string_builder; + const char *proc_limits_file_path; + const char *proc_stat_file_path; +}; + +#endif // TAOS_COLLECTOR_T_H diff --git a/source/libs/monitorfw/inc/taos_errors.h b/source/libs/monitorfw/inc/taos_errors.h new file mode 100644 index 0000000000..ee2a894df3 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_errors.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define TAOS_STDIO_CLOSE_DIR_ERROR "failed to close dir" +#define TAOS_STDIO_OPEN_DIR_ERROR "failed to open dir" +#define TAOS_METRIC_INCORRECT_TYPE "incorrect metric type" +#define TAOS_METRIC_INVALID_LABEL_NAME "invalid label name" +#define TAOS_PTHREAD_RWLOCK_DESTROY_ERROR "failed to destroy the pthread_rwlock_t*" +#define TAOS_PTHREAD_RWLOCK_INIT_ERROR "failed to initialize the pthread_rwlock_t*" +#define TAOS_PTHREAD_RWLOCK_LOCK_ERROR "failed to lock the pthread_rwlock_t*" +#define TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR "failed to unlock the pthread_rwlock_t*" +#define TAOS_REGEX_REGCOMP_ERROR "failed to compile the regular expression" +#define TAOS_REGEX_REGEXEC_ERROR "failed to execute the regular expression" diff --git a/source/libs/monitorfw/inc/taos_linked_list_i.h b/source/libs/monitorfw/inc/taos_linked_list_i.h new file mode 100644 index 0000000000..ed11a76427 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_linked_list_i.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_LIST_I_INCLUDED +#define TAOS_LIST_I_INCLUDED + +// Private +#include "taos_linked_list_t.h" + +/** + * @brief API PRIVATE Returns a pointer to a taos_linked_list + */ +taos_linked_list_t *taos_linked_list_new(void); + +/** + * @brief API PRIVATE removes all nodes from the given taos_linked_list * + */ +int taos_linked_list_purge(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Destroys a taos_linked_list + */ +int taos_linked_list_destroy(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Append an item to the back of the list + */ +int taos_linked_list_append(taos_linked_list_t *self, void *item); + +/** + * @brief API PRIVATE Push an item onto the front of the list + */ +int taos_linked_list_push(taos_linked_list_t *self, void *item); + +/** + * @brief API PRIVATE Pop the first item off of the list + */ +void *taos_linked_list_pop(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Returns the item at the head of the list or NULL if not present + */ +void *taos_linked_list_first(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Returns the item at the tail of the list or NULL if not present + */ +void *taos_linked_list_last(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Removes an item from the linked list + */ +int taos_linked_list_remove(taos_linked_list_t *self, void *item); + +/** + * @brief API PRIVATE Compares two items within a linked list + */ +taos_linked_list_compare_t taos_linked_list_compare(taos_linked_list_t *self, void *item_a, void *node_b); + +/** + * @brief API PRIVATE Get the size + */ +size_t taos_linked_list_size(taos_linked_list_t *self); + +/** + * @brief API PRIVATE Set the free_fn member on taos_linked_list + */ +int taos_linked_list_set_free_fn(taos_linked_list_t *self, taos_linked_list_free_item_fn free_fn); + +/** + * @brief API PRIVATE Set the compare_fn member on the taos_linked_list + */ +int taos_linked_list_set_compare_fn(taos_linked_list_t *self, taos_linked_list_compare_item_fn compare_fn); + +/** + * API PRIVATE + * @brief does nothing + */ +void taos_linked_list_no_op_free(void *item); + +#endif // TAOS_LIST_I_INCLUDED diff --git a/source/libs/monitorfw/inc/taos_linked_list_t.h b/source/libs/monitorfw/inc/taos_linked_list_t.h new file mode 100644 index 0000000000..ccd82ffb61 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_linked_list_t.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_LIST_T_H +#define TAOS_LIST_T_H + +#include "taos_linked_list.h" + +typedef enum { TAOS_LESS = -1, TAOS_EQUAL = 0, TAOS_GREATER = 1 } taos_linked_list_compare_t; + +/** + * @brief API PRIVATE Frees an item in a taos_linked_list_node + */ +typedef void (*taos_linked_list_free_item_fn)(void *); + +/** + * @brief API PRIVATE Compares two items within a taos_linked_list + */ +typedef taos_linked_list_compare_t (*taos_linked_list_compare_item_fn)(void *item_a, void *item_b); + +/** + * @brief API PRIVATE A struct containing a generic item, represented as a void pointer, and next, a pointer to the + * next taos_linked_list_node* + */ +typedef struct taos_linked_list_node { + struct taos_linked_list_node *next; + void *item; +} taos_linked_list_node_t; + +/** + * @brief API PRIVATE A linked list comprised of taos_linked_list_node* instances + */ +struct taos_linked_list { + taos_linked_list_node_t *head; + taos_linked_list_node_t *tail; + size_t size; + taos_linked_list_free_item_fn free_fn; + taos_linked_list_compare_item_fn compare_fn; +}; + +#endif // TAOS_LIST_T_H diff --git a/source/libs/monitorfw/inc/taos_log.h b/source/libs/monitorfw/inc/taos_log.h new file mode 100644 index 0000000000..6d6c9e1fb3 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_log.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +#ifndef TAOS_LOG_H +#define TAOS_LOG_H + +#ifdef TAOS_LOG_ENABLE +#define TAOS_LOG(msg) printf("%s %s %s %s %d %s\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__, msg); +#else +#define TAOS_LOG(msg) +#endif // TAOS_LOG_ENABLE + +#endif // TAOS_LOG_H diff --git a/source/libs/monitorfw/inc/taos_map_i.h b/source/libs/monitorfw/inc/taos_map_i.h new file mode 100644 index 0000000000..808548e96a --- /dev/null +++ b/source/libs/monitorfw/inc/taos_map_i.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_MAP_I_INCLUDED +#define TAOS_MAP_I_INCLUDED + +#include "taos_map_t.h" + +taos_map_t *taos_map_new(void); + +int taos_map_set_free_value_fn(taos_map_t *self, taos_map_node_free_value_fn free_value_fn); + +void *taos_map_get(taos_map_t *self, const char *key); + +int taos_map_set(taos_map_t *self, const char *key, void *value); + +int taos_map_delete(taos_map_t *self, const char *key); + +int taos_map_destroy(taos_map_t *self); + +size_t taos_map_size(taos_map_t *self); + +taos_map_node_t *taos_map_node_new(const char *key, void *value, taos_map_node_free_value_fn free_value_fn); + +#endif // TAOS_MAP_I_INCLUDED diff --git a/source/libs/monitorfw/inc/taos_map_t.h b/source/libs/monitorfw/inc/taos_map_t.h new file mode 100644 index 0000000000..6fcbda1366 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_map_t.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_MAP_T_H +#define TAOS_MAP_T_H + +#include + +// Public +#include "taos_map.h" + +// Private +#include "taos_linked_list_t.h" + +typedef void (*taos_map_node_free_value_fn)(void *); + +struct taos_map_node { + const char *key; + void *value; + taos_map_node_free_value_fn free_value_fn; +}; + +struct taos_map { + size_t size; /**< contains the size of the map */ + size_t max_size; /**< stores the current max_size */ + taos_linked_list_t *keys; /**< linked list containing containing all keys present */ + taos_linked_list_t **addrs; /**< Sequence of linked lists. Each list contains nodes with the same index */ + pthread_rwlock_t *rwlock; + taos_map_node_free_value_fn free_value_fn; +}; + +#endif // TAOS_MAP_T_H diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h new file mode 100644 index 0000000000..9a63850ea4 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_METRIC_FORMATTER_I_H +#define TAOS_METRIC_FORMATTER_I_H + +// Private +#include "taos_metric_formatter_t.h" +#include "taos_metric_t.h" + +/** + * @brief API PRIVATE taos_metric_formatter constructor + */ +taos_metric_formatter_t *taos_metric_formatter_new(); + +/** + * @brief API PRIVATE taos_metric_formatter destructor + */ +int taos_metric_formatter_destroy(taos_metric_formatter_t *self); + +/** + * @brief API PRIVATE Loads the help text + */ +int taos_metric_formatter_load_help(taos_metric_formatter_t *self, const char *name, const char *help); + +/** + * @brief API PRIVATE Loads the type text + */ +int taos_metric_formatter_load_type(taos_metric_formatter_t *self, const char *name, taos_metric_type_t metric_type); + +/** + * @brief API PRIVATE Loads the formatter with a metric sample L-value + * @param name The metric name + * @param suffix The metric suffix. This is applicable to Summary and Histogram metric types. + * @param label_count The number of labels for the given metric. + * @param label_keys An array of constant strings. + * @param label_values An array of constant strings. + * + * The number of const char **and taos_label_value must be the same. + */ +int taos_metric_formatter_load_l_value(taos_metric_formatter_t *metric_formatter, const char *name, const char *suffix, + size_t label_count, const char **label_keys, const char **label_values); + +/** + * @brief API PRIVATE Loads the formatter with a metric sample + */ +int taos_metric_formatter_load_sample( + taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, int64_t ts); + +/** + * @brief API PRIVATE Loads a metric in the string exposition format + */ +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, int64_t ts); + +/** + * @brief API PRIVATE Loads the given metrics + */ +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, int64_t ts); + +/** + * @brief API PRIVATE Clear the underlying string_builder + */ +int taos_metric_formatter_clear(taos_metric_formatter_t *self); + +/** + * @brief API PRIVATE Returns the string built by taos_metric_formatter + */ +char *taos_metric_formatter_dump(taos_metric_formatter_t *metric_formatter); + +#endif // TAOS_METRIC_FORMATTER_I_H diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_t.h b/source/libs/monitorfw/inc/taos_metric_formatter_t.h new file mode 100644 index 0000000000..0d7425aa59 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_formatter_t.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_METRIC_FORMATTER_T_H +#define TAOS_METRIC_FORMATTER_T_H + +#include "taos_string_builder_t.h" + +typedef struct taos_metric_formatter { + taos_string_builder_t *string_builder; + taos_string_builder_t *err_builder; +} taos_metric_formatter_t; + +#endif // TAOS_METRIC_FORMATTER_T_H diff --git a/source/libs/monitorfw/inc/taos_metric_i.h b/source/libs/monitorfw/inc/taos_metric_i.h new file mode 100644 index 0000000000..e8ae799547 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_i.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// Private +#include "taos_metric_t.h" + +#ifndef TAOS_METRIC_I_INCLUDED +#define TAOS_METRIC_I_INCLUDED + +/** + * @brief API PRIVATE Returns a *taos_metric + */ +taos_metric_t *taos_metric_new(taos_metric_type_t type, const char *name, const char *help, size_t label_key_count, + const char **label_keys); + +/** + * @brief API PRIVATE Destroys a *taos_metric + */ +int taos_metric_destroy(taos_metric_t *self); + +/** + * @brief API PRIVATE takes a generic item, casts to a *taos_metric_t and destroys it + */ +int taos_metric_destroy_generic(void *item); + +/** + * @brief API Private takes a generic item, casts to a *taos_metric_t and destroys it. Discards any errors. + */ +void taos_metric_free_generic(void *item); + +#endif // TAOS_METRIC_I_INCLUDED diff --git a/source/libs/monitorfw/inc/taos_metric_sample_i.h b/source/libs/monitorfw/inc/taos_metric_sample_i.h new file mode 100644 index 0000000000..b5e90f1933 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_sample_i.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "taos_metric_sample_t.h" +#include "taos_metric_t.h" + +#ifndef TAOS_METRIC_SAMPLE_I_H +#define TAOS_METRIC_SAMPLE_I_H + +/** + * @brief API PRIVATE Return a taos_metric_sample_t* + * + * @param type The type of metric sample + * @param l_value The entire left value of the metric e.g metric_name{foo="bar"} + * @param r_value A double representing the value of the sample + */ +taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value); + +/** + * @brief API PRIVATE Destroy the taos_metric_sample** + */ +int taos_metric_sample_destroy(taos_metric_sample_t *self); + +/** + * @brief API PRIVATE A taos_linked_list_free_item_fn to enable item destruction within a linked list's destructor + */ +int taos_metric_sample_destroy_generic(void *); + +/** + * @brief API PRIVATE A taos_linked_list_free_item_fn to enable item destruction within a linked list's destructor. + * + * This function ignores any errors. + */ +void taos_metric_sample_free_generic(void *gen); + +#endif // TAOS_METRIC_SAMPLE_I_H diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h new file mode 100644 index 0000000000..59a398b938 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_METRIC_SAMPLE_T_H +#define TAOS_METRIC_SAMPLE_T_H + +#include "taos_metric_sample.h" +#include "taos_metric_t.h" + +struct taos_metric_sample { + taos_metric_type_t type; /**< type is the metric type for the sample */ + char *l_value; /**< l_value is the full metric name and label set represeted as a string */ + _Atomic double r_value; /**< r_value is the value of the metric sample */ +}; + +#endif // TAOS_METRIC_SAMPLE_T_H diff --git a/source/libs/monitorfw/inc/taos_metric_t.h b/source/libs/monitorfw/inc/taos_metric_t.h new file mode 100644 index 0000000000..806466528d --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_t.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_METRIC_T_H +#define TAOS_METRIC_T_H + +#include + +// Public +#include "taos_metric.h" + +// Private +#include "taos_map_i.h" +#include "taos_map_t.h" +#include "taos_metric_formatter_t.h" + +/** + * @brief API PRIVATE Contains metric type constants + */ +typedef enum taos_metric_type { TAOS_COUNTER, TAOS_GAUGE, TAOS_HISTOGRAM, TAOS_SUMMARY } taos_metric_type_t; + +/** + * @brief API PRIVATE Maps metric type constants to human readable string values + */ +extern char *taos_metric_type_map[4]; + +/** + * @brief API PRIVATE An opaque struct to users containing metric metadata; one or more metric samples; and a metric + * formatter for locating metric samples and exporting metric data + */ +struct taos_metric { + taos_metric_type_t type; /**< metric_type The type of metric */ + const char *name; /**< name The name of the metric */ + const char *help; /**< help The help output for the metric */ + taos_map_t *samples; /**< samples Map comprised of samples for the given metric */ + size_t label_key_count; /**< label_keys_count The count of labe_keys*/ + taos_metric_formatter_t *formatter; /**< formatter The metric formatter */ + pthread_rwlock_t *rwlock; /**< rwlock Required for locking on certain non-atomic operations */ + const char **label_keys; /**< labels Array comprised of const char **/ +}; + +#endif // TAOS_METRIC_T_H diff --git a/source/libs/monitorfw/inc/taos_string_builder_i.h b/source/libs/monitorfw/inc/taos_string_builder_i.h new file mode 100644 index 0000000000..142ca020ba --- /dev/null +++ b/source/libs/monitorfw/inc/taos_string_builder_i.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_STRING_BUILDER_I_H +#define TAOS_STRING_BUILDER_I_H + +#include + +#include "taos_string_builder_t.h" + +/** + * API PRIVATE + * @brief Constructor for taos_string_builder + */ +taos_string_builder_t *taos_string_builder_new(void); + +/** + * API PRIVATE + * @brief Destroys a taos_string_builder* + */ +int taos_string_builder_destroy(taos_string_builder_t *self); + +/** + * API PRIVATE + * @brief Adds a string + */ +int taos_string_builder_add_str(taos_string_builder_t *self, const char *str); + +/** + * API PRIVATE + * @brief Adds a char + */ +int taos_string_builder_add_char(taos_string_builder_t *self, char c); + +/** + * API PRIVATE + * @brief Clear the string + */ +int taos_string_builder_clear(taos_string_builder_t *self); + +/** + * API PRIVATE + * @brief Remove data from the end + */ +int taos_string_buillder_truncate(taos_string_builder_t *self, size_t len); + +/** + * API PRIVATE + * @brief Returns the length of the string + */ +size_t taos_string_builder_len(taos_string_builder_t *self); + +/** + * API PRIVATE + * @brief Returns a copy of the string. The returned string must be deallocated when no longer needed. + */ +char *taos_string_builder_dump(taos_string_builder_t *self); + +/** + * API PRIVATE + * @brief Getter for str member + */ +char *taos_string_builder_str(taos_string_builder_t *self); + +#endif // TAOS_STRING_BUILDER_I_H diff --git a/source/libs/monitorfw/inc/taos_string_builder_t.h b/source/libs/monitorfw/inc/taos_string_builder_t.h new file mode 100644 index 0000000000..edd3d574fa --- /dev/null +++ b/source/libs/monitorfw/inc/taos_string_builder_t.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_STRING_BUILDER_T_H +#define TAOS_STRING_BUILDER_T_H + +struct taos_string_builder; +/** + * @brief API PRIVATE A structure with functions responsible for building a string + */ +typedef struct taos_string_builder taos_string_builder_t; + +#endif // TAOS_STRING_BUILDER_T_H diff --git a/source/libs/monitorfw/src/taos_collector.c b/source/libs/monitorfw/src/taos_collector.c new file mode 100644 index 0000000000..9d96f61b4b --- /dev/null +++ b/source/libs/monitorfw/src/taos_collector.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include + +// Public +#include "taos_alloc.h" +#include "taos_collector.h" +#include "taos_collector_registry.h" + +// Private +#include "taos_assert.h" +#include "taos_collector_t.h" +#include "taos_log.h" +#include "taos_map_i.h" +#include "taos_metric_i.h" +#include "taos_string_builder_i.h" + +taos_map_t *taos_collector_default_collect(taos_collector_t *self) { return self->metrics; } + +taos_collector_t *taos_collector_new(const char *name) { + int r = 0; + taos_collector_t *self = (taos_collector_t *)taos_malloc(sizeof(taos_collector_t)); + self->name = taos_strdup(name); + self->metrics = taos_map_new(); + if (self->metrics == NULL) { + taos_collector_destroy(self); + return NULL; + } + r = taos_map_set_free_value_fn(self->metrics, &taos_metric_free_generic); + if (r) { + taos_collector_destroy(self); + return NULL; + } + self->collect_fn = &taos_collector_default_collect; + self->string_builder = taos_string_builder_new(); + if (self->string_builder == NULL) { + taos_collector_destroy(self); + return NULL; + } + self->proc_limits_file_path = NULL; + self->proc_stat_file_path = NULL; + return self; +} + +int taos_collector_destroy(taos_collector_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + + int r = 0; + int ret = 0; + + r = taos_map_destroy(self->metrics); + if (r) ret = r; + self->metrics = NULL; + + r = taos_string_builder_destroy(self->string_builder); + if (r) ret = r; + self->string_builder = NULL; + + taos_free((char *)self->name); + self->name = NULL; + taos_free(self); + self = NULL; + + return ret; +} + +int taos_collector_destroy_generic(void *gen) { + int r = 0; + taos_collector_t *self = (taos_collector_t *)gen; + r = taos_collector_destroy(self); + self = NULL; + return r; +} + +void taos_collector_free_generic(void *gen) { + taos_collector_t *self = (taos_collector_t *)gen; + taos_collector_destroy(self); +} + +int taos_collector_set_collect_fn(taos_collector_t *self, taos_collect_fn *fn) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + self->collect_fn = fn; + return 0; +} + +int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (taos_map_get(self->metrics, metric->name) != NULL) { + TAOS_LOG("metric already found in collector"); + return 1; + } + return taos_map_set(self->metrics, metric->name, metric); +} diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c new file mode 100644 index 0000000000..7efe82ad23 --- /dev/null +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +// Public +#include "taos_alloc.h" +#include "taos_collector.h" +#include "taos_collector_registry.h" + +// Private +#include "taos_assert.h" +#include "taos_collector_registry_t.h" +#include "taos_collector_t.h" +#include "taos_errors.h" +#include "taos_log.h" +#include "taos_map_i.h" +#include "taos_metric_formatter_i.h" +#include "taos_metric_i.h" +#include "taos_metric_t.h" +#include "taos_string_builder_i.h" + +taos_collector_registry_t *TAOS_COLLECTOR_REGISTRY_DEFAULT; + +taos_collector_registry_t *taos_collector_registry_new(const char *name) { + int r = 0; + + taos_collector_registry_t *self = (taos_collector_registry_t *)taos_malloc(sizeof(taos_collector_registry_t)); + + self->disable_process_metrics = false; + + self->name = taos_strdup(name); + self->collectors = taos_map_new(); + taos_map_set_free_value_fn(self->collectors, &taos_collector_free_generic); + taos_map_set(self->collectors, "default", taos_collector_new("default")); + + self->metric_formatter = taos_metric_formatter_new(); + self->string_builder = taos_string_builder_new(); + self->out = taos_string_builder_new(); + self->lock = (pthread_rwlock_t *)taos_malloc(sizeof(pthread_rwlock_t)); + r = pthread_rwlock_init(self->lock, NULL); + if (r) { + TAOS_LOG("failed to initialize rwlock"); + return NULL; + } + return self; +} + +int taos_collector_registry_default_init(void) { + if (TAOS_COLLECTOR_REGISTRY_DEFAULT != NULL) return 0; + + TAOS_COLLECTOR_REGISTRY_DEFAULT = taos_collector_registry_new("default"); + //if (TAOS_COLLECTOR_REGISTRY_DEFAULT) { + // return taos_collector_registry_enable_process_metrics(TAOS_COLLECTOR_REGISTRY_DEFAULT); + //} + return 1; +} + +int taos_collector_registry_destroy(taos_collector_registry_t *self) { + if (self == NULL) return 0; + + int r = 0; + int ret = 0; + + r = taos_map_destroy(self->collectors); + self->collectors = NULL; + if (r) ret = r; + + r = taos_metric_formatter_destroy(self->metric_formatter); + self->metric_formatter = NULL; + if (r) ret = r; + + r = taos_string_builder_destroy(self->string_builder); + self->string_builder = NULL; + if (r) ret = r; + + r = pthread_rwlock_destroy(self->lock); + taos_free(self->lock); + self->lock = NULL; + if (r) ret = r; + + taos_free((char *)self->name); + self->name = NULL; + + taos_free(self); + self = NULL; + + return ret; +} + +int taos_collector_registry_register_metric(taos_metric_t *metric) { + TAOS_ASSERT(metric != NULL); + + taos_collector_t *default_collector = + (taos_collector_t *)taos_map_get(TAOS_COLLECTOR_REGISTRY_DEFAULT->collectors, "default"); + + if (default_collector == NULL) { + return 1; + } + + return taos_collector_add_metric(default_collector, metric); +} + +taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metric) { + int err = taos_collector_registry_register_metric(metric); + if (err != 0) { + exit(err); + } + return metric; +} + +int taos_collector_registry_register_collector(taos_collector_registry_t *self, taos_collector_t *collector) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = pthread_rwlock_wrlock(self->lock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_LOCK_ERROR); + return 1; + } + if (taos_map_get(self->collectors, collector->name) != NULL) { + TAOS_LOG("the given taos_collector_t* is already registered"); + int rr = pthread_rwlock_unlock(self->lock); + if (rr) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return rr; + } else { + return 1; + } + } + r = taos_map_set(self->collectors, collector->name, collector); + if (r) { + int rr = pthread_rwlock_unlock(self->lock); + if (rr) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return rr; + } else { + return r; + } + } + r = pthread_rwlock_unlock(self->lock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return 1; + } + return 0; +} + +int taos_collector_registry_validate_metric_name(taos_collector_registry_t *self, const char *metric_name) { + regex_t r; + int ret = 0; + ret = regcomp(&r, "^[a-zA-Z_:][a-zA-Z0-9_:]*$", REG_EXTENDED); + if (ret) { + TAOS_LOG(TAOS_REGEX_REGCOMP_ERROR); + regfree(&r); + return ret; + } + + ret = regexec(&r, metric_name, 0, NULL, 0); + if (ret) { + TAOS_LOG(TAOS_REGEX_REGEXEC_ERROR); + regfree(&r); + return ret; + } + regfree(&r); + return 0; +} + +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, int64_t ts) { + taos_metric_formatter_clear(self->metric_formatter); + taos_metric_formatter_load_metrics(self->metric_formatter, self->collectors, ts); + char *out = taos_metric_formatter_dump(self->metric_formatter); + + int r = 0; + r = taos_string_builder_add_str(self->out, out); + if (r) return NULL; + taos_free(out); + + return taos_string_builder_str(self->out); +} + +int taos_collector_registry_clear_out(taos_collector_registry_t *self){ + return taos_string_builder_clear(self->out); +} diff --git a/source/libs/monitorfw/src/taos_counter.c b/source/libs/monitorfw/src/taos_counter.c new file mode 100644 index 0000000000..d522411b2b --- /dev/null +++ b/source/libs/monitorfw/src/taos_counter.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// Public +#include "taos_counter.h" + +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_errors.h" +#include "taos_log.h" +#include "taos_metric_i.h" +#include "taos_metric_sample_i.h" +#include "taos_metric_sample_t.h" +#include "taos_metric_t.h" + +taos_counter_t *taos_counter_new(const char *name, const char *help, size_t label_key_count, const char **label_keys) { + return (taos_counter_t *)taos_metric_new(TAOS_COUNTER, name, help, label_key_count, label_keys); +} + +int taos_counter_destroy(taos_counter_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + int r = 0; + r = taos_metric_destroy(self); + self = NULL; + return r; +} + +int taos_counter_inc(taos_counter_t *self, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_add(sample, 1.0); +} + +int taos_counter_add(taos_counter_t *self, double r_value, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_add(sample, r_value); +} diff --git a/source/libs/monitorfw/src/taos_linked_list.c b/source/libs/monitorfw/src/taos_linked_list.c new file mode 100644 index 0000000000..ab4e23ff29 --- /dev/null +++ b/source/libs/monitorfw/src/taos_linked_list.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_linked_list_i.h" +#include "taos_linked_list_t.h" +#include "taos_log.h" + +taos_linked_list_t *taos_linked_list_new(void) { + taos_linked_list_t *self = (taos_linked_list_t *)taos_malloc(sizeof(taos_linked_list_t)); + self->head = NULL; + self->tail = NULL; + self->free_fn = NULL; + self->compare_fn = NULL; + self->size = 0; + return self; +} + +int taos_linked_list_purge(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + taos_linked_list_node_t *node = self->head; + while (node != NULL) { + taos_linked_list_node_t *next = node->next; + if (node->item != NULL) { + if (self->free_fn) { + (*self->free_fn)(node->item); + } else { + taos_free(node->item); + } + } + taos_free(node); + node = NULL; + node = next; + } + self->head = NULL; + self->tail = NULL; + self->size = 0; + return 0; +} + +int taos_linked_list_destroy(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + int r = 0; + int ret = 0; + + r = taos_linked_list_purge(self); + if (r) ret = r; + taos_free(self); + self = NULL; + return ret; +} + +void *taos_linked_list_first(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + if (self->head) { + return self->head->item; + } else { + return NULL; + } +} + +void *taos_linked_list_last(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + if (self->tail) { + return self->tail->item; + } else { + return NULL; + } +} + +int taos_linked_list_append(taos_linked_list_t *self, void *item) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + taos_linked_list_node_t *node = (taos_linked_list_node_t *)taos_malloc(sizeof(taos_linked_list_node_t)); + + node->item = item; + if (self->tail) { + self->tail->next = node; + } else { + self->head = node; + } + self->tail = node; + node->next = NULL; + self->size++; + return 0; +} + +int taos_linked_list_push(taos_linked_list_t *self, void *item) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + taos_linked_list_node_t *node = (taos_linked_list_node_t *)taos_malloc(sizeof(taos_linked_list_node_t)); + + node->item = item; + node->next = self->head; + self->head = node; + if (self->tail == NULL) { + self->tail = node; + } + self->size++; + return 0; +} + +void *taos_linked_list_pop(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return NULL; + taos_linked_list_node_t *node = self->head; + void *item = NULL; + if (node != NULL) { + item = node->item; + self->head = node->next; + if (self->tail == node) { + self->tail = NULL; + } + if (node->item != NULL) { + if (self->free_fn) { + (*self->free_fn)(node->item); + } else { + taos_free(node->item); + } + } + node->item = NULL; + node = NULL; + self->size--; + } + return item; +} + +int taos_linked_list_remove(taos_linked_list_t *self, void *item) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + taos_linked_list_node_t *node; + taos_linked_list_node_t *prev_node = NULL; + + // Locate the node + for (node = self->head; node != NULL; node = node->next) { + if (self->compare_fn) { + if ((*self->compare_fn)(node->item, item) == TAOS_EQUAL) { + break; + } + } else { + if (node->item == item) { + break; + } + } + prev_node = node; + } + + if (node == NULL) return 0; + + if (prev_node) { + prev_node->next = node->next; + } else { + self->head = node->next; + } + if (node->next == NULL) { + self->tail = prev_node; + } + + if (node->item != NULL) { + if (self->free_fn) { + (*self->free_fn)(node->item); + } else { + taos_free(node->item); + } + } + + node->item = NULL; + taos_free(node); + node = NULL; + self->size--; + return 0; +} + +taos_linked_list_compare_t taos_linked_list_compare(taos_linked_list_t *self, void *item_a, void *item_b) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->compare_fn) { + return (*self->compare_fn)(item_a, item_b); + } else { + return strcmp(item_a, item_b); + } +} + +size_t taos_linked_list_size(taos_linked_list_t *self) { + TAOS_ASSERT(self != NULL); + return self->size; +} + +int taos_linked_list_set_free_fn(taos_linked_list_t *self, taos_linked_list_free_item_fn free_fn) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + self->free_fn = free_fn; + return 0; +} + +int taos_linked_list_set_compare_fn(taos_linked_list_t *self, taos_linked_list_compare_item_fn compare_fn) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + self->compare_fn = compare_fn; + return 0; +} + +void taos_linked_list_no_op_free(void *item) {} diff --git a/source/libs/monitorfw/src/taos_map.c b/source/libs/monitorfw/src/taos_map.c new file mode 100644 index 0000000000..fce308f11d --- /dev/null +++ b/source/libs/monitorfw/src/taos_map.c @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_errors.h" +#include "taos_linked_list_i.h" +#include "taos_linked_list_t.h" +#include "taos_log.h" +#include "taos_map_i.h" +#include "taos_map_t.h" + +#define TAOS_MAP_INITIAL_SIZE 32 + +static void destroy_map_node_value_no_op(void *value) {} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// taos_map_node +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +taos_map_node_t *taos_map_node_new(const char *key, void *value, taos_map_node_free_value_fn free_value_fn) { + taos_map_node_t *self = taos_malloc(sizeof(taos_map_node_t)); + self->key = taos_strdup(key); + self->value = value; + self->free_value_fn = free_value_fn; + return self; +} + +int taos_map_node_destroy(taos_map_node_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + taos_free((void *)self->key); + self->key = NULL; + if (self->value != NULL) (*self->free_value_fn)(self->value); + self->value = NULL; + taos_free(self); + self = NULL; + return 0; +} + +void taos_map_node_free(void *item) { + taos_map_node_t *map_node = (taos_map_node_t *)item; + taos_map_node_destroy(map_node); +} + +taos_linked_list_compare_t taos_map_node_compare(void *item_a, void *item_b) { + taos_map_node_t *map_node_a = (taos_map_node_t *)item_a; + taos_map_node_t *map_node_b = (taos_map_node_t *)item_b; + + return strcmp(map_node_a->key, map_node_b->key); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// taos_map +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +taos_map_t *taos_map_new() { + int r = 0; + + taos_map_t *self = (taos_map_t *)taos_malloc(sizeof(taos_map_t)); + self->size = 0; + self->max_size = TAOS_MAP_INITIAL_SIZE; + + self->keys = taos_linked_list_new(); + if (self->keys == NULL) return NULL; + + // These each key will be allocated once by taos_map_node_new and used here as well to save memory. With that said + // we will only have to deallocate each key once. That will happen on taos_map_node_destroy. + r = taos_linked_list_set_free_fn(self->keys, taos_linked_list_no_op_free); + if (r) { + taos_map_destroy(self); + return NULL; + } + + self->addrs = taos_malloc(sizeof(taos_linked_list_t) * self->max_size); + self->free_value_fn = destroy_map_node_value_no_op; + + for (int i = 0; i < self->max_size; i++) { + self->addrs[i] = taos_linked_list_new(); + r = taos_linked_list_set_free_fn(self->addrs[i], taos_map_node_free); + if (r) { + taos_map_destroy(self); + return NULL; + } + r = taos_linked_list_set_compare_fn(self->addrs[i], taos_map_node_compare); + if (r) { + taos_map_destroy(self); + return NULL; + } + } + + self->rwlock = (pthread_rwlock_t *)taos_malloc(sizeof(pthread_rwlock_t)); + r = pthread_rwlock_init(self->rwlock, NULL); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_INIT_ERROR); + taos_map_destroy(self); + return NULL; + } + + return self; +} + +int taos_map_destroy(taos_map_t *self) { + TAOS_ASSERT(self != NULL); + int r = 0; + int ret = 0; + + r = taos_linked_list_destroy(self->keys); + if (r) ret = r; + self->keys = NULL; + + for (size_t i = 0; i < self->max_size; i++) { + r = taos_linked_list_destroy(self->addrs[i]); + if (r) ret = r; + self->addrs[i] = NULL; + } + taos_free(self->addrs); + self->addrs = NULL; + + r = pthread_rwlock_destroy(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_DESTROY_ERROR) + ret = r; + } + + taos_free(self->rwlock); + self->rwlock = NULL; + taos_free(self); + self = NULL; + + return ret; +} + +static size_t taos_map_get_index_internal(const char *key, size_t *size, size_t *max_size) { + size_t index; + size_t a = 31415, b = 27183; + for (index = 0; *key != '\0'; key++, a = a * b % (*max_size - 1)) { + index = (a * index + *key) % *max_size; + } + return index; +} + +/** + * @brief API PRIVATE hash function that returns an array index from the given key and taos_map. + * + * The algorithm is based off of Horner's method. In a simpler version, you set the return value to 0. Next, for each + * character in the string, you add the integer value of the current character to the product of the prime number and + * the current return value, set the result to the return value, then finally return the return value. + * + * In this version of the algorithm, we attempt to achieve a probabily of key to index conversion collisions to + * 1/M (with M being the max_size of the map). This optimizes dispersion and consequently, evens out the performance + * for gets and sets for each item. Instead of using a fixed prime number, we generate a coefficient for each iteration + * through the loop. + * + * Reference: + * * Algorithms in C: Third Edition by Robert Sedgewick, p579 + */ +size_t taos_map_get_index(taos_map_t *self, const char *key) { + return taos_map_get_index_internal(key, &self->size, &self->max_size); +} + +static void *taos_map_get_internal(const char *key, size_t *size, size_t *max_size, taos_linked_list_t *keys, + taos_linked_list_t **addrs, taos_map_node_free_value_fn free_value_fn) { + size_t index = taos_map_get_index_internal(key, size, max_size); + taos_linked_list_t *list = addrs[index]; + taos_map_node_t *temp_map_node = taos_map_node_new(key, NULL, free_value_fn); + + for (taos_linked_list_node_t *current_node = list->head; current_node != NULL; current_node = current_node->next) { + taos_map_node_t *current_map_node = (taos_map_node_t *)current_node->item; + taos_linked_list_compare_t result = taos_linked_list_compare(list, current_map_node, temp_map_node); + if (result == TAOS_EQUAL) { + taos_map_node_destroy(temp_map_node); + temp_map_node = NULL; + return current_map_node->value; + } + } + taos_map_node_destroy(temp_map_node); + temp_map_node = NULL; + return NULL; +} + +void *taos_map_get(taos_map_t *self, const char *key) { + TAOS_ASSERT(self != NULL); + int r = 0; + r = pthread_rwlock_wrlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_LOCK_ERROR); + NULL; + } + void *payload = + taos_map_get_internal(key, &self->size, &self->max_size, self->keys, self->addrs, self->free_value_fn); + r = pthread_rwlock_unlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return NULL; + } + return payload; +} + +static int taos_map_set_internal(const char *key, void *value, size_t *size, size_t *max_size, taos_linked_list_t *keys, + taos_linked_list_t **addrs, taos_map_node_free_value_fn free_value_fn, + bool destroy_current_value) { + taos_map_node_t *map_node = taos_map_node_new(key, value, free_value_fn); + if (map_node == NULL) return 1; + + size_t index = taos_map_get_index_internal(key, size, max_size); + taos_linked_list_t *list = addrs[index]; + for (taos_linked_list_node_t *current_node = list->head; current_node != NULL; current_node = current_node->next) { + taos_map_node_t *current_map_node = (taos_map_node_t *)current_node->item; + taos_linked_list_compare_t result = taos_linked_list_compare(list, current_map_node, map_node); + if (result == TAOS_EQUAL) { + if (destroy_current_value) { + free_value_fn(current_map_node->value); + current_map_node->value = NULL; + } + taos_free((char *)current_map_node->key); + current_map_node->key = NULL; + taos_free(current_map_node); + current_map_node = NULL; + current_node->item = map_node; + return 0; + } + } + taos_linked_list_append(list, map_node); + taos_linked_list_append(keys, (char *)map_node->key); + (*size)++; + return 0; +} + +int taos_map_ensure_space(taos_map_t *self) { + TAOS_ASSERT(self != NULL); + int r = 0; + + if (self->size <= self->max_size / 2) { + return 0; + } + + // Increase the max size + size_t new_max = self->max_size * 2; + size_t new_size = 0; + + // Create a new list of keys + taos_linked_list_t *new_keys = taos_linked_list_new(); + if (new_keys == NULL) return 1; + + r = taos_linked_list_set_free_fn(new_keys, taos_linked_list_no_op_free); + if (r) return r; + + // Create a new array of addrs + taos_linked_list_t **new_addrs = taos_malloc(sizeof(taos_linked_list_t) * new_max); + + // Initialize the new array + for (int i = 0; i < new_max; i++) { + new_addrs[i] = taos_linked_list_new(); + r = taos_linked_list_set_free_fn(new_addrs[i], taos_map_node_free); + if (r) return r; + r = taos_linked_list_set_compare_fn(new_addrs[i], taos_map_node_compare); + if (r) return r; + } + + // Iterate through each linked-list at each memory region in the map's backbone + for (int i = 0; i < self->max_size; i++) { + // Create a new map node for each node in the linked list and insert it into the new map. Afterwards, deallocate + // the old map node + taos_linked_list_t *list = self->addrs[i]; + taos_linked_list_node_t *current_node = list->head; + while (current_node != NULL) { + taos_map_node_t *map_node = (taos_map_node_t *)current_node->item; + r = taos_map_set_internal(map_node->key, map_node->value, &new_size, &new_max, new_keys, new_addrs, + self->free_value_fn, false); + if (r) return r; + + taos_linked_list_node_t *next = current_node->next; + taos_free(current_node); + current_node = NULL; + taos_free((void *)map_node->key); + map_node->key = NULL; + taos_free(map_node); + map_node = NULL; + current_node = next; + } + // We're done deallocating each map node in the linked list, so deallocate the linked-list object + taos_free(self->addrs[i]); + self->addrs[i] = NULL; + } + // Destroy the collection of keys in the map + taos_linked_list_destroy(self->keys); + self->keys = NULL; + + // Deallocate the backbone of the map + taos_free(self->addrs); + self->addrs = NULL; + + // Update the members of the current map + self->size = new_size; + self->max_size = new_max; + self->keys = new_keys; + self->addrs = new_addrs; + + return 0; +} + +int taos_map_set(taos_map_t *self, const char *key, void *value) { + TAOS_ASSERT(self != NULL); + int r = 0; + r = pthread_rwlock_wrlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_LOCK_ERROR); + return r; + } + + r = taos_map_ensure_space(self); + if (r) { + int rr = 0; + rr = pthread_rwlock_unlock(self->rwlock); + if (rr) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return rr; + } else { + return r; + } + } + r = taos_map_set_internal(key, value, &self->size, &self->max_size, self->keys, self->addrs, self->free_value_fn, + true); + if (r) { + int rr = 0; + rr = pthread_rwlock_unlock(self->rwlock); + if (rr) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + return rr; + } else { + return r; + } + } + r = pthread_rwlock_unlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + } + return r; +} + +static int taos_map_delete_internal(const char *key, size_t *size, size_t *max_size, taos_linked_list_t *keys, + taos_linked_list_t **addrs, taos_map_node_free_value_fn free_value_fn) { + int r = 0; + size_t index = taos_map_get_index_internal(key, size, max_size); + taos_linked_list_t *list = addrs[index]; + taos_map_node_t *temp_map_node = taos_map_node_new(key, NULL, free_value_fn); + + for (taos_linked_list_node_t *current_node = list->head; current_node != NULL; current_node = current_node->next) { + taos_map_node_t *current_map_node = (taos_map_node_t *)current_node->item; + taos_linked_list_compare_t result = taos_linked_list_compare(list, current_map_node, temp_map_node); + if (result == TAOS_EQUAL) { + r = taos_linked_list_remove(list, current_node); + if (r) return r; + + r = taos_linked_list_remove(keys, (char *)current_map_node->key); + if (r) return r; + + (*size)--; + break; + } + } + r = taos_map_node_destroy(temp_map_node); + temp_map_node = NULL; + return r; +} + +int taos_map_delete(taos_map_t *self, const char *key) { + TAOS_ASSERT(self != NULL); + int r = 0; + int ret = 0; + r = pthread_rwlock_wrlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_LOCK_ERROR); + ret = r; + } + r = taos_map_delete_internal(key, &self->size, &self->max_size, self->keys, self->addrs, self->free_value_fn); + if (r) ret = r; + r = pthread_rwlock_unlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); + ret = r; + } + return ret; +} + +int taos_map_set_free_value_fn(taos_map_t *self, taos_map_node_free_value_fn free_value_fn) { + TAOS_ASSERT(self != NULL); + self->free_value_fn = free_value_fn; + return 0; +} + +size_t taos_map_size(taos_map_t *self) { + TAOS_ASSERT(self != NULL); + return self->size; +} diff --git a/source/libs/monitorfw/src/taos_metric.c b/source/libs/monitorfw/src/taos_metric.c new file mode 100644 index 0000000000..a9bb6d45a4 --- /dev/null +++ b/source/libs/monitorfw/src/taos_metric.c @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_errors.h" +#include "taos_log.h" +#include "taos_map_i.h" +#include "taos_metric_formatter_i.h" +#include "taos_metric_i.h" +#include "taos_metric_sample_i.h" + +char *taos_metric_type_map[4] = {"counter", "gauge", "histogram", "summary"}; + +taos_metric_t *taos_metric_new(taos_metric_type_t metric_type, const char *name, const char *help, + size_t label_key_count, const char **label_keys) { + int r = 0; + taos_metric_t *self = (taos_metric_t *)taos_malloc(sizeof(taos_metric_t)); + self->type = metric_type; + self->name = name; + self->help = help; + + const char **k = (const char **)taos_malloc(sizeof(const char *) * label_key_count); + + for (int i = 0; i < label_key_count; i++) { + if (strcmp(label_keys[i], "le") == 0) { + TAOS_LOG(TAOS_METRIC_INVALID_LABEL_NAME); + taos_metric_destroy(self); + return NULL; + } + if (strcmp(label_keys[i], "quantile") == 0) { + TAOS_LOG(TAOS_METRIC_INVALID_LABEL_NAME); + taos_metric_destroy(self); + return NULL; + } + k[i] = taos_strdup(label_keys[i]); + } + self->label_keys = k; + self->label_key_count = label_key_count; + self->samples = taos_map_new(); + + if (metric_type == TAOS_HISTOGRAM) { + + } else { + r = taos_map_set_free_value_fn(self->samples, &taos_metric_sample_free_generic); + if (r) { + taos_metric_destroy(self); + return NULL; + } + } + + self->formatter = taos_metric_formatter_new(); + if (self->formatter == NULL) { + taos_metric_destroy(self); + return NULL; + } + self->rwlock = (pthread_rwlock_t *)taos_malloc(sizeof(pthread_rwlock_t)); + r = pthread_rwlock_init(self->rwlock, NULL); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_INIT_ERROR); + return NULL; + } + return self; +} + +int taos_metric_destroy(taos_metric_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + + int r = 0; + int ret = 0; + + r = taos_map_destroy(self->samples); + self->samples = NULL; + if (r) ret = r; + + r = taos_metric_formatter_destroy(self->formatter); + self->formatter = NULL; + if (r) ret = r; + + r = pthread_rwlock_destroy(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_DESTROY_ERROR); + ret = r; + } + + taos_free(self->rwlock); + self->rwlock = NULL; + + for (int i = 0; i < self->label_key_count; i++) { + taos_free((void *)self->label_keys[i]); + self->label_keys[i] = NULL; + } + taos_free(self->label_keys); + self->label_keys = NULL; + + taos_free(self); + self = NULL; + + return ret; +} + +int taos_metric_destroy_generic(void *item) { + int r = 0; + taos_metric_t *self = (taos_metric_t *)item; + r = taos_metric_destroy(self); + self = NULL; + return r; +} + +void taos_metric_free_generic(void *item) { + taos_metric_t *self = (taos_metric_t *)item; + taos_metric_destroy(self); +} + +taos_metric_sample_t *taos_metric_sample_from_labels(taos_metric_t *self, const char **label_values) { + TAOS_ASSERT(self != NULL); + int r = 0; + r = pthread_rwlock_wrlock(self->rwlock); + if (r) { + TAOS_LOG(TAOS_PTHREAD_RWLOCK_LOCK_ERROR); + return NULL; + } + +#define TAOS_METRIC_SAMPLE_FROM_LABELS_HANDLE_UNLOCK() \ + r = pthread_rwlock_unlock(self->rwlock); \ + if (r) TAOS_LOG(TAOS_PTHREAD_RWLOCK_UNLOCK_ERROR); \ + return NULL; + + // Get l_value + r = taos_metric_formatter_load_l_value(self->formatter, self->name, NULL, self->label_key_count, self->label_keys, + label_values); + if (r) { + TAOS_METRIC_SAMPLE_FROM_LABELS_HANDLE_UNLOCK(); + } + + // This must be freed before returning + const char *l_value = taos_metric_formatter_dump(self->formatter); + if (l_value == NULL) { + TAOS_METRIC_SAMPLE_FROM_LABELS_HANDLE_UNLOCK(); + } + + // Get sample + taos_metric_sample_t *sample = (taos_metric_sample_t *)taos_map_get(self->samples, l_value); + if (sample == NULL) { + sample = taos_metric_sample_new(self->type, l_value, 0.0); + r = taos_map_set(self->samples, l_value, sample); + if (r) { + TAOS_METRIC_SAMPLE_FROM_LABELS_HANDLE_UNLOCK(); + } + } + pthread_rwlock_unlock(self->rwlock); + taos_free((void *)l_value); + return sample; +} + diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c new file mode 100644 index 0000000000..235ecb2bce --- /dev/null +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_collector_t.h" +#include "taos_linked_list_t.h" +#include "taos_map_i.h" +#include "taos_metric_formatter_i.h" +#include "taos_metric_sample_t.h" +#include "taos_metric_t.h" +#include "taos_string_builder_i.h" + +#include + +taos_metric_formatter_t *taos_metric_formatter_new() { + taos_metric_formatter_t *self = (taos_metric_formatter_t *)taos_malloc(sizeof(taos_metric_formatter_t)); + self->string_builder = taos_string_builder_new(); + if (self->string_builder == NULL) { + taos_metric_formatter_destroy(self); + return NULL; + } + self->err_builder = taos_string_builder_new(); + if (self->err_builder == NULL) { + taos_metric_formatter_destroy(self); + return NULL; + } + return self; +} + +int taos_metric_formatter_destroy(taos_metric_formatter_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + + int r = 0; + int ret = 0; + + r = taos_string_builder_destroy(self->string_builder); + self->string_builder = NULL; + if (r) ret = r; + + r = taos_string_builder_destroy(self->err_builder); + self->err_builder = NULL; + if (r) ret = r; + + taos_free(self); + self = NULL; + return ret; +} + +int taos_metric_formatter_load_help(taos_metric_formatter_t *self, const char *name, const char *help) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = taos_string_builder_add_str(self->string_builder, "# HELP "); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, name); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, ' '); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, help); + if (r) return r; + + return taos_string_builder_add_char(self->string_builder, '\n'); +} + +int taos_metric_formatter_load_type(taos_metric_formatter_t *self, const char *name, taos_metric_type_t metric_type) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = taos_string_builder_add_str(self->string_builder, "# TYPE "); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, name); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, ' '); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, taos_metric_type_map[metric_type]); + if (r) return r; + + return taos_string_builder_add_char(self->string_builder, '\n'); +} + +int taos_metric_formatter_load_l_value(taos_metric_formatter_t *self, const char *name, const char *suffix, + size_t label_count, const char **label_keys, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = taos_string_builder_add_str(self->string_builder, name); + if (r) return r; + + if (suffix != NULL) { + r = taos_string_builder_add_char(self->string_builder, '_'); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, suffix); + if (r) return r; + } + + if (label_count == 0) return 0; + + for (int i = 0; i < label_count; i++) { + if (i == 0) { + r = taos_string_builder_add_char(self->string_builder, '{'); + if (r) return r; + } + r = taos_string_builder_add_str(self->string_builder, (const char *)label_keys[i]); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, '='); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, '"'); + if (r) return r; + + r = taos_string_builder_add_str(self->string_builder, (const char *)label_values[i]); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, '"'); + if (r) return r; + + if (i == label_count - 1) { + r = taos_string_builder_add_char(self->string_builder, '}'); + if (r) return r; + } else { + r = taos_string_builder_add_char(self->string_builder, ','); + if (r) return r; + } + } + return 0; +} + +int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, int64_t ts) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = taos_string_builder_add_str(self->string_builder, sample->l_value); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, ' '); + if (r) return r; + + char buffer[50]; + sprintf(buffer, "%.17g", sample->r_value); + r = taos_string_builder_add_str(self->string_builder, buffer); + if (r) return r; + + r = taos_string_builder_add_char(self->string_builder, ' '); + if (r) return r; + + sprintf(buffer, "%ld", ts); + r = taos_string_builder_add_str(self->string_builder, buffer); + if (r) return r; + + taos_metric_sample_set(sample, 0); + + return taos_string_builder_add_char(self->string_builder, '\n'); +} + +int taos_metric_formatter_clear(taos_metric_formatter_t *self) { + TAOS_ASSERT(self != NULL); + return taos_string_builder_clear(self->string_builder); +} + +char *taos_metric_formatter_dump(taos_metric_formatter_t *self) { + TAOS_ASSERT(self != NULL); + int r = 0; + if (self == NULL) return NULL; + char *data = taos_string_builder_dump(self->string_builder); + if (data == NULL) return NULL; + r = taos_string_builder_clear(self->string_builder); + if (r) { + taos_free(data); + return NULL; + } + return data; +} + +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, int64_t ts) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + r = taos_metric_formatter_load_help(self, metric->name, metric->help); + if (r) return r; + + r = taos_metric_formatter_load_type(self, metric->name, metric->type); + if (r) return r; + + for (taos_linked_list_node_t *current_node = metric->samples->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *key = (const char *)current_node->item; + if (metric->type == TAOS_HISTOGRAM) { + + } else { + taos_metric_sample_t *sample = (taos_metric_sample_t *)taos_map_get(metric->samples, key); + if (sample == NULL) return 1; + r = taos_metric_formatter_load_sample(self, sample, ts); + if (r) return r; + } + } + return taos_string_builder_add_char(self->string_builder, '\n'); +} + +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, int64_t ts) { + TAOS_ASSERT(self != NULL); + int r = 0; + for (taos_linked_list_node_t *current_node = collectors->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *collector_name = (const char *)current_node->item; + taos_collector_t *collector = (taos_collector_t *)taos_map_get(collectors, collector_name); + if (collector == NULL) return 1; + + taos_map_t *metrics = collector->collect_fn(collector); + if (metrics == NULL) return 1; + + for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *metric_name = (const char *)current_node->item; + taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); + if (metric == NULL) return 1; + r = taos_metric_formatter_load_metric(self, metric, ts); + if (r) return r; + } + } + return r; +} diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c new file mode 100644 index 0000000000..747eebc87c --- /dev/null +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_errors.h" +#include "taos_log.h" +#include "taos_metric_sample_i.h" +#include "taos_metric_sample_t.h" + +taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { + taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); + self->type = type; + self->l_value = taos_strdup(l_value); + self->r_value = ATOMIC_VAR_INIT(r_value); + return self; +} + +int taos_metric_sample_destroy(taos_metric_sample_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + taos_free((void *)self->l_value); + self->l_value = NULL; + taos_free((void *)self); + self = NULL; + return 0; +} + +int taos_metric_sample_destroy_generic(void *gen) { + int r = 0; + + taos_metric_sample_t *self = (taos_metric_sample_t *)gen; + r = taos_metric_sample_destroy(self); + self = NULL; + return r; +} + +void taos_metric_sample_free_generic(void *gen) { + taos_metric_sample_t *self = (taos_metric_sample_t *)gen; + taos_metric_sample_destroy(self); +} + +int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { + TAOS_ASSERT(self != NULL); + if (r_value < 0) { + return 1; + } + _Atomic double old = atomic_load(&self->r_value); + for (;;) { + _Atomic double new = ATOMIC_VAR_INIT(old + r_value); + if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { + return 0; + } + } +} + +int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { + TAOS_ASSERT(self != NULL); + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + _Atomic double old = atomic_load(&self->r_value); + for (;;) { + _Atomic double new = ATOMIC_VAR_INIT(old - r_value); + if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { + return 0; + } + } +} + +int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { + if (self->type != TAOS_GAUGE && self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + atomic_store(&self->r_value, r_value); + return 0; +} diff --git a/source/libs/monitorfw/src/taos_string_builder.c b/source/libs/monitorfw/src/taos_string_builder.c new file mode 100644 index 0000000000..0f3940cdab --- /dev/null +++ b/source/libs/monitorfw/src/taos_string_builder.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include + +// Public +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_string_builder_i.h" +#include "taos_string_builder_t.h" + +// The initial size of a string created via taos_string_builder +#define TAOS_STRING_BUILDER_INIT_SIZE 32 + +// taos_string_builder_init prototype declaration +int taos_string_builder_init(taos_string_builder_t *self); + +struct taos_string_builder { + char *str; /**< the target string */ + size_t allocated; /**< the size allocated to the string in bytes */ + size_t len; /**< the length of str */ + size_t init_size; /**< the initialize size of space to allocate */ +}; + +taos_string_builder_t *taos_string_builder_new(void) { + int r = 0; + + taos_string_builder_t *self = (taos_string_builder_t *)taos_malloc(sizeof(taos_string_builder_t)); + self->init_size = TAOS_STRING_BUILDER_INIT_SIZE; + r = taos_string_builder_init(self); + if (r) { + taos_string_builder_destroy(self); + return NULL; + } + + return self; +} + +int taos_string_builder_init(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + self->str = (char *)taos_malloc(self->init_size); + *self->str = '\0'; + self->allocated = self->init_size; + self->len = 0; + return 0; +} + +int taos_string_builder_destroy(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 0; + taos_free(self->str); + self->str = NULL; + taos_free(self); + self = NULL; + return 0; +} + +/** + * @brief API PRIVATE Grows the size of the string given the value we want to add + * + * The method continuously shifts left until the new size is large enough to accommodate add_len. This private method + * is called in methods that need to add one or more characters to the underlying string. + */ +static int taos_string_builder_ensure_space(taos_string_builder_t *self, size_t add_len) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (add_len == 0 || self->allocated >= self->len + add_len + 1) return 0; + while (self->allocated < self->len + add_len + 1) self->allocated <<= 1; + self->str = (char *)taos_realloc(self->str, self->allocated); + return 0; +} + +int taos_string_builder_add_str(taos_string_builder_t *self, const char *str) { + TAOS_ASSERT(self != NULL); + int r = 0; + + if (self == NULL) return 1; + if (str == NULL || *str == '\0') return 0; + + size_t len = strlen(str); + r = taos_string_builder_ensure_space(self, len); + if (r) return r; + + memcpy(self->str + self->len, str, len); + self->len += len; + self->str[self->len] = '\0'; + return 0; +} + +int taos_string_builder_add_char(taos_string_builder_t *self, char c) { + TAOS_ASSERT(self != NULL); + int r = 0; + + if (self == NULL) return 1; + r = taos_string_builder_ensure_space(self, 1); + if (r) return r; + + self->str[self->len] = c; + self->len++; + self->str[self->len] = '\0'; + return 0; +} + +int taos_string_builder_truncate(taos_string_builder_t *self, size_t len) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (len >= self->len) return 0; + + self->len = len; + self->str[self->len] = '\0'; + return 0; +} + +int taos_string_builder_clear(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + taos_free(self->str); + self->str = NULL; + return taos_string_builder_init(self); +} + +size_t taos_string_builder_len(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + return self->len; +} + +char *taos_string_builder_dump(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + // +1 to accommodate \0 + char *out = (char *)taos_malloc((self->len + 1) * sizeof(char)); + memcpy(out, self->str, self->len + 1); + return out; +} + +char *taos_string_builder_str(taos_string_builder_t *self) { + TAOS_ASSERT(self != NULL); + return self->str; +} From 43cd6049114b3480b7a4d0ffda4186bf60c09d3e Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Oct 2023 11:19:53 +0000 Subject: [PATCH 002/107] remove reference --- source/dnode/mgmt/node_util/inc/dmUtil.h | 1 - source/dnode/mnode/impl/src/mndMnode.c | 1 - 2 files changed, 2 deletions(-) diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index 4c00a48796..0a52c578a5 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -39,7 +39,6 @@ #include "sync.h" #include "tfs.h" #include "wal.h" -#include "taos_monitor.h" #ifdef __cplusplus extern "C" { diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index a93973fd13..22b2fec857 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -23,7 +23,6 @@ #include "mndTrans.h" #include "tmisce.h" #include "audit.h" -#include "taos_monitor.h" #define MNODE_VER_NUMBER 2 #define MNODE_RESERVE_SIZE 64 From a006c4634c1cb7cd7e307af30dbd15de61d59035 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 23 Oct 2023 12:47:49 +0000 Subject: [PATCH 003/107] destroy registry --- source/libs/monitor/src/monMain.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 93abda1281..20bd064d69 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -125,6 +125,9 @@ void monCleanup() { tFreeSMonQmInfo(&tsMonitor.qmInfo); tFreeSMonBmInfo(&tsMonitor.bmInfo); taosThreadMutexDestroy(&tsMonitor.lock); + + taos_collector_registry_destroy(TAOS_COLLECTOR_REGISTRY_DEFAULT); + TAOS_COLLECTOR_REGISTRY_DEFAULT = NULL; } static void monCleanupMonitorInfo(SMonInfo *pMonitor) { From 9756016d22ab54692ee3c133a1bd0975fddbb700 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 01:07:45 +0000 Subject: [PATCH 004/107] memory leak --- source/libs/monitorfw/src/taos_collector_registry.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index 7efe82ad23..6df1653393 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -88,6 +88,10 @@ int taos_collector_registry_destroy(taos_collector_registry_t *self) { self->string_builder = NULL; if (r) ret = r; + r = taos_string_builder_destroy(self->out); + self->out = NULL; + if (r) ret = r; + r = pthread_rwlock_destroy(self->lock); taos_free(self->lock); self->lock = NULL; From b82cd97b80d8abfa2a71baf061806e7807a66b67 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 04:10:56 +0000 Subject: [PATCH 005/107] memory leak and enable --- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 2 +- source/libs/monitor/src/monMain.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index c237ce73c0..14732cb509 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -107,7 +107,7 @@ void dmSendMonitorReport() { dmGetSmMonitorInfo(pDnode); monSendReport(); - monSendPromReport(); + //monSendPromReport(); } void dmGetVnodeLoads(SMonVloadInfo *pInfo) { diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 20bd064d69..b62cde5c5b 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -19,6 +19,7 @@ #include "thttp.h" #include "ttime.h" #include "taos_monitor.h" +#include "tglobal.h" static SMonitor tsMonitor = {0}; static char* tsMonUri = "/report"; @@ -553,7 +554,7 @@ void monSendReport() { void monSendPromReport() { char *pCont = (char *)taos_collector_registry_bridge( TAOS_COLLECTOR_REGISTRY_DEFAULT, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); - uInfoL("report cont:\n%s\n", pCont); + //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { @@ -565,7 +566,8 @@ void monSendPromReport() { } void monSendContent(char *pCont) { - uInfoL("report cont:\n%s\n", pCont); + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; + //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { From 7c83d190a42aa83b989a59cd95ab0e87346fba3f Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 05:29:45 +0000 Subject: [PATCH 006/107] ts format --- include/libs/monitorfw/taos_collector_registry.h | 2 +- source/libs/monitor/src/monMain.c | 5 +++-- source/libs/monitorfw/inc/taos_metric_formatter_i.h | 6 +++--- source/libs/monitorfw/src/taos_collector_registry.c | 2 +- source/libs/monitorfw/src/taos_metric_formatter.c | 9 ++++----- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h index f67deb074b..f3c89ad543 100644 --- a/include/libs/monitorfw/taos_collector_registry.h +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -103,7 +103,7 @@ int taos_collector_registry_register_collector(taos_collector_registry_t *self, * @param self The target taos_collector_registry_t* * @return The string int he default metric exposition format. */ -const char *taos_collector_registry_bridge(taos_collector_registry_t *self, int64_t ts); +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts); int taos_collector_registry_clear_out(taos_collector_registry_t *self); diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index b62cde5c5b..4670334565 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -552,8 +552,9 @@ void monSendReport() { } void monSendPromReport() { - char *pCont = (char *)taos_collector_registry_bridge( - TAOS_COLLECTOR_REGISTRY_DEFAULT, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + char ts[50]; + sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + char *pCont = (char *)taos_collector_registry_bridge(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts); //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h index 9a63850ea4..a5dd23410f 100644 --- a/source/libs/monitorfw/inc/taos_metric_formatter_i.h +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -57,17 +57,17 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *metric_formatter * @brief API PRIVATE Loads the formatter with a metric sample */ int taos_metric_formatter_load_sample( - taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, int64_t ts); + taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, char *ts); /** * @brief API PRIVATE Loads a metric in the string exposition format */ -int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, int64_t ts); +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts); /** * @brief API PRIVATE Loads the given metrics */ -int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, int64_t ts); +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts); /** * @brief API PRIVATE Clear the underlying string_builder diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index 6df1653393..f94c8fdcd1 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -186,7 +186,7 @@ int taos_collector_registry_validate_metric_name(taos_collector_registry_t *self return 0; } -const char *taos_collector_registry_bridge(taos_collector_registry_t *self, int64_t ts) { +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts) { taos_metric_formatter_clear(self->metric_formatter); taos_metric_formatter_load_metrics(self->metric_formatter, self->collectors, ts); char *out = taos_metric_formatter_dump(self->metric_formatter); diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 235ecb2bce..3529d9dda6 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -158,7 +158,7 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *self, const char return 0; } -int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, int64_t ts) { +int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, char *ts) { TAOS_ASSERT(self != NULL); if (self == NULL) return 1; @@ -178,8 +178,7 @@ int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric r = taos_string_builder_add_char(self->string_builder, ' '); if (r) return r; - sprintf(buffer, "%ld", ts); - r = taos_string_builder_add_str(self->string_builder, buffer); + r = taos_string_builder_add_str(self->string_builder, ts); if (r) return r; taos_metric_sample_set(sample, 0); @@ -206,7 +205,7 @@ char *taos_metric_formatter_dump(taos_metric_formatter_t *self) { return data; } -int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, int64_t ts) { +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts) { TAOS_ASSERT(self != NULL); if (self == NULL) return 1; @@ -233,7 +232,7 @@ int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric return taos_string_builder_add_char(self->string_builder, '\n'); } -int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, int64_t ts) { +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts) { TAOS_ASSERT(self != NULL); int r = 0; for (taos_linked_list_node_t *current_node = collectors->keys->head; current_node != NULL; From ff46bdb17a8415097461c8f90f971c8eba7bc851 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 06:51:00 +0000 Subject: [PATCH 007/107] ci memory leak test --- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 14732cb509..bf88d0014e 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -105,9 +105,9 @@ void dmSendMonitorReport() { dmGetVmMonitorInfo(pDnode); dmGetQmMonitorInfo(pDnode); dmGetSmMonitorInfo(pDnode); - monSendReport(); + //monSendReport(); - //monSendPromReport(); + monSendPromReport(); } void dmGetVnodeLoads(SMonVloadInfo *pInfo) { From 4c401c39fbf4ca9bd85a0d0dc0e56c840c6089d7 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 09:52:34 +0000 Subject: [PATCH 008/107] atomic --- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 12 ++++++------ source/libs/monitorfw/inc/taos_metric_sample_t.h | 2 +- source/libs/monitorfw/src/taos_collector.c | 1 - source/libs/monitorfw/src/taos_metric_formatter.c | 2 +- source/libs/monitorfw/src/taos_metric_sample.c | 13 +++++++++++++ 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index bf88d0014e..02d8bb43ea 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -99,12 +99,12 @@ void dmSendMonitorReport() { if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); - SDnode *pDnode = dmInstance(); - dmGetDmMonitorInfo(pDnode); - dmGetMmMonitorInfo(pDnode); - dmGetVmMonitorInfo(pDnode); - dmGetQmMonitorInfo(pDnode); - dmGetSmMonitorInfo(pDnode); + //SDnode *pDnode = dmInstance(); + //dmGetDmMonitorInfo(pDnode); + //dmGetMmMonitorInfo(pDnode); + //dmGetVmMonitorInfo(pDnode); + //dmGetQmMonitorInfo(pDnode); + //dmGetSmMonitorInfo(pDnode); //monSendReport(); monSendPromReport(); diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 59a398b938..92885acf4a 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -22,7 +22,7 @@ struct taos_metric_sample { taos_metric_type_t type; /**< type is the metric type for the sample */ char *l_value; /**< l_value is the full metric name and label set represeted as a string */ - _Atomic double r_value; /**< r_value is the value of the metric sample */ + /*_Atomic*/ int64_t r_value; /**< r_value is the value of the metric sample */ }; #endif // TAOS_METRIC_SAMPLE_T_H diff --git a/source/libs/monitorfw/src/taos_collector.c b/source/libs/monitorfw/src/taos_collector.c index 9d96f61b4b..d3228facb6 100644 --- a/source/libs/monitorfw/src/taos_collector.c +++ b/source/libs/monitorfw/src/taos_collector.c @@ -14,7 +14,6 @@ */ #include -#include // Public #include "taos_alloc.h" diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 3529d9dda6..77361b8b03 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -171,7 +171,7 @@ int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric if (r) return r; char buffer[50]; - sprintf(buffer, "%.17g", sample->r_value); + sprintf(buffer, "%ld", sample->r_value); r = taos_string_builder_add_str(self->string_builder, buffer); if (r) return r; diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 747eebc87c..10f626ba16 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -24,6 +24,7 @@ #include "taos_log.h" #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" +#include "osAtomic.h" taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); @@ -62,13 +63,18 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { if (r_value < 0) { return 1; } + /* _Atomic double old = atomic_load(&self->r_value); + for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old + r_value); if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { return 0; } } + */ + atomic_fetch_add_64(&self->r_value, r_value); + return 0; } int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { @@ -77,6 +83,7 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); return 1; } + /* _Atomic double old = atomic_load(&self->r_value); for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old - r_value); @@ -84,6 +91,9 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { return 0; } } + */ + atomic_fetch_sub_64(&self->r_value, r_value); + return 0; } int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { @@ -91,6 +101,9 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); return 1; } + /* atomic_store(&self->r_value, r_value); + */ + atomic_store_64(&self->r_value, r_value); return 0; } From 8e007f199b522f89201e9fbe9995259a94d826e4 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 24 Oct 2023 11:31:50 +0000 Subject: [PATCH 009/107] format --- include/libs/monitorfw/taos_collector_registry.h | 2 +- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 14 +++++++------- source/libs/monitor/src/monMain.c | 2 +- .../libs/monitorfw/inc/taos_metric_formatter_i.h | 8 ++++---- .../libs/monitorfw/src/taos_collector_registry.c | 4 ++-- source/libs/monitorfw/src/taos_metric_formatter.c | 13 +++++++------ 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h index f3c89ad543..915b132b11 100644 --- a/include/libs/monitorfw/taos_collector_registry.h +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -103,7 +103,7 @@ int taos_collector_registry_register_collector(taos_collector_registry_t *self, * @param self The target taos_collector_registry_t* * @return The string int he default metric exposition format. */ -const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts); +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts, char *format); int taos_collector_registry_clear_out(taos_collector_registry_t *self); diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 02d8bb43ea..c237ce73c0 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -99,13 +99,13 @@ void dmSendMonitorReport() { if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); - //SDnode *pDnode = dmInstance(); - //dmGetDmMonitorInfo(pDnode); - //dmGetMmMonitorInfo(pDnode); - //dmGetVmMonitorInfo(pDnode); - //dmGetQmMonitorInfo(pDnode); - //dmGetSmMonitorInfo(pDnode); - //monSendReport(); + SDnode *pDnode = dmInstance(); + dmGetDmMonitorInfo(pDnode); + dmGetMmMonitorInfo(pDnode); + dmGetVmMonitorInfo(pDnode); + dmGetQmMonitorInfo(pDnode); + dmGetSmMonitorInfo(pDnode); + monSendReport(); monSendPromReport(); } diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 4670334565..9c5b56f48e 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -554,7 +554,7 @@ void monSendReport() { void monSendPromReport() { char ts[50]; sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); - char *pCont = (char *)taos_collector_registry_bridge(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts); + char *pCont = (char *)taos_collector_registry_bridge(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts, "%" PRId64); //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_i.h index a5dd23410f..fba30d9eeb 100644 --- a/source/libs/monitorfw/inc/taos_metric_formatter_i.h +++ b/source/libs/monitorfw/inc/taos_metric_formatter_i.h @@ -56,18 +56,18 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *metric_formatter /** * @brief API PRIVATE Loads the formatter with a metric sample */ -int taos_metric_formatter_load_sample( - taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, char *ts); +int taos_metric_formatter_load_sample(taos_metric_formatter_t *metric_formatter, taos_metric_sample_t *sample, + char *ts, char *format); /** * @brief API PRIVATE Loads a metric in the string exposition format */ -int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts); +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts, char *format); /** * @brief API PRIVATE Loads the given metrics */ -int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts); +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts, char *format); /** * @brief API PRIVATE Clear the underlying string_builder diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index f94c8fdcd1..25e4b5b2ca 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -186,9 +186,9 @@ int taos_collector_registry_validate_metric_name(taos_collector_registry_t *self return 0; } -const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts) { +const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts, char *format) { taos_metric_formatter_clear(self->metric_formatter); - taos_metric_formatter_load_metrics(self->metric_formatter, self->collectors, ts); + taos_metric_formatter_load_metrics(self->metric_formatter, self->collectors, ts, format); char *out = taos_metric_formatter_dump(self->metric_formatter); int r = 0; diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 77361b8b03..8d1b44c149 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -158,7 +158,8 @@ int taos_metric_formatter_load_l_value(taos_metric_formatter_t *self, const char return 0; } -int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, char *ts) { +int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric_sample_t *sample, + char *ts, char *format) { TAOS_ASSERT(self != NULL); if (self == NULL) return 1; @@ -171,7 +172,7 @@ int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric if (r) return r; char buffer[50]; - sprintf(buffer, "%ld", sample->r_value); + sprintf(buffer, format, sample->r_value); r = taos_string_builder_add_str(self->string_builder, buffer); if (r) return r; @@ -205,7 +206,7 @@ char *taos_metric_formatter_dump(taos_metric_formatter_t *self) { return data; } -int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts) { +int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts, char *format) { TAOS_ASSERT(self != NULL); if (self == NULL) return 1; @@ -225,14 +226,14 @@ int taos_metric_formatter_load_metric(taos_metric_formatter_t *self, taos_metric } else { taos_metric_sample_t *sample = (taos_metric_sample_t *)taos_map_get(metric->samples, key); if (sample == NULL) return 1; - r = taos_metric_formatter_load_sample(self, sample, ts); + r = taos_metric_formatter_load_sample(self, sample, ts, format); if (r) return r; } } return taos_string_builder_add_char(self->string_builder, '\n'); } -int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts) { +int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts, char *format) { TAOS_ASSERT(self != NULL); int r = 0; for (taos_linked_list_node_t *current_node = collectors->keys->head; current_node != NULL; @@ -249,7 +250,7 @@ int taos_metric_formatter_load_metrics(taos_metric_formatter_t *self, taos_map_t const char *metric_name = (const char *)current_node->item; taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); if (metric == NULL) return 1; - r = taos_metric_formatter_load_metric(self, metric, ts); + r = taos_metric_formatter_load_metric(self, metric, ts, format); if (r) return r; } } From 91092cb9092f03913666611af1187db5c18a5c5c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Oct 2023 10:29:37 +0800 Subject: [PATCH 010/107] http handle empty packet --- source/libs/transport/src/thttp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index c483d82027..b0a384cfcc 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -293,6 +293,11 @@ int32_t httpSendQuit() { static int32_t taosSendHttpReportImpl(const char* server, const char* uri, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) { + if (contLen == 0) { + tError("http-report failed to report empty packet"); + return -1; + } + SHttpModule* load = taosAcquireRef(httpRefMgt, httpRef); if (load == NULL) { tError("http-report already released"); From b403810f45d5d22b549cd20ecfa731378a9af50f Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Oct 2023 10:31:18 +0800 Subject: [PATCH 011/107] http handle empty packet --- source/libs/transport/src/thttp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index b0a384cfcc..63f07d7493 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -293,7 +293,7 @@ int32_t httpSendQuit() { static int32_t taosSendHttpReportImpl(const char* server, const char* uri, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) { - if (contLen == 0) { + if (pCont == NULL || contLen == 0) { tError("http-report failed to report empty packet"); return -1; } From 0b9058162a7e0d98c5dbafcbea83b2eea8a54dc2 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 25 Oct 2023 10:38:57 +0800 Subject: [PATCH 012/107] http handle empty packet --- source/libs/transport/src/thttp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index 63f07d7493..f1bdd54948 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -293,6 +293,11 @@ int32_t httpSendQuit() { static int32_t taosSendHttpReportImpl(const char* server, const char* uri, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) { + if (server == NULL || uri == NULL) { + tError("http-report failed to report to invalid addr"); + return -1; + } + if (pCont == NULL || contLen == 0) { tError("http-report failed to report empty packet"); return -1; From 9af7b7b1789f44ca2ffaa4389355fe18824834c8 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 26 Oct 2023 11:50:34 +0000 Subject: [PATCH 013/107] init error --- source/dnode/vnode/src/vnd/vnodeSvr.c | 2 +- source/libs/monitorfw/src/taos_collector_registry.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index c4aa5c6428..a7179ae033 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1620,7 +1620,7 @@ _exit: int32_t label_count =1; const char *sample_labels[] = {"vgid"}; insert_counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); - insert_counter = taos_collector_registry_must_register_metric(insert_counter); + taos_collector_registry_must_register_metric(insert_counter); } char vgId[50]; diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index 25e4b5b2ca..711e66ed84 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -122,7 +122,8 @@ int taos_collector_registry_register_metric(taos_metric_t *metric) { taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metric) { int err = taos_collector_registry_register_metric(metric); if (err != 0) { - exit(err); + //exit(err); + return NULL; } return metric; } From 21dd6f70a9687fd61562faecdae6178728fc0c56 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 27 Oct 2023 01:16:53 +0000 Subject: [PATCH 014/107] atomic init --- source/dnode/vnode/src/vnd/vnodeSvr.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index a7179ae033..7d8aeb7e60 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1619,8 +1619,13 @@ _exit: if(insert_counter == NULL){ int32_t label_count =1; const char *sample_labels[] = {"vgid"}; - insert_counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); - taos_collector_registry_must_register_metric(insert_counter); + taos_counter_t *counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); + if(taos_collector_registry_register_metric(counter) == 1){ + taos_counter_destroy(counter); + } + else{ + atomic_store_ptr(insert_counter, counter); + } } char vgId[50]; From ca5e252c0caee8092fee11d31184212133f58509 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 27 Oct 2023 01:20:33 +0000 Subject: [PATCH 015/107] atomic init --- source/dnode/vnode/src/vnd/vnodeSvr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 7d8aeb7e60..758839f872 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1624,7 +1624,7 @@ _exit: taos_counter_destroy(counter); } else{ - atomic_store_ptr(insert_counter, counter); + atomic_store_ptr(&insert_counter, counter); } } From e861416e48902400ffb8169a8aed4153d4fcabe5 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 30 Oct 2023 11:50:51 +0000 Subject: [PATCH 016/107] uri --- source/libs/monitor/src/monMain.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 9c5b56f48e..d417a97db7 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -23,6 +23,7 @@ static SMonitor tsMonitor = {0}; static char* tsMonUri = "/report"; +static char* tsMonFwUri = "/td_metric"; void monRecordLog(int64_t ts, ELogLevel level, const char *content) { taosThreadMutexLock(&tsMonitor.lock); @@ -558,7 +559,7 @@ void monSendPromReport() { //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; - if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { uError("failed to send monitor msg"); }else{ taos_collector_registry_clear_out(TAOS_COLLECTOR_REGISTRY_DEFAULT); @@ -571,7 +572,7 @@ void monSendContent(char *pCont) { //uInfoL("report cont:\n%s\n", pCont); if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; - if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { uError("failed to send monitor msg"); } } From ffb1e1e8c3a25904a3fb0b6609258c197aeb9fc4 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 30 Oct 2023 12:05:20 +0000 Subject: [PATCH 017/107] end point --- source/dnode/vnode/src/vnd/vnodeSvr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 758839f872..a89a1f8dee 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1617,8 +1617,8 @@ _exit: } if(insert_counter == NULL){ - int32_t label_count =1; - const char *sample_labels[] = {"vgid"}; + int32_t label_count =2; + const char *sample_labels[] = {"vgid", "endpoint"}; taos_counter_t *counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); if(taos_collector_registry_register_metric(counter) == 1){ taos_counter_destroy(counter); @@ -1630,7 +1630,7 @@ _exit: char vgId[50]; sprintf(vgId, "%"PRId32, TD_VID(pVnode)); - const char *sample_labels[] = {vgId}; + const char *sample_labels[] = {vgId, tsLocalEp}; taos_counter_inc(insert_counter, sample_labels); From 8318aa1418b9d39c67ad2d5c0622ff7bdd41df0c Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Fri, 3 Nov 2023 10:14:27 +0800 Subject: [PATCH 018/107] compile on windows --- include/os/osAtomic.h | 2 ++ source/libs/monitorfw/src/taos_metric_formatter.c | 1 - source/libs/monitorfw/src/taos_metric_sample.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/os/osAtomic.h b/include/os/osAtomic.h index 9fd00cefb4..52be7200bf 100644 --- a/include/os/osAtomic.h +++ b/include/os/osAtomic.h @@ -20,6 +20,8 @@ extern "C" { #endif +#include "tdef.h" + // If the error is in a third-party library, place this header file under the third-party library header file. // When you want to use this feature, you should find or add the same function in the following section. #ifndef ALLOW_FORBID_FUNC diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 8d1b44c149..6c6f1974eb 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -28,7 +28,6 @@ #include "taos_metric_t.h" #include "taos_string_builder_i.h" -#include taos_metric_formatter_t *taos_metric_formatter_new() { taos_metric_formatter_t *self = (taos_metric_formatter_t *)taos_malloc(sizeof(taos_metric_formatter_t)); diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 10f626ba16..e784712c3f 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -#include +//#include // Public #include "taos_alloc.h" @@ -30,7 +30,7 @@ taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); self->type = type; self->l_value = taos_strdup(l_value); - self->r_value = ATOMIC_VAR_INIT(r_value); + self->r_value = 0; return self; } From 84545d4e8da87da5571a0758bb1ce800b09043b1 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Fri, 3 Nov 2023 10:32:16 +0800 Subject: [PATCH 019/107] include os.h --- include/os/osAtomic.h | 2 -- source/libs/monitorfw/src/taos_metric_sample.c | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/os/osAtomic.h b/include/os/osAtomic.h index 52be7200bf..9fd00cefb4 100644 --- a/include/os/osAtomic.h +++ b/include/os/osAtomic.h @@ -20,8 +20,6 @@ extern "C" { #endif -#include "tdef.h" - // If the error is in a third-party library, place this header file under the third-party library header file. // When you want to use this feature, you should find or add the same function in the following section. #ifndef ALLOW_FORBID_FUNC diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index e784712c3f..264fa220df 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -24,7 +24,7 @@ #include "taos_log.h" #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" -#include "osAtomic.h" +#include "os.h" taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); From d0b6fc2ba6496a0ea0c29a45151e14e0957a267b Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 3 Nov 2023 09:17:21 +0000 Subject: [PATCH 020/107] atomic windows --- include/os/osAtomic.h | 2 ++ source/libs/monitorfw/src/taos_metric_sample.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/os/osAtomic.h b/include/os/osAtomic.h index 9fd00cefb4..52be7200bf 100644 --- a/include/os/osAtomic.h +++ b/include/os/osAtomic.h @@ -20,6 +20,8 @@ extern "C" { #endif +#include "tdef.h" + // If the error is in a third-party library, place this header file under the third-party library header file. // When you want to use this feature, you should find or add the same function in the following section. #ifndef ALLOW_FORBID_FUNC diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 264fa220df..e784712c3f 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -24,7 +24,7 @@ #include "taos_log.h" #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" -#include "os.h" +#include "osAtomic.h" taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); From 68e2e4df74e23a123201a42c30513684e6d4ba9f Mon Sep 17 00:00:00 2001 From: tangfangzhi Date: Mon, 6 Nov 2023 11:26:42 +0800 Subject: [PATCH 021/107] atomic windows --- include/os/osAtomic.h | 2 -- source/libs/monitorfw/src/taos_metric_sample.c | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/os/osAtomic.h b/include/os/osAtomic.h index 52be7200bf..9fd00cefb4 100644 --- a/include/os/osAtomic.h +++ b/include/os/osAtomic.h @@ -20,8 +20,6 @@ extern "C" { #endif -#include "tdef.h" - // If the error is in a third-party library, place this header file under the third-party library header file. // When you want to use this feature, you should find or add the same function in the following section. #ifndef ALLOW_FORBID_FUNC diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index e784712c3f..034657cb3d 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -24,6 +24,10 @@ #include "taos_log.h" #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" + +#define ALLOW_FORBID_FUNC + +#include "tdef.h" #include "osAtomic.h" taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { From 0a16b758314cd7d0935ff88865519d5eb111c78c Mon Sep 17 00:00:00 2001 From: facetosea <285808407@qq.com> Date: Thu, 2 Nov 2023 18:44:18 +0800 Subject: [PATCH 022/107] monitor client --- include/common/tglobal.h | 1 + include/libs/monitor/clientMonitor.h | 50 ++++++ source/client/CMakeLists.txt | 4 +- source/client/inc/clientInt.h | 9 ++ source/client/src/clientEnv.c | 1 + source/client/src/clientImpl.c | 13 ++ source/client/src/selectMonitor.c | 46 ++++++ source/client/src/slowQueryMonitor.c | 73 +++++++++ source/client/test/CMakeLists.txt | 17 ++ source/client/test/clientMonitorTests.cpp | 81 ++++++++++ source/common/src/tglobal.c | 3 + source/libs/monitor/CMakeLists.txt | 2 +- source/libs/monitor/inc/monInt.h | 1 + source/libs/monitor/src/clientMonitor.c | 189 ++++++++++++++++++++++ 14 files changed, 487 insertions(+), 3 deletions(-) create mode 100644 include/libs/monitor/clientMonitor.h create mode 100644 source/client/src/selectMonitor.c create mode 100644 source/client/src/slowQueryMonitor.c create mode 100644 source/client/test/clientMonitorTests.cpp create mode 100644 source/libs/monitor/src/clientMonitor.c diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 1d0da9e150..1765b0a234 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -147,6 +147,7 @@ extern int32_t tsMetaCacheMaxSize; extern int32_t tsSlowLogThreshold; extern int32_t tsSlowLogScope; extern int32_t tsTimeSeriesThreshold; +extern bool enableSlowQueryMonitor; // client extern int32_t tsMinSlidingTime; diff --git a/include/libs/monitor/clientMonitor.h b/include/libs/monitor/clientMonitor.h new file mode 100644 index 0000000000..0d238157c5 --- /dev/null +++ b/include/libs/monitor/clientMonitor.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TDENGINE_CLIENT_MONITOR_H +#define TDENGINE_CLIENT_MONITOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "taos_monitor.h" +#include "thash.h" +#include "query.h" + +typedef struct { + char clusterKey[512]; + SEpSet epSet; + void* pTransporter; + taos_collector_registry_t* registry; + taos_collector_t* colector; + taos_counter_t* slow_query_counter; + taos_counter_t* select_counter; + SHashObj* counters; +} ClientMonitor; + +void clusterMonitorInit(const char* clusterKey, SEpSet epSet, void* pTransporter); +void clusterMonitorClose(const char* clusterKey); +taos_counter_t* createClusterCounter(const char* clusterKey, const char* name, const char* help, size_t label_key_count, + const char** label_keys); +int taosClusterCounterInc(const char* clusterKey, const char* counterName, const char** label_values); + +void cluster_monitor_stop(); + +#ifdef __cplusplus +} +#endif + +#endif // TDENGINE_CLIENT_MONITOR_H diff --git a/source/client/CMakeLists.txt b/source/client/CMakeLists.txt index f089247859..a17c27c297 100644 --- a/source/client/CMakeLists.txt +++ b/source/client/CMakeLists.txt @@ -20,7 +20,7 @@ target_include_directories( target_link_libraries( taos INTERFACE api - PRIVATE os util common transport nodes parser command planner catalog scheduler function qcom geometry + PRIVATE os util common transport monitor nodes parser command planner catalog scheduler function qcom geometry ) if(TD_DARWIN_ARM64) @@ -61,7 +61,7 @@ target_include_directories( target_link_libraries( taos_static INTERFACE api - PRIVATE os util common transport nodes parser command planner catalog scheduler function qcom geometry + PRIVATE os util common transport monitor nodes parser command planner catalog scheduler function qcom geometry ) if(${BUILD_TEST}) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 75003d76d8..ef19fb7c51 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -391,6 +391,8 @@ void hbRemoveAppHbMrg(SAppHbMgr** pAppHbMgr); void destroyAllRequests(SHashObj* pRequests); void stopAllRequests(SHashObj* pRequests); +SAppInstInfo* getAppInstInfo(const char* clusterKey); + // conn level int hbRegisterConn(SAppHbMgr* pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType); void hbDeregisterConn(STscObj* pTscObj, SClientHbKey connKey); @@ -426,6 +428,13 @@ void freeQueryParam(SSyncQueryParam* param); int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effeciveUser, SParseSqlRes* pRes); #endif +void clusterSlowQueryMonitorInit(const char* clusterKey); +void clusterSlowQueryLog(const char* clusterKey, int32_t cost); +void SlowQueryLog(int64_t connId, int32_t cost); + +void clusterSelectMonitorInit(const char* clusterKey); +void clusterSelectLog(const char* clusterKey); + #ifdef __cplusplus } #endif diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index b36ef20b53..26b076e5ee 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -114,6 +114,7 @@ static void deregisterRequest(SRequestObj *pRequest) { taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 ", Duration:%" PRId64 "us, SQL:%s", taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr); + SlowQueryLog(pTscObj->connId, duration); } } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 395a396d89..e3aaa63c87 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -15,6 +15,7 @@ #include "cJSON.h" #include "clientInt.h" +#include "clientMonitor.h" #include "clientLog.h" #include "command.h" #include "scheduler.h" @@ -157,6 +158,8 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas tscDebug("new app inst mgr %p, user:%s, ip:%s, port:%d", p, user, epSet.epSet.eps[0].fqdn, epSet.epSet.eps[0].port); pInst = &p; + + clusterSlowQueryMonitorInit(p->instKey); } else { ASSERTS((*pInst) && (*pInst)->pAppHbMgr, "*pInst:%p, pAppHgMgr:%p", *pInst, (*pInst) ? (*pInst)->pAppHbMgr : NULL); // reset to 0 in case of conn with duplicated user key but its user has ever been dropped. @@ -166,9 +169,19 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas taosThreadMutexUnlock(&appInfo.mutex); taosMemoryFreeClear(key); + return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst, connType); } +SAppInstInfo* getAppInstInfo(const char* clusterKey) { + SAppInstInfo** ppAppInstInfo = taosHashGet(appInfo.pInstMap, clusterKey, strlen(clusterKey)); + if (ppAppInstInfo != NULL && *ppAppInstInfo != NULL) { + return *ppAppInstInfo; + } else { + return NULL; + } +} + void freeQueryParam(SSyncQueryParam* param) { if (param == NULL) return; tsem_destroy(¶m->sem); diff --git a/source/client/src/selectMonitor.c b/source/client/src/selectMonitor.c new file mode 100644 index 0000000000..0cb2073961 --- /dev/null +++ b/source/client/src/selectMonitor.c @@ -0,0 +1,46 @@ + /* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include "clientInt.h" +#include "clientMonitor.h" +#include "clientLog.h" + +const char* selectMonitorName = "slow_query"; +const char* selectMonitorHelp = "slow query log when cost > 3s"; +const int selectMonitorLabelCount = 1; +const char* selectMonitorLabels[] = {"default"}; + +void clusterSelectMonitorInit(const char* clusterKey) { + SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); + SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); + clusterMonitorInit(clusterKey, epSet, pAppInstInfo->pTransporter); + createClusterCounter(clusterKey, selectMonitorName, selectMonitorHelp, selectMonitorLabelCount, selectMonitorLabels); +} + +void clusterSelectLog(const char* clusterKey) { + const char* selectMonitorLabelValues[] = {"default"}; + taosClusterCounterInc(clusterKey, selectMonitorName, selectMonitorLabelValues); +} + +void selectLog(int64_t connId) { + STscObj* pTscObj = acquireTscObj(connId); + if (pTscObj != NULL) { + if(pTscObj->pAppInfo == NULL) { + tscLog("selectLog, not found pAppInfo"); + } + return clusterSelectLog(pTscObj->pAppInfo->instKey); + } else { + tscLog("selectLog, not found connect ID"); + } +} diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c new file mode 100644 index 0000000000..b42f860d67 --- /dev/null +++ b/source/client/src/slowQueryMonitor.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include "clientInt.h" +#include "clientMonitor.h" +#include "clientLog.h" +#include "tglobal.h" + +const char* slowQueryName = "slow_query"; +const char* slowQueryHelp = "slow query log when cost > 3s"; +const int slowQueryLabelCount = 1; +const char* slowQueryLabels[] = {"cost"}; + +const int64_t msInSeconds = 1000; +const int64_t msInMinutes = 60 * msInSeconds; + +static const char* getSlowQueryLableCostDesc(int64_t cost) { + if (cost >= 30 * msInMinutes) { + return " > 30 min"; + } else if (cost >= 10 * msInMinutes) { + return " > 10 min"; + } else if (cost >= 5 * msInMinutes) { + return " > 5 min"; + } else if (cost >= 1 * msInMinutes) { + return " > 1 min"; + } else if (cost >= 30 * msInSeconds) { + return " > 30 seconds"; + } else if (cost >= 10 * msInSeconds) { + return " > 10 seconds"; + } else if (cost >= 5 * msInSeconds) { + return " > 5 seconds"; + } else if (cost >= 3 * msInSeconds) { + return " > 3 seconds"; + } + return "< 3 s"; +} + +void clusterSlowQueryMonitorInit(const char* clusterKey) { + if (!enableSlowQueryMonitor) return; + SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); + SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); + clusterMonitorInit(clusterKey, epSet, pAppInstInfo->pTransporter); + createClusterCounter(clusterKey, slowQueryName, slowQueryHelp, slowQueryLabelCount, slowQueryLabels); +} + +void clusterSlowQueryLog(const char* clusterKey, int32_t cost) { + const char* slowQueryLabelValues[] = {getSlowQueryLableCostDesc(cost)}; + taosClusterCounterInc(clusterKey, slowQueryName, slowQueryLabelValues); +} + +void SlowQueryLog(int64_t connId, int32_t cost) { + if (!enableSlowQueryMonitor) return; + STscObj* pTscObj = acquireTscObj(connId); + if (pTscObj != NULL) { + if(pTscObj->pAppInfo == NULL) { + tscLog("SlowQueryLog, not found pAppInfo"); + } + return clusterSlowQueryLog(pTscObj->pAppInfo->instKey, cost); + } else { + tscLog("SlowQueryLog, not found connect ID"); + } +} diff --git a/source/client/test/CMakeLists.txt b/source/client/test/CMakeLists.txt index 91f0d1eef8..7c3847e4a1 100644 --- a/source/client/test/CMakeLists.txt +++ b/source/client/test/CMakeLists.txt @@ -23,6 +23,12 @@ TARGET_LINK_LIBRARIES( PUBLIC os util common transport parser catalog scheduler function gtest taos_static qcom geometry ) +ADD_EXECUTABLE(clientMonitorTest clientMonitorTests.cpp) +TARGET_LINK_LIBRARIES( + clientMonitorTest + PUBLIC os util common transport monitor parser catalog scheduler function gtest taos_static qcom executor +) + TARGET_INCLUDE_DIRECTORIES( clientTest PUBLIC "${TD_SOURCE_DIR}/include/client/" @@ -41,7 +47,18 @@ TARGET_INCLUDE_DIRECTORIES( PRIVATE "${TD_SOURCE_DIR}/source/client/inc" ) +TARGET_INCLUDE_DIRECTORIES( + clientMonitorTest + PUBLIC "${TD_SOURCE_DIR}/include/client/" + PRIVATE "${TD_SOURCE_DIR}/source/client/inc" +) + add_test( NAME smlTest COMMAND smlTest ) + +# add_test( +# NAME clientMonitorTest +# COMMAND clientMonitorTest +# ) diff --git a/source/client/test/clientMonitorTests.cpp b/source/client/test/clientMonitorTests.cpp new file mode 100644 index 0000000000..8882e268e7 --- /dev/null +++ b/source/client/test/clientMonitorTests.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include "clientInt.h" +#include "clientMonitor.h" +#include "taoserror.h" +#include "tglobal.h" +#include "thash.h" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wwrite-strings" +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wsign-compare" + +#include "executor.h" +#include "taos.h" + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +TEST(clientMonitorTest, monitorTest) { + const char* cluster1 = "cluster1"; + const char* cluster2 = "cluster2"; + SEpSet epSet; + clusterMonitorInit(cluster1, epSet, NULL); + const char* counterName1 = "slow_query"; + const char* counterName2 = "select_count"; + const char* help1 = "test for slowQuery"; + const char* help2 = "test for selectSQL"; + const char* lables[] = {"lable1"}; + taos_counter_t* c1 = createClusterCounter(cluster1, counterName1, help1, 1, lables); + ASSERT_TRUE(c1 != NULL); + taos_counter_t* c2 = createClusterCounter(cluster1, counterName2, help2, 1, lables); + ASSERT_TRUE(c2 != NULL); + ASSERT_TRUE(c1 != c2); + taos_counter_t* c21 = createClusterCounter(cluster2, counterName1, help2, 1, lables); + ASSERT_TRUE(c21 == NULL); + clusterMonitorInit(cluster2, epSet, NULL); + c21 = createClusterCounter(cluster2, counterName1, help2, 1, lables); + ASSERT_TRUE(c21 != NULL); + int i = 0; + while (i < 12) { + taosMsleep(10); + ++i; + } clusterMonitorClose(cluster1); + clusterMonitorClose(cluster2); +} + +TEST(clientMonitorTest, sendTest) { + TAOS* taos = taos_connect("127.0.0.1", "root", "taosdata", NULL, 0); + ASSERT_TRUE(taos != NULL); + printf("connect taosd sucessfully.\n"); + + int64_t connId = *(int64_t *)taos; + SlowQueryLog(connId, 1000); + int i = 0; + while (i < 20) { + SlowQueryLog(connId, i * 1000); + taosMsleep(10); + ++i; + } + + taos_close(taos); +} diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 8e824b4d67..d755ef0075 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -156,6 +156,7 @@ int32_t tsMetaCacheMaxSize = -1; // MB int32_t tsSlowLogThreshold = 3; // seconds int32_t tsSlowLogScope = SLOW_LOG_TYPE_ALL; int32_t tsTimeSeriesThreshold = 50; +bool enableSlowQueryMonitor = false; /* * denote if the server needs to compress response message at the application layer to client, including query rsp, @@ -479,6 +480,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddInt32(pCfg, "metaCacheMaxSize", tsMetaCacheMaxSize, -1, INT32_MAX, CFG_SCOPE_CLIENT) != 0) return -1; if (cfgAddInt32(pCfg, "slowLogThreshold", tsSlowLogThreshold, 0, INT32_MAX, CFG_SCOPE_CLIENT) != 0) return -1; if (cfgAddString(pCfg, "slowLogScope", "", CFG_SCOPE_CLIENT) != 0) return -1; + if (cfgAddBool(pCfg, "enableSlowQueryMonitor", enableSlowQueryMonitor, CFG_SCOPE_CLIENT) != 0) return -1; tsNumOfRpcThreads = tsNumOfCores / 2; tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 2, TSDB_MAX_RPC_THREADS); @@ -991,6 +993,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { if (taosSetSlowLogScope(cfgGetItem(pCfg, "slowLogScope")->str)) { return -1; } + enableSlowQueryMonitor = cfgGetItem(pCfg, "enableSlowQueryMonitor")->bval; tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32; diff --git a/source/libs/monitor/CMakeLists.txt b/source/libs/monitor/CMakeLists.txt index 13523fd3cc..cc8f40fa4c 100644 --- a/source/libs/monitor/CMakeLists.txt +++ b/source/libs/monitor/CMakeLists.txt @@ -6,7 +6,7 @@ target_include_directories( PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -target_link_libraries(monitor os util common transport monitorfw) +target_link_libraries(monitor os util common qcom transport monitorfw) if(${BUILD_TEST}) add_subdirectory(test) diff --git a/source/libs/monitor/inc/monInt.h b/source/libs/monitor/inc/monInt.h index ae1af4ba62..c5219c60b2 100644 --- a/source/libs/monitor/inc/monInt.h +++ b/source/libs/monitor/inc/monInt.h @@ -17,6 +17,7 @@ #define _TD_MONITOR_INT_H_ #include "monitor.h" +#include "query.h" #include "tjson.h" diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c new file mode 100644 index 0000000000..941155f2fe --- /dev/null +++ b/source/libs/monitor/src/clientMonitor.c @@ -0,0 +1,189 @@ +#include "clientMonitor.h" +#include "os.h" +#include "tmisce.h" +#include "ttime.h" +#include "ttimer.h" + +SRWLatch monitorLock; +void* tmrClientMonitor; +tmr_h tmrStartHandle; +SHashObj* clusterMonitorInfoTable; + +static const int interval = 1000; // ms +static const int sendSize = 10; +static const int sleepTimeMS = 100; + +int32_t sendReport(ClientMonitor* pMonitor, char* pCont); +void generateClusterReport(ClientMonitor* pMonitor, bool send) { + char ts[50]; + sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + char* pCont = (char*)taos_collector_registry_bridge(pMonitor->registry, ts, "%" PRId64); + if (send && strlen(pCont) != TSDB_CODE_SUCCESS) { + if (sendReport(pMonitor, pCont) == 0) { + taos_collector_registry_clear_out(pMonitor->registry); + } + } +} + +void reportSendProcess(void* param, void* tmrId) { + taosRLockLatch(&monitorLock); + taosTmrReset(reportSendProcess, interval, NULL, tmrClientMonitor, &tmrStartHandle); + + static int index = 0; + index++; + ClientMonitor** ppMonitor = (ClientMonitor**)taosHashIterate(clusterMonitorInfoTable, NULL); + while (ppMonitor != NULL && *ppMonitor != NULL) { + ClientMonitor* pMonitor = *ppMonitor; + generateClusterReport(*ppMonitor, index == sendSize); + ppMonitor = taosHashIterate(clusterMonitorInfoTable, ppMonitor); + } + + if (index == sendSize) index = 0; + taosRUnLockLatch(&monitorLock); +} + +void monitorClientInitOnce() { + static int8_t init = 0; + if (atomic_exchange_8(&init, 1) == 0) { + uInfo("tscMonitorInit once."); + clusterMonitorInfoTable = + (SHashObj*)taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); + + tmrClientMonitor = taosTmrInit(0, 0, 0, "MONITOR"); + tmrStartHandle = taosTmrStart(reportSendProcess, interval, NULL, tmrClientMonitor); + taosInitRWLatch(&monitorLock); + } +} + +void createMonitorClient(const char* clusterKey, SEpSet epSet, void* pTransporter) { + taosWLockLatch(&monitorLock); + if (clusterKey == NULL || strlen(clusterKey) == 0) { + uError("createMonitorClient failed, clusterKey is NULL"); + return; + } + + if (taosHashGet(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)) == NULL) { + uInfo("createMonitorClient for %s.", clusterKey); + ClientMonitor* pMonitor = taosMemoryCalloc(1, sizeof(ClientMonitor)); + snprintf(pMonitor->clusterKey, sizeof(pMonitor->clusterKey), "%s", clusterKey); + pMonitor->registry = taos_collector_registry_new(clusterKey); + pMonitor->colector = taos_collector_new(clusterKey); + pMonitor->epSet = epSet; + pMonitor->pTransporter = pTransporter; + + taos_collector_registry_register_collector(pMonitor->registry, pMonitor->colector); + pMonitor->counters = + (SHashObj*)taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); + + taosHashPut(clusterMonitorInfoTable, clusterKey, strlen(clusterKey), &pMonitor, sizeof(ClientMonitor*)); + uInfo("createMonitorClient for %s finished %p.", clusterKey, pMonitor); + } + taosWUnLockLatch(&monitorLock); +} + +static int32_t monitorReportAsyncCB(void* param, SDataBuf* pMsg, int32_t code) { + static int32_t emptyRspNum = 0; + if (TSDB_CODE_SUCCESS != code) { + uError("found error in monitorReport send callback, code:%d, please check the network.", code); + } + return code; +} + +int32_t sendReport(ClientMonitor* pMonitor, char* pCont) { + SStatisReq sStatisReq; + sStatisReq.pCont = pCont; + sStatisReq.contLen = strlen(pCont); + + int tlen = tSerializeSStatisReq(NULL, 0, &sStatisReq); + if (tlen < 0) return 0; + void* buf = taosMemoryMalloc(tlen); + if (buf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + tSerializeSStatisReq(buf, tlen, &sStatisReq); + + SMsgSendInfo* pInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); + if (pInfo == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + pInfo->fp = monitorReportAsyncCB; + pInfo->msgInfo.pData = buf; + pInfo->msgInfo.len = tlen; + pInfo->msgType = TDMT_MND_STATIS; + // pInfo->param = taosMemoryMalloc(sizeof(int32_t)); + // *(int32_t*)pInfo->param = i; + pInfo->paramFreeFp = taosMemoryFree; + pInfo->requestId = tGenIdPI64(); + pInfo->requestObjRefId = 0; + + int64_t transporterId = 0; + return asyncSendMsgToServer(pMonitor->pTransporter, &pMonitor->epSet, &transporterId, pInfo); +} + +void clusterMonitorInit(const char* clusterKey, SEpSet epSet, void* pTransporter) { + monitorClientInitOnce(); + createMonitorClient(clusterKey, epSet, pTransporter); +} + +taos_counter_t* createClusterCounter(const char* clusterKey, const char* name, const char* help, size_t label_key_count, + const char** label_keys) { + ClientMonitor** ppMonitor = (ClientMonitor**)taosHashGet(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)); + + if (ppMonitor != NULL && *ppMonitor != NULL) { + ClientMonitor* pMonitor = *ppMonitor; + taos_counter_t** ppCounter = (taos_counter_t**)taosHashGet(pMonitor->counters, name, strlen(name)); + if (ppCounter != NULL && *ppCounter != NULL) { + taosHashRemove(pMonitor->counters, name, strlen(name)); + uInfo("createClusterCounter remove old counter: %s.", name); + } + + taos_counter_t* newCounter = taos_counter_new(name, help, label_key_count, label_keys); + if (newCounter != NULL) { + taos_collector_add_metric(pMonitor->colector, newCounter); + taosHashPut(pMonitor->counters, name, strlen(name), &newCounter, sizeof(taos_counter_t*)); + uInfo("createClusterCounter %s(%p):%s : %p.", pMonitor->clusterKey, pMonitor, name, newCounter); + return newCounter; + } else { + return NULL; + } + } else { + return NULL; + } + return NULL; +} + +int taosClusterCounterInc(const char* clusterKey, const char* counterName, const char** label_values) { + taosRLockLatch(&monitorLock); + ClientMonitor** ppMonitor = (ClientMonitor**)taosHashGet(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)); + + if (ppMonitor != NULL && *ppMonitor != NULL) { + ClientMonitor* pMonitor = *ppMonitor; + taos_counter_t** ppCounter = (taos_counter_t**)taosHashGet(pMonitor->counters, counterName, strlen(counterName)); + if (ppCounter != NULL && *ppCounter != NULL) { + int res = taos_counter_inc(*ppCounter, label_values); + } else { + uError("taosClusterCounterInc not found pCounter %s:%s.", clusterKey, counterName); + } + } else { + uError("taosClusterCounterInc not found pMonitor %s.", clusterKey); + } + taosRUnLockLatch(&monitorLock); + return 0; +} + +void clusterMonitorClose(const char* clusterKey) { + taosWLockLatch(&monitorLock); + ClientMonitor** ppMonitor = (ClientMonitor**)taosHashGet(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)); + + if (ppMonitor != NULL && *ppMonitor != NULL) { + ClientMonitor* pMonitor = *ppMonitor; + uInfo("clusterMonitorClose valule:%p clusterKey:%s.", pMonitor, pMonitor->clusterKey); + taosHashCleanup(pMonitor->counters); + taos_collector_registry_destroy(pMonitor->registry); + taosMemoryFree(pMonitor); + taosHashRemove(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)); + } + taosWUnLockLatch(&monitorLock); +} From 1494c6408278331c145e93384fe6ebcbfb9a9e76 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Wed, 8 Nov 2023 09:19:51 +0800 Subject: [PATCH 023/107] define const int direct --- source/client/src/slowQueryMonitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index b42f860d67..7d25cf87ca 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -23,7 +23,7 @@ const int slowQueryLabelCount = 1; const char* slowQueryLabels[] = {"cost"}; const int64_t msInSeconds = 1000; -const int64_t msInMinutes = 60 * msInSeconds; +const int64_t msInMinutes = 60 * 1000; static const char* getSlowQueryLableCostDesc(int64_t cost) { if (cost >= 30 * msInMinutes) { From ee006072096623f6e99810be0602d01e74c2ceca Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Wed, 8 Nov 2023 10:00:35 +0800 Subject: [PATCH 024/107] in line with api change on 3.0 --- source/common/src/tglobal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 04521f4c43..b41a9454b8 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -474,7 +474,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddInt32(pCfg, "slowLogThreshold", tsSlowLogThreshold, 0, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; if (cfgAddString(pCfg, "slowLogScope", "", CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; - if (cfgAddBool(pCfg, "enableSlowQueryMonitor", enableSlowQueryMonitor, CFG_SCOPE_CLIENT) != 0) return -1; + if (cfgAddBool(pCfg, "enableSlowQueryMonitor", enableSlowQueryMonitor, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; tsNumOfRpcThreads = tsNumOfCores / 2; tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 2, TSDB_MAX_RPC_THREADS); From c3d60989eff179e30279210b014d81ac2607e868 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Wed, 8 Nov 2023 14:11:55 +0800 Subject: [PATCH 025/107] lock optimization --- source/libs/monitor/src/clientMonitor.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index 941155f2fe..15d047f3c0 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -10,8 +10,7 @@ tmr_h tmrStartHandle; SHashObj* clusterMonitorInfoTable; static const int interval = 1000; // ms -static const int sendSize = 10; -static const int sleepTimeMS = 100; +static const int sendBathchSize = 10; int32_t sendReport(ClientMonitor* pMonitor, char* pCont); void generateClusterReport(ClientMonitor* pMonitor, bool send) { @@ -26,19 +25,19 @@ void generateClusterReport(ClientMonitor* pMonitor, bool send) { } void reportSendProcess(void* param, void* tmrId) { - taosRLockLatch(&monitorLock); taosTmrReset(reportSendProcess, interval, NULL, tmrClientMonitor, &tmrStartHandle); + taosRLockLatch(&monitorLock); static int index = 0; index++; ClientMonitor** ppMonitor = (ClientMonitor**)taosHashIterate(clusterMonitorInfoTable, NULL); while (ppMonitor != NULL && *ppMonitor != NULL) { ClientMonitor* pMonitor = *ppMonitor; - generateClusterReport(*ppMonitor, index == sendSize); + generateClusterReport(*ppMonitor, index == sendBathchSize); ppMonitor = taosHashIterate(clusterMonitorInfoTable, ppMonitor); } - if (index == sendSize) index = 0; + if (index == sendBathchSize) index = 0; taosRUnLockLatch(&monitorLock); } @@ -56,12 +55,11 @@ void monitorClientInitOnce() { } void createMonitorClient(const char* clusterKey, SEpSet epSet, void* pTransporter) { - taosWLockLatch(&monitorLock); if (clusterKey == NULL || strlen(clusterKey) == 0) { uError("createMonitorClient failed, clusterKey is NULL"); return; } - + taosWLockLatch(&monitorLock); if (taosHashGet(clusterMonitorInfoTable, clusterKey, strlen(clusterKey)) == NULL) { uInfo("createMonitorClient for %s.", clusterKey); ClientMonitor* pMonitor = taosMemoryCalloc(1, sizeof(ClientMonitor)); From ab12d110c0f59508c1dff7217c66b8b47645bf85 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Wed, 8 Nov 2023 14:28:37 +0800 Subject: [PATCH 026/107] delete unused variable --- include/libs/monitor/clientMonitor.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/libs/monitor/clientMonitor.h b/include/libs/monitor/clientMonitor.h index 0d238157c5..9d97c9004f 100644 --- a/include/libs/monitor/clientMonitor.h +++ b/include/libs/monitor/clientMonitor.h @@ -30,8 +30,6 @@ typedef struct { void* pTransporter; taos_collector_registry_t* registry; taos_collector_t* colector; - taos_counter_t* slow_query_counter; - taos_counter_t* select_counter; SHashObj* counters; } ClientMonitor; From 6b7a5b29103c8ed63def641e74b29523961a859d Mon Sep 17 00:00:00 2001 From: kailixu Date: Thu, 14 Dec 2023 11:41:47 +0800 Subject: [PATCH 027/107] fix: get tscobj by rid --- source/client/inc/clientInt.h | 2 +- source/client/src/clientEnv.c | 2 +- source/client/src/selectMonitor.c | 6 +++--- source/client/src/slowQueryMonitor.c | 6 +++--- source/client/test/clientMonitorTests.cpp | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index ef19fb7c51..fe3e55092c 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -430,7 +430,7 @@ int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, boo void clusterSlowQueryMonitorInit(const char* clusterKey); void clusterSlowQueryLog(const char* clusterKey, int32_t cost); -void SlowQueryLog(int64_t connId, int32_t cost); +void SlowQueryLog(int64_t rid, int32_t cost); void clusterSelectMonitorInit(const char* clusterKey); void clusterSelectLog(const char* clusterKey); diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 26b076e5ee..8c6292976f 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -114,7 +114,7 @@ static void deregisterRequest(SRequestObj *pRequest) { taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 ", Duration:%" PRId64 "us, SQL:%s", taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr); - SlowQueryLog(pTscObj->connId, duration); + SlowQueryLog(pTscObj->id, duration); } } diff --git a/source/client/src/selectMonitor.c b/source/client/src/selectMonitor.c index 0cb2073961..c1cab23188 100644 --- a/source/client/src/selectMonitor.c +++ b/source/client/src/selectMonitor.c @@ -33,14 +33,14 @@ void clusterSelectLog(const char* clusterKey) { taosClusterCounterInc(clusterKey, selectMonitorName, selectMonitorLabelValues); } -void selectLog(int64_t connId) { - STscObj* pTscObj = acquireTscObj(connId); +void selectLog(int64_t rid) { + STscObj* pTscObj = acquireTscObj(rid); if (pTscObj != NULL) { if(pTscObj->pAppInfo == NULL) { tscLog("selectLog, not found pAppInfo"); } return clusterSelectLog(pTscObj->pAppInfo->instKey); } else { - tscLog("selectLog, not found connect ID"); + tscLog("selectLog, not found rid"); } } diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 7d25cf87ca..420b66a954 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -59,15 +59,15 @@ void clusterSlowQueryLog(const char* clusterKey, int32_t cost) { taosClusterCounterInc(clusterKey, slowQueryName, slowQueryLabelValues); } -void SlowQueryLog(int64_t connId, int32_t cost) { +void SlowQueryLog(int64_t rid, int32_t cost) { if (!enableSlowQueryMonitor) return; - STscObj* pTscObj = acquireTscObj(connId); + STscObj* pTscObj = acquireTscObj(rid); if (pTscObj != NULL) { if(pTscObj->pAppInfo == NULL) { tscLog("SlowQueryLog, not found pAppInfo"); } return clusterSlowQueryLog(pTscObj->pAppInfo->instKey, cost); } else { - tscLog("SlowQueryLog, not found connect ID"); + tscLog("SlowQueryLog, not found rid"); } } diff --git a/source/client/test/clientMonitorTests.cpp b/source/client/test/clientMonitorTests.cpp index 8882e268e7..5272a2ab3a 100644 --- a/source/client/test/clientMonitorTests.cpp +++ b/source/client/test/clientMonitorTests.cpp @@ -68,11 +68,11 @@ TEST(clientMonitorTest, sendTest) { ASSERT_TRUE(taos != NULL); printf("connect taosd sucessfully.\n"); - int64_t connId = *(int64_t *)taos; - SlowQueryLog(connId, 1000); + int64_t rid = *(int64_t *)taos; + SlowQueryLog(rid, 1000); int i = 0; while (i < 20) { - SlowQueryLog(connId, i * 1000); + SlowQueryLog(rid, i * 1000); taosMsleep(10); ++i; } From dce02868b7ff2e94bdd025972f9465317862f889 Mon Sep 17 00:00:00 2001 From: kailixu Date: Fri, 19 Jan 2024 19:27:36 +0800 Subject: [PATCH 028/107] fix: user sysinfo --- source/libs/parser/src/parTranslater.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 70e4744644..3f1ae127a3 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -380,7 +380,10 @@ static int32_t getViewMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCac int32_t getTargetMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta, bool couldBeView) { int32_t code = TSDB_CODE_SUCCESS; - + if (!pParCxt->enableSysInfo && IS_SYS_DBNAME(pName->dbname)) { + code = TSDB_CODE_PAR_PERMISSION_DENIED; + return code; + } if (pParCxt->async) { code = getTableMetaFromCache(pMetaCache, pName, pMeta); #ifdef TD_ENTERPRISE From d9af07de6fe590e7960f1a8dddc5890b7ffd3b2b Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 24 Jan 2024 09:44:44 +0000 Subject: [PATCH 029/107] new table structure --- include/common/tglobal.h | 3 + include/libs/monitor/monitor.h | 7 +- include/libs/monitorfw/taos_collector.h | 2 + .../libs/monitorfw/taos_collector_registry.h | 6 +- include/libs/monitorfw/taos_gauge.h | 154 ++++ include/libs/monitorfw/taos_metric_sample.h | 2 + include/libs/monitorfw/taos_monitor.h | 2 + include/libs/monitorfw/taos_monitor_util.h | 31 + include/util/tdef.h | 6 + source/client/src/clientEnv.c | 5 + source/client/src/selectMonitor.c | 2 +- source/client/src/slowQueryMonitor.c | 2 +- source/common/src/tglobal.c | 14 +- source/dnode/mgmt/mgmt_dnode/inc/dmInt.h | 1 + source/dnode/mgmt/mgmt_dnode/src/dmInt.c | 1 + source/dnode/mgmt/mgmt_dnode/src/dmWorker.c | 11 + source/dnode/mgmt/node_mgmt/inc/dmMgmt.h | 1 + source/dnode/mgmt/node_mgmt/src/dmEnv.c | 1 + source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 18 +- source/dnode/mgmt/node_util/inc/dmUtil.h | 1 + source/dnode/mnode/impl/src/mndDnode.c | 124 +++- source/dnode/mnode/impl/src/mndMain.c | 3 + source/dnode/vnode/src/inc/vnodeInt.h | 24 + source/dnode/vnode/src/vnd/vnodeOpen.c | 22 + source/dnode/vnode/src/vnd/vnodeSvr.c | 69 +- source/libs/monitor/inc/monInt.h | 15 + source/libs/monitor/src/clientMonitor.c | 7 +- source/libs/monitor/src/monFramework.c | 656 ++++++++++++++++++ source/libs/monitor/src/monMain.c | 118 ++-- source/libs/monitor/test/monTest.cpp | 4 +- .../monitorfw/inc/taos_collector_registry_t.h | 2 +- .../inc/taos_metric_formatter_custom_i.h | 31 + .../libs/monitorfw/inc/taos_metric_sample_t.h | 8 +- source/libs/monitorfw/inc/taos_metric_t.h | 2 +- .../libs/monitorfw/inc/taos_monitor_util_i.h | 26 + source/libs/monitorfw/src/taos_collector.c | 6 + .../monitorfw/src/taos_collector_registry.c | 89 ++- source/libs/monitorfw/src/taos_gauge.c | 100 +++ source/libs/monitorfw/src/taos_metric.c | 9 +- .../monitorfw/src/taos_metric_formatter.c | 2 +- .../src/taos_metric_formatter_custom.c | 234 +++++++ .../libs/monitorfw/src/taos_metric_sample.c | 53 +- source/libs/monitorfw/src/taos_monitor_util.c | 110 +++ 43 files changed, 1878 insertions(+), 106 deletions(-) create mode 100644 include/libs/monitorfw/taos_gauge.h create mode 100644 include/libs/monitorfw/taos_monitor_util.h create mode 100644 source/libs/monitor/src/monFramework.c create mode 100644 source/libs/monitorfw/inc/taos_metric_formatter_custom_i.h create mode 100644 source/libs/monitorfw/inc/taos_monitor_util_i.h create mode 100644 source/libs/monitorfw/src/taos_gauge.c create mode 100644 source/libs/monitorfw/src/taos_metric_formatter_custom.c create mode 100644 source/libs/monitorfw/src/taos_monitor_util.c diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 3a7ff40125..9b8d63b327 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -105,6 +105,9 @@ extern char tsMonitorFqdn[]; extern uint16_t tsMonitorPort; extern int32_t tsMonitorMaxLogs; extern bool tsMonitorComp; +extern bool tsMonitorLogProtocol; +extern int32_t tsMonitorIntervalForBasic; +extern bool tsMonitorForceV2; // audit extern bool tsEnableAudit; diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 1f3d21777d..4c6ffa0add 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -100,6 +100,7 @@ typedef struct { int32_t mnode_id; char mnode_ep[TSDB_EP_LEN]; char role[MON_ROLE_LEN]; + int32_t syncState; } SMonMnodeDesc; typedef struct { @@ -125,6 +126,7 @@ typedef struct { typedef struct { int32_t dnode_id; char vnode_role[MON_ROLE_LEN]; + int32_t syncState; } SMonVnodeDesc; typedef struct { @@ -221,9 +223,8 @@ void monSetVmInfo(SMonVmInfo *pInfo); void monSetQmInfo(SMonQmInfo *pInfo); void monSetSmInfo(SMonSmInfo *pInfo); void monSetBmInfo(SMonBmInfo *pInfo); -void monSendReport(); -void monSendPromReport(); -void monSendContent(char *pCont); +void monGenAndSendReport(); +void monGenAndSendReportBasic(); void tFreeSMonMmInfo(SMonMmInfo *pInfo); void tFreeSMonVmInfo(SMonVmInfo *pInfo); diff --git a/include/libs/monitorfw/taos_collector.h b/include/libs/monitorfw/taos_collector.h index 918395ae72..8fe304ed7d 100644 --- a/include/libs/monitorfw/taos_collector.h +++ b/include/libs/monitorfw/taos_collector.h @@ -76,6 +76,8 @@ int taos_collector_destroy_generic(void *gen); */ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric); +taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name); + /** * @brief The collect function is responsible for doing any work involving a set of metrics and then returning them * for metric exposition. diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h index 915b132b11..063e8afb50 100644 --- a/include/libs/monitorfw/taos_collector_registry.h +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -86,6 +86,8 @@ taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metri */ int taos_collector_registry_register_metric(taos_metric_t *metric); +taos_metric_t *taos_collector_registry_get_metric(char* metric_name); + /** * @brief Register a collector with the given registry. Returns a non-zero integer value on failure. * @param self The target taos_collector_registry_t* @@ -105,7 +107,9 @@ int taos_collector_registry_register_collector(taos_collector_registry_t *self, */ const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char *ts, char *format); -int taos_collector_registry_clear_out(taos_collector_registry_t *self); +int taos_collector_registry_clear_batch(taos_collector_registry_t *self); + +const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, char *ts, char *format, char** prom_str); /** *@brief Validates that the given metric name complies with the specification: diff --git a/include/libs/monitorfw/taos_gauge.h b/include/libs/monitorfw/taos_gauge.h new file mode 100644 index 0000000000..a33661dfe4 --- /dev/null +++ b/include/libs/monitorfw/taos_gauge.h @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_gauge.h + * @brief https://prometheus.io/docs/concepts/metric_types/#gauge + */ + +#ifndef TAOS_GAUGE_H +#define TAOS_GAUGE_H + +#include + +#include "taos_metric.h" + +/** + * @brief A prometheus gauge. + * + * References + * * See https://prometheus.io/docs/concepts/metric_types/#gauge + */ +typedef taos_metric_t taos_gauge_t; + +/** + * @brief Constructs a taos_gauge_t* + * @param name The name of the metric + * @param help The metric description + * @param label_key_count The number of labels associated with the given metric. Pass 0 if the metric does not + * require labels. + * @param label_keys A collection of label keys. The number of keys MUST match the value passed as label_key_count. If + * no labels are required, pass NULL. Otherwise, it may be convenient to pass this value as a + * literal. + * @return The constructed taos_guage_t* + * + * // An example with labels + * taos_gauge_new("foo", "foo is a gauge with labels", 2, (const char**) { "one", "two" }); + * + * // An example without labels + * taos_gauge_new("foo", "foo is a gauge without labels", 0, NULL); + */ +taos_gauge_t *taos_gauge_new(const char *name, const char *help, size_t label_key_count, const char **label_keys); + +/** + * @brief Destroys a taos_gauge_t*. You must set self to NULL after destruction. A non-zero integer value will be + * returned on failure. + * @param self The target taos_gauge_t* + * @return A non-zero integer value upon failure + */ +int taos_gauge_destroy(taos_gauge_t *self); + +/** + * @brief Increment the taos_gauge_t* by 1. + * @param self The target taos_gauger_t* + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the gauge's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure + * *Example* + * + * // An example with labels + * taos_gauge_inc(foo_gauge, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_gauge_inc(foo_gauge, NULL); + */ +int taos_gauge_inc(taos_gauge_t *self, const char **label_values); + +/** + * @brief Decrement the taos_gauge_t* by 1. + * @param self The target taos_gauger_t* + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the gauge's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * *Example* + * + * // An example with labels + * taos_gauge_dec(foo_gauge, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_gauge_dec(foo_gauge, NULL); + */ +int taos_gauge_dec(taos_gauge_t *self, const char **label_values); + +/** + * @brief Add the value to the taos_gauge_t*. + * @param self The target taos_gauge_t* + * @param r_value The double to add to the taos_gauge_t passed as self. + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the gauge's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * + * *Example* + * + * // An example with labels + * taos_gauge_add(foo_gauge 22, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_gauge_add(foo_gauge, 22, NULL); + */ +int taos_gauge_add(taos_gauge_t *self, double r_value, const char **label_values); + +/** + * @brief Subtract the value to the taos_gauge. A non-zero integer value will be returned on failure. + * @param self The target taos_gauge_t* + * @param r_value The double to add to the taos_gauge_t passed as self. + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the gauge's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * + * *Example* + * + * // An example with labels + * taos_gauge_sub(foo_gauge 22, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_gauge_sub(foo_gauge, 22, NULL); + */ +int taos_gauge_sub(taos_gauge_t *self, double r_value, const char **label_values); + +/** + * @brief Set the value for the taos_gauge_t* + * @param self The target taos_gauge_t* + * @param r_value The double to which the taos_gauge_t* passed as self will be set + * @param label_values The label values associated with the metric sample being updated. The number of labels must + * match the value passed to label_key_count in the gauge's constructor. If no label values are + * necessary, pass NULL. Otherwise, It may be convenient to pass this value as a literal. + * @return A non-zero integer value upon failure. + * + * *Example* + * + * // An example with labels + * taos_gauge_set(foo_gauge 22, (const char**) { "bar", "bang" }); + * + * // An example without labels + * taos_gauge_set(foo_gauge, 22, NULL); + */ +int taos_gauge_set(taos_gauge_t *self, double r_value, const char **label_values); + +#endif // TAOS_GAUGE_H diff --git a/include/libs/monitorfw/taos_metric_sample.h b/include/libs/monitorfw/taos_metric_sample.h index 1c37f59e32..0283d56ad9 100644 --- a/include/libs/monitorfw/taos_metric_sample.h +++ b/include/libs/monitorfw/taos_metric_sample.h @@ -56,4 +56,6 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value); */ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value); +int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, double* old_value); + #endif // TAOS_METRIC_SAMPLE_H diff --git a/include/libs/monitorfw/taos_monitor.h b/include/libs/monitorfw/taos_monitor.h index ec4f007c45..c8569dd0a0 100644 --- a/include/libs/monitorfw/taos_monitor.h +++ b/include/libs/monitorfw/taos_monitor.h @@ -126,5 +126,7 @@ limitations under the License. #include "taos_map.h" #include "taos_metric.h" #include "taos_metric_sample.h" +#include "taos_monitor_util.h" +#include "taos_gauge.h" #endif // TAOS_INCLUDED \ No newline at end of file diff --git a/include/libs/monitorfw/taos_monitor_util.h b/include/libs/monitorfw/taos_monitor_util.h new file mode 100644 index 0000000000..a42d1ddcef --- /dev/null +++ b/include/libs/monitorfw/taos_monitor_util.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file taos_monitor_util.h + * @brief Functions for retrieving metric samples from metrics given an ordered set of labels + */ + +#ifndef TAOS_MONITOR_UTIL_H +#define TAOS_MONITOR_UTIL_H + +#include "taos_metric.h" +#include "tjson.h" + +void taos_monitor_split_str(char** arr, char* str, const char* del); +void taos_monitor_split_str_metric(char** arr, taos_metric_t* metric, const char* del, char** buf); +char* taos_monitor_get_metric_name(taos_metric_t* metric); + +#endif // TAOS_MONITOR_UTIL_H \ No newline at end of file diff --git a/include/util/tdef.h b/include/util/tdef.h index 875a6f5738..b6f64c368d 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -196,6 +196,8 @@ typedef enum ELogicConditionType { // ACCOUNT is a 32 bit positive integer // this is the length of its string representation, including the terminator zero #define TSDB_ACCT_ID_LEN 11 +#define TSDB_NODE_ID_LEN 11 +#define TSDB_VGROUP_ID_LEN 11 #define TSDB_MAX_COLUMNS 4096 #define TSDB_MIN_COLUMNS 2 // PRIMARY COLUMN(timestamp) + other columns @@ -543,6 +545,10 @@ enum { #define VNODE_TIMEOUT_SEC 60 #define MNODE_TIMEOUT_SEC 60 +#define MONITOR_TABLENAME_LEN 200 +#define MONITOR_TAG_NAME_LEN 100 +#define MONITOR_TAG_VALUE_LEN 300 +#define MONITOR_METRIC_NAME_LEN 100 #ifdef __cplusplus } #endif diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index b3d0023f9a..bb77c530c3 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -18,6 +18,7 @@ #include "clientLog.h" #include "functionMgt.h" #include "os.h" +#include "osSleep.h" #include "query.h" #include "qworker.h" #include "scheduler.h" @@ -82,6 +83,8 @@ static void deregisterRequest(SRequestObj *pRequest) { int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1); int32_t reqType = SLOW_LOG_TYPE_OTHERS; + //taosSsleep(3); + int64_t duration = taosGetTimestampUs() - pRequest->metric.start; tscDebug("0x%" PRIx64 " free Request from connObj: 0x%" PRIx64 ", reqId:0x%" PRIx64 " elapsed:%.2f ms, " @@ -108,6 +111,8 @@ static void deregisterRequest(SRequestObj *pRequest) { } } + duration = 7000000; + if (duration >= (tsSlowLogThreshold * 1000000UL)) { atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1); if (tsSlowLogScope & reqType) { diff --git a/source/client/src/selectMonitor.c b/source/client/src/selectMonitor.c index c1cab23188..58aba8de0b 100644 --- a/source/client/src/selectMonitor.c +++ b/source/client/src/selectMonitor.c @@ -16,7 +16,7 @@ #include "clientMonitor.h" #include "clientLog.h" -const char* selectMonitorName = "slow_query"; +const char* selectMonitorName = "slow_query:slow_query_metric"; const char* selectMonitorHelp = "slow query log when cost > 3s"; const int selectMonitorLabelCount = 1; const char* selectMonitorLabels[] = {"default"}; diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 420b66a954..4af00f5360 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -17,7 +17,7 @@ #include "clientLog.h" #include "tglobal.h" -const char* slowQueryName = "slow_query"; +const char* slowQueryName = "slow_query:slow_query_metric"; const char* slowQueryHelp = "slow query log when cost > 3s"; const int slowQueryLabelCount = 1; const char* slowQueryLabels[] = {"cost"}; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 30596d3e72..cb853c1a75 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -93,6 +93,9 @@ char tsMonitorFqdn[TSDB_FQDN_LEN] = {0}; uint16_t tsMonitorPort = 6043; int32_t tsMonitorMaxLogs = 100; bool tsMonitorComp = false; +bool tsMonitorLogProtocol = false; +int32_t tsMonitorIntervalForBasic = 30; +bool tsMonitorForceV2 = false; // audit bool tsEnableAudit = true; @@ -690,7 +693,11 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { if (cfgAddInt32(pCfg, "monitorPort", tsMonitorPort, 1, 65056, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; if (cfgAddInt32(pCfg, "monitorMaxLogs", tsMonitorMaxLogs, 1, 1000000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; if (cfgAddBool(pCfg, "monitorComp", tsMonitorComp, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; - + if (cfgAddBool(pCfg, "monitorLogProtocol", tsMonitorLogProtocol, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0) return -1; + if (cfgAddInt32(pCfg, "monitorIntervalForBasic", tsMonitorIntervalForBasic, 1, 200000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) + return -1; + if (cfgAddBool(pCfg, "monitorForceV2", tsMonitorForceV2, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; + if (cfgAddBool(pCfg, "audit", tsEnableAudit, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0) return -1; if (cfgAddBool(pCfg, "auditCreateTable", tsEnableAuditCreateTable, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; if (cfgAddInt32(pCfg, "auditInterval", tsAuditInterval, 500, 200000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) @@ -1152,7 +1159,10 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsMonitorMaxLogs = cfgGetItem(pCfg, "monitorMaxLogs")->i32; tsMonitorComp = cfgGetItem(pCfg, "monitorComp")->bval; tsQueryRspPolicy = cfgGetItem(pCfg, "queryRspPolicy")->i32; - + tsMonitorLogProtocol = cfgGetItem(pCfg, "monitorLogProtocol")->bval; + tsMonitorIntervalForBasic = cfgGetItem(pCfg, "monitorIntervalForBasic")->i32; + tsMonitorForceV2 = cfgGetItem(pCfg, "monitorForceV2")->i32; + tsEnableAudit = cfgGetItem(pCfg, "audit")->bval; tsEnableAuditCreateTable = cfgGetItem(pCfg, "auditCreateTable")->bval; tsAuditInterval = cfgGetItem(pCfg, "auditInterval")->i32; diff --git a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h index 80502e2662..975246a10f 100644 --- a/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h +++ b/source/dnode/mgmt/mgmt_dnode/inc/dmInt.h @@ -43,6 +43,7 @@ typedef struct SDnodeMgmt { GetMnodeLoadsFp getMnodeLoadsFp; GetQnodeLoadsFp getQnodeLoadsFp; int32_t statusSeq; + SendMonitorReportFp sendMonitorReportFpBasic; } SDnodeMgmt; // dmHandle.c diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmInt.c b/source/dnode/mgmt/mgmt_dnode/src/dmInt.c index b9dd45f1c0..a651fbf060 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmInt.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmInt.c @@ -65,6 +65,7 @@ static int32_t dmOpenMgmt(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) { pMgmt->processDropNodeFp = pInput->processDropNodeFp; pMgmt->sendMonitorReportFp = pInput->sendMonitorReportFp; pMgmt->sendAuditRecordsFp = pInput->sendAuditRecordFp; + pMgmt->sendMonitorReportFpBasic = pInput->sendMonitorReportFpBasic; pMgmt->getVnodeLoadsFp = pInput->getVnodeLoadsFp; pMgmt->getVnodeLoadsLiteFp = pInput->getVnodeLoadsLiteFp; pMgmt->getMnodeLoadsFp = pInput->getMnodeLoadsFp; diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c index af43804db4..1f2dc575d0 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c @@ -81,6 +81,7 @@ static void *dmNotifyThreadFp(void *param) { static void *dmMonitorThreadFp(void *param) { SDnodeMgmt *pMgmt = param; int64_t lastTime = taosGetTimestampMs(); + int64_t lastTimeForBasic = taosGetTimestampMs(); setThreadName("dnode-monitor"); while (1) { @@ -88,12 +89,22 @@ static void *dmMonitorThreadFp(void *param) { if (pMgmt->pData->dropped || pMgmt->pData->stopped) break; int64_t curTime = taosGetTimestampMs(); + if (curTime < lastTime) lastTime = curTime; float interval = (curTime - lastTime) / 1000.0f; if (interval >= tsMonitorInterval) { (*pMgmt->sendMonitorReportFp)(); lastTime = curTime; } + + if(tsMonitorForceV2){ + if (curTime < lastTimeForBasic) lastTimeForBasic = curTime; + float intervalForBasic = (curTime - lastTimeForBasic) / 1000.0f; + if (intervalForBasic >= tsMonitorIntervalForBasic) { + (*pMgmt->sendMonitorReportFpBasic)(); + lastTimeForBasic = curTime; + } + } } return NULL; diff --git a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h index c646bb4bdd..25e388672e 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h @@ -149,6 +149,7 @@ int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg); // dmMonitor.c void dmSendMonitorReport(); void dmSendAuditRecords(); +void dmSendMonitorReportBasic(); void dmGetVnodeLoads(SMonVloadInfo *pInfo); void dmGetVnodeLoadsLite(SMonVloadInfo *pInfo); void dmGetMnodeLoads(SMonMloadInfo *pInfo); diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c index f9bba19fbb..b343be9426 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c +++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c @@ -398,6 +398,7 @@ SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper) { .processDropNodeFp = dmProcessDropNodeReq, .sendMonitorReportFp = dmSendMonitorReport, .sendAuditRecordFp = auditSendRecordsInBatch, + .sendMonitorReportFpBasic = dmSendMonitorReportBasic, .getVnodeLoadsFp = dmGetVnodeLoads, .getVnodeLoadsLiteFp = dmGetVnodeLoadsLite, .getMnodeLoadsFp = dmGetMnodeLoads, diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 69a7956c9c..590c25b936 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -19,7 +19,8 @@ #include "audit.h" static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { - pInfo->protocol = 1; + //pInfo->protocol = 1; + pInfo->protocol = 2; pInfo->dnode_id = pDnode->data.dnodeId; pInfo->cluster_id = pDnode->data.clusterId; tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN); @@ -106,9 +107,20 @@ void dmSendMonitorReport() { dmGetVmMonitorInfo(pDnode); dmGetQmMonitorInfo(pDnode); dmGetSmMonitorInfo(pDnode); - monSendReport(); + monGenAndSendReport(); +} - monSendPromReport(); +void dmSendMonitorReportBasic() { + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; + dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); + + SDnode *pDnode = dmInstance(); + dmGetDmMonitorInfo(pDnode); + dmGetMmMonitorInfo(pDnode); + //dmGetVmMonitorInfo(pDnode); + //dmGetQmMonitorInfo(pDnode); + //dmGetSmMonitorInfo(pDnode); + monGenAndSendReportBasic(); } //Todo: put this in seperate file in the future diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index 4769ef8538..16c464d17c 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -122,6 +122,7 @@ typedef struct { ProcessDropNodeFp processDropNodeFp; SendMonitorReportFp sendMonitorReportFp; SendAuditRecordsFp sendAuditRecordFp; + SendMonitorReportFp sendMonitorReportFpBasic; GetVnodeLoadsFp getVnodeLoadsFp; GetVnodeLoadsFp getVnodeLoadsLiteFp; GetMnodeLoadsFp getMnodeLoadsFp; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index b75753a87f..bd0c29f4c8 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -14,6 +14,7 @@ */ #define _DEFAULT_SOURCE +#include "tjson.h" #include "mndDnode.h" #include "audit.h" #include "mndCluster.h" @@ -28,6 +29,7 @@ #include "mndVgroup.h" #include "tmisce.h" #include "tunit.h" +#include "taos_monitor.h" #define TSDB_DNODE_VER_NUMBER 2 #define TSDB_DNODE_RESERVE_SIZE 64 @@ -503,9 +505,129 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { goto _OVER; } - monSendContent(pReq->pCont); + if(tsMonitorLogProtocol){ + mInfo("process statis req,\n %s", statisReq.pCont); + } + + SJson* pJson = tjsonParse(statisReq.pCont); + + int32_t ts_size = tjsonGetArraySize(pJson); + + for(int32_t i = 0; i < ts_size; i++){ + SJson* item = tjsonGetArrayItem(pJson, i); + + SJson* tables = tjsonGetObjectItem(item, "tables"); + + int32_t tableSize = tjsonGetArraySize(tables); + for(int32_t i = 0; i < tableSize; i++){ + SJson* table = tjsonGetArrayItem(tables, i); + + char tableName[MONITOR_TABLENAME_LEN] = {0}; + tjsonGetStringValue(table, "name", tableName); + + SJson* metricGroups = tjsonGetObjectItem(table, "metric_groups"); + + int32_t size = tjsonGetArraySize(metricGroups); + for(int32_t i = 0; i < size; i++){ + SJson* item = tjsonGetArrayItem(metricGroups, i); + + SJson* arrayTag = tjsonGetObjectItem(item, "tags"); + + int32_t tagSize = tjsonGetArraySize(arrayTag); + + char** labels = taosMemoryMalloc(sizeof(char*) * tagSize); + char** sample_labels = taosMemoryMalloc(sizeof(char*) * tagSize); + + for(int32_t j = 0; j < tagSize; j++){ + SJson* item = tjsonGetArrayItem(arrayTag, j); + + *(labels + j) = taosMemoryMalloc(MONITOR_TAG_NAME_LEN); + tjsonGetStringValue(item, "name", *(labels + j)); + + *(sample_labels + j) = taosMemoryMalloc(MONITOR_TAG_VALUE_LEN); + tjsonGetStringValue(item, "value", *(sample_labels + j)); + } + + SJson* metrics = tjsonGetObjectItem(item, "metrics"); + + int32_t metricLen = tjsonGetArraySize(metrics); + for(int32_t j = 0; j < metricLen; j++){ + SJson *item = tjsonGetArrayItem(metrics, j); + + char name[MONITOR_METRIC_NAME_LEN] = {0}; + tjsonGetStringValue(item, "name", name); + + double value = 0; + tjsonGetDoubleValue(item, "value", &value); + + double type = 0; + tjsonGetDoubleValue(item, "type", &type); + + int32_t metricNameLen = strlen(name) + strlen(tableName) + 2; + char* metricName = taosMemoryMalloc(metricNameLen); + memset(metricName, 0, metricNameLen); + sprintf(metricName, "%s:%s", tableName, name); + + taos_metric_t* metric = taos_collector_registry_get_metric(metricName); + if(metric == NULL){ + if(type == 0){ + metric = taos_counter_new(metricName, "", tagSize, (const char**)labels); + } + if(type == 1){ + metric = taos_gauge_new(metricName, "", tagSize, (const char**)labels); + } + mTrace("fail to get metric from registry, new one metric:%p", metric); + + if(taos_collector_registry_register_metric(metric) == 1){ + if(type == 0){ + taos_counter_destroy(metric); + } + if(type == 1){ + taos_gauge_destroy(metric); + } + + metric = taos_collector_registry_get_metric(metricName); + + mTrace("fail to register metric, get metric from registry:%p", metric); + } + else{ + mTrace("succeed to register metric:%p", metric); + } + } + else{ + mTrace("get metric from registry:%p", metric); + } + + if(type == 0){ + taos_counter_add(metric, value, (const char**)sample_labels); + } + if(type == 1){ + taos_gauge_set(metric, value, (const char**)sample_labels); + } + + taosMemoryFreeClear(metricName); + } + + for(int32_t j = 0; j < tagSize; j++){ + taosMemoryFreeClear(*(labels + j)); + taosMemoryFreeClear(*(sample_labels + j)); + } + + taosMemoryFreeClear(sample_labels); + taosMemoryFreeClear(labels); + } + } + + } + + code = 0; _OVER: + if(pJson != NULL){ + tjsonDelete(pJson); + pJson = NULL; + } + tFreeSStatisReq(&statisReq); return code; } diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 38a92b43e7..51abcc4eae 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -859,8 +859,10 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr pClusterInfo->master_uptime = (float)mndGetClusterUpTime(pMnode) / 86400.0f; // pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f); tstrncpy(desc.role, syncStr(TAOS_SYNC_STATE_LEADER), sizeof(desc.role)); + desc.syncState = TAOS_SYNC_STATE_LEADER; } else { tstrncpy(desc.role, syncStr(pObj->syncState), sizeof(desc.role)); + desc.syncState = pObj->syncState; } taosArrayPush(pClusterInfo->mnodes, &desc); sdbRelease(pSdb, pObj); @@ -891,6 +893,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr SMonVnodeDesc *pVnDesc = &desc.vnodes[i]; pVnDesc->dnode_id = pVgid->dnodeId; tstrncpy(pVnDesc->vnode_role, syncStr(pVgid->syncState), sizeof(pVnDesc->vnode_role)); + pVnDesc->syncState = pVgid->syncState; if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) { tstrncpy(desc.status, "ready", sizeof(desc.status)); pClusterInfo->vgroups_alive++; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index c1a4754b62..eb9c3483d1 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -47,6 +47,8 @@ #include "vnode.h" +#include "taos_monitor.h" + #ifdef __cplusplus extern "C" { #endif @@ -104,6 +106,20 @@ typedef struct SQueryNode SQueryNode; #define VND_INFO_FNAME "vnode.json" #define VND_INFO_FNAME_TMP "vnode_tmp.json" +#define VNODE_METRIC_SQL_COUNT "taoscd_sql_req:count" + +#define VNODE_METRIC_TAG_NAME_SQL_TYPE "sql_type" +#define VNODE_METRIC_TAG_NAME_CLUSTER_ID "cluster_id" +#define VNODE_METRIC_TAG_NAME_DNODE_ID "dnode_id" +#define VNODE_METRIC_TAG_NAME_DNODE_EP "dnode_ep" +#define VNODE_METRIC_TAG_NAME_VGROUP_ID "vgroup_id" +#define VNODE_METRIC_TAG_NAME_USERNAME "username" +#define VNODE_METRIC_TAG_NAME_RESULT "result" + +#define VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS "insert_affected_rows" +//#define VNODE_METRIC_TAG_VALUE_INSERT "insert" +#define VNODE_METRIC_TAG_VALUE_DELETE "delete" + // vnd.h typedef int32_t (*_query_reseek_func_t)(void* pQHandle); struct SQueryNode { @@ -438,6 +454,13 @@ typedef struct SVCommitSched { int64_t maxWaitMs; } SVCommitSched; +typedef struct SVMonitorObj{ + char strClusterId[TSDB_CLUSTER_ID_LEN]; + char strDnodeId[TSDB_NODE_ID_LEN]; + char strVgId[TSDB_VGROUP_ID_LEN]; + taos_counter_t *insertCounter; +}SVMonitorObj; + struct SVnode { char* path; SVnodeCfg config; @@ -476,6 +499,7 @@ struct SVnode { int32_t blockSec; int64_t blockSeq; SQHandle* pQuery; + SVMonitorObj monitor; }; #define TD_VID(PVNODE) ((PVNODE)->config.vgId) diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 946ce9d278..e1f76b3a25 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -480,6 +480,28 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC vnodeRollback(pVnode); } + snprintf(pVnode->monitor.strClusterId, TSDB_CLUSTER_ID_LEN, "%"PRId64, pVnode->config.syncCfg.nodeInfo[0].clusterId); + snprintf(pVnode->monitor.strDnodeId, TSDB_NODE_ID_LEN, "%"PRId32, pVnode->config.syncCfg.nodeInfo[0].nodeId); + snprintf(pVnode->monitor.strVgId, TSDB_VGROUP_ID_LEN, "%"PRId32, pVnode->config.vgId); + + if(pVnode->monitor.insertCounter == NULL){ + int32_t label_count = 7; + const char *sample_labels[] = {VNODE_METRIC_TAG_NAME_SQL_TYPE, VNODE_METRIC_TAG_NAME_CLUSTER_ID, + VNODE_METRIC_TAG_NAME_DNODE_ID, VNODE_METRIC_TAG_NAME_DNODE_EP, + VNODE_METRIC_TAG_NAME_VGROUP_ID, VNODE_METRIC_TAG_NAME_USERNAME, + VNODE_METRIC_TAG_NAME_RESULT}; + taos_counter_t *counter = taos_counter_new(VNODE_METRIC_SQL_COUNT, "counter for insert sql", + label_count, sample_labels); + vInfo("vgId:%d, new metric:%p",TD_VID(pVnode), counter); + if(taos_collector_registry_register_metric(counter) == 1){ + taos_counter_destroy(counter); + counter = taos_collector_registry_get_metric(VNODE_METRIC_SQL_COUNT); + vInfo("vgId:%d, get metric from registry:%p",TD_VID(pVnode), counter); + } + pVnode->monitor.insertCounter = counter; + vInfo("vgId:%d, succeed to set metric:%p",TD_VID(pVnode), counter); + } + return pVnode; _err: diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 1c45c93346..d79d239a50 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -21,8 +21,6 @@ #include "vnd.h" #include "vnode.h" #include "vnodeInt.h" -#include "taos_monitor.h" - static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); @@ -32,20 +30,21 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, static int32_t vnodeProcessAlterTbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessDropTbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, SRpcMsg *pOriginRpc); -static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); +static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, + SRpcMsg *pOriginalMsg); static int32_t vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterConfirmReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessAlterConfigReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessDropTtlTbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessTrimReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); -static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); +static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, + SRpcMsg *pOriginalMsg); static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessCreateIndexReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessDropIndexReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessCompactVnodeReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); static int32_t vnodeProcessConfigChangeReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); -taos_counter_t *insert_counter = NULL; extern int32_t vnodeProcessKillCompactReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp); extern int32_t vnodeQueryCompactProgress(SVnode *pVnode, SRpcMsg *pMsg); @@ -535,10 +534,10 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg break; /* TSDB */ case TDMT_VND_SUBMIT: - if (vnodeProcessSubmitReq(pVnode, ver, pMsg->pCont, pMsg->contLen, pRsp) < 0) goto _err; + if (vnodeProcessSubmitReq(pVnode, ver, pMsg->pCont, pMsg->contLen, pRsp, pMsg) < 0) goto _err; break; case TDMT_VND_DELETE: - if (vnodeProcessDeleteReq(pVnode, ver, pReq, len, pRsp) < 0) goto _err; + if (vnodeProcessDeleteReq(pVnode, ver, pReq, len, pRsp, pMsg) < 0) goto _err; break; case TDMT_VND_BATCH_DEL: if (vnodeProcessBatchDeleteReq(pVnode, ver, pReq, len, pRsp) < 0) goto _err; @@ -1482,7 +1481,8 @@ static int32_t vnodeRebuildSubmitReqMsg(SSubmitReq2 *pSubmitReq, void **ppMsg) { return code; } -static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { +static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, + SRpcMsg *pOriginalMsg) { int32_t code = 0; terrno = 0; @@ -1700,28 +1700,33 @@ _exit: atomic_add_fetch_64(&pVnode->statis.nInsert, pSubmitRsp->affectedRows); atomic_add_fetch_64(&pVnode->statis.nInsertSuccess, pSubmitRsp->affectedRows); atomic_add_fetch_64(&pVnode->statis.nBatchInsert, 1); + + const char *sample_labels[] = {VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Success"}; + taos_counter_add(pVnode->monitor.insertCounter, pSubmitRsp->affectedRows, sample_labels); + if (code == 0) { atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, 1); code = tdProcessRSmaSubmit(pVnode->pSma, ver, pSubmitReq, pReq, len); } + /* + if (code == 0) { + atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, 1); + code = tdProcessRSmaSubmit(pVnode->pSma, ver, pSubmitReq, pReq, len); - if(insert_counter == NULL){ - int32_t label_count =2; - const char *sample_labels[] = {"vgid", "endpoint"}; - taos_counter_t *counter = taos_counter_new("insert_counter", "counter for insert sql", label_count, sample_labels); - if(taos_collector_registry_register_metric(counter) == 1){ - taos_counter_destroy(counter); - } - else{ - atomic_store_ptr(&insert_counter, counter); - } + const char *batch_sample_labels[] = {VNODE_METRIC_TAG_VALUE_INSERT, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Success"}; + taos_counter_inc(pVnode->monitor.insertCounter, batch_sample_labels); } - - char vgId[50]; - sprintf(vgId, "%"PRId32, TD_VID(pVnode)); - const char *sample_labels[] = {vgId, tsLocalEp}; - - taos_counter_inc(insert_counter, sample_labels); + else{ + const char *batch_sample_labels[] = {VNODE_METRIC_TAG_VALUE_INSERT, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Failed"}; + taos_counter_inc(pVnode->monitor.insertCounter, batch_sample_labels); + } + */ // clear taosArrayDestroy(newTbUids); @@ -1977,7 +1982,8 @@ static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t ver, void *pRe return 0; } -static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { +static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, + SRpcMsg *pOriginalMsg) { int32_t code = 0; SDecoder *pCoder = &(SDecoder){0}; SDeleteRes *pRes = &(SDeleteRes){0}; @@ -2020,6 +2026,19 @@ static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, in return code; _err: + if(code == TSDB_CODE_SUCCESS){ + const char *batch_sample_labels[] = {VNODE_METRIC_TAG_VALUE_DELETE, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Success"}; + taos_counter_inc(pVnode->monitor.insertCounter, batch_sample_labels); + } + else{ + const char *batch_sample_labels[] = {VNODE_METRIC_TAG_VALUE_DELETE, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Failed"}; + taos_counter_inc(pVnode->monitor.insertCounter, batch_sample_labels); + } + return code; } static int32_t vnodeProcessCreateIndexReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { diff --git a/source/libs/monitor/inc/monInt.h b/source/libs/monitor/inc/monInt.h index c5219c60b2..7fc718393b 100644 --- a/source/libs/monitor/inc/monInt.h +++ b/source/libs/monitor/inc/monInt.h @@ -20,6 +20,7 @@ #include "query.h" #include "tjson.h" +#include "thash.h" typedef struct { int64_t curTime; @@ -45,8 +46,22 @@ typedef struct { SMonSmInfo smInfo; SMonQmInfo qmInfo; SMonBmInfo bmInfo; + SHashObj *metrics; } SMonitor; +void monGenClusterInfoTable(SMonInfo *pMonitor); +void monGenVgroupInfoTable(SMonInfo *pMonitor); +void monGenDnodeInfoTable(SMonInfo *pMonitor); +void monGenDnodeStatusInfoTable(SMonInfo *pMonitor); +void monGenDataDiskTable(SMonInfo *pMonitor); +void monGenLogDiskTable(SMonInfo *pMonitor); +void monGenMnodeRoleTable(SMonInfo *pMonitor); +void monGenVnodeRoleTable(SMonInfo *pMonitor); + +void monSendPromReport(); +void monInitMonitorFW(); +void monCleanupMonitorFW(); + #ifdef __cplusplus } #endif diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index 15d047f3c0..64df693e1e 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -10,16 +10,17 @@ tmr_h tmrStartHandle; SHashObj* clusterMonitorInfoTable; static const int interval = 1000; // ms -static const int sendBathchSize = 10; +static const int sendBathchSize = 1; int32_t sendReport(ClientMonitor* pMonitor, char* pCont); void generateClusterReport(ClientMonitor* pMonitor, bool send) { char ts[50]; sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); - char* pCont = (char*)taos_collector_registry_bridge(pMonitor->registry, ts, "%" PRId64); + char* pCont = (char*)taos_collector_registry_bridge_new(pMonitor->registry, ts, "%" PRId64, NULL); + uInfo("report cont:\n%s", pCont); if (send && strlen(pCont) != TSDB_CODE_SUCCESS) { if (sendReport(pMonitor, pCont) == 0) { - taos_collector_registry_clear_out(pMonitor->registry); + taos_collector_registry_clear_batch(pMonitor->registry); } } } diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c new file mode 100644 index 0000000000..3cc2ab8c90 --- /dev/null +++ b/source/libs/monitor/src/monFramework.c @@ -0,0 +1,656 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include "monitor.h" +#include "monInt.h" + +#include "thash.h" +#include "taos_monitor.h" +#include "thttp.h" +#include "ttime.h" +#include "tglobal.h" + +extern SMonitor tsMonitor; +extern char* tsMonUri; +extern char* tsMonFwUri; + +#define LEVEL_LEN 11 + +#define CLUSTER_TABLE "taosd_cluster_info" + +#define MASTER_UPTIME CLUSTER_TABLE":master_uptime" +#define DBS_TOTAL CLUSTER_TABLE":dbs_total" +#define TBS_TOTAL CLUSTER_TABLE":tbs_total" +#define STBS_TOTAL CLUSTER_TABLE":stbs_total" +#define VGROUPS_TOTAL CLUSTER_TABLE":vgroups_total" +#define VGROUPS_ALIVE CLUSTER_TABLE":vgroups_alive" +#define VNODES_TOTAL CLUSTER_TABLE":vnodes_total" +#define VNODES_ALIVE CLUSTER_TABLE":vnodes_alive" +#define DNODES_TOTAL CLUSTER_TABLE":dnodes_total" +#define DNODES_ALIVE CLUSTER_TABLE":dnodes_alive" +#define CONNECTIONS_TOTAL CLUSTER_TABLE":connections_total" +#define TOPICS_TOTAL CLUSTER_TABLE":topics_total" +#define STREAMS_TOTAL CLUSTER_TABLE":streams_total" +#define EXPIRE_TIME CLUSTER_TABLE":expire_time" +#define TIMESERIES_USED CLUSTER_TABLE":timeseries_used" +#define TIMESERIES_TOTAL CLUSTER_TABLE":timeseries_total" + +#define VGROUP_TABLE "taosd_cluster_vgroups_info" + +#define TABLES_NUM VGROUP_TABLE":tables_num" +#define STATUS VGROUP_TABLE":status" + +#define DNODE_TABLE "taosd_dnodes_info" + +#define UPTIME DNODE_TABLE":uptime" +#define CPU_ENGINE DNODE_TABLE":cpu_engine" +#define CPU_SYSTEM DNODE_TABLE":cpu_system" +#define CPU_CORE DNODE_TABLE":cpu_cores" +#define MEM_ENGINE DNODE_TABLE":mem_engine" +#define MEM_SYSTEM DNODE_TABLE":mem_system" +#define MEM_TOTAL DNODE_TABLE":mem_total" +#define DISK_ENGINE DNODE_TABLE":disk_engine" +#define DISK_USED DNODE_TABLE":disk_used" +#define DISK_TOTAL DNODE_TABLE":disk_total" +#define NET_IN DNODE_TABLE":net_in" +#define NET_OUT DNODE_TABLE":net_out" +#define IO_READ DNODE_TABLE":io_read" +#define IO_WRITE DNODE_TABLE":io_write" +#define IO_READ_DISK DNODE_TABLE":io_read_disk" +#define IO_WRITE_DISK DNODE_TABLE":io_write_disk" +#define ERRORS DNODE_TABLE":errors" +#define VNODES_NUM DNODE_TABLE":vnodes_num" +#define MASTERS DNODE_TABLE":masters" +#define HAS_MNODE DNODE_TABLE":has_mnode" +#define HAS_QNODE DNODE_TABLE":has_qnode" +#define HAS_SNODE DNODE_TABLE":has_snode" +#define DNODE_LOG_ERROR DNODE_TABLE":ERROR" +#define DNODE_LOG_INFO DNODE_TABLE":INFO" +#define DNODE_LOG_DEBUG DNODE_TABLE":DEBUG" +#define DNODE_LOG_TRACE DNODE_TABLE":TRACE" + +#define DNODE_STATUS "taosd_dnodes_status:status" + +#define DATADIR_TABLE "taosd_dnodes_data_dirs" + +#define DNODE_DATA_AVAIL DATADIR_TABLE":avail" +#define DNODE_DATA_USED DATADIR_TABLE":used" +#define DNODE_DATA_TOTAL DATADIR_TABLE":total" + +#define LOGDIR_TABLE "taosd_dnodes_log_dirs" + +#define DNODE_LOG_AVAIL LOGDIR_TABLE":avail" +#define DNODE_LOG_USED LOGDIR_TABLE":used" +#define DNODE_LOG_TOTAL LOGDIR_TABLE":total" + +#define MNODE_ROLE "taosd_mnodes_info:role" +#define VNODE_ROLE "taosd_vnodes_info:role" + +void monInitMonitorFW(){ + taos_collector_registry_default_init(); + + tsMonitor.metrics = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); + taos_gauge_t *gauge = NULL; + + int32_t label_count =1; + const char *sample_labels[] = {"cluster_id"}; + char *metric[] = {MASTER_UPTIME, DBS_TOTAL, TBS_TOTAL, STBS_TOTAL, VGROUPS_TOTAL, + VGROUPS_ALIVE, VNODES_TOTAL, VNODES_ALIVE, CONNECTIONS_TOTAL, TOPICS_TOTAL, STREAMS_TOTAL, + DNODES_TOTAL, DNODES_ALIVE, EXPIRE_TIME, TIMESERIES_USED, + TIMESERIES_TOTAL}; + for(int32_t i = 0; i < 16; i++){ + gauge= taos_gauge_new(metric[i], "", label_count, sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, metric[i], strlen(metric[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t vgroup_label_count = 3; + const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; + char *vgroup_metrics[] = {TABLES_NUM, STATUS}; + for(int32_t i = 0; i < 2; i++){ + gauge= taos_gauge_new(vgroup_metrics[i], "", vgroup_label_count, vgroup_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, vgroup_metrics[i], strlen(vgroup_metrics[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t dnodes_label_count = 3; + const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; + char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, + MEM_TOTAL, DISK_ENGINE, DISK_USED, DISK_TOTAL, NET_IN, + NET_OUT, IO_READ, IO_WRITE, IO_READ_DISK, IO_WRITE_DISK, ERRORS, + VNODES_NUM, MASTERS, HAS_MNODE, HAS_QNODE, HAS_SNODE, DNODE_STATUS, + DNODE_LOG_ERROR, DNODE_LOG_INFO, DNODE_LOG_DEBUG, DNODE_LOG_TRACE}; + for(int32_t i = 0; i < 27; i++){ + gauge= taos_gauge_new(dnodes_gauges[i], "", dnodes_label_count, dnodes_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, dnodes_gauges[i], strlen(dnodes_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t dnodes_data_label_count = 5; + const char *dnodes_data_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep", "data_dir_name", "data_dir_level"}; + char *dnodes_data_gauges[] = {DNODE_DATA_AVAIL, DNODE_DATA_USED, DNODE_DATA_TOTAL}; + for(int32_t i = 0; i < 3; i++){ + gauge= taos_gauge_new(dnodes_data_gauges[i], "", dnodes_data_label_count, dnodes_data_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, dnodes_data_gauges[i], strlen(dnodes_data_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t dnodes_log_label_count = 4; + const char *dnodes_log_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep", "data_dir_name"}; + char *dnodes_log_gauges[] = {DNODE_LOG_AVAIL, DNODE_LOG_USED, DNODE_LOG_TOTAL}; + for(int32_t i = 0; i < 3; i++){ + gauge= taos_gauge_new(dnodes_log_gauges[i], "", dnodes_log_label_count, dnodes_log_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, dnodes_log_gauges[i], strlen(dnodes_log_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t mnodes_role_label_count = 3; + const char *mnodes_role_sample_labels[] = {"cluster_id", "mnode_id", "mnode_ep"}; + char *mnodes_role_gauges[] = {MNODE_ROLE}; + for(int32_t i = 0; i < 1; i++){ + gauge= taos_gauge_new(mnodes_role_gauges[i], "", mnodes_role_label_count, mnodes_role_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + + int32_t vnodes_role_label_count = 4; + const char *vnodes_role_sample_labels[] = {"cluster_id", "vgroup_id", "database_name", "dnode_id"}; + char *vnodes_role_gauges[] = {VNODE_ROLE}; + for(int32_t i = 0; i < 1; i++){ + gauge= taos_gauge_new(vnodes_role_gauges[i], "", vnodes_role_label_count, vnodes_role_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } +} + +void monCleanupMonitorFW(){ + taosHashCleanup(tsMonitor.metrics); + taos_collector_registry_destroy(TAOS_COLLECTOR_REGISTRY_DEFAULT); + TAOS_COLLECTOR_REGISTRY_DEFAULT = NULL; +} + +void monGenClusterInfoTable(SMonInfo *pMonitor){ + SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; + SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; + SMonGrantInfo *pGrantInfo = &pMonitor->mmInfo.grant; + + if(pBasicInfo->cluster_id == 0) { + uError("failed to generate dnode info table since cluster_id is 0"); + return; + } + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + //cluster info + char buf[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(buf, TSDB_CLUSTER_ID_LEN, "%"PRId64, pBasicInfo->cluster_id); + const char *sample_labels[] = {buf}; + + taos_gauge_t **metric = NULL; + + metric = taosHashGet(tsMonitor.metrics, MASTER_UPTIME, strlen(MASTER_UPTIME)); + taos_gauge_set(*metric, pInfo->master_uptime, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DBS_TOTAL, strlen(DBS_TOTAL)); + taos_gauge_set(*metric, pInfo->dbs_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, TBS_TOTAL, strlen(TBS_TOTAL)); + taos_gauge_set(*metric, pInfo->tbs_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, STBS_TOTAL, strlen(STBS_TOTAL)); + taos_gauge_set(*metric, pInfo->stbs_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, VGROUPS_TOTAL, strlen(VGROUPS_TOTAL)); + taos_gauge_set(*metric, pInfo->vgroups_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, VGROUPS_ALIVE, strlen(VGROUPS_ALIVE)); + taos_gauge_set(*metric, pInfo->vgroups_alive, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, VNODES_TOTAL, strlen(VNODES_TOTAL)); + taos_gauge_set(*metric, pInfo->vnodes_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, VNODES_ALIVE, strlen(VNODES_ALIVE)); + taos_gauge_set(*metric, pInfo->vnodes_alive, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, CONNECTIONS_TOTAL, strlen(CONNECTIONS_TOTAL)); + taos_gauge_set(*metric, pInfo->connections_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, TOPICS_TOTAL, strlen(TOPICS_TOTAL)); + taos_gauge_set(*metric, pInfo->topics_toal, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, STREAMS_TOTAL, strlen(STREAMS_TOTAL)); + taos_gauge_set(*metric, pInfo->streams_total, sample_labels); + + //dnodes number + int32_t dnode_total = taosArrayGetSize(pInfo->dnodes); + int32_t dnode_alive = 0; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) { + SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); + + if(strcmp(pDnodeDesc->status, "ready") == 0){ + dnode_alive++; + } + } + + metric = taosHashGet(tsMonitor.metrics, DNODES_TOTAL, strlen(DNODES_TOTAL)); + taos_gauge_set(*metric, dnode_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODES_ALIVE, strlen(DNODES_ALIVE)); + taos_gauge_set(*metric, dnode_alive, sample_labels); + + //grant info + metric = taosHashGet(tsMonitor.metrics, EXPIRE_TIME, strlen(EXPIRE_TIME)); + taos_gauge_set(*metric, pGrantInfo->expire_time, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, TIMESERIES_USED, strlen(TIMESERIES_USED)); + taos_gauge_set(*metric, pGrantInfo->timeseries_used, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, TIMESERIES_TOTAL, strlen(TIMESERIES_TOTAL)); + taos_gauge_set(*metric, pGrantInfo->timeseries_total, sample_labels); +} + +void monGenVgroupInfoTable(SMonInfo *pMonitor){ + if(pMonitor->dmInfo.basic.cluster_id == 0) return; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) { + SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i); + + char vgroup_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(vgroup_id, TSDB_NODE_ID_LEN, "%"PRId32, pVgroupDesc->vgroup_id); + + const char *sample_labels[] = {cluster_id, vgroup_id, pVgroupDesc->database_name}; + + taos_gauge_t **metric = NULL; + + metric = taosHashGet(tsMonitor.metrics, TABLES_NUM, strlen(TABLES_NUM)); + taos_gauge_set(*metric, pVgroupDesc->tables_num, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, STATUS, strlen(STATUS)); + int32_t status = 0; + if(strcmp(pVgroupDesc->status, "ready") == 0){ + status = 1; + } + taos_gauge_set(*metric, status, sample_labels); + } +} + +void monGenDnodeInfoTable(SMonInfo *pMonitor) { + if(pMonitor->dmInfo.basic.cluster_id == 0) { + uError("failed to generate dnode info table since cluster_id is 0"); + return; + } + + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); + + char dnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(dnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pMonitor->dmInfo.basic.dnode_id); + + const char *sample_labels[] = {cluster_id, dnode_id, pMonitor->dmInfo.basic.dnode_ep}; + + taos_gauge_t **metric = NULL; + + //dnode info + SMonDnodeInfo *pInfo = &pMonitor->dmInfo.dnode; + SMonSysInfo *pSys = &pMonitor->dmInfo.sys; + SVnodesStat *pStat = &pMonitor->vmInfo.vstat; + SMonClusterInfo *pClusterInfo = &pMonitor->mmInfo.cluster; + + double interval = (pMonitor->curTime - pMonitor->lastTime) / 1000.0; + if (pMonitor->curTime - pMonitor->lastTime == 0) { + interval = 1; + } + + double cpu_engine = 0; + double mem_engine = 0; + double net_in = 0; + double net_out = 0; + double io_read = 0; + double io_write = 0; + double io_read_disk = 0; + double io_write_disk = 0; + + SMonSysInfo *sysArrays[6]; + sysArrays[0] = &pMonitor->dmInfo.sys; + sysArrays[1] = &pMonitor->mmInfo.sys; + sysArrays[2] = &pMonitor->vmInfo.sys; + sysArrays[3] = &pMonitor->qmInfo.sys; + sysArrays[4] = &pMonitor->smInfo.sys; + sysArrays[5] = &pMonitor->bmInfo.sys; + for (int32_t i = 0; i < 6; ++i) { + cpu_engine += sysArrays[i]->cpu_engine; + mem_engine += sysArrays[i]->mem_engine; + net_in += sysArrays[i]->net_in; + net_out += sysArrays[i]->net_out; + io_read += sysArrays[i]->io_read; + io_write += sysArrays[i]->io_write; + io_read_disk += sysArrays[i]->io_read_disk; + io_write_disk += sysArrays[i]->io_write_disk; + } + + double req_select_rate = pStat->numOfSelectReqs / interval; + double req_insert_rate = pStat->numOfInsertReqs / interval; + double req_insert_batch_rate = pStat->numOfBatchInsertReqs / interval; + double net_in_rate = net_in / interval; + double net_out_rate = net_out / interval; + double io_read_rate = io_read / interval; + double io_write_rate = io_write / interval; + double io_read_disk_rate = io_read_disk / interval; + double io_write_disk_rate = io_write_disk / interval; + + metric = taosHashGet(tsMonitor.metrics, UPTIME, strlen(UPTIME)); + taos_gauge_set(*metric, pInfo->uptime, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, CPU_ENGINE, strlen(CPU_ENGINE)); + taos_gauge_set(*metric, cpu_engine, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, CPU_SYSTEM, strlen(CPU_SYSTEM)); + taos_gauge_set(*metric, pSys->cpu_system, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, CPU_CORE, strlen(CPU_CORE)); + taos_gauge_set(*metric, pSys->cpu_cores, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, MEM_ENGINE, strlen(MEM_ENGINE)); + taos_gauge_set(*metric, mem_engine, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, MEM_SYSTEM, strlen(MEM_SYSTEM)); + taos_gauge_set(*metric, pSys->mem_system, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, MEM_TOTAL, strlen(MEM_TOTAL)); + taos_gauge_set(*metric, pSys->mem_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DISK_ENGINE, strlen(DISK_ENGINE)); + taos_gauge_set(*metric, pSys->disk_engine, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DISK_USED, strlen(DISK_USED)); + taos_gauge_set(*metric, pSys->disk_used, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DISK_TOTAL, strlen(DISK_TOTAL)); + taos_gauge_set(*metric, pSys->disk_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, NET_IN, strlen(NET_IN)); + taos_gauge_set(*metric, net_in_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, NET_OUT, strlen(NET_OUT)); + taos_gauge_set(*metric, net_out_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, IO_READ, strlen(IO_READ)); + taos_gauge_set(*metric, io_read_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, IO_WRITE, strlen(IO_WRITE)); + taos_gauge_set(*metric, io_write_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, IO_READ_DISK, strlen(IO_READ_DISK)); + taos_gauge_set(*metric, io_read_disk_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, IO_WRITE_DISK, strlen(IO_WRITE_DISK)); + taos_gauge_set(*metric, io_write_disk_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, ERRORS, strlen(ERRORS)); + taos_gauge_set(*metric, io_read_disk_rate, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, VNODES_NUM, strlen(VNODES_NUM)); + taos_gauge_set(*metric, pStat->errors, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, MASTERS, strlen(MASTERS)); + taos_gauge_set(*metric, pStat->masterNum, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, HAS_MNODE, strlen(HAS_MNODE)); + taos_gauge_set(*metric, pInfo->has_mnode, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, HAS_QNODE, strlen(HAS_QNODE)); + taos_gauge_set(*metric, pInfo->has_qnode, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, HAS_SNODE, strlen(HAS_SNODE)); + taos_gauge_set(*metric, pInfo->has_snode, sample_labels); + + //log number + SMonLogs *logs[6]; + logs[0] = &pMonitor->log; + logs[1] = &pMonitor->mmInfo.log; + logs[2] = &pMonitor->vmInfo.log; + logs[3] = &pMonitor->smInfo.log; + logs[4] = &pMonitor->qmInfo.log; + logs[5] = &pMonitor->bmInfo.log; + + int32_t numOfErrorLogs = 0; + int32_t numOfInfoLogs = 0; + int32_t numOfDebugLogs = 0; + int32_t numOfTraceLogs = 0; + + for (int32_t j = 0; j < 6; j++) { + SMonLogs *pLog = logs[j]; + numOfErrorLogs += pLog->numOfErrorLogs; + numOfInfoLogs += pLog->numOfInfoLogs; + numOfDebugLogs += pLog->numOfDebugLogs; + numOfTraceLogs += pLog->numOfTraceLogs; + } + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_ERROR, strlen(DNODE_LOG_ERROR)); + taos_gauge_set(*metric, numOfErrorLogs, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_INFO, strlen(DNODE_LOG_INFO)); + taos_gauge_set(*metric, numOfInfoLogs, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_DEBUG, strlen(DNODE_LOG_DEBUG)); + taos_gauge_set(*metric, numOfDebugLogs, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_TRACE, strlen(DNODE_LOG_TRACE)); + taos_gauge_set(*metric, numOfTraceLogs, sample_labels); +} + +void monGenDnodeStatusInfoTable(SMonInfo *pMonitor){ + if(pMonitor->dmInfo.basic.cluster_id == 0) { + uError("failed to generate dnode info table since cluster_id is 0"); + return; + } + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + char cluster_id[TSDB_CLUSTER_ID_LEN]; + snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); + + taos_gauge_t **metric = NULL; + //dnodes status + + SMonClusterInfo *pClusterInfo = &pMonitor->mmInfo.cluster; + + for (int32_t i = 0; i < taosArrayGetSize(pClusterInfo->dnodes); ++i) { + SMonDnodeDesc *pDnodeDesc = taosArrayGet(pClusterInfo->dnodes, i); + + char dnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(dnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pDnodeDesc->dnode_id); + + const char *sample_labels[] = {cluster_id, dnode_id, pDnodeDesc->dnode_ep}; + + metric = taosHashGet(tsMonitor.metrics, DNODE_STATUS, strlen(DNODE_STATUS)); + + int32_t status = 0; + if(strcmp(pDnodeDesc->status, "ready") == 0){ + status = 1; + } + taos_gauge_set(*metric, status, sample_labels); + } +} + +void monGenDataDiskTable(SMonInfo *pMonitor){ + if(pMonitor->dmInfo.basic.cluster_id == 0) return; + + SMonDiskInfo *pInfo = &pMonitor->vmInfo.tfs; + + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%" PRId64, pMonitor->dmInfo.basic.cluster_id); + + char dnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(dnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pMonitor->dmInfo.basic.dnode_id); + + taos_gauge_t **metric = NULL; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->datadirs); ++i) { + SMonDiskDesc *pDatadirDesc = taosArrayGet(pInfo->datadirs, i); + + char level[LEVEL_LEN] = {0}; + snprintf(level, LEVEL_LEN, "%"PRId32, pDatadirDesc->level); + + const char *sample_labels[] = {cluster_id, dnode_id, pMonitor->dmInfo.basic.dnode_ep, pDatadirDesc->name, level}; + + metric = taosHashGet(tsMonitor.metrics, DNODE_DATA_AVAIL, strlen(DNODE_DATA_AVAIL)); + taos_gauge_set(*metric, pDatadirDesc->size.avail, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_DATA_USED, strlen(DNODE_DATA_USED)); + taos_gauge_set(*metric, pDatadirDesc->size.used, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_DATA_TOTAL, strlen(DNODE_DATA_TOTAL)); + taos_gauge_set(*metric, pDatadirDesc->size.total, sample_labels); + } +} + +void monGenLogDiskTable(SMonInfo *pMonitor){ + if(pMonitor->dmInfo.basic.cluster_id == 0) return; + + SMonDiskDesc *pLogDesc = &pMonitor->dmInfo.dnode.logdir; + SMonDiskDesc *pTempDesc = &pMonitor->dmInfo.dnode.tempdir; + + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%" PRId64, pMonitor->dmInfo.basic.cluster_id); + + char dnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(dnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pMonitor->dmInfo.basic.dnode_id); + + taos_gauge_t **metric = NULL; + + const char *sample_log_labels[] = {cluster_id, dnode_id, pMonitor->dmInfo.basic.dnode_ep, pLogDesc->name}; + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_AVAIL, strlen(DNODE_LOG_AVAIL)); + taos_gauge_set(*metric, pLogDesc->size.avail, sample_log_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_USED, strlen(DNODE_LOG_USED)); + taos_gauge_set(*metric, pLogDesc->size.used, sample_log_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_TOTAL, strlen(DNODE_LOG_TOTAL)); + taos_gauge_set(*metric, pLogDesc->size.total, sample_log_labels); + + const char *sample_temp_labels[] = {cluster_id, dnode_id, pMonitor->dmInfo.basic.dnode_ep, pTempDesc->name}; + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_AVAIL, strlen(DNODE_LOG_AVAIL)); + taos_gauge_set(*metric, pTempDesc->size.avail, sample_temp_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_USED, strlen(DNODE_LOG_USED)); + taos_gauge_set(*metric, pTempDesc->size.used, sample_temp_labels); + + metric = taosHashGet(tsMonitor.metrics, DNODE_LOG_TOTAL, strlen(DNODE_LOG_TOTAL)); + taos_gauge_set(*metric, pTempDesc->size.total, sample_temp_labels); +} + +void monGenMnodeRoleTable(SMonInfo *pMonitor){ + SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; + if(pBasicInfo->cluster_id == 0) return; + + char buf[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(buf, TSDB_CLUSTER_ID_LEN, "%" PRId64, pBasicInfo->cluster_id); + + taos_gauge_t **metric = NULL; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->mnodes); ++i) { + + SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->mnodes, i); + + char mnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(mnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pMnodeDesc->mnode_id); + + const char *sample_labels[] = {buf, mnode_id, pMnodeDesc->mnode_ep}; + + metric = taosHashGet(tsMonitor.metrics, MNODE_ROLE, strlen(MNODE_ROLE)); + taos_gauge_set(*metric, pMnodeDesc->syncState, sample_labels); + } +} + +void monGenVnodeRoleTable(SMonInfo *pMonitor){ + SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; + if(pBasicInfo->cluster_id == 0) return; + + char buf[TSDB_CLUSTER_ID_LEN] = {0}; + snprintf(buf, TSDB_CLUSTER_ID_LEN, "%" PRId64, pBasicInfo->cluster_id); + + taos_gauge_t **metric = NULL; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) { + SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i); + + char vgroup_id[TSDB_VGROUP_ID_LEN] = {0}; + snprintf(vgroup_id, TSDB_VGROUP_ID_LEN, "%"PRId32, pVgroupDesc->vgroup_id); + + for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) { + SMonVnodeDesc *pVnodeDesc = &pVgroupDesc->vnodes[j]; + if (pVnodeDesc->dnode_id <= 0) continue; + + char dnode_id[TSDB_NODE_ID_LEN] = {0}; + snprintf(dnode_id, TSDB_NODE_ID_LEN, "%"PRId32, pVnodeDesc->dnode_id); + + const char *sample_labels[] = {buf, vgroup_id, pVgroupDesc->database_name, dnode_id}; + + metric = taosHashGet(tsMonitor.metrics, VNODE_ROLE, strlen(VNODE_ROLE)); + taos_gauge_set(*metric, pVnodeDesc->syncState, sample_labels); + } + } +} + +void monSendPromReport() { + char ts[50] = {0}; + sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + + char* promStr = NULL; + char* pCont = (char *)taos_collector_registry_bridge_new(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts, "%" PRId64, &promStr); + if(tsMonitorLogProtocol){ + uInfoL("report cont:\n%s\n", pCont); + uDebugL("report cont prom:\n%s\n", promStr); + } + if (pCont != NULL) { + EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + uError("failed to send monitor msg"); + }else{ + taos_collector_registry_clear_batch(TAOS_COLLECTOR_REGISTRY_DEFAULT); + } + taosMemoryFreeClear(pCont); + } + if(promStr != NULL){ + taosMemoryFreeClear(promStr); + } +} \ No newline at end of file diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index d417a97db7..83cde72a91 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -21,9 +21,9 @@ #include "taos_monitor.h" #include "tglobal.h" -static SMonitor tsMonitor = {0}; -static char* tsMonUri = "/report"; -static char* tsMonFwUri = "/td_metric"; +SMonitor tsMonitor = {0}; +char* tsMonUri = "/report"; +char* tsMonFwUri = "/td_metric"; void monRecordLog(int64_t ts, ELogLevel level, const char *content) { taosThreadMutexLock(&tsMonitor.lock); @@ -112,7 +112,7 @@ int32_t monInit(const SMonCfg *pCfg) { tsMonitor.lastTime = taosGetTimestampMs(); taosThreadMutexInit(&tsMonitor.lock, NULL); - taos_collector_registry_default_init(); + monInitMonitorFW(); return 0; } @@ -128,8 +128,7 @@ void monCleanup() { tFreeSMonBmInfo(&tsMonitor.bmInfo); taosThreadMutexDestroy(&tsMonitor.lock); - taos_collector_registry_destroy(TAOS_COLLECTOR_REGISTRY_DEFAULT); - TAOS_COLLECTOR_REGISTRY_DEFAULT = NULL; + monCleanupMonitorFW(); } static void monCleanupMonitorInfo(SMonInfo *pMonitor) { @@ -195,6 +194,22 @@ static void monGenBasicJson(SMonInfo *pMonitor) { tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol); } +static void monGenBasicJsonBasic(SMonInfo *pMonitor) { + SMonBasicInfo *pInfo = &pMonitor->dmInfo.basic; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + SJson *pJson = pMonitor->pJson; + char buf[40] = {0}; + + sprintf(buf, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); + tjsonAddStringToObject(pJson, "ts", buf); + tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id); + tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep); + snprintf(buf, sizeof(buf), "%" PRId64, pInfo->cluster_id); + tjsonAddStringToObject(pJson, "cluster_id", buf); + tjsonAddDoubleToObject(pJson, "protocol", pInfo->protocol); +} + static void monGenClusterJson(SMonInfo *pMonitor) { SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; @@ -253,6 +268,16 @@ static void monGenClusterJson(SMonInfo *pMonitor) { } } +static void monGenClusterJsonBasic(SMonInfo *pMonitor) { + SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + + tjsonAddStringToObject(pMonitor->pJson, "first_ep", pInfo->first_ep); + tjsonAddDoubleToObject(pMonitor->pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); + tjsonAddStringToObject(pMonitor->pJson, "cluster_version", pInfo->version); + tjsonAddDoubleToObject(pMonitor->pJson, "monitor_interval", pInfo->monitor_interval); +} + static void monGenVgroupJson(SMonInfo *pMonitor) { SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; @@ -526,21 +551,11 @@ static void monGenLogJson(SMonInfo *pMonitor) { if (tjsonAddItemToArray(pSummaryJson, pLogTrace) != 0) tjsonDelete(pLogTrace); } -void monSendReport() { - SMonInfo *pMonitor = monCreateMonitorInfo(); - if (pMonitor == NULL) return; - - monGenBasicJson(pMonitor); - monGenClusterJson(pMonitor); - monGenVgroupJson(pMonitor); - monGenStbJson(pMonitor); - monGenGrantJson(pMonitor); - monGenDnodeJson(pMonitor); - monGenDiskJson(pMonitor); - monGenLogJson(pMonitor); - +void monSendReport(SMonInfo *pMonitor){ char *pCont = tjsonToString(pMonitor->pJson); - // uDebugL("report cont:%s\n", pCont); + if(tsMonitorLogProtocol){ + uInfoL("report cont basic:\n%s", pCont); + } if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; if (taosSendHttpReport(tsMonitor.cfg.server, tsMonUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { @@ -548,32 +563,49 @@ void monSendReport() { } taosMemoryFree(pCont); } +} + +void monGenAndSendReport() { + SMonInfo *pMonitor = monCreateMonitorInfo(); + if (pMonitor == NULL) return; + + if(!tsMonitorForceV2){ + monGenBasicJson(pMonitor); + monGenClusterJson(pMonitor); + monGenVgroupJson(pMonitor); + monGenStbJson(pMonitor); + monGenGrantJson(pMonitor); + monGenDnodeJson(pMonitor); + monGenDiskJson(pMonitor); + monGenLogJson(pMonitor); + + monSendReport(pMonitor); + } + else{ + monGenClusterInfoTable(pMonitor); + monGenVgroupInfoTable(pMonitor); + monGenDnodeInfoTable(pMonitor); + monGenDnodeStatusInfoTable(pMonitor); + monGenDataDiskTable(pMonitor); + monGenLogDiskTable(pMonitor); + monGenMnodeRoleTable(pMonitor); + monGenVnodeRoleTable(pMonitor); + + monSendPromReport(); + } monCleanupMonitorInfo(pMonitor); } -void monSendPromReport() { - char ts[50]; - sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); - char *pCont = (char *)taos_collector_registry_bridge(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts, "%" PRId64); - //uInfoL("report cont:\n%s\n", pCont); - if (pCont != NULL) { - EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; - if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { - uError("failed to send monitor msg"); - }else{ - taos_collector_registry_clear_out(TAOS_COLLECTOR_REGISTRY_DEFAULT); - } - } -} +void monGenAndSendReportBasic() { + SMonInfo *pMonitor = monCreateMonitorInfo(); + if (pMonitor == NULL) return; + if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; -void monSendContent(char *pCont) { - if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; - //uInfoL("report cont:\n%s\n", pCont); - if (pCont != NULL) { - EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; - if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { - uError("failed to send monitor msg"); - } - } + monGenBasicJsonBasic(pMonitor); + monGenClusterJsonBasic(pMonitor); + + monSendReport(pMonitor); + + monCleanupMonitorInfo(pMonitor); } \ No newline at end of file diff --git a/source/libs/monitor/test/monTest.cpp b/source/libs/monitor/test/monTest.cpp index 3f7b1b51da..2660cff216 100644 --- a/source/libs/monitor/test/monTest.cpp +++ b/source/libs/monitor/test/monTest.cpp @@ -283,10 +283,10 @@ TEST_F(MonitorTest, 01_Full) { tFreeSMonSmInfo(&smInfo); tFreeSMonQmInfo(&qmInfo); tFreeSMonBmInfo(&bmInfo); - monSendReport(); + monGenAndSendReport(); } TEST_F(MonitorTest, 02_Log) { AddLogInfo2(); - monSendReport(); + monGenAndSendReport(); } diff --git a/source/libs/monitorfw/inc/taos_collector_registry_t.h b/source/libs/monitorfw/inc/taos_collector_registry_t.h index 2264d18081..8e8a881fca 100644 --- a/source/libs/monitorfw/inc/taos_collector_registry_t.h +++ b/source/libs/monitorfw/inc/taos_collector_registry_t.h @@ -34,7 +34,7 @@ struct taos_collector_registry { taos_string_builder_t *string_builder; /**< Enables string building */ taos_metric_formatter_t *metric_formatter; /**< metric formatter for metric exposition on bridge call */ pthread_rwlock_t *lock; /**< mutex for safety against concurrent registration */ - taos_string_builder_t *out; + taos_string_builder_t *string_builder_batch; }; #endif // TAOS_REGISTRY_T_H diff --git a/source/libs/monitorfw/inc/taos_metric_formatter_custom_i.h b/source/libs/monitorfw/inc/taos_metric_formatter_custom_i.h new file mode 100644 index 0000000000..f3e4ebae75 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_metric_formatter_custom_i.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_METRIC_FORMATTER_CUSTOMV2_I_H +#define TAOS_METRIC_FORMATTER_CUSTOMV2_I_H + +#define ALLOW_FORBID_FUNC + +#include +#include "tjson.h" + +int taos_metric_formatter_load_sample_new(taos_metric_formatter_t *self, taos_metric_sample_t *sample, + char *ts, char *format, char *metricName, int32_t metric_type, + SJson *arrayMetricGroups); +int taos_metric_formatter_load_metric_new(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts, char *format, + SJson* tableArray); +int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts, + char *format, SJson* tableArray); +#endif // TAOS_METRIC_FORMATTER_CUSTOMV2_I_H \ No newline at end of file diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 92885acf4a..3aa9b7bb99 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -19,10 +19,16 @@ #include "taos_metric_sample.h" #include "taos_metric_t.h" +#define DOUBLE_ATOMIC + struct taos_metric_sample { taos_metric_type_t type; /**< type is the metric type for the sample */ char *l_value; /**< l_value is the full metric name and label set represeted as a string */ - /*_Atomic*/ int64_t r_value; /**< r_value is the value of the metric sample */ +#ifdef DOUBLE_ATOMIC + _Atomic double r_value; /**< r_value is the value of the metric sample */ +#else + int64_t r_value; /**< r_value is the value of the metric sample */ +#endif }; #endif // TAOS_METRIC_SAMPLE_T_H diff --git a/source/libs/monitorfw/inc/taos_metric_t.h b/source/libs/monitorfw/inc/taos_metric_t.h index 806466528d..da237aa814 100644 --- a/source/libs/monitorfw/inc/taos_metric_t.h +++ b/source/libs/monitorfw/inc/taos_metric_t.h @@ -42,7 +42,7 @@ extern char *taos_metric_type_map[4]; */ struct taos_metric { taos_metric_type_t type; /**< metric_type The type of metric */ - const char *name; /**< name The name of the metric */ + char *name; /**< name The name of the metric */ const char *help; /**< help The help output for the metric */ taos_map_t *samples; /**< samples Map comprised of samples for the given metric */ size_t label_key_count; /**< label_keys_count The count of labe_keys*/ diff --git a/source/libs/monitorfw/inc/taos_monitor_util_i.h b/source/libs/monitorfw/inc/taos_monitor_util_i.h new file mode 100644 index 0000000000..fe072204a3 --- /dev/null +++ b/source/libs/monitorfw/inc/taos_monitor_util_i.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TAOS_MONITOR_UTIL_I_H +#define TAOS_MONITOR_UTIL_I_H + +#include + +void taos_monitor_split_str(char** arr, char* str, const char* del); +int taos_monitor_count_occurrences(char *str, char *toSearch); +void taos_monitor_strip(char *s); +bool taos_monitor_is_match(const SJson* tags, char** pairs, int32_t count); + +#endif // TAOS_MONITOR_UTIL_I_H \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_collector.c b/source/libs/monitorfw/src/taos_collector.c index d3228facb6..997bf5587c 100644 --- a/source/libs/monitorfw/src/taos_collector.c +++ b/source/libs/monitorfw/src/taos_collector.c @@ -107,3 +107,9 @@ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric) { } return taos_map_set(self->metrics, metric->name, metric); } + +taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name){ + TAOS_ASSERT(self != NULL); + if (self == NULL) return NULL; + return taos_map_get(self->metrics, metric_name); +} \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index 711e66ed84..c94675c95c 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -33,6 +33,10 @@ #include "taos_metric_i.h" #include "taos_metric_t.h" #include "taos_string_builder_i.h" +#include "taos_metric_formatter_custom_i.h" + +#define ALLOW_FORBID_FUNC +#include "tjson.h" taos_collector_registry_t *TAOS_COLLECTOR_REGISTRY_DEFAULT; @@ -50,7 +54,7 @@ taos_collector_registry_t *taos_collector_registry_new(const char *name) { self->metric_formatter = taos_metric_formatter_new(); self->string_builder = taos_string_builder_new(); - self->out = taos_string_builder_new(); + self->string_builder_batch = taos_string_builder_new(); self->lock = (pthread_rwlock_t *)taos_malloc(sizeof(pthread_rwlock_t)); r = pthread_rwlock_init(self->lock, NULL); if (r) { @@ -88,8 +92,8 @@ int taos_collector_registry_destroy(taos_collector_registry_t *self) { self->string_builder = NULL; if (r) ret = r; - r = taos_string_builder_destroy(self->out); - self->out = NULL; + r = taos_string_builder_destroy(self->string_builder_batch); + self->string_builder_batch = NULL; if (r) ret = r; r = pthread_rwlock_destroy(self->lock); @@ -119,6 +123,19 @@ int taos_collector_registry_register_metric(taos_metric_t *metric) { return taos_collector_add_metric(default_collector, metric); } +taos_metric_t *taos_collector_registry_get_metric(char* metric_name){ + TAOS_ASSERT(metric != NULL); + + taos_collector_t *default_collector = + (taos_collector_t *)taos_map_get(TAOS_COLLECTOR_REGISTRY_DEFAULT->collectors, "default"); + + if (default_collector == NULL) { + return NULL; + } + + return taos_collector_get_metric(default_collector, metric_name); +} + taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metric) { int err = taos_collector_registry_register_metric(metric); if (err != 0) { @@ -193,13 +210,71 @@ const char *taos_collector_registry_bridge(taos_collector_registry_t *self, char char *out = taos_metric_formatter_dump(self->metric_formatter); int r = 0; - r = taos_string_builder_add_str(self->out, out); + r = taos_string_builder_add_str(self->string_builder_batch, out); if (r) return NULL; taos_free(out); - return taos_string_builder_str(self->out); + return taos_string_builder_str(self->string_builder_batch); } -int taos_collector_registry_clear_out(taos_collector_registry_t *self){ - return taos_string_builder_clear(self->out); +int taos_collector_registry_clear_batch(taos_collector_registry_t *self){ + return taos_string_builder_clear(self->string_builder_batch); +} + +const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, char *ts, char *format, char** prom_str) { + taos_metric_formatter_clear(self->metric_formatter); + + SJson* pJson = tjsonCreateArray(); + SJson* item = tjsonCreateObject(); + tjsonAddItemToArray(pJson, item); + tjsonAddStringToObject(item, "ts", ts); + tjsonAddDoubleToObject(item, "protocol", 2); + SJson* array = tjsonCreateArray(); + tjsonAddItemToObject(item, "tables", array); + + taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array); + + //caller free this + //generate prom protocol for debug + if(prom_str != NULL){ + *prom_str = taos_metric_formatter_dump(self->metric_formatter); + } + + //add this result to batch cache, format in batch cache is {},{} + int r = 0; + char* old_str = taos_string_builder_str(self->string_builder_batch); + if(old_str[0] != '\0'){ + r = taos_string_builder_add_str(self->string_builder_batch, ","); + if (r) return NULL; + } + char * item_str = tjsonToString(item); + r = taos_string_builder_add_str(self->string_builder_batch, item_str); + taos_free(item_str); + if (r) return NULL; + + tjsonDelete(pJson); + + //generate final array format result, ie, add [] to str in batch cache + taos_string_builder_t* tmp_builder = taos_string_builder_new(); + + r = taos_string_builder_add_str(tmp_builder, "["); + if (r) return NULL; + + r = taos_string_builder_add_str(tmp_builder, taos_string_builder_str(self->string_builder_batch)); + if (r) return NULL; + + r = taos_string_builder_add_str(tmp_builder, "]"); + if (r) return NULL; + + //caller free this + char *data = taos_string_builder_dump(tmp_builder); + if (data == NULL) return NULL; + r = taos_string_builder_clear(tmp_builder); + if (r) return NULL; + + r = taos_string_builder_destroy(tmp_builder); + tmp_builder = NULL; + if (r) return NULL; + + return data; } diff --git a/source/libs/monitorfw/src/taos_gauge.c b/source/libs/monitorfw/src/taos_gauge.c new file mode 100644 index 0000000000..74d2665194 --- /dev/null +++ b/source/libs/monitorfw/src/taos_gauge.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// Public +#include "taos_gauge.h" + +#include "taos_alloc.h" + +// Private +#include "taos_assert.h" +#include "taos_errors.h" +#include "taos_log.h" +#include "taos_metric_i.h" +#include "taos_metric_sample_i.h" +#include "taos_metric_sample_t.h" +#include "taos_metric_t.h" + +taos_gauge_t *taos_gauge_new(const char *name, const char *help, size_t label_key_count, const char **label_keys) { + return (taos_gauge_t *)taos_metric_new(TAOS_GAUGE, name, help, label_key_count, label_keys); +} + +int taos_gauge_destroy(taos_gauge_t *self) { + TAOS_ASSERT(self != NULL); + int r = 0; + r = taos_metric_destroy(self); + self = NULL; + return r; +} + +int taos_gauge_inc(taos_gauge_t *self, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_add(sample, 1.0); +} + +int taos_gauge_dec(taos_gauge_t *self, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_sub(sample, 1.0); +} + +int taos_gauge_add(taos_gauge_t *self, double r_value, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_add(sample, r_value); +} + +int taos_gauge_sub(taos_gauge_t *self, double r_value, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_sub(sample, r_value); +} + +int taos_gauge_set(taos_gauge_t *self, double r_value, const char **label_values) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + if (self->type != TAOS_GAUGE) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + taos_metric_sample_t *sample = taos_metric_sample_from_labels(self, label_values); + if (sample == NULL) return 1; + return taos_metric_sample_set(sample, r_value); +} diff --git a/source/libs/monitorfw/src/taos_metric.c b/source/libs/monitorfw/src/taos_metric.c index a9bb6d45a4..4e9af35f34 100644 --- a/source/libs/monitorfw/src/taos_metric.c +++ b/source/libs/monitorfw/src/taos_metric.c @@ -34,7 +34,11 @@ taos_metric_t *taos_metric_new(taos_metric_type_t metric_type, const char *name, int r = 0; taos_metric_t *self = (taos_metric_t *)taos_malloc(sizeof(taos_metric_t)); self->type = metric_type; - self->name = name; + int len = strlen(name) + 1; + self->name = taos_malloc(len); + memset(self->name, 0, len); + strcpy(self->name, name); + //self->name = name; self->help = help; const char **k = (const char **)taos_malloc(sizeof(const char *) * label_key_count); @@ -111,6 +115,9 @@ int taos_metric_destroy(taos_metric_t *self) { taos_free(self->label_keys); self->label_keys = NULL; + taos_free(self->name); + self->name = NULL; + taos_free(self); self = NULL; diff --git a/source/libs/monitorfw/src/taos_metric_formatter.c b/source/libs/monitorfw/src/taos_metric_formatter.c index 6c6f1974eb..a9f35c3e8d 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter.c +++ b/source/libs/monitorfw/src/taos_metric_formatter.c @@ -181,7 +181,7 @@ int taos_metric_formatter_load_sample(taos_metric_formatter_t *self, taos_metric r = taos_string_builder_add_str(self->string_builder, ts); if (r) return r; - taos_metric_sample_set(sample, 0); + //taos_metric_sample_set(sample, 0); return taos_string_builder_add_char(self->string_builder, '\n'); } diff --git a/source/libs/monitorfw/src/taos_metric_formatter_custom.c b/source/libs/monitorfw/src/taos_metric_formatter_custom.c new file mode 100644 index 0000000000..d7650098e0 --- /dev/null +++ b/source/libs/monitorfw/src/taos_metric_formatter_custom.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define ALLOW_FORBID_FUNC + +#include +#include "taos_metric_formatter_i.h" +#include "taos_metric_sample_t.h" +#include "tjson.h" +#include "taos_monitor_util_i.h" +#include "taos_assert.h" +#include "tdef.h" +#include "taos_collector_t.h" + +int taos_metric_formatter_load_sample_new(taos_metric_formatter_t *self, taos_metric_sample_t *sample, + char *ts, char *format, char *metricName, int32_t metric_type, + SJson *arrayMetricGroups) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + char* start = strstr(sample->l_value, "{"); + char* end = strstr(sample->l_value, "}"); + + int32_t len = end -start; + + char* keyvalues = taosMemoryMalloc(len); + memset(keyvalues, 0, len); + memcpy(keyvalues, start + 1, len - 1); + + int32_t count = taos_monitor_count_occurrences(keyvalues, ","); + + char** keyvalue = taosMemoryMalloc(sizeof(char*) * (count + 1)); + memset(keyvalue, 0, sizeof(char*) * (count + 1)); + taos_monitor_split_str(keyvalue, keyvalues, ","); + + char** arr = taosMemoryMalloc(sizeof(char*) * (count + 1) * 2); + memset(arr, 0, sizeof(char*) * (count + 1) * 2); + + bool isfound = true; + for(int32_t i = 0; i < count + 1; i++){ + char* str = *(keyvalue + i); + + char** pair = arr + i * 2; + taos_monitor_split_str(pair, str, "="); + + taos_monitor_strip(pair[1]); + } + + int32_t table_size = tjsonGetArraySize(arrayMetricGroups); + + SJson* item = NULL; + for(int32_t i = 0; i < table_size; i++){ + SJson *cur = tjsonGetArrayItem(arrayMetricGroups, i); + + SJson* tag = tjsonGetObjectItem(cur, "tags"); + + if(taos_monitor_is_match(tag, arr, count + 1)) { + item = cur; + break; + } + } + + SJson* metrics = NULL; + if(item == NULL) { + item = tjsonCreateObject(); + + SJson* arrayTag = tjsonCreateArray(); + for(int32_t i = 0; i < count + 1; i++){ + char** pair = arr + i * 2; + + char* key = *pair; + char* value = *(pair + 1); + + SJson* tag = tjsonCreateObject(); + tjsonAddStringToObject(tag, "name", key); + tjsonAddStringToObject(tag, "value", value); + + tjsonAddItemToArray(arrayTag, tag); + } + tjsonAddItemToObject(item, "tags", arrayTag); + + metrics = tjsonCreateArray(); + tjsonAddItemToObject(item, "metrics", metrics); + + tjsonAddItemToArray(arrayMetricGroups, item); + } + else{ + metrics = tjsonGetObjectItem(item, "metrics"); + } + + taosMemoryFreeClear(arr); + taosMemoryFreeClear(keyvalue); + taosMemoryFreeClear(keyvalues); + + SJson* metric = tjsonCreateObject(); + tjsonAddStringToObject(metric, "name", metricName); + + double old_value = 0; +#define USE_EXCHANGE +#ifdef USE_EXCHANGE + taos_metric_sample_exchange(sample, 0, &old_value); +#else + old_value = sample->r_value; + taos_metric_sample_set(sample, 0); +#endif + + tjsonAddDoubleToObject(metric, "value", old_value); + tjsonAddDoubleToObject(metric, "type", metric_type); + tjsonAddItemToArray(metrics, metric); + + return 0; +} + +int taos_metric_formatter_load_metric_new(taos_metric_formatter_t *self, taos_metric_t *metric, char *ts, char *format, + SJson* tableArray) { + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + + int r = 0; + + int32_t size = strlen(metric->name); + char* name = taosMemoryMalloc(size + 1); + memset(name, 0, size + 1); + memcpy(name, metric->name, size); + char* arr[2] = {0}; //arr[0] is table name, arr[1] is metric name + taos_monitor_split_str((char**)&arr, name, ":"); + + bool isFound = false; + SJson* table = NULL; + SJson* arrayMetricGroups = NULL; + + int32_t table_count = tjsonGetArraySize(tableArray); + for(int32_t i = 0; i < table_count; i++){ + SJson* table = tjsonGetArrayItem(tableArray, i); + + char tableName[MONITOR_TABLENAME_LEN] = {0}; + tjsonGetStringValue(table, "name", tableName); + if(strcmp(tableName, arr[0]) == 0){ + isFound = true; + arrayMetricGroups = tjsonGetObjectItem(table, "metric_groups"); + break; + } + } + + if(!isFound){ + table = tjsonCreateObject(); + + tjsonAddStringToObject(table, "name", arr[0]); + + arrayMetricGroups = tjsonCreateArray(); + tjsonAddItemToObject(table, "metric_groups", arrayMetricGroups); + } + + int32_t sample_count = 0; + for (taos_linked_list_node_t *current_node = metric->samples->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *key = (const char *)current_node->item; + if (metric->type == TAOS_HISTOGRAM) { + + } else { + taos_metric_sample_t *sample = (taos_metric_sample_t *)taos_map_get(metric->samples, key); + if (sample == NULL) return 1; + r = taos_metric_formatter_load_sample_new(self, sample, ts, format, arr[1], metric->type, arrayMetricGroups); + if (r) return r; + } + sample_count++; + } + + if(!isFound && sample_count > 0){ + tjsonAddItemToArray(tableArray, table); + } + else{ + if(table != NULL) tjsonDelete(table); + } + + taosMemoryFreeClear(name); + return r; +} + +int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_map_t *collectors, char *ts, + char *format, SJson* tableArray) { + TAOS_ASSERT(self != NULL); + int r = 0; + + for (taos_linked_list_node_t *current_node = collectors->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *collector_name = (const char *)current_node->item; + taos_collector_t *collector = (taos_collector_t *)taos_map_get(collectors, collector_name); + if (collector == NULL) return 1; + + taos_map_t *metrics = collector->collect_fn(collector); + if (metrics == NULL) return 1; + + //if(strcmp(collector->name, "custom") != 0 ){ + + for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *metric_name = (const char *)current_node->item; + taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); + if (metric == NULL) return 1; + r = taos_metric_formatter_load_metric_new(self, metric, ts, format, tableArray); + if (r) return r; + } + + //} + //else{ + + for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; + current_node = current_node->next) { + const char *metric_name = (const char *)current_node->item; + taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); + if (metric == NULL) return 1; + r = taos_metric_formatter_load_metric(self, metric, ts, format); + if (r) return r; + } + + //} + } + return r; +} \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 034657cb3d..04a6045e76 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -//#include + // Public #include "taos_alloc.h" @@ -25,10 +25,14 @@ #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" -#define ALLOW_FORBID_FUNC +#define DOUBLE_ATOMIC -#include "tdef.h" +#ifdef DOUBLE_ATOMIC +#include +#else +#define ALLOW_FORBID_FUNC #include "osAtomic.h" +#endif taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { taos_metric_sample_t *self = (taos_metric_sample_t *)taos_malloc(sizeof(taos_metric_sample_t)); @@ -67,7 +71,8 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { if (r_value < 0) { return 1; } - /* + +#ifdef DOUBLE_ATOMIC _Atomic double old = atomic_load(&self->r_value); for (;;) { @@ -76,8 +81,10 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { return 0; } } - */ +#else atomic_fetch_add_64(&self->r_value, r_value); +#endif + return 0; } @@ -87,7 +94,8 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); return 1; } - /* + +#ifdef DOUBLE_ATOMIC _Atomic double old = atomic_load(&self->r_value); for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old - r_value); @@ -95,8 +103,10 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { return 0; } } - */ +#else atomic_fetch_sub_64(&self->r_value, r_value); +#endif + return 0; } @@ -105,9 +115,34 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); return 1; } - /* + +#ifdef DOUBLE_ATOMIC atomic_store(&self->r_value, r_value); - */ +#else atomic_store_64(&self->r_value, r_value); +#endif + return 0; } + +int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, double* old_value) { + if (self->type != TAOS_GAUGE && self->type != TAOS_COUNTER) { + TAOS_LOG(TAOS_METRIC_INCORRECT_TYPE); + return 1; + } + +#ifdef DOUBLE_ATOMIC + _Atomic double new = ATOMIC_VAR_INIT(r_value); + for (;;) { + _Atomic double old = atomic_load(&self->r_value); + *old_value = old; + if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { + return 0; + } + } +#else + *old_value = atomic_exchange_64(&self->r_value, r_value); +#endif + + return 0; +} \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_monitor_util.c b/source/libs/monitorfw/src/taos_monitor_util.c new file mode 100644 index 0000000000..182402b3ff --- /dev/null +++ b/source/libs/monitorfw/src/taos_monitor_util.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + + +#define ALLOW_FORBID_FUNC +#include "tjson.h" +#include +#include +#include +#include "osMemory.h" +#include "tdef.h" + +#include "taos_metric_t.h" + +void taos_monitor_split_str(char** arr, char* str, const char* del) { + char *lasts; + char* s = strsep(&str, del); + while (s != NULL) { + *arr++ = s; + s = strsep(&str, del); + } +} + +void taos_monitor_split_str_metric(char** arr, taos_metric_t* metric, const char* del, char** buf) { + int32_t size = strlen(metric->name); + char* name = taosMemoryMalloc(size + 1); + memset(name, 0, size + 1); + memcpy(name, metric->name, size); + + char* s = strtok(name, del); + while (s != NULL) { + *arr++ = s; + s = strtok(NULL, del); + } + + *buf = name; +} + +const char* taos_monitor_get_metric_name(taos_metric_t* metric){ + return metric->name; +} + +int taos_monitor_count_occurrences(char *str, char *toSearch) { + int count = 0; + char *ptr = str; + while ((ptr = strstr(ptr, toSearch)) != NULL) { + count++; + ptr++; + } + return count; +} + +void taos_monitor_strip(char *s) +{ + size_t i; + size_t len = strlen(s); + size_t offset = 0; + for(i = 0; i < len; ++i){ + char c = s[i]; + if(c=='\"') ++offset; + else s[i-offset] = c; + } + s[len-offset] = '\0'; +} + +bool taos_monitor_is_match(const SJson* tags, char** pairs, int32_t count) { + int32_t size = tjsonGetArraySize(tags); + if(size != count) return false; + + for(int32_t i = 0; i < size; i++){ + SJson* item = tjsonGetArrayItem(tags, i); + + char item_name[MONITOR_TAG_NAME_LEN] = {0}; + tjsonGetStringValue(item, "name", item_name); + + char item_value[MONITOR_TAG_VALUE_LEN] = {0}; + tjsonGetStringValue(item, "value", item_value); + + bool isfound = false; + for(int32_t j = 0; j < count; j++){ + + char** pair = pairs + j * 2; + + char* key = *pair; + char* value = *(pair + 1); + + + if(strcmp(value, item_value) == 0 && strcmp(key, item_name) == 0){ + isfound = true; + break; + } + } + + if(!isfound) return false; + } + + return true; +} From f6ecd8d20477812493b8b4194fd62941900da493 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 01:37:32 +0000 Subject: [PATCH 030/107] keep old protocal --- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 590c25b936..3d6be1f433 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -19,7 +19,13 @@ #include "audit.h" static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) { - //pInfo->protocol = 1; + pInfo->protocol = 1; + pInfo->dnode_id = pDnode->data.dnodeId; + pInfo->cluster_id = pDnode->data.clusterId; + tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN); +} + +static void dmGetMonitorBasicInfoBasic(SDnode *pDnode, SMonBasicInfo *pInfo) { pInfo->protocol = 2; pInfo->dnode_id = pDnode->data.dnodeId; pInfo->cluster_id = pDnode->data.clusterId; @@ -45,6 +51,12 @@ static void dmGetDmMonitorInfo(SDnode *pDnode) { monSetDmInfo(&dmInfo); } +static void dmGetDmMonitorInfoBasic(SDnode *pDnode) { + SMonDmInfo dmInfo = {0}; + dmGetMonitorBasicInfoBasic(pDnode, &dmInfo.basic); + monSetDmInfo(&dmInfo); +} + static void dmGetMmMonitorInfo(SDnode *pDnode) { SMgmtWrapper *pWrapper = &pDnode->wrappers[MNODE]; if (dmMarkWrapper(pWrapper) == 0) { @@ -115,11 +127,8 @@ void dmSendMonitorReportBasic() { dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort); SDnode *pDnode = dmInstance(); - dmGetDmMonitorInfo(pDnode); + dmGetDmMonitorInfoBasic(pDnode); dmGetMmMonitorInfo(pDnode); - //dmGetVmMonitorInfo(pDnode); - //dmGetQmMonitorInfo(pDnode); - //dmGetSmMonitorInfo(pDnode); monGenAndSendReportBasic(); } From e7953ad541ade1c19eac0c6571bd0f316cd99344 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 03:26:04 +0000 Subject: [PATCH 031/107] revert client change --- source/client/src/clientEnv.c | 4 ---- source/client/src/selectMonitor.c | 2 +- source/client/src/slowQueryMonitor.c | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index bb77c530c3..d5f444a0e3 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -83,8 +83,6 @@ static void deregisterRequest(SRequestObj *pRequest) { int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1); int32_t reqType = SLOW_LOG_TYPE_OTHERS; - //taosSsleep(3); - int64_t duration = taosGetTimestampUs() - pRequest->metric.start; tscDebug("0x%" PRIx64 " free Request from connObj: 0x%" PRIx64 ", reqId:0x%" PRIx64 " elapsed:%.2f ms, " @@ -111,8 +109,6 @@ static void deregisterRequest(SRequestObj *pRequest) { } } - duration = 7000000; - if (duration >= (tsSlowLogThreshold * 1000000UL)) { atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1); if (tsSlowLogScope & reqType) { diff --git a/source/client/src/selectMonitor.c b/source/client/src/selectMonitor.c index 58aba8de0b..c1cab23188 100644 --- a/source/client/src/selectMonitor.c +++ b/source/client/src/selectMonitor.c @@ -16,7 +16,7 @@ #include "clientMonitor.h" #include "clientLog.h" -const char* selectMonitorName = "slow_query:slow_query_metric"; +const char* selectMonitorName = "slow_query"; const char* selectMonitorHelp = "slow query log when cost > 3s"; const int selectMonitorLabelCount = 1; const char* selectMonitorLabels[] = {"default"}; diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 4af00f5360..420b66a954 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -17,7 +17,7 @@ #include "clientLog.h" #include "tglobal.h" -const char* slowQueryName = "slow_query:slow_query_metric"; +const char* slowQueryName = "slow_query"; const char* slowQueryHelp = "slow query log when cost > 3s"; const int slowQueryLabelCount = 1; const char* slowQueryLabels[] = {"cost"}; From 0f90422a39040ae8a82675c421de38dd411cc931 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 03:34:45 +0000 Subject: [PATCH 032/107] revert client --- source/libs/monitor/src/clientMonitor.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index 64df693e1e..db5fde0d8d 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -10,14 +10,13 @@ tmr_h tmrStartHandle; SHashObj* clusterMonitorInfoTable; static const int interval = 1000; // ms -static const int sendBathchSize = 1; +static const int sendBathchSize = 10; int32_t sendReport(ClientMonitor* pMonitor, char* pCont); void generateClusterReport(ClientMonitor* pMonitor, bool send) { char ts[50]; sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); char* pCont = (char*)taos_collector_registry_bridge_new(pMonitor->registry, ts, "%" PRId64, NULL); - uInfo("report cont:\n%s", pCont); if (send && strlen(pCont) != TSDB_CODE_SUCCESS) { if (sendReport(pMonitor, pCont) == 0) { taos_collector_registry_clear_batch(pMonitor->registry); From b10d7e7c1f9ab27ed62746ce1529264ec73f3cfd Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 07:30:54 +0000 Subject: [PATCH 033/107] compile atomic --- source/libs/monitorfw/inc/taos_metric_sample_t.h | 4 ++++ source/libs/monitorfw/src/taos_metric_sample.c | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 3aa9b7bb99..fd796978b3 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -21,6 +21,10 @@ #define DOUBLE_ATOMIC +#ifdef DOUBLE_ATOMIC +#include +#endif + struct taos_metric_sample { taos_metric_type_t type; /**< type is the metric type for the sample */ char *l_value; /**< l_value is the full metric name and label set represeted as a string */ diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 04a6045e76..1ee699fe2b 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -25,8 +25,6 @@ #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" -#define DOUBLE_ATOMIC - #ifdef DOUBLE_ATOMIC #include #else From 2a8ef27f33934be8f1e7953239fe6a93fd07357e Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 08:22:21 +0000 Subject: [PATCH 034/107] compile in macos --- source/libs/monitorfw/src/taos_metric_sample.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 1ee699fe2b..c6c3844ab3 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -71,7 +71,7 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { } #ifdef DOUBLE_ATOMIC - _Atomic double old = atomic_load(&self->r_value); + /*_Atomic*/ double old = atomic_load(&self->r_value); for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old + r_value); @@ -94,7 +94,7 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { } #ifdef DOUBLE_ATOMIC - _Atomic double old = atomic_load(&self->r_value); + /*_Atomic*/ double old = atomic_load(&self->r_value); for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old - r_value); if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { @@ -130,7 +130,7 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub } #ifdef DOUBLE_ATOMIC - _Atomic double new = ATOMIC_VAR_INIT(r_value); + /*_Atomic*/ double new = ATOMIC_VAR_INIT(r_value); for (;;) { _Atomic double old = atomic_load(&self->r_value); *old_value = old; From b693d990dc4fce295e75121156ce9611094e502c Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 25 Jan 2024 09:14:59 +0000 Subject: [PATCH 035/107] atomic macos --- source/libs/monitorfw/src/taos_metric_sample.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index c6c3844ab3..62b058d846 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -130,9 +130,9 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub } #ifdef DOUBLE_ATOMIC - /*_Atomic*/ double new = ATOMIC_VAR_INIT(r_value); + _Atomic double new = ATOMIC_VAR_INIT(r_value); for (;;) { - _Atomic double old = atomic_load(&self->r_value); + /*_Atomic*/ double old = atomic_load(&self->r_value); *old_value = old; if (atomic_compare_exchange_weak(&self->r_value, &old, new)) { return 0; From 580dd28565d5df248d1af6646847e693a08b83fa Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 26 Jan 2024 02:00:43 +0000 Subject: [PATCH 036/107] except windows --- source/libs/monitorfw/inc/taos_metric_sample_t.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index fd796978b3..1cc291b3cc 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -19,7 +19,9 @@ #include "taos_metric_sample.h" #include "taos_metric_t.h" +#if !defined(WINDOWS) #define DOUBLE_ATOMIC +#endif #ifdef DOUBLE_ATOMIC #include From c5b06d44fe45e3ba8d6af0ce3dff3b55f9e9c250 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 26 Jan 2024 03:03:34 +0000 Subject: [PATCH 037/107] windows osAtomic.h --- source/libs/monitorfw/src/taos_metric_sample.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 62b058d846..9b16e6fe1a 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -29,6 +29,7 @@ #include #else #define ALLOW_FORBID_FUNC +#include "tdef.h" #include "osAtomic.h" #endif From 8d683983e0dddeaaf0f4aa61c2fb0c8c4bed06a7 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 29 Jan 2024 10:11:17 +0000 Subject: [PATCH 038/107] interface name --- source/dnode/vnode/src/inc/vnodeInt.h | 2 +- source/libs/monitor/src/monMain.c | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index eb9c3483d1..bc54a6b3c8 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -106,7 +106,7 @@ typedef struct SQueryNode SQueryNode; #define VND_INFO_FNAME "vnode.json" #define VND_INFO_FNAME_TMP "vnode_tmp.json" -#define VNODE_METRIC_SQL_COUNT "taoscd_sql_req:count" +#define VNODE_METRIC_SQL_COUNT "taos_sql_req:count" #define VNODE_METRIC_TAG_NAME_SQL_TYPE "sql_type" #define VNODE_METRIC_TAG_NAME_CLUSTER_ID "cluster_id" diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 83cde72a91..22b53340e1 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -23,7 +23,8 @@ SMonitor tsMonitor = {0}; char* tsMonUri = "/report"; -char* tsMonFwUri = "/td_metric"; +char* tsMonFwUri = "/general-metric"; +char* tsMonFwBasicUri = "/taosd-cluster-basic"; void monRecordLog(int64_t ts, ELogLevel level, const char *content) { taosThreadMutexLock(&tsMonitor.lock); @@ -554,7 +555,7 @@ static void monGenLogJson(SMonInfo *pMonitor) { void monSendReport(SMonInfo *pMonitor){ char *pCont = tjsonToString(pMonitor->pJson); if(tsMonitorLogProtocol){ - uInfoL("report cont basic:\n%s", pCont); + uInfoL("report cont:\n%s", pCont); } if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; @@ -597,6 +598,20 @@ void monGenAndSendReport() { monCleanupMonitorInfo(pMonitor); } +void monSendReportBasic(SMonInfo *pMonitor){ + char *pCont = tjsonToString(pMonitor->pJson); + if(tsMonitorLogProtocol){ + uInfoL("report cont basic:\n%s", pCont); + } + if (pCont != NULL) { + EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwBasicUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + uError("failed to send monitor msg"); + } + taosMemoryFree(pCont); + } +} + void monGenAndSendReportBasic() { SMonInfo *pMonitor = monCreateMonitorInfo(); if (pMonitor == NULL) return; @@ -605,7 +620,7 @@ void monGenAndSendReportBasic() { monGenBasicJsonBasic(pMonitor); monGenClusterJsonBasic(pMonitor); - monSendReport(pMonitor); + monSendReportBasic(pMonitor); monCleanupMonitorInfo(pMonitor); } \ No newline at end of file From 80d5f35bc5d742e1bb8782265981ee21e4c56f5b Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 31 Jan 2024 01:33:56 +0000 Subject: [PATCH 039/107] vgroups table name --- source/libs/monitor/src/monFramework.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 3cc2ab8c90..47912a188c 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -46,7 +46,7 @@ extern char* tsMonFwUri; #define TIMESERIES_USED CLUSTER_TABLE":timeseries_used" #define TIMESERIES_TOTAL CLUSTER_TABLE":timeseries_total" -#define VGROUP_TABLE "taosd_cluster_vgroups_info" +#define VGROUP_TABLE "taosd_vgroups_info" #define TABLES_NUM VGROUP_TABLE":tables_num" #define STATUS VGROUP_TABLE":status" From 907e06ad4deaa54d41d40b96be339a2f147465bb Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 1 Feb 2024 04:52:54 +0000 Subject: [PATCH 040/107] clusterid by taosd --- source/dnode/mnode/impl/src/mndDnode.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index bd0c29f4c8..50bc95f546 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -14,6 +14,7 @@ */ #define _DEFAULT_SOURCE +#include #include "tjson.h" #include "mndDnode.h" #include "audit.h" @@ -500,6 +501,9 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { SStatisReq statisReq = {0}; int32_t code = -1; + char strClusterId[TSDB_CLUSTER_ID_LEN] = {0}; + sprintf(strClusterId, "%"PRId64, pMnode->clusterId); + if (tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq) != 0) { terrno = TSDB_CODE_INVALID_MSG; goto _OVER; @@ -546,8 +550,21 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { *(sample_labels + j) = taosMemoryMalloc(MONITOR_TAG_VALUE_LEN); tjsonGetStringValue(item, "value", *(sample_labels + j)); + if(strncmp(*(labels + j), "cluster_id", MONITOR_TAG_NAME_LEN) == 0) { + strncpy(*(sample_labels + j), strClusterId, MONITOR_TAG_VALUE_LEN); + } } + /* + *(labels + tagSize) = taosMemoryMalloc(MONITOR_TAG_NAME_LEN); + strncpy(*(labels + tagSize), "cluster_id", MONITOR_TAG_NAME_LEN); + + *(sample_labels + tagSize) = taosMemoryMalloc(MONITOR_TAG_VALUE_LEN); + strncpy(*(sample_labels + tagSize), strClusterId, MONITOR_TAG_VALUE_LEN); + + tagSize++; + */ + SJson* metrics = tjsonGetObjectItem(item, "metrics"); int32_t metricLen = tjsonGetArraySize(metrics); From 4605f6b0111164e2e3bb6f4b4344c0a3ce02d1f9 Mon Sep 17 00:00:00 2001 From: dm chen Date: Thu, 1 Feb 2024 14:19:12 +0800 Subject: [PATCH 041/107] Windows double atomic --- .../libs/monitorfw/inc/taos_metric_sample_t.h | 2 +- .../libs/monitorfw/src/taos_metric_sample.c | 58 +++++++++++++++++-- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 1cc291b3cc..a955a1fa4d 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -33,7 +33,7 @@ struct taos_metric_sample { #ifdef DOUBLE_ATOMIC _Atomic double r_value; /**< r_value is the value of the metric sample */ #else - int64_t r_value; /**< r_value is the value of the metric sample */ + double r_value; /**< r_value is the value of the metric sample */ #endif }; diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 9b16e6fe1a..d289b4e722 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -31,6 +31,10 @@ #define ALLOW_FORBID_FUNC #include "tdef.h" #include "osAtomic.h" +typedef union { + volatile int64_t i; + double d; +} double_number; #endif taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { @@ -81,7 +85,19 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { } } #else - atomic_fetch_add_64(&self->r_value, r_value); + for (;;) { + double_number old_num; + old_num.i = *(int64_t *)(&self->r_value); // current old value + + double_number new_num; + new_num.d = old_num.d + r_value; + + int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), new_num.i, old_num.i); + + if (old_value == old_num.i) return 0; + } + + //atomic_fetch_add_64(&self->r_value, r_value); #endif return 0; @@ -103,7 +119,19 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { } } #else - atomic_fetch_sub_64(&self->r_value, r_value); + for (;;) { + double_number old_num; + old_num.i = *(int64_t *)(&self->r_value); // current old value + + double_number new_num; + new_num.d = old_num.d - r_value; + + int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), new_num.i, old_num.i); + + if (old_value == old_num.i) return 0; + } + + //atomic_fetch_sub_64(&self->r_value, r_value); #endif return 0; @@ -118,7 +146,16 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { #ifdef DOUBLE_ATOMIC atomic_store(&self->r_value, r_value); #else - atomic_store_64(&self->r_value, r_value); + for (;;) { + int64_t iOld = *(int64_t *)(&self->r_value); // current old value + + int64_t iNew = *(int64_t *)(&r_value); + + int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), iNew, iOld); + + if (old_value == iOld) return 0; + } + //atomic_store_64(&self->r_value, r_value); #endif return 0; @@ -140,7 +177,20 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub } } #else - *old_value = atomic_exchange_64(&self->r_value, r_value); + for (;;) { + int64_t iOld = *(int64_t *)(&self->r_value); // current old value + + int64_t iNew = *(int64_t *)(&r_value); + + int64_t iold_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), iNew, iOld); + + if (iold_value == iOld) { + *old_value = *(double *)(&iold_value); + return 0; + } + } + + //*old_value = atomic_exchange_64(&self->r_value, r_value); #endif return 0; From 7752a57580e8a02ce060067d554675bff52ad270 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 1 Feb 2024 07:26:05 +0000 Subject: [PATCH 042/107] not log null, memory leak, skip empty, default config --- source/common/src/tglobal.c | 2 +- source/libs/monitor/src/monFramework.c | 9 ++++-- source/libs/monitor/src/monMain.c | 13 ++++++--- .../monitorfw/src/taos_collector_registry.c | 29 ++++++++++++------- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index cb853c1a75..4a0a7a3a73 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -95,7 +95,7 @@ int32_t tsMonitorMaxLogs = 100; bool tsMonitorComp = false; bool tsMonitorLogProtocol = false; int32_t tsMonitorIntervalForBasic = 30; -bool tsMonitorForceV2 = false; +bool tsMonitorForceV2 = true; // audit bool tsEnableAudit = true; diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 47912a188c..b1e6265906 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -638,8 +638,13 @@ void monSendPromReport() { char* promStr = NULL; char* pCont = (char *)taos_collector_registry_bridge_new(TAOS_COLLECTOR_REGISTRY_DEFAULT, ts, "%" PRId64, &promStr); if(tsMonitorLogProtocol){ - uInfoL("report cont:\n%s\n", pCont); - uDebugL("report cont prom:\n%s\n", promStr); + if(pCont != NULL){ + uInfoL("report cont:\n%s", pCont); + uDebugL("report cont prom:\n%s", promStr); + } + else{ + uInfo("report cont is null"); + } } if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 22b53340e1..ba3db804c3 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -601,7 +601,12 @@ void monGenAndSendReport() { void monSendReportBasic(SMonInfo *pMonitor){ char *pCont = tjsonToString(pMonitor->pJson); if(tsMonitorLogProtocol){ - uInfoL("report cont basic:\n%s", pCont); + if(pCont != NULL){ + uInfoL("report cont basic:\n%s", pCont); + } + else{ + uInfo("report cont basic is null"); + } } if (pCont != NULL) { EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; @@ -614,13 +619,13 @@ void monSendReportBasic(SMonInfo *pMonitor){ void monGenAndSendReportBasic() { SMonInfo *pMonitor = monCreateMonitorInfo(); - if (pMonitor == NULL) return; - if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; monGenBasicJsonBasic(pMonitor); monGenClusterJsonBasic(pMonitor); - monSendReportBasic(pMonitor); + if (pMonitor->mmInfo.cluster.first_ep_dnode_id != 0) { + monSendReportBasic(pMonitor); + } monCleanupMonitorInfo(pMonitor); } \ No newline at end of file diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index c94675c95c..acf2cb4248 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -234,6 +234,11 @@ const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array); + if(tjsonGetArraySize(array) == 0){ + tjsonDelete(pJson); + return NULL; + } + //caller free this //generate prom protocol for debug if(prom_str != NULL){ @@ -245,36 +250,40 @@ const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, char* old_str = taos_string_builder_str(self->string_builder_batch); if(old_str[0] != '\0'){ r = taos_string_builder_add_str(self->string_builder_batch, ","); - if (r) return NULL; + if (r) goto _OVER; } char * item_str = tjsonToString(item); r = taos_string_builder_add_str(self->string_builder_batch, item_str); taos_free(item_str); - if (r) return NULL; - - tjsonDelete(pJson); + if (r) goto _OVER;; //generate final array format result, ie, add [] to str in batch cache taos_string_builder_t* tmp_builder = taos_string_builder_new(); r = taos_string_builder_add_str(tmp_builder, "["); - if (r) return NULL; + if (r) goto _OVER;; r = taos_string_builder_add_str(tmp_builder, taos_string_builder_str(self->string_builder_batch)); - if (r) return NULL; + if (r) goto _OVER;; r = taos_string_builder_add_str(tmp_builder, "]"); - if (r) return NULL; + if (r) goto _OVER;; //caller free this char *data = taos_string_builder_dump(tmp_builder); - if (data == NULL) return NULL; + if (data == NULL) goto _OVER;; r = taos_string_builder_clear(tmp_builder); - if (r) return NULL; + if (r) goto _OVER;; r = taos_string_builder_destroy(tmp_builder); tmp_builder = NULL; - if (r) return NULL; + if (r) goto _OVER;; + tjsonDelete(pJson); return data; + +_OVER: + tjsonDelete(pJson); + + return NULL; } From 97a120ee0968e09fff3afb79eb1a3e4e35e52860 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 1 Feb 2024 08:41:10 +0000 Subject: [PATCH 043/107] fix taosd monitor case --- tests/system-test/0-others/taosdMonitor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system-test/0-others/taosdMonitor.py b/tests/system-test/0-others/taosdMonitor.py index 169c70e675..690de65dbb 100644 --- a/tests/system-test/0-others/taosdMonitor.py +++ b/tests/system-test/0-others/taosdMonitor.py @@ -267,6 +267,7 @@ class TDTestCase: updatecfgDict["monitorInterval"] = "5" updatecfgDict["monitorMaxLogs"] = "10" updatecfgDict["monitorComp"] = "1" + updatecfgDict["monitorForceV2"] = "0" updatecfgDict["audit"] = '0' From d3b668bd5fdd3ba81dc848612fe2773868aa74cb Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 2 Feb 2024 01:48:00 +0000 Subject: [PATCH 044/107] double atomic lib --- include/os/osAtomic.h | 4 ++ .../libs/monitorfw/src/taos_metric_sample.c | 58 ++---------------- source/os/src/osAtomic.c | 61 +++++++++++++++++++ 3 files changed, 69 insertions(+), 54 deletions(-) diff --git a/include/os/osAtomic.h b/include/os/osAtomic.h index 9fd00cefb4..48b7b8c56f 100644 --- a/include/os/osAtomic.h +++ b/include/os/osAtomic.h @@ -48,11 +48,13 @@ void atomic_store_8(int8_t volatile *ptr, int8_t val); void atomic_store_16(int16_t volatile *ptr, int16_t val); void atomic_store_32(int32_t volatile *ptr, int32_t val); void atomic_store_64(int64_t volatile *ptr, int64_t val); +double atomic_store_double(double volatile *ptr, double val); void atomic_store_ptr(void *ptr, void *val); int8_t atomic_exchange_8(int8_t volatile *ptr, int8_t val); int16_t atomic_exchange_16(int16_t volatile *ptr, int16_t val); int32_t atomic_exchange_32(int32_t volatile *ptr, int32_t val); int64_t atomic_exchange_64(int64_t volatile *ptr, int64_t val); +double atomic_exchange_double(double volatile *ptr, int64_t val); void *atomic_exchange_ptr(void *ptr, void *val); int8_t atomic_val_compare_exchange_8(int8_t volatile *ptr, int8_t oldval, int8_t newval); int16_t atomic_val_compare_exchange_16(int16_t volatile *ptr, int16_t oldval, int16_t newval); @@ -68,6 +70,7 @@ int8_t atomic_fetch_add_8(int8_t volatile *ptr, int8_t val); int16_t atomic_fetch_add_16(int16_t volatile *ptr, int16_t val); int32_t atomic_fetch_add_32(int32_t volatile *ptr, int32_t val); int64_t atomic_fetch_add_64(int64_t volatile *ptr, int64_t val); +double atomic_fetch_add_double(double volatile *ptr, double val); void *atomic_fetch_add_ptr(void *ptr, void *val); int8_t atomic_sub_fetch_8(int8_t volatile *ptr, int8_t val); int16_t atomic_sub_fetch_16(int16_t volatile *ptr, int16_t val); @@ -78,6 +81,7 @@ int8_t atomic_fetch_sub_8(int8_t volatile *ptr, int8_t val); int16_t atomic_fetch_sub_16(int16_t volatile *ptr, int16_t val); int32_t atomic_fetch_sub_32(int32_t volatile *ptr, int32_t val); int64_t atomic_fetch_sub_64(int64_t volatile *ptr, int64_t val); +double atomic_fetch_sub_double(double volatile *ptr, double val); void *atomic_fetch_sub_ptr(void *ptr, void *val); int8_t atomic_and_fetch_8(int8_t volatile *ptr, int8_t val); int16_t atomic_and_fetch_16(int16_t volatile *ptr, int16_t val); diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index d289b4e722..445568ed5b 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -31,10 +31,6 @@ #define ALLOW_FORBID_FUNC #include "tdef.h" #include "osAtomic.h" -typedef union { - volatile int64_t i; - double d; -} double_number; #endif taos_metric_sample_t *taos_metric_sample_new(taos_metric_type_t type, const char *l_value, double r_value) { @@ -85,19 +81,7 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { } } #else - for (;;) { - double_number old_num; - old_num.i = *(int64_t *)(&self->r_value); // current old value - - double_number new_num; - new_num.d = old_num.d + r_value; - - int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), new_num.i, old_num.i); - - if (old_value == old_num.i) return 0; - } - - //atomic_fetch_add_64(&self->r_value, r_value); + atomic_fetch_add_double(&self->r_value, r_value); #endif return 0; @@ -119,19 +103,7 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { } } #else - for (;;) { - double_number old_num; - old_num.i = *(int64_t *)(&self->r_value); // current old value - - double_number new_num; - new_num.d = old_num.d - r_value; - - int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), new_num.i, old_num.i); - - if (old_value == old_num.i) return 0; - } - - //atomic_fetch_sub_64(&self->r_value, r_value); + atomic_fetch_sub_double(&self->r_value, r_value); #endif return 0; @@ -146,16 +118,7 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { #ifdef DOUBLE_ATOMIC atomic_store(&self->r_value, r_value); #else - for (;;) { - int64_t iOld = *(int64_t *)(&self->r_value); // current old value - - int64_t iNew = *(int64_t *)(&r_value); - - int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), iNew, iOld); - - if (old_value == iOld) return 0; - } - //atomic_store_64(&self->r_value, r_value); + atomic_store_double(&self->r_value, r_value); #endif return 0; @@ -177,20 +140,7 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub } } #else - for (;;) { - int64_t iOld = *(int64_t *)(&self->r_value); // current old value - - int64_t iNew = *(int64_t *)(&r_value); - - int64_t iold_value = atomic_val_compare_exchange_64((volatile int64_t *)(&self->r_value), iNew, iOld); - - if (iold_value == iOld) { - *old_value = *(double *)(&iold_value); - return 0; - } - } - - //*old_value = atomic_exchange_64(&self->r_value, r_value); + *old_value = atomic_exchange_double(&self->r_value, r_value); #endif return 0; diff --git a/source/os/src/osAtomic.c b/source/os/src/osAtomic.c index a54c301de9..3736a71e08 100644 --- a/source/os/src/osAtomic.c +++ b/source/os/src/osAtomic.c @@ -16,6 +16,11 @@ #define ALLOW_FORBID_FUNC #include "os.h" +typedef union { + volatile int64_t i; + double d; +} double_number; + #ifdef WINDOWS // add @@ -339,6 +344,18 @@ void atomic_store_64(int64_t volatile* ptr, int64_t val) { #endif } +double atomic_store_double(double volatile *ptr, double val){ + for (;;) { + int64_t iOld = *(int64_t *)ptr; // current old value + + int64_t iNew = *(int64_t *)(&val); + + int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)ptr, iOld, iNew); + + if (old_value == iOld) return old_value; + } +} + void atomic_store_ptr(void* ptr, void* val) { #ifdef WINDOWS ((*(void* volatile*)(ptr)) = (void*)(val)); @@ -393,6 +410,20 @@ int64_t atomic_exchange_64(int64_t volatile* ptr, int64_t val) { #endif } +double atomic_exchange_double(double volatile *ptr, int64_t val){ + for (;;) { + int64_t iOld = *(int64_t *)ptr; // current old value + + int64_t iNew = *(int64_t *)(&val); + + int64_t iold_value = atomic_val_compare_exchange_64((volatile int64_t *)ptr, iOld, iNew); + + if (iold_value == iOld) { + return *(double *)(&iold_value); + } + } +} + void* atomic_exchange_ptr(void* ptr, void* val) { #ifdef WINDOWS #ifdef _WIN64 @@ -551,6 +582,21 @@ int64_t atomic_fetch_add_64(int64_t volatile* ptr, int64_t val) { #endif } +double atomic_fetch_add_double(double volatile *ptr, double val){ + for (;;) { + double_number old_num = {0}; + old_num.i = *(int64_t *)ptr; // current old value + + double_number new_num = {0}; + new_num.d = old_num.d + val; + + double_number ret_num = {0}; + ret_num.i = atomic_val_compare_exchange_64((volatile int64_t *)ptr, old_num.i, new_num.i); + + if (ret_num.i == old_num.i) return ret_num.d; + } +} + void* atomic_fetch_add_ptr(void* ptr, void* val) { #ifdef WINDOWS return _InterlockedExchangePointer((void* volatile*)(ptr), (void*)(val)); @@ -657,6 +703,21 @@ int64_t atomic_fetch_sub_64(int64_t volatile* ptr, int64_t val) { #endif } +double atomic_fetch_sub_double(double volatile *ptr, double val){ + for (;;) { + double_number old_num = {0}; + old_num.i = *(int64_t *)ptr; // current old value + + double_number new_num = {0}; + new_num.d = old_num.d - val; + + double_number ret_num = {0}; + ret_num.i = atomic_val_compare_exchange_64((volatile int64_t *)ptr, old_num.i, new_num.i); + + if (ret_num.i == old_num.i) return ret_num.d; + } +} + void* atomic_fetch_sub_ptr(void* ptr, void* val) { #ifdef WINDOWS return interlocked_fetch_sub_ptr(ptr, val); From 7ae45a0a837d27d7f51e57f942356f820625095d Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 2 Feb 2024 02:21:06 +0000 Subject: [PATCH 045/107] atomic refactor --- .../libs/monitorfw/inc/taos_metric_sample_t.h | 6 ++-- .../libs/monitorfw/src/taos_metric_sample.c | 10 +++---- source/os/src/osAtomic.c | 28 +++++++++++-------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index a955a1fa4d..62d58c5b9f 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -20,17 +20,17 @@ #include "taos_metric_t.h" #if !defined(WINDOWS) -#define DOUBLE_ATOMIC +#define C11_ATOMIC #endif -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC #include #endif struct taos_metric_sample { taos_metric_type_t type; /**< type is the metric type for the sample */ char *l_value; /**< l_value is the full metric name and label set represeted as a string */ -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC _Atomic double r_value; /**< r_value is the value of the metric sample */ #else double r_value; /**< r_value is the value of the metric sample */ diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index 445568ed5b..c3f948434d 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -25,7 +25,7 @@ #include "taos_metric_sample_i.h" #include "taos_metric_sample_t.h" -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC #include #else #define ALLOW_FORBID_FUNC @@ -71,7 +71,7 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { return 1; } -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC /*_Atomic*/ double old = atomic_load(&self->r_value); for (;;) { @@ -94,7 +94,7 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { return 1; } -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC /*_Atomic*/ double old = atomic_load(&self->r_value); for (;;) { _Atomic double new = ATOMIC_VAR_INIT(old - r_value); @@ -115,7 +115,7 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { return 1; } -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC atomic_store(&self->r_value, r_value); #else atomic_store_double(&self->r_value, r_value); @@ -130,7 +130,7 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub return 1; } -#ifdef DOUBLE_ATOMIC +#ifdef C11_ATOMIC _Atomic double new = ATOMIC_VAR_INIT(r_value); for (;;) { /*_Atomic*/ double old = atomic_load(&self->r_value); diff --git a/source/os/src/osAtomic.c b/source/os/src/osAtomic.c index 3736a71e08..e56cf629bb 100644 --- a/source/os/src/osAtomic.c +++ b/source/os/src/osAtomic.c @@ -346,13 +346,16 @@ void atomic_store_64(int64_t volatile* ptr, int64_t val) { double atomic_store_double(double volatile *ptr, double val){ for (;;) { - int64_t iOld = *(int64_t *)ptr; // current old value + double_number old_num = {0}; + old_num.d = *ptr; // current old value - int64_t iNew = *(int64_t *)(&val); + double_number new_num = {0}; + new_num.d = val; - int64_t old_value = atomic_val_compare_exchange_64((volatile int64_t *)ptr, iOld, iNew); + double_number ret_num = {0}; + ret_num.i = atomic_val_compare_exchange_64((volatile int64_t *)ptr, old_num.i, new_num.i); - if (old_value == iOld) return old_value; + if (ret_num.i == old_num.i) return ret_num.d; } } @@ -412,14 +415,17 @@ int64_t atomic_exchange_64(int64_t volatile* ptr, int64_t val) { double atomic_exchange_double(double volatile *ptr, int64_t val){ for (;;) { - int64_t iOld = *(int64_t *)ptr; // current old value + double_number old_num = {0}; + old_num.i = *ptr; // current old value - int64_t iNew = *(int64_t *)(&val); + double_number new_num = {0}; + int64_t iNew = val; - int64_t iold_value = atomic_val_compare_exchange_64((volatile int64_t *)ptr, iOld, iNew); + double_number ret_num = {0}; + ret_num.i = atomic_val_compare_exchange_64((volatile int64_t *)ptr, old_num.i, new_num.i); - if (iold_value == iOld) { - return *(double *)(&iold_value); + if (ret_num.i == old_num.i) { + return ret_num.d; } } } @@ -585,7 +591,7 @@ int64_t atomic_fetch_add_64(int64_t volatile* ptr, int64_t val) { double atomic_fetch_add_double(double volatile *ptr, double val){ for (;;) { double_number old_num = {0}; - old_num.i = *(int64_t *)ptr; // current old value + old_num.d = *ptr; // current old value double_number new_num = {0}; new_num.d = old_num.d + val; @@ -706,7 +712,7 @@ int64_t atomic_fetch_sub_64(int64_t volatile* ptr, int64_t val) { double atomic_fetch_sub_double(double volatile *ptr, double val){ for (;;) { double_number old_num = {0}; - old_num.i = *(int64_t *)ptr; // current old value + old_num.d = *ptr; // current old value double_number new_num = {0}; new_num.d = old_num.d - val; From 010d3fc860ae7078609ca1ed1febb2864de8a94c Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Fri, 2 Feb 2024 13:39:31 +0800 Subject: [PATCH 046/107] add select count --- include/libs/monitor/clientMonitor.h | 11 ++++- source/client/inc/clientInt.h | 5 +-- source/client/src/clientEnv.c | 3 +- source/client/src/clientImpl.c | 1 + .../{selectMonitor.c => clientSqlMonitor.c} | 29 +++++++++---- source/client/src/slowQueryMonitor.c | 42 ++++++++++--------- source/libs/monitor/src/clientMonitor.c | 28 ++++++++++--- 7 files changed, 80 insertions(+), 39 deletions(-) rename source/client/src/{selectMonitor.c => clientSqlMonitor.c} (60%) diff --git a/include/libs/monitor/clientMonitor.h b/include/libs/monitor/clientMonitor.h index 9d97c9004f..9c0302a15f 100644 --- a/include/libs/monitor/clientMonitor.h +++ b/include/libs/monitor/clientMonitor.h @@ -24,6 +24,14 @@ extern "C" { #include "thash.h" #include "query.h" +typedef enum SQL_RESULT_CODE { + SQL_RESULT_SUCCESS = 0, + SQL_RESULT_FAILED = 1, + SQL_RESULT_CANCEL = 2, +} SQL_RESULT_CODE; + +const char* resultStr(SQL_RESULT_CODE code); + typedef struct { char clusterKey[512]; SEpSet epSet; @@ -38,8 +46,7 @@ void clusterMonitorClose(const char* clusterKey); taos_counter_t* createClusterCounter(const char* clusterKey, const char* name, const char* help, size_t label_key_count, const char** label_keys); int taosClusterCounterInc(const char* clusterKey, const char* counterName, const char** label_values); - -void cluster_monitor_stop(); +void cluster_monitor_stop(); #ifdef __cplusplus } diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index bae0627055..257ee35aaf 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -432,11 +432,10 @@ int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, boo #endif void clusterSlowQueryMonitorInit(const char* clusterKey); -void clusterSlowQueryLog(const char* clusterKey, int32_t cost); -void SlowQueryLog(int64_t rid, int32_t cost); +void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); void clusterSelectMonitorInit(const char* clusterKey); -void clusterSelectLog(const char* clusterKey); +void selectLog(int64_t rid, bool killed, int32_t code); #ifdef __cplusplus } diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index d5f444a0e3..bd83f15e7e 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -105,6 +105,7 @@ static void deregisterRequest(SRequestObj *pRequest) { pRequest->metric.planCostUs, pRequest->metric.execCostUs); atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); + selectLog(pTscObj->id, pRequest->killed, pRequest->code); reqType = SLOW_LOG_TYPE_QUERY; } } @@ -115,7 +116,7 @@ static void deregisterRequest(SRequestObj *pRequest) { taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 ", Duration:%" PRId64 "us, SQL:%s", taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr); - SlowQueryLog(pTscObj->id, duration); + SlowQueryLog(pTscObj->id, pRequest->killed, pRequest->code, duration); } } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 405df7377f..a165ef6e88 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -160,6 +160,7 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas pInst = &p; clusterSlowQueryMonitorInit(p->instKey); + clusterSelectMonitorInit(p->instKey); } else { ASSERTS((*pInst) && (*pInst)->pAppHbMgr, "*pInst:%p, pAppHgMgr:%p", *pInst, (*pInst) ? (*pInst)->pAppHbMgr : NULL); // reset to 0 in case of conn with duplicated user key but its user has ever been dropped. diff --git a/source/client/src/selectMonitor.c b/source/client/src/clientSqlMonitor.c similarity index 60% rename from source/client/src/selectMonitor.c rename to source/client/src/clientSqlMonitor.c index c1cab23188..79a862275f 100644 --- a/source/client/src/selectMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -16,10 +16,12 @@ #include "clientMonitor.h" #include "clientLog.h" -const char* selectMonitorName = "slow_query"; -const char* selectMonitorHelp = "slow query log when cost > 3s"; -const int selectMonitorLabelCount = 1; -const char* selectMonitorLabels[] = {"default"}; +const char* selectMonitorName = "select sql"; +const char* selectMonitorHelp = "count for select sql"; +const int selectMonitorLabelCount = 4; +const char* selectMonitorLabels[] = {"cluster_id", "sql_type", "username", "result"}; + +static const char* defaultClusterID = ""; void clusterSelectMonitorInit(const char* clusterKey) { SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); @@ -28,18 +30,27 @@ void clusterSelectMonitorInit(const char* clusterKey) { createClusterCounter(clusterKey, selectMonitorName, selectMonitorHelp, selectMonitorLabelCount, selectMonitorLabels); } -void clusterSelectLog(const char* clusterKey) { - const char* selectMonitorLabelValues[] = {"default"}; +void clusterSelectLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result) { + const char* selectMonitorLabelValues[] = {defaultClusterID, "select", user, resultStr(result)}; taosClusterCounterInc(clusterKey, selectMonitorName, selectMonitorLabelValues); } -void selectLog(int64_t rid) { +void selectLog(int64_t rid, bool killed, int32_t code) { + SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; + if (TSDB_CODE_SUCCESS != code) { + result = SQL_RESULT_FAILED; + } + // to do Distinguish active Kill events + // else if (killed) { + // result = SQL_RESULT_CANCEL; + // } + STscObj* pTscObj = acquireTscObj(rid); if (pTscObj != NULL) { - if(pTscObj->pAppInfo == NULL) { + if (pTscObj->pAppInfo == NULL) { tscLog("selectLog, not found pAppInfo"); } - return clusterSelectLog(pTscObj->pAppInfo->instKey); + return clusterSelectLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); } else { tscLog("selectLog, not found rid"); } diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 420b66a954..8f6253007f 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -18,28 +18,23 @@ #include "tglobal.h" const char* slowQueryName = "slow_query"; -const char* slowQueryHelp = "slow query log when cost > 3s"; -const int slowQueryLabelCount = 1; -const char* slowQueryLabels[] = {"cost"}; +const char* slowQueryHelp = "slow query log when cost over than config duration"; +const int slowQueryLabelCount = 4; +const char* slowQueryLabels[] = {"cluster_id", "username", "result", "duration"}; +static const char* defaultClusterID = ""; const int64_t msInSeconds = 1000; const int64_t msInMinutes = 60 * 1000; static const char* getSlowQueryLableCostDesc(int64_t cost) { - if (cost >= 30 * msInMinutes) { - return " > 30 min"; - } else if (cost >= 10 * msInMinutes) { - return " > 10 min"; - } else if (cost >= 5 * msInMinutes) { - return " > 5 min"; - } else if (cost >= 1 * msInMinutes) { - return " > 1 min"; - } else if (cost >= 30 * msInSeconds) { - return " > 30 seconds"; + if (cost >= 10000 * msInSeconds) { + return " > 10000 seconds"; + } else if (cost >= 1000 * msInSeconds) { + return " > 1000 seconds"; + } else if (cost >= 100 * msInSeconds) { + return " > 100 seconds"; } else if (cost >= 10 * msInSeconds) { return " > 10 seconds"; - } else if (cost >= 5 * msInSeconds) { - return " > 5 seconds"; } else if (cost >= 3 * msInSeconds) { return " > 3 seconds"; } @@ -54,19 +49,28 @@ void clusterSlowQueryMonitorInit(const char* clusterKey) { createClusterCounter(clusterKey, slowQueryName, slowQueryHelp, slowQueryLabelCount, slowQueryLabels); } -void clusterSlowQueryLog(const char* clusterKey, int32_t cost) { - const char* slowQueryLabelValues[] = {getSlowQueryLableCostDesc(cost)}; +void clusterSlowQueryLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result, int32_t cost) { + const char* slowQueryLabelValues[] = {defaultClusterID, user, resultStr(result), getSlowQueryLableCostDesc(cost)}; taosClusterCounterInc(clusterKey, slowQueryName, slowQueryLabelValues); } -void SlowQueryLog(int64_t rid, int32_t cost) { +void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost) { if (!enableSlowQueryMonitor) return; + SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; + if (TSDB_CODE_SUCCESS != code) { + result = SQL_RESULT_FAILED; + } + // to do Distinguish active Kill events + // else if (killed) { + // result = SQL_RESULT_CANCEL; + // } + STscObj* pTscObj = acquireTscObj(rid); if (pTscObj != NULL) { if(pTscObj->pAppInfo == NULL) { tscLog("SlowQueryLog, not found pAppInfo"); } - return clusterSlowQueryLog(pTscObj->pAppInfo->instKey, cost); + return clusterSlowQueryLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, cost); } else { tscLog("SlowQueryLog, not found rid"); } diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index db5fde0d8d..e3b49da858 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -3,21 +3,26 @@ #include "tmisce.h" #include "ttime.h" #include "ttimer.h" +#include "tglobal.h" SRWLatch monitorLock; void* tmrClientMonitor; tmr_h tmrStartHandle; SHashObj* clusterMonitorInfoTable; -static const int interval = 1000; // ms -static const int sendBathchSize = 10; +static int interval = 30 * 1000; +static int sendBathchSize = 1; int32_t sendReport(ClientMonitor* pMonitor, char* pCont); void generateClusterReport(ClientMonitor* pMonitor, bool send) { char ts[50]; sprintf(ts, "%" PRId64, taosGetTimestamp(TSDB_TIME_PRECISION_MILLI)); char* pCont = (char*)taos_collector_registry_bridge_new(pMonitor->registry, ts, "%" PRId64, NULL); - if (send && strlen(pCont) != TSDB_CODE_SUCCESS) { + if(NULL == pCont) { + uError("generateClusterReport failed, get null content."); + return; + } + if (send && strlen(pCont) != 0) { if (sendReport(pMonitor, pCont) == 0) { taos_collector_registry_clear_batch(pMonitor->registry); } @@ -25,7 +30,7 @@ void generateClusterReport(ClientMonitor* pMonitor, bool send) { } void reportSendProcess(void* param, void* tmrId) { - taosTmrReset(reportSendProcess, interval, NULL, tmrClientMonitor, &tmrStartHandle); + taosTmrReset(reportSendProcess, tsMonitorInterval * 1000, NULL, tmrClientMonitor, &tmrStartHandle); taosRLockLatch(&monitorLock); static int index = 0; @@ -49,7 +54,15 @@ void monitorClientInitOnce() { (SHashObj*)taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); tmrClientMonitor = taosTmrInit(0, 0, 0, "MONITOR"); - tmrStartHandle = taosTmrStart(reportSendProcess, interval, NULL, tmrClientMonitor); + tmrStartHandle = taosTmrStart(reportSendProcess, tsMonitorInterval * 1000, NULL, tmrClientMonitor); + if(tsMonitorInterval < 1){ + interval = 30 * 1000; + } else { + interval = tsMonitorInterval * 1000; + } + if (tsMonitorInterval < 10) { + sendBathchSize = (10 / sendBathchSize) + 1; + } taosInitRWLatch(&monitorLock); } } @@ -185,3 +198,8 @@ void clusterMonitorClose(const char* clusterKey) { } taosWUnLockLatch(&monitorLock); } + +const char* resultStr(SQL_RESULT_CODE code) { + static const char* result_state[] = {"Success", "Failed", "Cancel"}; + return result_state[code]; +} From 881df9d9363c17e3e22b1fb327a5502af11849fb Mon Sep 17 00:00:00 2001 From: cadem Date: Fri, 2 Feb 2024 13:47:11 +0800 Subject: [PATCH 047/107] windows atomic --- source/libs/monitorfw/inc/taos_metric_sample_t.h | 6 ++++++ source/libs/monitorfw/src/taos_metric_sample.c | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 62d58c5b9f..6ebc000df5 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -21,6 +21,8 @@ #if !defined(WINDOWS) #define C11_ATOMIC +#else +//#define DOUBLE_ATOMIC #endif #ifdef C11_ATOMIC @@ -33,7 +35,11 @@ struct taos_metric_sample { #ifdef C11_ATOMIC _Atomic double r_value; /**< r_value is the value of the metric sample */ #else +#ifdef DOUBLE_ATOMIC double r_value; /**< r_value is the value of the metric sample */ +#else + int64_t r_value; +#endif #endif }; diff --git a/source/libs/monitorfw/src/taos_metric_sample.c b/source/libs/monitorfw/src/taos_metric_sample.c index c3f948434d..ca6ea30028 100644 --- a/source/libs/monitorfw/src/taos_metric_sample.c +++ b/source/libs/monitorfw/src/taos_metric_sample.c @@ -81,7 +81,11 @@ int taos_metric_sample_add(taos_metric_sample_t *self, double r_value) { } } #else +#ifdef DOUBLE_ATOMIC atomic_fetch_add_double(&self->r_value, r_value); +#else + atomic_fetch_add_64(&self->r_value, r_value); +#endif #endif return 0; @@ -103,7 +107,11 @@ int taos_metric_sample_sub(taos_metric_sample_t *self, double r_value) { } } #else +#ifdef DOUBLE_ATOMIC atomic_fetch_sub_double(&self->r_value, r_value); +#else + atomic_fetch_sub_64(&self->r_value, r_value); +#endif #endif return 0; @@ -118,7 +126,11 @@ int taos_metric_sample_set(taos_metric_sample_t *self, double r_value) { #ifdef C11_ATOMIC atomic_store(&self->r_value, r_value); #else +#ifdef DOUBLE_ATOMIC atomic_store_double(&self->r_value, r_value); +#else + atomic_store_64(&self->r_value, r_value); +#endif #endif return 0; @@ -140,7 +152,11 @@ int taos_metric_sample_exchange(taos_metric_sample_t *self, double r_value, doub } } #else +#ifdef DOUBLE_ATOMIC *old_value = atomic_exchange_double(&self->r_value, r_value); +#else + *old_value = atomic_exchange_64(&self->r_value, r_value); +#endif #endif return 0; From 75539fb9080eeb30f7b71ecf09e8079cdc000a2d Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 2 Feb 2024 14:16:28 +0800 Subject: [PATCH 048/107] fix: table name --- source/client/src/clientSqlMonitor.c | 2 +- source/client/src/slowQueryMonitor.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 79a862275f..2f8aa1db5d 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -16,7 +16,7 @@ #include "clientMonitor.h" #include "clientLog.h" -const char* selectMonitorName = "select sql"; +const char* selectMonitorName = "taos_sql_req:count"; const char* selectMonitorHelp = "count for select sql"; const int selectMonitorLabelCount = 4; const char* selectMonitorLabels[] = {"cluster_id", "sql_type", "username", "result"}; diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 8f6253007f..0818aaeae4 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -17,7 +17,7 @@ #include "clientLog.h" #include "tglobal.h" -const char* slowQueryName = "slow_query"; +const char* slowQueryName = "taos_slow_sql:count"; const char* slowQueryHelp = "slow query log when cost over than config duration"; const int slowQueryLabelCount = 4; const char* slowQueryLabels[] = {"cluster_id", "username", "result", "duration"}; From b552a16743405d61b76e6a7f3c20295e9177ff5a Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 2 Feb 2024 14:52:12 +0800 Subject: [PATCH 049/107] fix: monitor switch --- source/client/src/clientSqlMonitor.c | 2 ++ source/client/src/slowQueryMonitor.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 2f8aa1db5d..911d589096 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -24,6 +24,7 @@ const char* selectMonitorLabels[] = {"cluster_id", "sql_type", "username", "resu static const char* defaultClusterID = ""; void clusterSelectMonitorInit(const char* clusterKey) { + if (!tsEnableMonitor) return; SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); clusterMonitorInit(clusterKey, epSet, pAppInstInfo->pTransporter); @@ -36,6 +37,7 @@ void clusterSelectLog(const char* clusterKey, const char* user, SQL_RESULT_CODE } void selectLog(int64_t rid, bool killed, int32_t code) { + if (!tsEnableMonitor) return; SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; if (TSDB_CODE_SUCCESS != code) { result = SQL_RESULT_FAILED; diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 0818aaeae4..98785205b9 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -42,7 +42,7 @@ static const char* getSlowQueryLableCostDesc(int64_t cost) { } void clusterSlowQueryMonitorInit(const char* clusterKey) { - if (!enableSlowQueryMonitor) return; + if (!tsEnableMonitor || !enableSlowQueryMonitor) return; SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); clusterMonitorInit(clusterKey, epSet, pAppInstInfo->pTransporter); @@ -55,7 +55,7 @@ void clusterSlowQueryLog(const char* clusterKey, const char* user, SQL_RESULT_CO } void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost) { - if (!enableSlowQueryMonitor) return; + if (!tsEnableMonitor || !enableSlowQueryMonitor) return; SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; if (TSDB_CODE_SUCCESS != code) { result = SQL_RESULT_FAILED; From a72593e66dbecb755a9678b73df9ceb59777abc8 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 2 Feb 2024 14:54:31 +0800 Subject: [PATCH 050/107] fix: include head file --- source/client/src/clientSqlMonitor.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 911d589096..85458b6960 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -15,6 +15,7 @@ #include "clientInt.h" #include "clientMonitor.h" #include "clientLog.h" +#include "tglobal.h" const char* selectMonitorName = "taos_sql_req:count"; const char* selectMonitorHelp = "count for select sql"; From e0a1b886dfba4985c0b6a7c670915cae0ce4d0ba Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 2 Feb 2024 15:25:35 +0800 Subject: [PATCH 051/107] function rename --- source/client/inc/clientInt.h | 6 +++--- source/client/src/clientEnv.c | 2 +- source/client/src/clientImpl.c | 4 ++-- source/client/src/clientSqlMonitor.c | 12 ++++++------ source/client/src/slowQueryMonitor.c | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 257ee35aaf..8fe717a7fa 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -431,11 +431,11 @@ void freeQueryParam(SSyncQueryParam* param); int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effeciveUser, SParseSqlRes* pRes); #endif -void clusterSlowQueryMonitorInit(const char* clusterKey); +void clientSlowQueryMonitorInit(const char* clusterKey); void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); -void clusterSelectMonitorInit(const char* clusterKey); -void selectLog(int64_t rid, bool killed, int32_t code); +void clientSQLReqMonitorInit(const char* clusterKey); +void sqlReqLog(int64_t rid, bool killed, int32_t code); #ifdef __cplusplus } diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index bd83f15e7e..d5523d6d7e 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -105,7 +105,7 @@ static void deregisterRequest(SRequestObj *pRequest) { pRequest->metric.planCostUs, pRequest->metric.execCostUs); atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); - selectLog(pTscObj->id, pRequest->killed, pRequest->code); + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code); reqType = SLOW_LOG_TYPE_QUERY; } } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index a165ef6e88..200a940924 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -159,8 +159,8 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas pInst = &p; - clusterSlowQueryMonitorInit(p->instKey); - clusterSelectMonitorInit(p->instKey); + clientSlowQueryMonitorInit(p->instKey); + clientSQLReqMonitorInit(p->instKey); } else { ASSERTS((*pInst) && (*pInst)->pAppHbMgr, "*pInst:%p, pAppHgMgr:%p", *pInst, (*pInst) ? (*pInst)->pAppHbMgr : NULL); // reset to 0 in case of conn with duplicated user key but its user has ever been dropped. diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 85458b6960..80375bafae 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -24,7 +24,7 @@ const char* selectMonitorLabels[] = {"cluster_id", "sql_type", "username", "resu static const char* defaultClusterID = ""; -void clusterSelectMonitorInit(const char* clusterKey) { +void clientSQLReqMonitorInit(const char* clusterKey) { if (!tsEnableMonitor) return; SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); @@ -32,12 +32,12 @@ void clusterSelectMonitorInit(const char* clusterKey) { createClusterCounter(clusterKey, selectMonitorName, selectMonitorHelp, selectMonitorLabelCount, selectMonitorLabels); } -void clusterSelectLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result) { +void clientSQLReqLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result) { const char* selectMonitorLabelValues[] = {defaultClusterID, "select", user, resultStr(result)}; taosClusterCounterInc(clusterKey, selectMonitorName, selectMonitorLabelValues); } -void selectLog(int64_t rid, bool killed, int32_t code) { +void sqlReqLog(int64_t rid, bool killed, int32_t code) { if (!tsEnableMonitor) return; SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; if (TSDB_CODE_SUCCESS != code) { @@ -51,10 +51,10 @@ void selectLog(int64_t rid, bool killed, int32_t code) { STscObj* pTscObj = acquireTscObj(rid); if (pTscObj != NULL) { if (pTscObj->pAppInfo == NULL) { - tscLog("selectLog, not found pAppInfo"); + tscLog("sqlReqLog, not found pAppInfo"); } - return clusterSelectLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); + return clientSQLReqLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); } else { - tscLog("selectLog, not found rid"); + tscLog("sqlReqLog, not found rid"); } } diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 98785205b9..c4c623c7be 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -41,7 +41,7 @@ static const char* getSlowQueryLableCostDesc(int64_t cost) { return "< 3 s"; } -void clusterSlowQueryMonitorInit(const char* clusterKey) { +void clientSlowQueryMonitorInit(const char* clusterKey) { if (!tsEnableMonitor || !enableSlowQueryMonitor) return; SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); @@ -49,7 +49,7 @@ void clusterSlowQueryMonitorInit(const char* clusterKey) { createClusterCounter(clusterKey, slowQueryName, slowQueryHelp, slowQueryLabelCount, slowQueryLabels); } -void clusterSlowQueryLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result, int32_t cost) { +void clientSlowQueryLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result, int32_t cost) { const char* slowQueryLabelValues[] = {defaultClusterID, user, resultStr(result), getSlowQueryLableCostDesc(cost)}; taosClusterCounterInc(clusterKey, slowQueryName, slowQueryLabelValues); } @@ -70,7 +70,7 @@ void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost) { if(pTscObj->pAppInfo == NULL) { tscLog("SlowQueryLog, not found pAppInfo"); } - return clusterSlowQueryLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, cost); + return clientSlowQueryLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, cost); } else { tscLog("SlowQueryLog, not found rid"); } From 0159a046be049a113a1b651fd82bb01209747c19 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sun, 4 Feb 2024 01:26:27 +0000 Subject: [PATCH 052/107] winows atomic --- source/os/src/osAtomic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/os/src/osAtomic.c b/source/os/src/osAtomic.c index e56cf629bb..c891ee4579 100644 --- a/source/os/src/osAtomic.c +++ b/source/os/src/osAtomic.c @@ -18,7 +18,8 @@ typedef union { volatile int64_t i; - double d; + volatile double d; + //double d; } double_number; #ifdef WINDOWS @@ -416,7 +417,7 @@ int64_t atomic_exchange_64(int64_t volatile* ptr, int64_t val) { double atomic_exchange_double(double volatile *ptr, int64_t val){ for (;;) { double_number old_num = {0}; - old_num.i = *ptr; // current old value + old_num.d = *ptr; // current old value double_number new_num = {0}; int64_t iNew = val; From c9fd8d2c7c2631a226b7c7ba32dfafc94dcb6224 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Sun, 4 Feb 2024 09:57:57 +0800 Subject: [PATCH 053/107] fix: test build failed --- source/client/test/clientMonitorTests.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/client/test/clientMonitorTests.cpp b/source/client/test/clientMonitorTests.cpp index 5272a2ab3a..f38ee74284 100644 --- a/source/client/test/clientMonitorTests.cpp +++ b/source/client/test/clientMonitorTests.cpp @@ -69,10 +69,10 @@ TEST(clientMonitorTest, sendTest) { printf("connect taosd sucessfully.\n"); int64_t rid = *(int64_t *)taos; - SlowQueryLog(rid, 1000); + SlowQueryLog(rid, false, -1, 1000); int i = 0; while (i < 20) { - SlowQueryLog(rid, i * 1000); + SlowQueryLog(rid, false, 0, i * 1000); taosMsleep(10); ++i; } From 2108f69c848e51d46e3c495322f07d3d37803045 Mon Sep 17 00:00:00 2001 From: cadem Date: Mon, 5 Feb 2024 07:32:15 +0800 Subject: [PATCH 054/107] client memory leak --- source/libs/monitor/src/clientMonitor.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index e3b49da858..4064f600b4 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -27,6 +27,7 @@ void generateClusterReport(ClientMonitor* pMonitor, bool send) { taos_collector_registry_clear_batch(pMonitor->registry); } } + taosMemoryFreeClear(pCont); } void reportSendProcess(void* param, void* tmrId) { From 71d9065d479e2163cf397dcf1ee598f3fe6b8e5a Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 5 Feb 2024 00:12:35 +0000 Subject: [PATCH 055/107] tmp log --- source/dnode/mnode/impl/src/mndDnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 50bc95f546..13a0d6cfcc 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -509,9 +509,9 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { goto _OVER; } - if(tsMonitorLogProtocol){ + //if(tsMonitorLogProtocol){ mInfo("process statis req,\n %s", statisReq.pCont); - } + //} SJson* pJson = tjsonParse(statisReq.pCont); From 16aef662603ad563084394a97803a19951eb0735 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 5 Feb 2024 01:34:20 +0000 Subject: [PATCH 056/107] ci case fail --- source/dnode/vnode/src/inc/vnodeInt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index bc54a6b3c8..1aaab9e81d 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -106,7 +106,7 @@ typedef struct SQueryNode SQueryNode; #define VND_INFO_FNAME "vnode.json" #define VND_INFO_FNAME_TMP "vnode_tmp.json" -#define VNODE_METRIC_SQL_COUNT "taos_sql_req:count" +#define VNODE_METRIC_SQL_COUNT "taos_sql_req:inserted_rows" #define VNODE_METRIC_TAG_NAME_SQL_TYPE "sql_type" #define VNODE_METRIC_TAG_NAME_CLUSTER_ID "cluster_id" @@ -116,7 +116,7 @@ typedef struct SQueryNode SQueryNode; #define VNODE_METRIC_TAG_NAME_USERNAME "username" #define VNODE_METRIC_TAG_NAME_RESULT "result" -#define VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS "insert_affected_rows" +#define VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS "inserted_rows" //#define VNODE_METRIC_TAG_VALUE_INSERT "insert" #define VNODE_METRIC_TAG_VALUE_DELETE "delete" From 5c7f839da8a8a2408d6968e661aed67042ce8c14 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 5 Feb 2024 03:28:33 +0000 Subject: [PATCH 057/107] remove tmp log --- source/dnode/mnode/impl/src/mndDnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 13a0d6cfcc..50bc95f546 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -509,9 +509,9 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { goto _OVER; } - //if(tsMonitorLogProtocol){ + if(tsMonitorLogProtocol){ mInfo("process statis req,\n %s", statisReq.pCont); - //} + } SJson* pJson = tjsonParse(statisReq.pCont); From 6c9bfb8f62b108174cebc418a568b2dbac0ee372 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Mon, 5 Feb 2024 15:18:09 +0800 Subject: [PATCH 058/107] fix: release obj reference --- source/client/src/clientSqlMonitor.c | 4 +++- source/client/src/slowQueryMonitor.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 80375bafae..7c54eb7b01 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -52,8 +52,10 @@ void sqlReqLog(int64_t rid, bool killed, int32_t code) { if (pTscObj != NULL) { if (pTscObj->pAppInfo == NULL) { tscLog("sqlReqLog, not found pAppInfo"); + } else { + clientSQLReqLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); } - return clientSQLReqLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); + releaseTscObj(rid); } else { tscLog("sqlReqLog, not found rid"); } diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index c4c623c7be..61add665dc 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -69,8 +69,10 @@ void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost) { if (pTscObj != NULL) { if(pTscObj->pAppInfo == NULL) { tscLog("SlowQueryLog, not found pAppInfo"); + } else { + clientSlowQueryLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, cost); } - return clientSlowQueryLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, cost); + releaseTscObj(rid); } else { tscLog("SlowQueryLog, not found rid"); } From 930158088625580c6759393efae6f074b5ddbcf6 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Tue, 6 Feb 2024 13:06:56 +0800 Subject: [PATCH 059/107] fix: free mem in callback --- source/client/inc/clientInt.h | 2 + source/client/src/clientEnv.c | 1 + source/client/src/clientMain.c | 1 + source/client/src/clientSqlMonitor.c | 5 + source/client/test/clientMonitorTests.cpp | 3 +- source/libs/monitor/src/clientMonitor.c | 8 +- tests/system-test/2-query/stable_1.csv | 364 ++++++++++++++++++ .../2-query/stable_null_childtable.csv | 64 +++ .../system-test/2-query/stable_null_data.csv | 64 +++ 9 files changed, 509 insertions(+), 3 deletions(-) create mode 100644 tests/system-test/2-query/stable_1.csv create mode 100644 tests/system-test/2-query/stable_null_childtable.csv create mode 100644 tests/system-test/2-query/stable_null_data.csv diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 8fe717a7fa..246d86ca54 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -437,6 +437,8 @@ void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); void clientSQLReqMonitorInit(const char* clusterKey); void sqlReqLog(int64_t rid, bool killed, int32_t code); +void clientMonitorClose(const char* clusterKey); + #ifdef __cplusplus } #endif diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index d5523d6d7e..93ee530b41 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -227,6 +227,7 @@ void destroyAppInst(SAppInstInfo *pAppInfo) { taosThreadMutexLock(&appInfo.mutex); + clientMonitorClose(pAppInfo->instKey); hbRemoveAppHbMrg(&pAppInfo->pAppHbMgr); taosHashRemove(appInfo.pInstMap, pAppInfo->instKey, strlen(pAppInfo->instKey)); diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index b99654172c..4a80aba971 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -279,6 +279,7 @@ void taos_close_internal(void *taos) { STscObj *pTscObj = (STscObj *)taos; tscDebug("0x%" PRIx64 " try to close connection, numOfReq:%d", pTscObj->id, pTscObj->numOfReqs); + // clientMonitorClose(pTscObj->pAppInfo->instKey); taosRemoveRef(clientConnRefPool, pTscObj->id); } diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 7c54eb7b01..89b91646ff 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -60,3 +60,8 @@ void sqlReqLog(int64_t rid, bool killed, int32_t code) { tscLog("sqlReqLog, not found rid"); } } + +void clientMonitorClose(const char* clusterKey) { + tscLog("clientMonitorClose, key:%s", clusterKey); + clusterMonitorClose(clusterKey); +} diff --git a/source/client/test/clientMonitorTests.cpp b/source/client/test/clientMonitorTests.cpp index f38ee74284..f7ddc1a5cd 100644 --- a/source/client/test/clientMonitorTests.cpp +++ b/source/client/test/clientMonitorTests.cpp @@ -59,7 +59,8 @@ TEST(clientMonitorTest, monitorTest) { while (i < 12) { taosMsleep(10); ++i; - } clusterMonitorClose(cluster1); + } + clusterMonitorClose(cluster1); clusterMonitorClose(cluster2); } diff --git a/source/libs/monitor/src/clientMonitor.c b/source/libs/monitor/src/clientMonitor.c index 4064f600b4..0891932583 100644 --- a/source/libs/monitor/src/clientMonitor.c +++ b/source/libs/monitor/src/clientMonitor.c @@ -80,7 +80,7 @@ void createMonitorClient(const char* clusterKey, SEpSet epSet, void* pTransporte snprintf(pMonitor->clusterKey, sizeof(pMonitor->clusterKey), "%s", clusterKey); pMonitor->registry = taos_collector_registry_new(clusterKey); pMonitor->colector = taos_collector_new(clusterKey); - pMonitor->epSet = epSet; + epsetAssign(&pMonitor->epSet, &epSet); pMonitor->pTransporter = pTransporter; taos_collector_registry_register_collector(pMonitor->registry, pMonitor->colector); @@ -98,6 +98,10 @@ static int32_t monitorReportAsyncCB(void* param, SDataBuf* pMsg, int32_t code) { if (TSDB_CODE_SUCCESS != code) { uError("found error in monitorReport send callback, code:%d, please check the network.", code); } + if (pMsg) { + taosMemoryFree(pMsg->pData); + taosMemoryFree(pMsg->pEpSet); + } return code; } @@ -174,7 +178,7 @@ int taosClusterCounterInc(const char* clusterKey, const char* counterName, const ClientMonitor* pMonitor = *ppMonitor; taos_counter_t** ppCounter = (taos_counter_t**)taosHashGet(pMonitor->counters, counterName, strlen(counterName)); if (ppCounter != NULL && *ppCounter != NULL) { - int res = taos_counter_inc(*ppCounter, label_values); + taos_counter_inc(*ppCounter, label_values); } else { uError("taosClusterCounterInc not found pCounter %s:%s.", clusterKey, counterName); } diff --git a/tests/system-test/2-query/stable_1.csv b/tests/system-test/2-query/stable_1.csv new file mode 100644 index 0000000000..7b0587f527 --- /dev/null +++ b/tests/system-test/2-query/stable_1.csv @@ -0,0 +1,364 @@ +tbname,ts,q_int,q_binary +"stable_1_1","2021-08-27 01:46:40.000",-143708439,"binary.wEvcyPTYhxxKhVFrShTZ" +"stable_1_1","2021-08-27 05:56:40.000",-2044434228,"binary.iVmwRqGqAbGImLpoUiKX" +"stable_1_1","2021-08-27 10:06:40.000",1109067209,"binary.mJPDrXToNeEldaahHrjD" +"stable_1_1","2021-08-27 14:16:40.000",1148326681,"binary.NHZMOcXRwhSPvmIIxdxp" +"stable_1_1","2021-08-27 18:26:40.000",723117353,"binary.TublFbdwZUkjDXBnzoCS" +"stable_1_1","2021-08-27 22:36:40.000",-1735114764,"binary.TCDlFpIyMpXfcghfWlUe" +"stable_1_1","2021-08-28 02:46:40.000",1973623075,"binary.xkRVpVawmLMQlKCdvZtZ" +"stable_1_1","2021-08-28 06:56:40.000",1693347900,"binary.CRmkBadMfWkcImouLOYC" +"stable_1_1","2021-08-28 11:06:40.000",1041114692,"binary.FplIhrrnZDEqcPpMXcCz" +"stable_1_1","2021-08-28 15:16:40.000",-1384036824,"binary.NpfAGysaedqwHzyjOEhb" +"stable_1_1","2021-08-28 19:26:40.000",1841425030,"binary.wpRXidgNPOERhEaZlJAM" +"stable_1_1","2021-08-28 23:36:40.000",-270068972,"binary.FNcyuyrPVVVfxbzDuGlf" +"stable_1_1","2021-08-29 03:46:40.000",418330248,"binary.KevLpYjpMOfugEsBCBlm" +"stable_1_1","2021-08-29 07:56:40.000",-1261626278,"binary.DmaGJbQkLmJQaURuaowv" +"stable_1_1","2021-08-29 12:06:40.000",665794589,"binary.IKfpbOnsEUqZvDUDXwxE" +"stable_1_1","2021-08-29 16:16:40.000",1556546304,"binary.GKOAUmTHRsUYNGpJuJXS" +"stable_1_1","2021-08-29 20:26:40.000",-635394652,"binary.UPKoftKIqXYBGkgijulk" +"stable_1_1","2021-08-30 00:36:40.000",1654794184,"binary.QHlEvczXvDhrjeXKechh" +"stable_1_1","2021-08-30 04:46:40.000",41007230,"binary.wuOctyBeTsCZynkMWYzu" +"stable_1_1","2021-08-30 08:56:40.000",1387304128,"binary.QwtMztxuEtuQdccEPSgc" +"stable_1_1","2021-08-30 13:06:40.000",-1036308321,"binary.CHRMHcuiDKIrbquzMWnc" +"stable_1_1","2021-08-30 17:16:40.000",-1768408453,"binary.OaHLnnqkcUEKxOOHCYCJ" +"stable_1_1","2021-08-30 21:26:40.000",125729034,"binary.YAKBKrKRqlgNweLacnpB" +"stable_1_1","2021-08-31 01:36:40.000",-125236222,"binary.UJkpaKsbERScbXdQuhvo" +"stable_1_1","2021-08-31 05:46:40.000",-677274672,"binary.jwdoZKFVRIbdNbxvzglZ" +"stable_1_2","2021-08-27 01:46:39.999",1048090051,"binary.QFXcjYxRIgvVcaabbAuo" +"stable_1_2","2021-08-27 01:46:40.001",-115380468,"binary.ilLTZcPTGRSwIjACLGlM" +"stable_1_2","2021-08-27 05:56:39.999",1095266727,"binary.NMQGxjbGhMVVbcQEBaEK" +"stable_1_2","2021-08-27 05:56:40.001",-1664825220,"binary.LZlUlCryyKuhhwGGlSjc" +"stable_1_2","2021-08-27 10:06:39.999",1270783858,"binary.GqXavHpdBwhbCDrQnpSF" +"stable_1_2","2021-08-27 10:06:40.001",-1718628594,"binary.wPOmeglMuNsatgqVOYvh" +"stable_1_2","2021-08-27 14:16:39.999",781814072,"binary.LBBuZbsGbCPwrtpgpJUU" +"stable_1_2","2021-08-27 14:16:40.001",-222510400,"binary.BgnCkJAICiNgxqiaowKU" +"stable_1_2","2021-08-27 18:26:39.999",260526220,"binary.uSifMBsrTaQhLuYRzSNB" +"stable_1_2","2021-08-27 18:26:40.001",-1734497021,"binary.UnQSdMFNesxovxaQqywB" +"stable_1_2","2021-08-27 22:36:39.999",856956546,"binary.ctAKBcRCfQQDgayszuAG" +"stable_1_2","2021-08-27 22:36:40.001",-2035071163,"binary.evhulVVFzQzmcxSxrhKQ" +"stable_1_2","2021-08-28 02:46:39.999",2024548336,"binary.HAdhzWKQINYLaYkXNWMA" +"stable_1_2","2021-08-28 02:46:40.001",-1388002413,"binary.uYfWFNKpQafMupBPxsaQ" +"stable_1_2","2021-08-28 06:56:39.999",896614799,"binary.eLMnpehchKlvWYooNwzT" +"stable_1_2","2021-08-28 06:56:40.001",-449300050,"binary.qKdRIooLiEPovATVrIjv" +"stable_1_2","2021-08-28 11:06:39.999",640308875,"binary.OzGnekdKxbZxbKgGFJlg" +"stable_1_2","2021-08-28 11:06:40.001",-1961834598,"binary.FbQxRmecVULCPbyUFBtd" +"stable_1_2","2021-08-28 15:16:39.999",152017229,"binary.CoERNXcHahySItezBpen" +"stable_1_2","2021-08-28 15:16:40.001",-873242705,"binary.LLhLPAXTmmXelsILHdQZ" +"stable_1_2","2021-08-28 19:26:39.999",7371013,"binary.OtbSjvYZOPWbIQOdIrKG" +"stable_1_2","2021-08-28 19:26:40.001",-259884599,"binary.ILwvbvFGWLKDelTSCcDm" +"stable_1_2","2021-08-28 23:36:39.999",1060176497,"binary.cZSBdkTCfHzKdaUbRObM" +"stable_1_2","2021-08-28 23:36:40.001",-1895192712,"binary.CYsQdbzmYnNmadYZeaGH" +"stable_1_2","2021-08-29 03:46:39.999",778869650,"binary.HYiRCyeEqGzFGwoHupCH" +"stable_1_2","2021-08-29 03:46:40.001",-1070149378,"binary.VZKQmmtwMfYTGzlJOyzv" +"stable_1_2","2021-08-29 07:56:39.999",2139522991,"binary.WgIELLWDqNqWvdsblKCB" +"stable_1_2","2021-08-29 07:56:40.001",-1450415363,"binary.THXDnYCLdvuTXRSUsMnH" +"stable_1_2","2021-08-29 12:06:39.999",1202083307,"binary.jzdrBvoIOBydYtlFDBfZ" +"stable_1_2","2021-08-29 12:06:40.001",-808169724,"binary.sUZnozuiMlgMQjgaKLWT" +"stable_1_2","2021-08-29 16:16:39.999",202190259,"binary.QFvJnTjavOlzsXAEZVwH" +"stable_1_2","2021-08-29 16:16:40.001",-409805763,"binary.sbSiqKmjPKvnXbSeKwXG" +"stable_1_2","2021-08-29 20:26:39.999",238657263,"binary.OgrrbsocdxzSAsMKmGFW" +"stable_1_2","2021-08-29 20:26:40.001",-1447960279,"binary.gMIOOqmPvHzbiBiPEVsv" +"stable_1_2","2021-08-30 00:36:39.999",954795210,"binary.VOdZRucmuTuXzTGKuWfA" +"stable_1_2","2021-08-30 00:36:40.001",-185956520,"binary.LsRcBtiQqicggCLXZoWe" +"stable_1_2","2021-08-30 04:46:39.999",1365142146,"binary.EnWxuBUlakKcHrXrPBOj" +"stable_1_2","2021-08-30 04:46:40.001",-210822579,"binary.ZKvMAWaDuBEInoXJgQSL" +"stable_1_2","2021-08-30 08:56:39.999",952122349,"binary.lcXghoPWtfUTfSAAJDPS" +"stable_1_2","2021-08-30 08:56:40.001",-1152099753,"binary.vtvGwZIEcxVUBWDFVniL" +"stable_1_2","2021-08-30 13:06:39.999",1198995002,"binary.CobYIOXzviHBQmtndNfY" +"stable_1_2","2021-08-30 13:06:40.001",-1498342366,"binary.qfSLXCSfQexiQHdraTYY" +"stable_1_2","2021-08-30 17:16:39.999",388708472,"binary.VWdcyMxbxjRZCcDesjWH" +"stable_1_2","2021-08-30 17:16:40.001",-1688761021,"binary.fsNWygGviERgbHDCTNoU" +"stable_1_2","2021-08-30 21:26:39.999",1046617386,"binary.OmMMfoOWmDphnVXsqVny" +"stable_1_2","2021-08-30 21:26:40.001",-509016842,"binary.miOrdOLIjNjowuqZLMJY" +"stable_1_2","2021-08-31 01:36:39.999",1470657859,"binary.QLjYhzfGDKcPmHFQjBub" +"stable_1_2","2021-08-31 01:36:40.001",-720454315,"binary.GaEJJOwaHtRTijYNSKrt" +"stable_1_2","2021-08-31 05:46:39.999",1874112564,"binary.tNjvCgdWlmcOHVbLJRMN" +"stable_1_2","2021-08-31 05:46:40.001",-805620343,"binary.rMWNLTrygVpKqbvfAPEQ" +"stable_1_2","2021-08-31 09:56:39.999",1624260248,"binary.OMehRclQHcJBTynDoScY" +"stable_1_2","2021-08-31 09:56:40.001",-321755377,"binary.pYwaFBbMgRmreHVLLqHM" +"stable_1_2","2021-08-31 14:06:39.999",1338486910,"binary.PewhoryOLSZsZOExXrsO" +"stable_1_2","2021-08-31 14:06:40.001",-1972396465,"binary.HCciTUVnuKaUQHOTLmoy" +"stable_1_2","2021-08-31 18:16:39.999",586219277,"binary.ejuJVeKrOYTBIOGtnvwN" +"stable_1_2","2021-08-31 18:16:40.001",-23773554,"binary.HMzLCwXDnCBrSjyvRiij" +"stable_1_2","2021-08-31 22:26:39.999",403592186,"binary.KbgXOhPmkagxFsFbQakf" +"stable_1_2","2021-08-31 22:26:40.001",-1017841441,"binary.BONmREpjVojUyNnkKVDr" +"stable_1_2","2021-09-01 02:36:39.999",2123582595,"binary.JqrmmSVJyyJSphzDfdfF" +"stable_1_2","2021-09-01 02:36:40.001",-541998051,"binary.DAHIBWzujRgGmXHITFdP" +"stable_1_2","2021-09-01 06:46:39.999",863783720,"binary.iZrgQLIwNNvEhiErAwkt" +"stable_1_2","2021-09-01 06:46:40.001",-1507574370,"binary.nVGhmvtMlkPpeaBpAFTM" +"stable_1_2","2021-09-01 10:56:39.999",1652311395,"binary.GFGXaNXjaQWBuiuIuflv" +"stable_1_2","2021-09-01 10:56:40.001",-881848122,"binary.WKsWUZoBjTlKVGgAJxPx" +"stable_1_2","2021-09-01 15:06:39.999",133942525,"binary.jFkkgXUPSCrZnMUmiDca" +"stable_1_2","2021-09-01 15:06:40.001",-1161482672,"binary.TMzTATElhmlhyqFvwFKJ" +"stable_1_2","2021-09-01 19:16:39.999",1748308690,"binary.bsqrWOhUgZliFzqtMCyZ" +"stable_1_2","2021-09-01 19:16:40.001",-45395742,"binary.SEnorgonMIgtUKkNTOxP" +"stable_1_2","2021-09-01 23:26:39.999",59717021,"binary.XBJIPnZODnweOOXmzRkO" +"stable_1_2","2021-09-01 23:26:40.001",-369410792,"binary.HBmqhBQjhNYwAaLJWbpE" +"stable_1_2","2021-09-02 03:36:39.999",1042899672,"binary.SyRZdWnAthyOUqpOtOos" +"stable_1_2","2021-09-02 03:36:40.001",-1784712756,"binary.FsBnuFMAwIdTjEjYkjBR" +"stable_1_2","2021-09-02 07:46:39.999",656087591,"binary.vsIjUPiZNVxiFWHzGqkg" +"stable_1_2","2021-09-02 07:46:40.001",-70790307,"binary.GLAJYWukLZueieYRsidQ" +"stable_1_2","2021-09-02 11:56:39.999",396390446,"binary.pgBGZOKYSliCxHFmGsyp" +"stable_1_2","2021-09-02 11:56:40.001",-1965530504,"binary.ECLVeNvkmqcTHEoSSxYT" +"stable_1_2","2021-09-02 16:06:39.999",554982384,"binary.zpGkiHSJABZuoZlpNXMp" +"stable_1_2","2021-09-02 16:06:40.001",-2032946157,"binary.lyLVozekCioDlqntmATw" +"stable_1_2","2021-09-02 20:16:39.999",677947760,"binary.vfXYvrHXFnDSAHwCndcp" +"stable_1_2","2021-09-02 20:16:40.001",-494862894,"binary.zffLjgnXcDlwdKAxADMr" +"stable_1_2","2021-09-03 00:26:39.999",1558178384,"binary.bKLXWDPaBjWRXgOeesiD" +"stable_1_2","2021-09-03 00:26:40.001",-475557451,"binary.wnZulRregqgognSRRYWI" +"stable_1_2","2021-09-03 04:36:39.999",632223220,"binary.JqnabMfPCrzsTaYczTLh" +"stable_1_2","2021-09-03 04:36:40.001",-951785691,"binary.sKKfLrkShxlGFGromDFZ" +"stable_1_2","2021-09-03 08:46:39.999",826686189,"binary.shGShhPNnWdZQDAdbiHo" +"stable_1_2","2021-09-03 08:46:40.001",-667795153,"binary.OaUjyowfAGaGXKoVLWZR" +"stable_1_2","2021-09-03 12:56:39.999",1420828021,"binary.AYcgokdEsFMUOIcUpxnM" +"stable_1_2","2021-09-03 12:56:40.001",-2009472018,"binary.JpOZwpoVKCDjiqsFhbaS" +"stable_1_2","2021-09-03 17:06:39.999",395324903,"binary.vWVYYMXIWQAEHBTKKWjP" +"stable_1_2","2021-09-03 17:06:40.001",-9754404,"binary.QNAVDZqImSFgnHpVdWtS" +"stable_1_2","2021-09-03 21:16:39.999",2068284680,"binary.wNSWJmuVBjpRVVCpksQC" +"stable_1_2","2021-09-03 21:16:40.001",-853667209,"binary.OgZwwWPZuNLXAAdBcanX" +"stable_1_2","2021-09-04 01:26:39.999",155983724,"binary.MRJjXYWHBZvzaAjTzrli" +"stable_1_2","2021-09-04 01:26:40.001",-1760453704,"binary.pARRcJciJQzdzcCZRqZA" +"stable_1_2","2021-09-04 05:36:39.999",570191599,"binary.VVxoQGPpWrOYSXzSxWlM" +"stable_1_2","2021-09-04 05:36:40.001",-1289549437,"binary.mtOMrfEeDMegNqMauPgK" +"stable_1_2","2021-09-04 09:46:39.999",1998845359,"binary.IROrsLaBEXcULJZvtXDS" +"stable_1_2","2021-09-04 09:46:40.001",-1746905381,"binary.WatcMYFnezOmZtsAGUDK" +"stable_1_2","2021-09-04 13:56:39.999",2123054685,"binary.cRdRGuitRXDuGAWVDxAE" +"stable_1_2","2021-09-04 13:56:40.001",-45388705,"binary.HMSrCuTIHQiHmuAoGqJK" +"stable_1_2","2021-09-04 18:06:39.999",422908755,"binary.xeqmTUMylYPDFkFJGLQY" +"stable_1_2","2021-09-04 18:06:40.001",-1902203841,"binary.dEfjmLzekcjvysMUToXa" +"stable_1_2","2021-09-04 22:16:39.999",1335747951,"binary.ugUzQSUcPjEXMIDrFobB" +"stable_1_2","2021-09-04 22:16:40.001",-1552553924,"binary.gZMscjyRXoGyNsFLHpoR" +"stable_1_2","2021-09-05 02:26:39.999",1092904458,"binary.IAiAMcGMqeACFMkfgGju" +"stable_1_2","2021-09-05 02:26:40.001",-437886009,"binary.jWguWEtBAUgcMKtgXieL" +"stable_1_2","2021-09-05 06:36:39.999",433850999,"binary.QBIulMvNBsGMfStAKgCQ" +"stable_1_2","2021-09-05 06:36:40.001",-1219816305,"binary.aSnbvFgLheGIahlWoBEf" +"stable_1_2","2021-09-05 10:46:39.999",1771552222,"binary.YdwgZmlYfeivmxtaWueZ" +"stable_1_2","2021-09-05 10:46:40.001",-429657495,"binary.yGIWxOkDtQCQgbPJhHFi" +"stable_1_2","2021-09-05 14:56:39.999",1560886565,"binary.OlTzMGFNSfSrcixpefQx" +"stable_1_2","2021-09-05 14:56:40.001",-2082927804,"binary.FTNnvEphxFByhzkfmAhb" +"stable_1_2","2021-09-05 19:06:39.999",312047911,"binary.yaVlkhtTxxgrtZTsFdxa" +"stable_1_2","2021-09-05 19:06:40.001",-1417705247,"binary.tHnemGaRugDffcmoyWli" +"stable_1_2","2021-09-05 23:16:39.999",1667164436,"binary.NdSzaJxdoQPGYefWPJyi" +"stable_1_2","2021-09-05 23:16:40.001",-2145233720,"binary.jghuIXEGcUtKikJpzLOh" +"stable_1_2","2021-09-06 03:26:39.999",488072919,"binary.RLQFgpAcQCfhuZExHLkx" +"stable_1_2","2021-09-06 03:26:40.001",-1943550230,"binary.ozdeiPLKjSgywqNpCBYN" +"stable_1_2","2021-09-06 07:36:39.999",724025582,"binary.XZmZYlSRZZddcxEOjfEd" +"stable_1_2","2021-09-06 07:36:40.001",-2130070769,"binary.qLvSSOSazLTUKvqpCCBL" +"stable_1_2","2021-09-06 11:46:39.999",941556630,"binary.WrcojJGdsiZyAaRxYrdw" +"stable_1_2","2021-09-06 11:46:40.001",-343938435,"binary.HoqLkegpacFGqzFWeVXL" +"stable_1_2","2021-09-06 15:56:39.999",462886464,"binary.BRImBBEftaaKZeOGRSvW" +"stable_1_2","2021-09-06 15:56:40.001",-674623669,"binary.XevOOqIPqCmaJUcXaaKz" +"stable_1_2","2021-09-06 20:06:39.999",1589240480,"binary.wJyZOXguJRYIbgIuIRye" +"stable_1_2","2021-09-06 20:06:40.001",-253589870,"binary.CzIxfDKtViliFCPuYkSq" +"stable_1_2","2021-09-07 00:16:39.999",701182235,"binary.wFVimJeupABVGEvwMiTv" +"stable_1_2","2021-09-07 00:16:40.001",-1563988450,"binary.OjWhbhEvRlHpqFEHXmfR" +"stable_1_2","2021-09-07 04:26:39.999",1631111972,"binary.QZSHkvsYmRHnGFnyMije" +"stable_1_2","2021-09-07 04:26:40.001",-1081644320,"binary.TDrOTkriDBpZtXBadhIx" +"stable_1_2","2021-09-07 08:36:39.999",1021775776,"binary.AstGPfaVxEefogcWzDzq" +"stable_1_2","2021-09-07 08:36:40.001",-1715903601,"binary.lSSCcLFElDWxKZTdHRLN" +"stable_1_2","2021-09-07 12:46:39.999",1492685945,"binary.esYXdqdUGVFhLCHHciWA" +"stable_1_2","2021-09-07 12:46:40.001",-457991373,"binary.OCGshioisqgLTUFLRMSc" +"stable_1_2","2021-09-07 16:56:39.999",306491871,"binary.WPbbRgxYIRecrOFSlRYM" +"stable_1_2","2021-09-07 16:56:40.001",-709883988,"binary.cADQdfbZkXfcNPPOPQwp" +"stable_1_2","2021-09-07 21:06:39.999",1639981656,"binary.mVTonpWtYFauqLNntbcK" +"stable_1_2","2021-09-07 21:06:40.001",-40134567,"binary.hSZKVixlyoxpHpdvwYxY" +"stable_1_2","2021-09-08 01:16:39.999",1412945598,"binary.EPkNzxzaeCAWQetzzzlv" +"stable_1_2","2021-09-08 01:16:40.001",-517552216,"binary.AmPftzlwURAILqlHhYtv" +"stable_1_2","2021-09-08 05:26:39.999",1210716085,"binary.xPKETDcCdbWtoYoUCgre" +"stable_1_2","2021-09-08 05:26:40.001",-1186882087,"binary.HVKExGKBzdrjjQbKdgim" +"stable_1_2","2021-09-08 09:36:39.999",1209625354,"binary.xDqLioOjrUudmVTRaKmP" +"stable_1_2","2021-09-08 09:36:40.001",-1049869765,"binary.ZcJrqAQpBfTRFJupVZDH" +"stable_1_2","2021-09-08 13:46:39.999",482971664,"binary.ZumfNrRUgHCXCqqjBwgX" +"stable_1_2","2021-09-08 13:46:40.001",-1695698428,"binary.VzjkizbqoeqlOEtsqzTd" +"stable_1_2","2021-09-08 17:56:39.999",369111551,"binary.hBVqWjfnRCktdjBpGTYb" +"stable_1_2","2021-09-08 17:56:40.001",-1324385506,"binary.aBZiPEKTvPqdXPsDXgvy" +"stable_1_2","2021-09-08 22:06:39.999",1370148713,"binary.ApKvhLsWkpRndmodhPEN" +"stable_1_2","2021-09-08 22:06:40.001",-1440742963,"binary.nsuhquhIJtXKINhuhbZm" +"stable_1_2","2021-09-09 02:16:39.999",1951461498,"binary.hZDumWlAzVpYfXkEaPlW" +"stable_1_2","2021-09-09 02:16:40.001",-1663211983,"binary.wBVWJVLFoOdXTzTtRNuT" +"stable_1_2","2021-09-09 06:26:39.999",2092906691,"binary.hLAAdJsauemmUBKhTtqW" +"stable_1_2","2021-09-09 06:26:40.001",-2137737633,"binary.wRfxAxVfEcdfKteGLuaX" +"stable_1_2","2021-09-09 10:36:39.999",870002160,"binary.JCROwpmJQkPqZkIzrRkU" +"stable_1_2","2021-09-09 10:36:40.001",-837033747,"binary.YKouegacQvxoSSgTaPrv" +"stable_1_2","2021-09-09 14:46:39.999",1397781824,"binary.hwfhcmJDDTvQaCRmlKCd" +"stable_1_2","2021-09-09 14:46:40.001",-1573224659,"binary.QpcyRVyxqqnHSSLxWCdz" +"stable_1_2","2021-09-09 18:56:39.999",1354974803,"binary.mgwWzOiTRoTHUbvzEMSm" +"stable_1_2","2021-09-09 18:56:40.001",-1306330996,"binary.xazZjdXNjaykPYfDWhos" +"stable_1_2","2021-09-09 23:06:39.999",1089140558,"binary.tqyfrLsfYAZeSvFCwYXQ" +"stable_1_2","2021-09-09 23:06:40.001",-2070609011,"binary.HtBovhAaClqmUKDVoPoA" +"stable_1_2","2021-09-10 03:16:39.999",243460896,"binary.GwEkcVzBVjqKKvBBYCHl" +"stable_1_2","2021-09-10 03:16:40.001",-442417658,"binary.aMVpynzemnksvKTWGcDC" +"stable_1_2","2021-09-10 07:26:39.999",993462171,"binary.akkJQvtKVOUMeEJdtLWQ" +"stable_1_2","2021-09-10 07:26:40.001",-1147877996,"binary.UsylaHHTjnwUCmWOFRop" +"stable_1_1","2021-08-31 09:56:40.000",1859005003,"binary.uDiGDbJBCeWVuQCYGwQU" +"stable_1_1","2021-08-31 14:06:40.000",620402706,"binary.kcxyJbYKMUthZCemDZwN" +"stable_1_1","2021-08-31 18:16:40.000",-697189031,"binary.mjvvuLgBZRyYZvSnmrpW" +"stable_1_1","2021-08-31 22:26:40.000",-1223538957,"binary.YhGtRmitXcCooBPlNxlh" +"stable_1_1","2021-09-01 02:36:40.000",-838875167,"binary.AXEKjEPNWZzTiqwFpkrg" +"stable_1_1","2021-09-01 06:46:40.000",-765134201,"binary.uytkzHZmorAgiDiISVoG" +"stable_1_1","2021-09-01 10:56:40.000",-314548498,"binary.zPUYZbaXGMPJOywgECDZ" +"stable_1_1","2021-09-01 15:06:40.000",780205345,"binary.dyNGyigdTXCBLJSGKHrJ" +"stable_1_1","2021-09-01 19:16:40.000",-179608812,"binary.VMzHtbnrmjokPDZCMXsk" +"stable_1_1","2021-09-01 23:26:40.000",-138813503,"binary.cvjJVfNMFXXyaKDjkvRu" +"stable_1_1","2021-09-02 03:36:40.000",-319429462,"binary.INFGvqMFdDTmdeFePZnQ" +"stable_1_1","2021-09-02 07:46:40.000",-298407008,"binary.ligoRoVSAHzFhUvIDwlE" +"stable_1_1","2021-09-02 11:56:40.000",632563376,"binary.RsQnCVXQtzoeXuamUiBl" +"stable_1_1","2021-09-02 16:06:40.000",446510409,"binary.FEewTpfZgngFmPSTSvxJ" +"stable_1_1","2021-09-02 20:16:40.000",640199308,"binary.bRHphFiZkeWtyDjXqNaO" +"stable_1_1","2021-09-03 00:26:40.000",790711145,"binary.uCOCqMGewUkNeUhAbNNf" +"stable_1_1","2021-09-03 04:36:40.000",1664157316,"binary.AyZCLhYiMxZgfYXlVciw" +"stable_1_1","2021-09-03 08:46:40.000",-1983928412,"binary.CaPFXqhDLSOaNmNnOsLh" +"stable_1_1","2021-09-03 12:56:40.000",-412013965,"binary.qEwLmiFwCrLZumFHOYjb" +"stable_1_1","2021-09-03 17:06:40.000",-1579595934,"binary.xUUoAUpZeJJsquiJOKsO" +"stable_1_1","2021-09-03 21:16:40.000",-98786523,"binary.XQfGXHbnwGQPulAcrAPX" +"stable_1_1","2021-09-04 01:26:40.000",-287136285,"binary.OdsJNUSWeVvTxQdKykmk" +"stable_1_1","2021-09-04 05:36:40.000",1051015641,"binary.HfnUyPAwYxEHQotoCfFT" +"stable_1_1","2021-09-04 09:46:40.000",-1161611813,"binary.jEENQpaYOWcVHUYKPaPn" +"stable_1_1","2021-09-04 13:56:40.000",-1162065386,"binary.ltmEKwzkvDqQIZWAxJtQ" +"stable_1_1","2021-09-04 18:06:40.000",1289374504,"binary.SHhbtXRCqxYOqQcWUDtU" +"stable_1_1","2021-09-04 22:16:40.000",-115300759,"binary.CowDUEaCtAEdafPCLLwM" +"stable_1_1","2021-09-05 02:26:40.000",-97528818,"binary.pqfTTMuvVmSCfxCmFTwS" +"stable_1_1","2021-09-05 06:36:40.000",-738727537,"binary.zWAWphEtCuSMACUmkfvN" +"stable_1_1","2021-09-05 10:46:40.000",1063250813,"binary.XwbrXvujPArWLXYhQRQK" +"stable_1_1","2021-09-05 14:56:40.000",1579885922,"binary.FEXGjykuWeGEfkKImWDw" +"stable_1_1","2021-09-05 19:06:40.000",-714663691,"binary.tdLqigCoasQnRffCEaDD" +"stable_1_1","2021-09-05 23:16:40.000",1437018826,"binary.XZcaYfmvLZtxhrmzHWEJ" +"stable_1_1","2021-09-06 03:26:40.000",1811347552,"binary.riDaPlhuskGRZsNxzooI" +"stable_1_1","2021-09-06 07:36:40.000",-2123493348,"binary.ZKZunxmtjBCRRCZBHTsL" +"stable_1_1","2021-09-06 11:46:40.000",2108150002,"binary.eEaxRyDoGrrYZQfYhDwC" +"stable_1_1","2021-09-06 15:56:40.000",-1893993866,"binary.bMuXKucyDJjBggYIIAvd" +"stable_1_1","2021-09-06 20:06:40.000",-1494759877,"binary.GGbtLZVCzfmnUdMHExqv" +"stable_1_1","2021-09-07 00:16:40.000",2135168110,"binary.ICfwWUnCEvXrJWGQNYjv" +"stable_1_1","2021-09-07 04:26:40.000",15376875,"binary.lwtmrfdurUFDSkHMZuOe" +"stable_1_1","2021-09-07 08:36:40.000",1998856189,"binary.JCxsLYijtQSKzNLYAICB" +"stable_1_1","2021-09-07 12:46:40.000",-1190594011,"binary.lTlvbMfWCVccDOCnIDBK" +"stable_1_1","2021-09-07 16:56:40.000",-925781701,"binary.iLESXKenJaWTIeKHFleM" +"stable_1_1","2021-09-07 21:06:40.000",-487874477,"binary.AfIofVnHdvWMCGyeajlC" +"stable_1_1","2021-09-08 01:16:40.000",212157003,"binary.jDxeCyLAKzKgEHGHAlif" +"stable_1_1","2021-09-08 05:26:40.000",-1001974902,"binary.ELgeHxhmjoFyFgkFXZui" +"stable_1_1","2021-09-08 09:36:40.000",-607426580,"binary.NuToHMvRscGxwMENZqOS" +"stable_1_1","2021-09-08 13:46:40.000",630458653,"binary.SrRBINnQSvdBTBKNGHFz" +"stable_1_1","2021-09-08 17:56:40.000",1299240809,"binary.eqzlYcordfJQQJMBljjF" +"stable_1_1","2021-09-08 22:06:40.000",1560015019,"binary.fWtsEHhFIrXfqBGYlTNJ" +"stable_1_1","2021-09-09 02:16:40.000",-1618319757,"binary.xQXfGqKJJntmbtHJzqHc" +"stable_1_1","2021-09-09 06:26:40.000",989052773,"binary.SifrNRSsBKcJKDqsnfXN" +"stable_1_1","2021-09-09 10:36:40.000",-1117272908,"binary.HlxBvTuGkChJDLzDaxyu" +"stable_1_1","2021-09-09 14:46:40.000",2139488417,"binary.yymGCDKbqZkixkIjIIGT" +"stable_1_1","2021-09-09 18:56:40.000",-1462514908,"binary.gMqqCIzQCNGNgbSwolZX" +"stable_1_1","2021-09-09 23:06:40.000",-1984142506,"binary.pfhSySLjKZbOfIPTmqAB" +"stable_1_1","2021-09-10 03:16:40.000",-2106211575,"binary.lENnnzItGfhHBhuBSKkg" +"stable_1_1","2021-09-10 07:26:40.000",-456444500,"binary.zrOBefSbOEUgRLtVobMw" +"stable_1_1","2021-09-10 11:36:40.000",-294434895,"binary.olALLZcgYbqmLLsQAfvv" +"stable_1_1","2021-09-10 15:46:40.000",1229299947,"binary.TIeullzMmPeJOEDzERVs" +"stable_1_1","2021-09-10 19:56:40.000",1290141025,"binary.loHjtwzgyvJksRhJNiQS" +"stable_1_1","2021-09-11 00:06:40.000",-770991939,"binary.QKhLWpoMPsfwyQYNoPZA" +"stable_1_1","2021-09-11 04:16:40.000",262080824,"binary.hIMCRvrXPAOVpFRmYnUy" +"stable_1_1","2021-09-11 08:26:40.000",-493256377,"binary.PqdASxtDLyeIFzBiaFGV" +"stable_1_1","2021-09-11 12:36:40.000",408968903,"binary.GLyIXkgZbApVCOoVSqaO" +"stable_1_1","2021-09-11 16:46:40.000",29364546,"binary.SOQDYnfDtUghMpNrrrvd" +"stable_1_1","2021-09-11 20:56:40.000",568429328,"binary.IGDZBmjwYmOzJaUbkiKN" +"stable_1_1","2021-09-12 01:06:40.000",1015255006,"binary.dcFQefENHBmSbWfsxkNZ" +"stable_1_1","2021-09-12 05:16:40.000",110327094,"binary.jBWuQXhwybyeWaUeuiCo" +"stable_1_1","2021-09-12 09:26:40.000",1886325467,"binary.QSJUCkzpJcOiAmsyKmUs" +"stable_1_1","2021-09-12 13:36:40.000",2071766507,"binary.sROneWSFNuXBalpsjyEo" +"stable_1_1","2021-09-12 17:46:40.000",-1084304030,"binary.TyxrsRIKPjtzXgKyuAEH" +"stable_1_1","2021-09-12 21:56:40.000",113309185,"binary.DJuxhSLmckBxGAZrTrdg" +"stable_1_1","2021-09-13 02:06:40.000",222279926,"binary.VsnXIRHAihqVgXYwhHKL" +"stable_1_1","2021-09-13 06:16:40.000",-1420187501,"binary.SlMenUlCCEwyXsFKefLW" +"stable_1_2","2021-09-10 11:36:39.999",224419688,"binary.FsYcmhXFIVEwuCmapLFd" +"stable_1_2","2021-09-10 11:36:40.001",-111362062,"binary.wugzMLvmLdkxesgmixOH" +"stable_1_2","2021-09-10 15:46:39.999",2133083813,"binary.buDeWRmTqpbBhNKoIWjt" +"stable_1_2","2021-09-10 15:46:40.001",-88622269,"binary.fgqZcQmlErAwLKYvDwkA" +"stable_1_2","2021-09-10 19:56:39.999",521859506,"binary.NgxLslBkOvvWWVcDCUlC" +"stable_1_2","2021-09-10 19:56:40.001",-1577694201,"binary.zgfPMXusJGeFxLLImITl" +"stable_1_2","2021-09-11 00:06:39.999",896685945,"binary.NEkCzZWDoXmvngPlArSM" +"stable_1_2","2021-09-11 00:06:40.001",-102246541,"binary.qiNYdNPnHVKQBpzXATmm" +"stable_1_2","2021-09-11 04:16:39.999",2143525047,"binary.eIPLVCyRogBRyzGbrFic" +"stable_1_2","2021-09-11 04:16:40.001",-489200958,"binary.bCLmDBrnkgDcXvcwrBqA" +"stable_1_2","2021-09-11 08:26:39.999",1129994268,"binary.rqJyBwQmuzFVARUJRgKb" +"stable_1_2","2021-09-11 08:26:40.001",-1449143866,"binary.fPxCvZJXReoaPBmALmPQ" +"stable_1_2","2021-09-11 12:36:39.999",2026186883,"binary.fOSZlDCKdxiQaysyscfx" +"stable_1_2","2021-09-11 12:36:40.001",-2001883206,"binary.IUNzHoyqCMDBQckAVEQz" +"stable_1_2","2021-09-11 16:46:39.999",341004545,"binary.PlQgjTLDuHwIfIkGmfIq" +"stable_1_2","2021-09-11 16:46:40.001",-2139193188,"binary.LSzPYUKvvRlNrhoKoYkL" +"stable_1_2","2021-09-11 20:56:39.999",2050068224,"binary.fzVzLhgOcjBWiooIbfZy" +"stable_1_2","2021-09-11 20:56:40.001",-1606114187,"binary.DQLAjLojVsSPrXVqoaFU" +"stable_1_2","2021-09-12 01:06:39.999",869226799,"binary.thrXsOuUUQEwGkXiZqVD" +"stable_1_2","2021-09-12 01:06:40.001",-2127572203,"binary.MtiGMwxbCoGxBrSCfmnb" +"stable_1_2","2021-09-12 05:16:39.999",415752279,"binary.pNjKEKLwWZUgNZshphnH" +"stable_1_2","2021-09-12 05:16:40.001",-1943166726,"binary.hSqhMEcJIhZRmIFrQDKl" +"stable_1_2","2021-09-12 09:26:39.999",1895012884,"binary.KBNSdgumJOCWoMmWtLJU" +"stable_1_2","2021-09-12 09:26:40.001",-1384685953,"binary.orjVZeKJsgJsTEqHljkf" +"stable_1_2","2021-09-12 13:36:39.999",2108909701,"binary.vYUalkfScnQyDPeEqCTq" +"stable_1_2","2021-09-12 13:36:40.001",-52260486,"binary.erVQJAvbzEahBSRwIflK" +"stable_1_2","2021-09-12 17:46:39.999",20091569,"binary.kZJLmYOxtxuJZnMBDufv" +"stable_1_2","2021-09-12 17:46:40.001",-958070866,"binary.RZliiclFrDaNImulqJTo" +"stable_1_2","2021-09-12 21:56:39.999",420485592,"binary.PUybFnyERTpaOdCfdUeZ" +"stable_1_2","2021-09-12 21:56:40.001",-136337675,"binary.AvuVCfvKjWXieILiINcT" +"stable_1_2","2021-09-13 02:06:39.999",447814637,"binary.fyooIrohcePtHVwJGMuD" +"stable_1_2","2021-09-13 02:06:40.001",-994364364,"binary.qpXjZYHYtFFCkEkBnwAb" +"stable_1_2","2021-09-13 06:16:39.999",1572668480,"binary.qWPhdNHKBtjYxVZgdXOh" +"stable_1_2","2021-09-13 06:16:40.001",-375162227,"binary.yMDiebwbXIHZiaQKPRut" +"stable_1_1","2024-01-30 20:18:24.652",1,NULL +"stable_1_1","2024-01-30 20:18:24.653",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.654",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.655",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.656",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.657",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.658",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.659",NULL,"1" +"stable_1_1","2024-01-30 20:18:24.660",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.661",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.672",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.673",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.674",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.675",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.676",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.677",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.678",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.679",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.680",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.681",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.692",1,NULL +"stable_1_1","2024-01-30 20:18:24.693",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.694",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.695",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.696",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.697",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.698",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.699",NULL,"1" +"stable_1_1","2024-01-30 20:18:24.700",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.701",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.834",1,NULL +"stable_1_1","2024-01-30 20:18:24.835",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.836",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.837",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.838",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.839",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.840",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.841",NULL,"1" +"stable_1_1","2024-01-30 20:18:24.842",NULL,NULL +"stable_1_1","2024-01-30 20:18:24.843",NULL,NULL +"stable_1_1","2024-01-30 20:18:34.387",NULL,NULL +"stable_1_1","2024-01-30 20:18:34.400",1,NULL +"stable_1_1","2024-01-30 20:18:34.432",NULL,NULL +"stable_1_1","2024-01-30 20:18:34.637",NULL,NULL +"stable_1_1","2024-01-30 20:18:35.402",NULL,NULL +"stable_1_1","2024-01-30 20:18:35.437",NULL,NULL +"stable_1_1","2024-01-30 20:18:36.404",NULL,NULL +"stable_1_1","2024-01-30 20:18:36.439",NULL,NULL +"stable_1_1","2024-01-30 20:18:37.406",NULL,NULL +"stable_1_1","2024-01-30 20:18:37.441",NULL,NULL +"stable_1_1","2024-01-30 20:18:38.408",NULL,NULL +"stable_1_1","2024-01-30 20:18:38.443",NULL,NULL +"stable_1_1","2024-01-30 20:18:39.410",NULL,NULL +"stable_1_1","2024-01-30 20:18:39.445",NULL,NULL +"stable_1_1","2024-01-30 20:18:40.413",NULL,NULL +"stable_1_1","2024-01-30 20:18:40.447",NULL,NULL +"stable_1_1","2024-01-30 20:18:41.414",NULL,"1" +"stable_1_1","2024-01-30 20:18:41.449",NULL,NULL +"stable_1_1","2024-01-30 20:18:42.417",NULL,NULL +"stable_1_1","2024-01-30 20:18:42.451",NULL,NULL +"stable_1_1","2024-01-30 20:18:43.419",NULL,NULL +"stable_1_1","2024-01-30 20:18:43.453",NULL,NULL +"!@!@$$^$","2024-01-30 20:18:24.844",1,NULL diff --git a/tests/system-test/2-query/stable_null_childtable.csv b/tests/system-test/2-query/stable_null_childtable.csv new file mode 100644 index 0000000000..ec2a2da4fd --- /dev/null +++ b/tests/system-test/2-query/stable_null_childtable.csv @@ -0,0 +1,64 @@ +tbname,ts,q_int,q_binary +"$^%$%^&","2024-01-30 20:18:24.844",1,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.773",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.774",1,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.775",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.776",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.777",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.778",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.779",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.780",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.781",NULL,"1" +"stable_null_childtable_1","2024-01-30 20:18:24.782",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.783",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.794",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.795",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.796",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.797",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.798",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.799",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.800",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.801",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.802",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.803",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.814",1,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.815",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.816",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.817",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.818",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.819",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.820",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.821",NULL,"1" +"stable_null_childtable_1","2024-01-30 20:18:24.822",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.823",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.834",1,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.835",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.836",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.837",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.838",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.839",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.840",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.841",NULL,"1" +"stable_null_childtable_1","2024-01-30 20:18:24.842",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:24.843",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:34.539",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:34.552",1,NULL +"stable_null_childtable_1","2024-01-30 20:18:34.582",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:35.554",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:35.587",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:36.557",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:36.589",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:37.559",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:37.592",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:38.561",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:38.594",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:39.563",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:39.596",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:40.565",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:40.598",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:41.567",NULL,"1" +"stable_null_childtable_1","2024-01-30 20:18:41.600",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:42.569",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:42.602",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:43.571",NULL,NULL +"stable_null_childtable_1","2024-01-30 20:18:43.604",NULL,NULL diff --git a/tests/system-test/2-query/stable_null_data.csv b/tests/system-test/2-query/stable_null_data.csv new file mode 100644 index 0000000000..06534ac559 --- /dev/null +++ b/tests/system-test/2-query/stable_null_data.csv @@ -0,0 +1,64 @@ +tbname,ts,q_int,q_binary +"stable_null_data_1","2024-01-30 20:18:24.712",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.713",1,NULL +"stable_null_data_1","2024-01-30 20:18:24.714",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.715",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.716",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.717",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.718",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.719",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.720",NULL,"1" +"stable_null_data_1","2024-01-30 20:18:24.721",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.722",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.733",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.734",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.735",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.736",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.737",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.738",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.739",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.740",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.741",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.742",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.753",1,NULL +"stable_null_data_1","2024-01-30 20:18:24.754",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.755",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.756",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.757",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.758",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.759",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.760",NULL,"1" +"stable_null_data_1","2024-01-30 20:18:24.761",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.762",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.834",1,NULL +"stable_null_data_1","2024-01-30 20:18:24.835",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.836",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.837",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.838",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.839",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.840",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.841",NULL,"1" +"stable_null_data_1","2024-01-30 20:18:24.842",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:24.843",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:34.466",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:34.477",1,NULL +"stable_null_data_1","2024-01-30 20:18:34.506",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:35.479",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:35.512",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:36.481",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:36.514",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:37.483",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:37.516",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:38.485",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:38.518",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:39.487",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:39.520",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:40.489",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:40.522",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:41.491",NULL,"1" +"stable_null_data_1","2024-01-30 20:18:41.524",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:42.493",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:42.526",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:43.495",NULL,NULL +"stable_null_data_1","2024-01-30 20:18:43.528",NULL,NULL +"%^$^&^&","2024-01-30 20:18:24.844",1,NULL From cd80560c94998af9bbc3afe2f5f0c8ca5f01fae3 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 6 Feb 2024 06:40:38 +0000 Subject: [PATCH 060/107] windows double --- source/libs/monitorfw/inc/taos_metric_sample_t.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/monitorfw/inc/taos_metric_sample_t.h b/source/libs/monitorfw/inc/taos_metric_sample_t.h index 6ebc000df5..387512af9d 100644 --- a/source/libs/monitorfw/inc/taos_metric_sample_t.h +++ b/source/libs/monitorfw/inc/taos_metric_sample_t.h @@ -22,7 +22,7 @@ #if !defined(WINDOWS) #define C11_ATOMIC #else -//#define DOUBLE_ATOMIC +#define DOUBLE_ATOMIC #endif #ifdef C11_ATOMIC From e5dcef0794a018d99122f6b035b7a4dc88880a1b Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 6 Feb 2024 08:29:09 +0000 Subject: [PATCH 061/107] forward client directly --- include/libs/monitor/monitor.h | 1 + include/util/tjson.h | 1 + source/dnode/mnode/impl/src/mndDnode.c | 70 ++++++++++++++++++++++---- source/dnode/vnode/src/inc/vnodeInt.h | 2 +- source/libs/monitor/src/monMain.c | 15 ++++++ source/util/src/tjson.c | 6 ++- 6 files changed, 82 insertions(+), 13 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 4c6ffa0add..55b8117f3d 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -225,6 +225,7 @@ void monSetSmInfo(SMonSmInfo *pInfo); void monSetBmInfo(SMonBmInfo *pInfo); void monGenAndSendReport(); void monGenAndSendReportBasic(); +void monSendContent(char *pCont); void tFreeSMonMmInfo(SMonMmInfo *pInfo); void tFreeSMonVmInfo(SMonVmInfo *pInfo); diff --git a/include/util/tjson.h b/include/util/tjson.h index 6922930c13..b9ea72b4bb 100644 --- a/include/util/tjson.h +++ b/include/util/tjson.h @@ -103,6 +103,7 @@ char* tjsonToUnformattedString(const SJson* pJson); SJson* tjsonParse(const char* pStr); bool tjsonValidateJson(const char* pJson); const char* tjsonGetError(); +void tjsonDeleteItemFromObject(const SJson* pJson, const char* pName); #ifdef __cplusplus } diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 50bc95f546..422821301b 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -506,7 +506,7 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { if (tDeserializeSStatisReq(pReq->pCont, pReq->contLen, &statisReq) != 0) { terrno = TSDB_CODE_INVALID_MSG; - goto _OVER; + return code; } if(tsMonitorLogProtocol){ @@ -517,6 +517,63 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { int32_t ts_size = tjsonGetArraySize(pJson); + for(int32_t i = 0; i < ts_size; i++){ + SJson* item = tjsonGetArrayItem(pJson, i); + + SJson* tables = tjsonGetObjectItem(item, "tables"); + + int32_t tableSize = tjsonGetArraySize(tables); + for(int32_t i = 0; i < tableSize; i++){ + SJson* table = tjsonGetArrayItem(tables, i); + + char tableName[MONITOR_TABLENAME_LEN] = {0}; + tjsonGetStringValue(table, "name", tableName); + + SJson* metricGroups = tjsonGetObjectItem(table, "metric_groups"); + + int32_t size = tjsonGetArraySize(metricGroups); + for(int32_t i = 0; i < size; i++){ + SJson* item = tjsonGetArrayItem(metricGroups, i); + + SJson* arrayTag = tjsonGetObjectItem(item, "tags"); + + int32_t tagSize = tjsonGetArraySize(arrayTag); + for(int32_t j = 0; j < tagSize; j++){ + SJson* item = tjsonGetArrayItem(arrayTag, j); + + char tagName[MONITOR_TAG_NAME_LEN] = {0}; + tjsonGetStringValue(item, "name", tagName); + + if(strncmp(tagName, "cluster_id", MONITOR_TAG_NAME_LEN) == 0) { + tjsonDeleteItemFromObject(item, "value"); + tjsonAddStringToObject(item, "value", strClusterId); + } + } + } + } + } + + char *pCont = tjsonToString(pJson); + monSendContent(pCont); + + if(pJson != NULL){ + tjsonDelete(pJson); + pJson = NULL; + } + + if(pCont != NULL){ + taosMemoryFree(pCont); + pCont = NULL; + } + + tFreeSStatisReq(&statisReq); + return 0; + +/* + SJson* pJson = tjsonParse(statisReq.pCont); + + int32_t ts_size = tjsonGetArraySize(pJson); + for(int32_t i = 0; i < ts_size; i++){ SJson* item = tjsonGetArrayItem(pJson, i); @@ -555,16 +612,6 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) { } } - /* - *(labels + tagSize) = taosMemoryMalloc(MONITOR_TAG_NAME_LEN); - strncpy(*(labels + tagSize), "cluster_id", MONITOR_TAG_NAME_LEN); - - *(sample_labels + tagSize) = taosMemoryMalloc(MONITOR_TAG_VALUE_LEN); - strncpy(*(sample_labels + tagSize), strClusterId, MONITOR_TAG_VALUE_LEN); - - tagSize++; - */ - SJson* metrics = tjsonGetObjectItem(item, "metrics"); int32_t metricLen = tjsonGetArraySize(metrics); @@ -647,6 +694,7 @@ _OVER: tFreeSStatisReq(&statisReq); return code; + */ } static int32_t mndProcessStatusReq(SRpcMsg *pReq) { diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 1aaab9e81d..bfd19f2346 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -106,7 +106,7 @@ typedef struct SQueryNode SQueryNode; #define VND_INFO_FNAME "vnode.json" #define VND_INFO_FNAME_TMP "vnode_tmp.json" -#define VNODE_METRIC_SQL_COUNT "taos_sql_req:inserted_rows" +#define VNODE_METRIC_SQL_COUNT "taos_sql_req:count" #define VNODE_METRIC_TAG_NAME_SQL_TYPE "sql_type" #define VNODE_METRIC_TAG_NAME_CLUSTER_ID "cluster_id" diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index ba3db804c3..a849dc8f06 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -628,4 +628,19 @@ void monGenAndSendReportBasic() { } monCleanupMonitorInfo(pMonitor); +} + +void monSendContent(char *pCont) { + if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return; + if(tsMonitorLogProtocol){ + if (pCont != NULL){ + uInfoL("report client cont:\n%s\n", pCont); + } + } + if (pCont != NULL) { + EHttpCompFlag flag = tsMonitor.cfg.comp ? HTTP_GZIP : HTTP_FLAT; + if (taosSendHttpReport(tsMonitor.cfg.server, tsMonFwUri, tsMonitor.cfg.port, pCont, strlen(pCont), flag) != 0) { + uError("failed to send monitor msg"); + } + } } \ No newline at end of file diff --git a/source/util/src/tjson.c b/source/util/src/tjson.c index 0b7ad330a7..82993e8449 100644 --- a/source/util/src/tjson.c +++ b/source/util/src/tjson.c @@ -375,4 +375,8 @@ bool tjsonValidateJson(const char* jIn) { return true; } -const char* tjsonGetError() { return cJSON_GetErrorPtr(); } \ No newline at end of file +const char* tjsonGetError() { return cJSON_GetErrorPtr(); } + +void tjsonDeleteItemFromObject(const SJson* pJson, const char* pName) { + cJSON_DeleteItemFromObject((cJSON*)pJson, pName); +} \ No newline at end of file From 52c5295ce8e1ad7a6484bfe6d0be8cc557fdcd46 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sat, 17 Feb 2024 09:08:03 +0000 Subject: [PATCH 062/107] mnode number --- source/libs/monitor/src/monFramework.c | 34 +++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index b1e6265906..f3ba050d68 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -29,7 +29,7 @@ extern char* tsMonFwUri; #define CLUSTER_TABLE "taosd_cluster_info" -#define MASTER_UPTIME CLUSTER_TABLE":master_uptime" +#define MASTER_UPTIME CLUSTER_TABLE":cluster_uptime" #define DBS_TOTAL CLUSTER_TABLE":dbs_total" #define TBS_TOTAL CLUSTER_TABLE":tbs_total" #define STBS_TOTAL CLUSTER_TABLE":stbs_total" @@ -39,12 +39,14 @@ extern char* tsMonFwUri; #define VNODES_ALIVE CLUSTER_TABLE":vnodes_alive" #define DNODES_TOTAL CLUSTER_TABLE":dnodes_total" #define DNODES_ALIVE CLUSTER_TABLE":dnodes_alive" +#define MNODES_TOTAL CLUSTER_TABLE":mnodes_total" +#define MNODES_ALIVE CLUSTER_TABLE":mnodes_alive" #define CONNECTIONS_TOTAL CLUSTER_TABLE":connections_total" #define TOPICS_TOTAL CLUSTER_TABLE":topics_total" #define STREAMS_TOTAL CLUSTER_TABLE":streams_total" -#define EXPIRE_TIME CLUSTER_TABLE":expire_time" -#define TIMESERIES_USED CLUSTER_TABLE":timeseries_used" -#define TIMESERIES_TOTAL CLUSTER_TABLE":timeseries_total" +#define EXPIRE_TIME CLUSTER_TABLE":grants_expire_time" +#define TIMESERIES_USED CLUSTER_TABLE":grants_timeseries_used" +#define TIMESERIES_TOTAL CLUSTER_TABLE":grants_timeseries_total" #define VGROUP_TABLE "taosd_vgroups_info" @@ -106,10 +108,11 @@ void monInitMonitorFW(){ int32_t label_count =1; const char *sample_labels[] = {"cluster_id"}; char *metric[] = {MASTER_UPTIME, DBS_TOTAL, TBS_TOTAL, STBS_TOTAL, VGROUPS_TOTAL, - VGROUPS_ALIVE, VNODES_TOTAL, VNODES_ALIVE, CONNECTIONS_TOTAL, TOPICS_TOTAL, STREAMS_TOTAL, + VGROUPS_ALIVE, VNODES_TOTAL, VNODES_ALIVE, MNODES_TOTAL, MNODES_ALIVE, + CONNECTIONS_TOTAL, TOPICS_TOTAL, STREAMS_TOTAL, DNODES_TOTAL, DNODES_ALIVE, EXPIRE_TIME, TIMESERIES_USED, TIMESERIES_TOTAL}; - for(int32_t i = 0; i < 16; i++){ + for(int32_t i = 0; i < 18; i++){ gauge= taos_gauge_new(metric[i], "", label_count, sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ taos_counter_destroy(gauge); @@ -263,6 +266,25 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ metric = taosHashGet(tsMonitor.metrics, DNODES_ALIVE, strlen(DNODES_ALIVE)); taos_gauge_set(*metric, dnode_alive, sample_labels); + //mnodes number + int32_t mnode_total = taosArrayGetSize(pInfo->mnodes); + int32_t mnode_alive = 0; + + for (int32_t i = 0; i < taosArrayGetSize(pInfo->mnodes); ++i) { + + SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->mnodes, i); + + if(pMnodeDesc->syncState != 0){ + mnode_alive++; + } + } + + metric = taosHashGet(tsMonitor.metrics, MNODES_TOTAL, strlen(MNODES_TOTAL)); + taos_gauge_set(*metric, mnode_total, sample_labels); + + metric = taosHashGet(tsMonitor.metrics, MNODES_ALIVE, strlen(MNODES_ALIVE)); + taos_gauge_set(*metric, mnode_alive, sample_labels); + //grant info metric = taosHashGet(tsMonitor.metrics, EXPIRE_TIME, strlen(EXPIRE_TIME)); taos_gauge_set(*metric, pGrantInfo->expire_time, sample_labels); From b8bc14f9dfe8c86445242f0e6d978ce2ceeb5d43 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sun, 18 Feb 2024 09:17:59 +0000 Subject: [PATCH 063/107] log count --- source/libs/monitor/src/monFramework.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index f3ba050d68..bf651f1dee 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -77,10 +77,10 @@ extern char* tsMonFwUri; #define HAS_MNODE DNODE_TABLE":has_mnode" #define HAS_QNODE DNODE_TABLE":has_qnode" #define HAS_SNODE DNODE_TABLE":has_snode" -#define DNODE_LOG_ERROR DNODE_TABLE":ERROR" -#define DNODE_LOG_INFO DNODE_TABLE":INFO" -#define DNODE_LOG_DEBUG DNODE_TABLE":DEBUG" -#define DNODE_LOG_TRACE DNODE_TABLE":TRACE" +#define DNODE_LOG_ERROR DNODE_TABLE":error_log_count" +#define DNODE_LOG_INFO DNODE_TABLE":info_log_count" +#define DNODE_LOG_DEBUG DNODE_TABLE":debug_log_count" +#define DNODE_LOG_TRACE DNODE_TABLE":trace_log_count" #define DNODE_STATUS "taosd_dnodes_status:status" From 53a3ab3edcdafb2153741e9755b2797e42e91d64 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Mon, 19 Feb 2024 11:41:58 +0800 Subject: [PATCH 064/107] fix: delete slowSQLLog switch --- include/common/tglobal.h | 1 - source/client/src/slowQueryMonitor.c | 4 +- source/common/src/tglobal.c | 3 - tests/system-test/2-query/stable_1.csv | 364 ------------------ .../2-query/stable_null_childtable.csv | 64 --- .../system-test/2-query/stable_null_data.csv | 64 --- 6 files changed, 2 insertions(+), 498 deletions(-) delete mode 100644 tests/system-test/2-query/stable_1.csv delete mode 100644 tests/system-test/2-query/stable_null_childtable.csv delete mode 100644 tests/system-test/2-query/stable_null_data.csv diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 697b41543c..4f87ebcbd9 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -153,7 +153,6 @@ extern int32_t tsMetaCacheMaxSize; extern int32_t tsSlowLogThreshold; extern int32_t tsSlowLogScope; extern int32_t tsTimeSeriesThreshold; -extern bool enableSlowQueryMonitor; // client extern int32_t tsMinSlidingTime; diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 61add665dc..933ef5de16 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -42,7 +42,7 @@ static const char* getSlowQueryLableCostDesc(int64_t cost) { } void clientSlowQueryMonitorInit(const char* clusterKey) { - if (!tsEnableMonitor || !enableSlowQueryMonitor) return; + if (!tsEnableMonitor) return; SAppInstInfo* pAppInstInfo = getAppInstInfo(clusterKey); SEpSet epSet = getEpSet_s(&pAppInstInfo->mgmtEp); clusterMonitorInit(clusterKey, epSet, pAppInstInfo->pTransporter); @@ -55,7 +55,7 @@ void clientSlowQueryLog(const char* clusterKey, const char* user, SQL_RESULT_COD } void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost) { - if (!tsEnableMonitor || !enableSlowQueryMonitor) return; + if (!tsEnableMonitor) return; SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; if (TSDB_CODE_SUCCESS != code) { result = SQL_RESULT_FAILED; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 39b7a23e3a..63f69d94a8 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -165,7 +165,6 @@ int32_t tsMetaCacheMaxSize = -1; // MB int32_t tsSlowLogThreshold = 3; // seconds int32_t tsSlowLogScope = SLOW_LOG_TYPE_ALL; int32_t tsTimeSeriesThreshold = 50; -bool enableSlowQueryMonitor = false; /* * denote if the server needs to compress response message at the application layer to client, including query rsp, @@ -511,7 +510,6 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddInt32(pCfg, "slowLogThreshold", tsSlowLogThreshold, 0, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; if (cfgAddString(pCfg, "slowLogScope", "", CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; - if (cfgAddBool(pCfg, "enableSlowQueryMonitor", enableSlowQueryMonitor, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1; tsNumOfRpcThreads = tsNumOfCores / 2; tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 2, TSDB_MAX_RPC_THREADS); @@ -1090,7 +1088,6 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { if (taosSetSlowLogScope(cfgGetItem(pCfg, "slowLogScope")->str)) { return -1; } - enableSlowQueryMonitor = cfgGetItem(pCfg, "enableSlowQueryMonitor")->bval; tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32; diff --git a/tests/system-test/2-query/stable_1.csv b/tests/system-test/2-query/stable_1.csv deleted file mode 100644 index 7b0587f527..0000000000 --- a/tests/system-test/2-query/stable_1.csv +++ /dev/null @@ -1,364 +0,0 @@ -tbname,ts,q_int,q_binary -"stable_1_1","2021-08-27 01:46:40.000",-143708439,"binary.wEvcyPTYhxxKhVFrShTZ" -"stable_1_1","2021-08-27 05:56:40.000",-2044434228,"binary.iVmwRqGqAbGImLpoUiKX" -"stable_1_1","2021-08-27 10:06:40.000",1109067209,"binary.mJPDrXToNeEldaahHrjD" -"stable_1_1","2021-08-27 14:16:40.000",1148326681,"binary.NHZMOcXRwhSPvmIIxdxp" -"stable_1_1","2021-08-27 18:26:40.000",723117353,"binary.TublFbdwZUkjDXBnzoCS" -"stable_1_1","2021-08-27 22:36:40.000",-1735114764,"binary.TCDlFpIyMpXfcghfWlUe" -"stable_1_1","2021-08-28 02:46:40.000",1973623075,"binary.xkRVpVawmLMQlKCdvZtZ" -"stable_1_1","2021-08-28 06:56:40.000",1693347900,"binary.CRmkBadMfWkcImouLOYC" -"stable_1_1","2021-08-28 11:06:40.000",1041114692,"binary.FplIhrrnZDEqcPpMXcCz" -"stable_1_1","2021-08-28 15:16:40.000",-1384036824,"binary.NpfAGysaedqwHzyjOEhb" -"stable_1_1","2021-08-28 19:26:40.000",1841425030,"binary.wpRXidgNPOERhEaZlJAM" -"stable_1_1","2021-08-28 23:36:40.000",-270068972,"binary.FNcyuyrPVVVfxbzDuGlf" -"stable_1_1","2021-08-29 03:46:40.000",418330248,"binary.KevLpYjpMOfugEsBCBlm" -"stable_1_1","2021-08-29 07:56:40.000",-1261626278,"binary.DmaGJbQkLmJQaURuaowv" -"stable_1_1","2021-08-29 12:06:40.000",665794589,"binary.IKfpbOnsEUqZvDUDXwxE" -"stable_1_1","2021-08-29 16:16:40.000",1556546304,"binary.GKOAUmTHRsUYNGpJuJXS" -"stable_1_1","2021-08-29 20:26:40.000",-635394652,"binary.UPKoftKIqXYBGkgijulk" -"stable_1_1","2021-08-30 00:36:40.000",1654794184,"binary.QHlEvczXvDhrjeXKechh" -"stable_1_1","2021-08-30 04:46:40.000",41007230,"binary.wuOctyBeTsCZynkMWYzu" -"stable_1_1","2021-08-30 08:56:40.000",1387304128,"binary.QwtMztxuEtuQdccEPSgc" -"stable_1_1","2021-08-30 13:06:40.000",-1036308321,"binary.CHRMHcuiDKIrbquzMWnc" -"stable_1_1","2021-08-30 17:16:40.000",-1768408453,"binary.OaHLnnqkcUEKxOOHCYCJ" -"stable_1_1","2021-08-30 21:26:40.000",125729034,"binary.YAKBKrKRqlgNweLacnpB" -"stable_1_1","2021-08-31 01:36:40.000",-125236222,"binary.UJkpaKsbERScbXdQuhvo" -"stable_1_1","2021-08-31 05:46:40.000",-677274672,"binary.jwdoZKFVRIbdNbxvzglZ" -"stable_1_2","2021-08-27 01:46:39.999",1048090051,"binary.QFXcjYxRIgvVcaabbAuo" -"stable_1_2","2021-08-27 01:46:40.001",-115380468,"binary.ilLTZcPTGRSwIjACLGlM" -"stable_1_2","2021-08-27 05:56:39.999",1095266727,"binary.NMQGxjbGhMVVbcQEBaEK" -"stable_1_2","2021-08-27 05:56:40.001",-1664825220,"binary.LZlUlCryyKuhhwGGlSjc" -"stable_1_2","2021-08-27 10:06:39.999",1270783858,"binary.GqXavHpdBwhbCDrQnpSF" -"stable_1_2","2021-08-27 10:06:40.001",-1718628594,"binary.wPOmeglMuNsatgqVOYvh" -"stable_1_2","2021-08-27 14:16:39.999",781814072,"binary.LBBuZbsGbCPwrtpgpJUU" -"stable_1_2","2021-08-27 14:16:40.001",-222510400,"binary.BgnCkJAICiNgxqiaowKU" -"stable_1_2","2021-08-27 18:26:39.999",260526220,"binary.uSifMBsrTaQhLuYRzSNB" -"stable_1_2","2021-08-27 18:26:40.001",-1734497021,"binary.UnQSdMFNesxovxaQqywB" -"stable_1_2","2021-08-27 22:36:39.999",856956546,"binary.ctAKBcRCfQQDgayszuAG" -"stable_1_2","2021-08-27 22:36:40.001",-2035071163,"binary.evhulVVFzQzmcxSxrhKQ" -"stable_1_2","2021-08-28 02:46:39.999",2024548336,"binary.HAdhzWKQINYLaYkXNWMA" -"stable_1_2","2021-08-28 02:46:40.001",-1388002413,"binary.uYfWFNKpQafMupBPxsaQ" -"stable_1_2","2021-08-28 06:56:39.999",896614799,"binary.eLMnpehchKlvWYooNwzT" -"stable_1_2","2021-08-28 06:56:40.001",-449300050,"binary.qKdRIooLiEPovATVrIjv" -"stable_1_2","2021-08-28 11:06:39.999",640308875,"binary.OzGnekdKxbZxbKgGFJlg" -"stable_1_2","2021-08-28 11:06:40.001",-1961834598,"binary.FbQxRmecVULCPbyUFBtd" -"stable_1_2","2021-08-28 15:16:39.999",152017229,"binary.CoERNXcHahySItezBpen" -"stable_1_2","2021-08-28 15:16:40.001",-873242705,"binary.LLhLPAXTmmXelsILHdQZ" -"stable_1_2","2021-08-28 19:26:39.999",7371013,"binary.OtbSjvYZOPWbIQOdIrKG" -"stable_1_2","2021-08-28 19:26:40.001",-259884599,"binary.ILwvbvFGWLKDelTSCcDm" -"stable_1_2","2021-08-28 23:36:39.999",1060176497,"binary.cZSBdkTCfHzKdaUbRObM" -"stable_1_2","2021-08-28 23:36:40.001",-1895192712,"binary.CYsQdbzmYnNmadYZeaGH" -"stable_1_2","2021-08-29 03:46:39.999",778869650,"binary.HYiRCyeEqGzFGwoHupCH" -"stable_1_2","2021-08-29 03:46:40.001",-1070149378,"binary.VZKQmmtwMfYTGzlJOyzv" -"stable_1_2","2021-08-29 07:56:39.999",2139522991,"binary.WgIELLWDqNqWvdsblKCB" -"stable_1_2","2021-08-29 07:56:40.001",-1450415363,"binary.THXDnYCLdvuTXRSUsMnH" -"stable_1_2","2021-08-29 12:06:39.999",1202083307,"binary.jzdrBvoIOBydYtlFDBfZ" -"stable_1_2","2021-08-29 12:06:40.001",-808169724,"binary.sUZnozuiMlgMQjgaKLWT" -"stable_1_2","2021-08-29 16:16:39.999",202190259,"binary.QFvJnTjavOlzsXAEZVwH" -"stable_1_2","2021-08-29 16:16:40.001",-409805763,"binary.sbSiqKmjPKvnXbSeKwXG" -"stable_1_2","2021-08-29 20:26:39.999",238657263,"binary.OgrrbsocdxzSAsMKmGFW" -"stable_1_2","2021-08-29 20:26:40.001",-1447960279,"binary.gMIOOqmPvHzbiBiPEVsv" -"stable_1_2","2021-08-30 00:36:39.999",954795210,"binary.VOdZRucmuTuXzTGKuWfA" -"stable_1_2","2021-08-30 00:36:40.001",-185956520,"binary.LsRcBtiQqicggCLXZoWe" -"stable_1_2","2021-08-30 04:46:39.999",1365142146,"binary.EnWxuBUlakKcHrXrPBOj" -"stable_1_2","2021-08-30 04:46:40.001",-210822579,"binary.ZKvMAWaDuBEInoXJgQSL" -"stable_1_2","2021-08-30 08:56:39.999",952122349,"binary.lcXghoPWtfUTfSAAJDPS" -"stable_1_2","2021-08-30 08:56:40.001",-1152099753,"binary.vtvGwZIEcxVUBWDFVniL" -"stable_1_2","2021-08-30 13:06:39.999",1198995002,"binary.CobYIOXzviHBQmtndNfY" -"stable_1_2","2021-08-30 13:06:40.001",-1498342366,"binary.qfSLXCSfQexiQHdraTYY" -"stable_1_2","2021-08-30 17:16:39.999",388708472,"binary.VWdcyMxbxjRZCcDesjWH" -"stable_1_2","2021-08-30 17:16:40.001",-1688761021,"binary.fsNWygGviERgbHDCTNoU" -"stable_1_2","2021-08-30 21:26:39.999",1046617386,"binary.OmMMfoOWmDphnVXsqVny" -"stable_1_2","2021-08-30 21:26:40.001",-509016842,"binary.miOrdOLIjNjowuqZLMJY" -"stable_1_2","2021-08-31 01:36:39.999",1470657859,"binary.QLjYhzfGDKcPmHFQjBub" -"stable_1_2","2021-08-31 01:36:40.001",-720454315,"binary.GaEJJOwaHtRTijYNSKrt" -"stable_1_2","2021-08-31 05:46:39.999",1874112564,"binary.tNjvCgdWlmcOHVbLJRMN" -"stable_1_2","2021-08-31 05:46:40.001",-805620343,"binary.rMWNLTrygVpKqbvfAPEQ" -"stable_1_2","2021-08-31 09:56:39.999",1624260248,"binary.OMehRclQHcJBTynDoScY" -"stable_1_2","2021-08-31 09:56:40.001",-321755377,"binary.pYwaFBbMgRmreHVLLqHM" -"stable_1_2","2021-08-31 14:06:39.999",1338486910,"binary.PewhoryOLSZsZOExXrsO" -"stable_1_2","2021-08-31 14:06:40.001",-1972396465,"binary.HCciTUVnuKaUQHOTLmoy" -"stable_1_2","2021-08-31 18:16:39.999",586219277,"binary.ejuJVeKrOYTBIOGtnvwN" -"stable_1_2","2021-08-31 18:16:40.001",-23773554,"binary.HMzLCwXDnCBrSjyvRiij" -"stable_1_2","2021-08-31 22:26:39.999",403592186,"binary.KbgXOhPmkagxFsFbQakf" -"stable_1_2","2021-08-31 22:26:40.001",-1017841441,"binary.BONmREpjVojUyNnkKVDr" -"stable_1_2","2021-09-01 02:36:39.999",2123582595,"binary.JqrmmSVJyyJSphzDfdfF" -"stable_1_2","2021-09-01 02:36:40.001",-541998051,"binary.DAHIBWzujRgGmXHITFdP" -"stable_1_2","2021-09-01 06:46:39.999",863783720,"binary.iZrgQLIwNNvEhiErAwkt" -"stable_1_2","2021-09-01 06:46:40.001",-1507574370,"binary.nVGhmvtMlkPpeaBpAFTM" -"stable_1_2","2021-09-01 10:56:39.999",1652311395,"binary.GFGXaNXjaQWBuiuIuflv" -"stable_1_2","2021-09-01 10:56:40.001",-881848122,"binary.WKsWUZoBjTlKVGgAJxPx" -"stable_1_2","2021-09-01 15:06:39.999",133942525,"binary.jFkkgXUPSCrZnMUmiDca" -"stable_1_2","2021-09-01 15:06:40.001",-1161482672,"binary.TMzTATElhmlhyqFvwFKJ" -"stable_1_2","2021-09-01 19:16:39.999",1748308690,"binary.bsqrWOhUgZliFzqtMCyZ" -"stable_1_2","2021-09-01 19:16:40.001",-45395742,"binary.SEnorgonMIgtUKkNTOxP" -"stable_1_2","2021-09-01 23:26:39.999",59717021,"binary.XBJIPnZODnweOOXmzRkO" -"stable_1_2","2021-09-01 23:26:40.001",-369410792,"binary.HBmqhBQjhNYwAaLJWbpE" -"stable_1_2","2021-09-02 03:36:39.999",1042899672,"binary.SyRZdWnAthyOUqpOtOos" -"stable_1_2","2021-09-02 03:36:40.001",-1784712756,"binary.FsBnuFMAwIdTjEjYkjBR" -"stable_1_2","2021-09-02 07:46:39.999",656087591,"binary.vsIjUPiZNVxiFWHzGqkg" -"stable_1_2","2021-09-02 07:46:40.001",-70790307,"binary.GLAJYWukLZueieYRsidQ" -"stable_1_2","2021-09-02 11:56:39.999",396390446,"binary.pgBGZOKYSliCxHFmGsyp" -"stable_1_2","2021-09-02 11:56:40.001",-1965530504,"binary.ECLVeNvkmqcTHEoSSxYT" -"stable_1_2","2021-09-02 16:06:39.999",554982384,"binary.zpGkiHSJABZuoZlpNXMp" -"stable_1_2","2021-09-02 16:06:40.001",-2032946157,"binary.lyLVozekCioDlqntmATw" -"stable_1_2","2021-09-02 20:16:39.999",677947760,"binary.vfXYvrHXFnDSAHwCndcp" -"stable_1_2","2021-09-02 20:16:40.001",-494862894,"binary.zffLjgnXcDlwdKAxADMr" -"stable_1_2","2021-09-03 00:26:39.999",1558178384,"binary.bKLXWDPaBjWRXgOeesiD" -"stable_1_2","2021-09-03 00:26:40.001",-475557451,"binary.wnZulRregqgognSRRYWI" -"stable_1_2","2021-09-03 04:36:39.999",632223220,"binary.JqnabMfPCrzsTaYczTLh" -"stable_1_2","2021-09-03 04:36:40.001",-951785691,"binary.sKKfLrkShxlGFGromDFZ" -"stable_1_2","2021-09-03 08:46:39.999",826686189,"binary.shGShhPNnWdZQDAdbiHo" -"stable_1_2","2021-09-03 08:46:40.001",-667795153,"binary.OaUjyowfAGaGXKoVLWZR" -"stable_1_2","2021-09-03 12:56:39.999",1420828021,"binary.AYcgokdEsFMUOIcUpxnM" -"stable_1_2","2021-09-03 12:56:40.001",-2009472018,"binary.JpOZwpoVKCDjiqsFhbaS" -"stable_1_2","2021-09-03 17:06:39.999",395324903,"binary.vWVYYMXIWQAEHBTKKWjP" -"stable_1_2","2021-09-03 17:06:40.001",-9754404,"binary.QNAVDZqImSFgnHpVdWtS" -"stable_1_2","2021-09-03 21:16:39.999",2068284680,"binary.wNSWJmuVBjpRVVCpksQC" -"stable_1_2","2021-09-03 21:16:40.001",-853667209,"binary.OgZwwWPZuNLXAAdBcanX" -"stable_1_2","2021-09-04 01:26:39.999",155983724,"binary.MRJjXYWHBZvzaAjTzrli" -"stable_1_2","2021-09-04 01:26:40.001",-1760453704,"binary.pARRcJciJQzdzcCZRqZA" -"stable_1_2","2021-09-04 05:36:39.999",570191599,"binary.VVxoQGPpWrOYSXzSxWlM" -"stable_1_2","2021-09-04 05:36:40.001",-1289549437,"binary.mtOMrfEeDMegNqMauPgK" -"stable_1_2","2021-09-04 09:46:39.999",1998845359,"binary.IROrsLaBEXcULJZvtXDS" -"stable_1_2","2021-09-04 09:46:40.001",-1746905381,"binary.WatcMYFnezOmZtsAGUDK" -"stable_1_2","2021-09-04 13:56:39.999",2123054685,"binary.cRdRGuitRXDuGAWVDxAE" -"stable_1_2","2021-09-04 13:56:40.001",-45388705,"binary.HMSrCuTIHQiHmuAoGqJK" -"stable_1_2","2021-09-04 18:06:39.999",422908755,"binary.xeqmTUMylYPDFkFJGLQY" -"stable_1_2","2021-09-04 18:06:40.001",-1902203841,"binary.dEfjmLzekcjvysMUToXa" -"stable_1_2","2021-09-04 22:16:39.999",1335747951,"binary.ugUzQSUcPjEXMIDrFobB" -"stable_1_2","2021-09-04 22:16:40.001",-1552553924,"binary.gZMscjyRXoGyNsFLHpoR" -"stable_1_2","2021-09-05 02:26:39.999",1092904458,"binary.IAiAMcGMqeACFMkfgGju" -"stable_1_2","2021-09-05 02:26:40.001",-437886009,"binary.jWguWEtBAUgcMKtgXieL" -"stable_1_2","2021-09-05 06:36:39.999",433850999,"binary.QBIulMvNBsGMfStAKgCQ" -"stable_1_2","2021-09-05 06:36:40.001",-1219816305,"binary.aSnbvFgLheGIahlWoBEf" -"stable_1_2","2021-09-05 10:46:39.999",1771552222,"binary.YdwgZmlYfeivmxtaWueZ" -"stable_1_2","2021-09-05 10:46:40.001",-429657495,"binary.yGIWxOkDtQCQgbPJhHFi" -"stable_1_2","2021-09-05 14:56:39.999",1560886565,"binary.OlTzMGFNSfSrcixpefQx" -"stable_1_2","2021-09-05 14:56:40.001",-2082927804,"binary.FTNnvEphxFByhzkfmAhb" -"stable_1_2","2021-09-05 19:06:39.999",312047911,"binary.yaVlkhtTxxgrtZTsFdxa" -"stable_1_2","2021-09-05 19:06:40.001",-1417705247,"binary.tHnemGaRugDffcmoyWli" -"stable_1_2","2021-09-05 23:16:39.999",1667164436,"binary.NdSzaJxdoQPGYefWPJyi" -"stable_1_2","2021-09-05 23:16:40.001",-2145233720,"binary.jghuIXEGcUtKikJpzLOh" -"stable_1_2","2021-09-06 03:26:39.999",488072919,"binary.RLQFgpAcQCfhuZExHLkx" -"stable_1_2","2021-09-06 03:26:40.001",-1943550230,"binary.ozdeiPLKjSgywqNpCBYN" -"stable_1_2","2021-09-06 07:36:39.999",724025582,"binary.XZmZYlSRZZddcxEOjfEd" -"stable_1_2","2021-09-06 07:36:40.001",-2130070769,"binary.qLvSSOSazLTUKvqpCCBL" -"stable_1_2","2021-09-06 11:46:39.999",941556630,"binary.WrcojJGdsiZyAaRxYrdw" -"stable_1_2","2021-09-06 11:46:40.001",-343938435,"binary.HoqLkegpacFGqzFWeVXL" -"stable_1_2","2021-09-06 15:56:39.999",462886464,"binary.BRImBBEftaaKZeOGRSvW" -"stable_1_2","2021-09-06 15:56:40.001",-674623669,"binary.XevOOqIPqCmaJUcXaaKz" -"stable_1_2","2021-09-06 20:06:39.999",1589240480,"binary.wJyZOXguJRYIbgIuIRye" -"stable_1_2","2021-09-06 20:06:40.001",-253589870,"binary.CzIxfDKtViliFCPuYkSq" -"stable_1_2","2021-09-07 00:16:39.999",701182235,"binary.wFVimJeupABVGEvwMiTv" -"stable_1_2","2021-09-07 00:16:40.001",-1563988450,"binary.OjWhbhEvRlHpqFEHXmfR" -"stable_1_2","2021-09-07 04:26:39.999",1631111972,"binary.QZSHkvsYmRHnGFnyMije" -"stable_1_2","2021-09-07 04:26:40.001",-1081644320,"binary.TDrOTkriDBpZtXBadhIx" -"stable_1_2","2021-09-07 08:36:39.999",1021775776,"binary.AstGPfaVxEefogcWzDzq" -"stable_1_2","2021-09-07 08:36:40.001",-1715903601,"binary.lSSCcLFElDWxKZTdHRLN" -"stable_1_2","2021-09-07 12:46:39.999",1492685945,"binary.esYXdqdUGVFhLCHHciWA" -"stable_1_2","2021-09-07 12:46:40.001",-457991373,"binary.OCGshioisqgLTUFLRMSc" -"stable_1_2","2021-09-07 16:56:39.999",306491871,"binary.WPbbRgxYIRecrOFSlRYM" -"stable_1_2","2021-09-07 16:56:40.001",-709883988,"binary.cADQdfbZkXfcNPPOPQwp" -"stable_1_2","2021-09-07 21:06:39.999",1639981656,"binary.mVTonpWtYFauqLNntbcK" -"stable_1_2","2021-09-07 21:06:40.001",-40134567,"binary.hSZKVixlyoxpHpdvwYxY" -"stable_1_2","2021-09-08 01:16:39.999",1412945598,"binary.EPkNzxzaeCAWQetzzzlv" -"stable_1_2","2021-09-08 01:16:40.001",-517552216,"binary.AmPftzlwURAILqlHhYtv" -"stable_1_2","2021-09-08 05:26:39.999",1210716085,"binary.xPKETDcCdbWtoYoUCgre" -"stable_1_2","2021-09-08 05:26:40.001",-1186882087,"binary.HVKExGKBzdrjjQbKdgim" -"stable_1_2","2021-09-08 09:36:39.999",1209625354,"binary.xDqLioOjrUudmVTRaKmP" -"stable_1_2","2021-09-08 09:36:40.001",-1049869765,"binary.ZcJrqAQpBfTRFJupVZDH" -"stable_1_2","2021-09-08 13:46:39.999",482971664,"binary.ZumfNrRUgHCXCqqjBwgX" -"stable_1_2","2021-09-08 13:46:40.001",-1695698428,"binary.VzjkizbqoeqlOEtsqzTd" -"stable_1_2","2021-09-08 17:56:39.999",369111551,"binary.hBVqWjfnRCktdjBpGTYb" -"stable_1_2","2021-09-08 17:56:40.001",-1324385506,"binary.aBZiPEKTvPqdXPsDXgvy" -"stable_1_2","2021-09-08 22:06:39.999",1370148713,"binary.ApKvhLsWkpRndmodhPEN" -"stable_1_2","2021-09-08 22:06:40.001",-1440742963,"binary.nsuhquhIJtXKINhuhbZm" -"stable_1_2","2021-09-09 02:16:39.999",1951461498,"binary.hZDumWlAzVpYfXkEaPlW" -"stable_1_2","2021-09-09 02:16:40.001",-1663211983,"binary.wBVWJVLFoOdXTzTtRNuT" -"stable_1_2","2021-09-09 06:26:39.999",2092906691,"binary.hLAAdJsauemmUBKhTtqW" -"stable_1_2","2021-09-09 06:26:40.001",-2137737633,"binary.wRfxAxVfEcdfKteGLuaX" -"stable_1_2","2021-09-09 10:36:39.999",870002160,"binary.JCROwpmJQkPqZkIzrRkU" -"stable_1_2","2021-09-09 10:36:40.001",-837033747,"binary.YKouegacQvxoSSgTaPrv" -"stable_1_2","2021-09-09 14:46:39.999",1397781824,"binary.hwfhcmJDDTvQaCRmlKCd" -"stable_1_2","2021-09-09 14:46:40.001",-1573224659,"binary.QpcyRVyxqqnHSSLxWCdz" -"stable_1_2","2021-09-09 18:56:39.999",1354974803,"binary.mgwWzOiTRoTHUbvzEMSm" -"stable_1_2","2021-09-09 18:56:40.001",-1306330996,"binary.xazZjdXNjaykPYfDWhos" -"stable_1_2","2021-09-09 23:06:39.999",1089140558,"binary.tqyfrLsfYAZeSvFCwYXQ" -"stable_1_2","2021-09-09 23:06:40.001",-2070609011,"binary.HtBovhAaClqmUKDVoPoA" -"stable_1_2","2021-09-10 03:16:39.999",243460896,"binary.GwEkcVzBVjqKKvBBYCHl" -"stable_1_2","2021-09-10 03:16:40.001",-442417658,"binary.aMVpynzemnksvKTWGcDC" -"stable_1_2","2021-09-10 07:26:39.999",993462171,"binary.akkJQvtKVOUMeEJdtLWQ" -"stable_1_2","2021-09-10 07:26:40.001",-1147877996,"binary.UsylaHHTjnwUCmWOFRop" -"stable_1_1","2021-08-31 09:56:40.000",1859005003,"binary.uDiGDbJBCeWVuQCYGwQU" -"stable_1_1","2021-08-31 14:06:40.000",620402706,"binary.kcxyJbYKMUthZCemDZwN" -"stable_1_1","2021-08-31 18:16:40.000",-697189031,"binary.mjvvuLgBZRyYZvSnmrpW" -"stable_1_1","2021-08-31 22:26:40.000",-1223538957,"binary.YhGtRmitXcCooBPlNxlh" -"stable_1_1","2021-09-01 02:36:40.000",-838875167,"binary.AXEKjEPNWZzTiqwFpkrg" -"stable_1_1","2021-09-01 06:46:40.000",-765134201,"binary.uytkzHZmorAgiDiISVoG" -"stable_1_1","2021-09-01 10:56:40.000",-314548498,"binary.zPUYZbaXGMPJOywgECDZ" -"stable_1_1","2021-09-01 15:06:40.000",780205345,"binary.dyNGyigdTXCBLJSGKHrJ" -"stable_1_1","2021-09-01 19:16:40.000",-179608812,"binary.VMzHtbnrmjokPDZCMXsk" -"stable_1_1","2021-09-01 23:26:40.000",-138813503,"binary.cvjJVfNMFXXyaKDjkvRu" -"stable_1_1","2021-09-02 03:36:40.000",-319429462,"binary.INFGvqMFdDTmdeFePZnQ" -"stable_1_1","2021-09-02 07:46:40.000",-298407008,"binary.ligoRoVSAHzFhUvIDwlE" -"stable_1_1","2021-09-02 11:56:40.000",632563376,"binary.RsQnCVXQtzoeXuamUiBl" -"stable_1_1","2021-09-02 16:06:40.000",446510409,"binary.FEewTpfZgngFmPSTSvxJ" -"stable_1_1","2021-09-02 20:16:40.000",640199308,"binary.bRHphFiZkeWtyDjXqNaO" -"stable_1_1","2021-09-03 00:26:40.000",790711145,"binary.uCOCqMGewUkNeUhAbNNf" -"stable_1_1","2021-09-03 04:36:40.000",1664157316,"binary.AyZCLhYiMxZgfYXlVciw" -"stable_1_1","2021-09-03 08:46:40.000",-1983928412,"binary.CaPFXqhDLSOaNmNnOsLh" -"stable_1_1","2021-09-03 12:56:40.000",-412013965,"binary.qEwLmiFwCrLZumFHOYjb" -"stable_1_1","2021-09-03 17:06:40.000",-1579595934,"binary.xUUoAUpZeJJsquiJOKsO" -"stable_1_1","2021-09-03 21:16:40.000",-98786523,"binary.XQfGXHbnwGQPulAcrAPX" -"stable_1_1","2021-09-04 01:26:40.000",-287136285,"binary.OdsJNUSWeVvTxQdKykmk" -"stable_1_1","2021-09-04 05:36:40.000",1051015641,"binary.HfnUyPAwYxEHQotoCfFT" -"stable_1_1","2021-09-04 09:46:40.000",-1161611813,"binary.jEENQpaYOWcVHUYKPaPn" -"stable_1_1","2021-09-04 13:56:40.000",-1162065386,"binary.ltmEKwzkvDqQIZWAxJtQ" -"stable_1_1","2021-09-04 18:06:40.000",1289374504,"binary.SHhbtXRCqxYOqQcWUDtU" -"stable_1_1","2021-09-04 22:16:40.000",-115300759,"binary.CowDUEaCtAEdafPCLLwM" -"stable_1_1","2021-09-05 02:26:40.000",-97528818,"binary.pqfTTMuvVmSCfxCmFTwS" -"stable_1_1","2021-09-05 06:36:40.000",-738727537,"binary.zWAWphEtCuSMACUmkfvN" -"stable_1_1","2021-09-05 10:46:40.000",1063250813,"binary.XwbrXvujPArWLXYhQRQK" -"stable_1_1","2021-09-05 14:56:40.000",1579885922,"binary.FEXGjykuWeGEfkKImWDw" -"stable_1_1","2021-09-05 19:06:40.000",-714663691,"binary.tdLqigCoasQnRffCEaDD" -"stable_1_1","2021-09-05 23:16:40.000",1437018826,"binary.XZcaYfmvLZtxhrmzHWEJ" -"stable_1_1","2021-09-06 03:26:40.000",1811347552,"binary.riDaPlhuskGRZsNxzooI" -"stable_1_1","2021-09-06 07:36:40.000",-2123493348,"binary.ZKZunxmtjBCRRCZBHTsL" -"stable_1_1","2021-09-06 11:46:40.000",2108150002,"binary.eEaxRyDoGrrYZQfYhDwC" -"stable_1_1","2021-09-06 15:56:40.000",-1893993866,"binary.bMuXKucyDJjBggYIIAvd" -"stable_1_1","2021-09-06 20:06:40.000",-1494759877,"binary.GGbtLZVCzfmnUdMHExqv" -"stable_1_1","2021-09-07 00:16:40.000",2135168110,"binary.ICfwWUnCEvXrJWGQNYjv" -"stable_1_1","2021-09-07 04:26:40.000",15376875,"binary.lwtmrfdurUFDSkHMZuOe" -"stable_1_1","2021-09-07 08:36:40.000",1998856189,"binary.JCxsLYijtQSKzNLYAICB" -"stable_1_1","2021-09-07 12:46:40.000",-1190594011,"binary.lTlvbMfWCVccDOCnIDBK" -"stable_1_1","2021-09-07 16:56:40.000",-925781701,"binary.iLESXKenJaWTIeKHFleM" -"stable_1_1","2021-09-07 21:06:40.000",-487874477,"binary.AfIofVnHdvWMCGyeajlC" -"stable_1_1","2021-09-08 01:16:40.000",212157003,"binary.jDxeCyLAKzKgEHGHAlif" -"stable_1_1","2021-09-08 05:26:40.000",-1001974902,"binary.ELgeHxhmjoFyFgkFXZui" -"stable_1_1","2021-09-08 09:36:40.000",-607426580,"binary.NuToHMvRscGxwMENZqOS" -"stable_1_1","2021-09-08 13:46:40.000",630458653,"binary.SrRBINnQSvdBTBKNGHFz" -"stable_1_1","2021-09-08 17:56:40.000",1299240809,"binary.eqzlYcordfJQQJMBljjF" -"stable_1_1","2021-09-08 22:06:40.000",1560015019,"binary.fWtsEHhFIrXfqBGYlTNJ" -"stable_1_1","2021-09-09 02:16:40.000",-1618319757,"binary.xQXfGqKJJntmbtHJzqHc" -"stable_1_1","2021-09-09 06:26:40.000",989052773,"binary.SifrNRSsBKcJKDqsnfXN" -"stable_1_1","2021-09-09 10:36:40.000",-1117272908,"binary.HlxBvTuGkChJDLzDaxyu" -"stable_1_1","2021-09-09 14:46:40.000",2139488417,"binary.yymGCDKbqZkixkIjIIGT" -"stable_1_1","2021-09-09 18:56:40.000",-1462514908,"binary.gMqqCIzQCNGNgbSwolZX" -"stable_1_1","2021-09-09 23:06:40.000",-1984142506,"binary.pfhSySLjKZbOfIPTmqAB" -"stable_1_1","2021-09-10 03:16:40.000",-2106211575,"binary.lENnnzItGfhHBhuBSKkg" -"stable_1_1","2021-09-10 07:26:40.000",-456444500,"binary.zrOBefSbOEUgRLtVobMw" -"stable_1_1","2021-09-10 11:36:40.000",-294434895,"binary.olALLZcgYbqmLLsQAfvv" -"stable_1_1","2021-09-10 15:46:40.000",1229299947,"binary.TIeullzMmPeJOEDzERVs" -"stable_1_1","2021-09-10 19:56:40.000",1290141025,"binary.loHjtwzgyvJksRhJNiQS" -"stable_1_1","2021-09-11 00:06:40.000",-770991939,"binary.QKhLWpoMPsfwyQYNoPZA" -"stable_1_1","2021-09-11 04:16:40.000",262080824,"binary.hIMCRvrXPAOVpFRmYnUy" -"stable_1_1","2021-09-11 08:26:40.000",-493256377,"binary.PqdASxtDLyeIFzBiaFGV" -"stable_1_1","2021-09-11 12:36:40.000",408968903,"binary.GLyIXkgZbApVCOoVSqaO" -"stable_1_1","2021-09-11 16:46:40.000",29364546,"binary.SOQDYnfDtUghMpNrrrvd" -"stable_1_1","2021-09-11 20:56:40.000",568429328,"binary.IGDZBmjwYmOzJaUbkiKN" -"stable_1_1","2021-09-12 01:06:40.000",1015255006,"binary.dcFQefENHBmSbWfsxkNZ" -"stable_1_1","2021-09-12 05:16:40.000",110327094,"binary.jBWuQXhwybyeWaUeuiCo" -"stable_1_1","2021-09-12 09:26:40.000",1886325467,"binary.QSJUCkzpJcOiAmsyKmUs" -"stable_1_1","2021-09-12 13:36:40.000",2071766507,"binary.sROneWSFNuXBalpsjyEo" -"stable_1_1","2021-09-12 17:46:40.000",-1084304030,"binary.TyxrsRIKPjtzXgKyuAEH" -"stable_1_1","2021-09-12 21:56:40.000",113309185,"binary.DJuxhSLmckBxGAZrTrdg" -"stable_1_1","2021-09-13 02:06:40.000",222279926,"binary.VsnXIRHAihqVgXYwhHKL" -"stable_1_1","2021-09-13 06:16:40.000",-1420187501,"binary.SlMenUlCCEwyXsFKefLW" -"stable_1_2","2021-09-10 11:36:39.999",224419688,"binary.FsYcmhXFIVEwuCmapLFd" -"stable_1_2","2021-09-10 11:36:40.001",-111362062,"binary.wugzMLvmLdkxesgmixOH" -"stable_1_2","2021-09-10 15:46:39.999",2133083813,"binary.buDeWRmTqpbBhNKoIWjt" -"stable_1_2","2021-09-10 15:46:40.001",-88622269,"binary.fgqZcQmlErAwLKYvDwkA" -"stable_1_2","2021-09-10 19:56:39.999",521859506,"binary.NgxLslBkOvvWWVcDCUlC" -"stable_1_2","2021-09-10 19:56:40.001",-1577694201,"binary.zgfPMXusJGeFxLLImITl" -"stable_1_2","2021-09-11 00:06:39.999",896685945,"binary.NEkCzZWDoXmvngPlArSM" -"stable_1_2","2021-09-11 00:06:40.001",-102246541,"binary.qiNYdNPnHVKQBpzXATmm" -"stable_1_2","2021-09-11 04:16:39.999",2143525047,"binary.eIPLVCyRogBRyzGbrFic" -"stable_1_2","2021-09-11 04:16:40.001",-489200958,"binary.bCLmDBrnkgDcXvcwrBqA" -"stable_1_2","2021-09-11 08:26:39.999",1129994268,"binary.rqJyBwQmuzFVARUJRgKb" -"stable_1_2","2021-09-11 08:26:40.001",-1449143866,"binary.fPxCvZJXReoaPBmALmPQ" -"stable_1_2","2021-09-11 12:36:39.999",2026186883,"binary.fOSZlDCKdxiQaysyscfx" -"stable_1_2","2021-09-11 12:36:40.001",-2001883206,"binary.IUNzHoyqCMDBQckAVEQz" -"stable_1_2","2021-09-11 16:46:39.999",341004545,"binary.PlQgjTLDuHwIfIkGmfIq" -"stable_1_2","2021-09-11 16:46:40.001",-2139193188,"binary.LSzPYUKvvRlNrhoKoYkL" -"stable_1_2","2021-09-11 20:56:39.999",2050068224,"binary.fzVzLhgOcjBWiooIbfZy" -"stable_1_2","2021-09-11 20:56:40.001",-1606114187,"binary.DQLAjLojVsSPrXVqoaFU" -"stable_1_2","2021-09-12 01:06:39.999",869226799,"binary.thrXsOuUUQEwGkXiZqVD" -"stable_1_2","2021-09-12 01:06:40.001",-2127572203,"binary.MtiGMwxbCoGxBrSCfmnb" -"stable_1_2","2021-09-12 05:16:39.999",415752279,"binary.pNjKEKLwWZUgNZshphnH" -"stable_1_2","2021-09-12 05:16:40.001",-1943166726,"binary.hSqhMEcJIhZRmIFrQDKl" -"stable_1_2","2021-09-12 09:26:39.999",1895012884,"binary.KBNSdgumJOCWoMmWtLJU" -"stable_1_2","2021-09-12 09:26:40.001",-1384685953,"binary.orjVZeKJsgJsTEqHljkf" -"stable_1_2","2021-09-12 13:36:39.999",2108909701,"binary.vYUalkfScnQyDPeEqCTq" -"stable_1_2","2021-09-12 13:36:40.001",-52260486,"binary.erVQJAvbzEahBSRwIflK" -"stable_1_2","2021-09-12 17:46:39.999",20091569,"binary.kZJLmYOxtxuJZnMBDufv" -"stable_1_2","2021-09-12 17:46:40.001",-958070866,"binary.RZliiclFrDaNImulqJTo" -"stable_1_2","2021-09-12 21:56:39.999",420485592,"binary.PUybFnyERTpaOdCfdUeZ" -"stable_1_2","2021-09-12 21:56:40.001",-136337675,"binary.AvuVCfvKjWXieILiINcT" -"stable_1_2","2021-09-13 02:06:39.999",447814637,"binary.fyooIrohcePtHVwJGMuD" -"stable_1_2","2021-09-13 02:06:40.001",-994364364,"binary.qpXjZYHYtFFCkEkBnwAb" -"stable_1_2","2021-09-13 06:16:39.999",1572668480,"binary.qWPhdNHKBtjYxVZgdXOh" -"stable_1_2","2021-09-13 06:16:40.001",-375162227,"binary.yMDiebwbXIHZiaQKPRut" -"stable_1_1","2024-01-30 20:18:24.652",1,NULL -"stable_1_1","2024-01-30 20:18:24.653",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.654",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.655",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.656",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.657",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.658",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.659",NULL,"1" -"stable_1_1","2024-01-30 20:18:24.660",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.661",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.672",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.673",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.674",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.675",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.676",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.677",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.678",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.679",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.680",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.681",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.692",1,NULL -"stable_1_1","2024-01-30 20:18:24.693",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.694",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.695",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.696",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.697",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.698",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.699",NULL,"1" -"stable_1_1","2024-01-30 20:18:24.700",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.701",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.834",1,NULL -"stable_1_1","2024-01-30 20:18:24.835",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.836",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.837",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.838",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.839",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.840",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.841",NULL,"1" -"stable_1_1","2024-01-30 20:18:24.842",NULL,NULL -"stable_1_1","2024-01-30 20:18:24.843",NULL,NULL -"stable_1_1","2024-01-30 20:18:34.387",NULL,NULL -"stable_1_1","2024-01-30 20:18:34.400",1,NULL -"stable_1_1","2024-01-30 20:18:34.432",NULL,NULL -"stable_1_1","2024-01-30 20:18:34.637",NULL,NULL -"stable_1_1","2024-01-30 20:18:35.402",NULL,NULL -"stable_1_1","2024-01-30 20:18:35.437",NULL,NULL -"stable_1_1","2024-01-30 20:18:36.404",NULL,NULL -"stable_1_1","2024-01-30 20:18:36.439",NULL,NULL -"stable_1_1","2024-01-30 20:18:37.406",NULL,NULL -"stable_1_1","2024-01-30 20:18:37.441",NULL,NULL -"stable_1_1","2024-01-30 20:18:38.408",NULL,NULL -"stable_1_1","2024-01-30 20:18:38.443",NULL,NULL -"stable_1_1","2024-01-30 20:18:39.410",NULL,NULL -"stable_1_1","2024-01-30 20:18:39.445",NULL,NULL -"stable_1_1","2024-01-30 20:18:40.413",NULL,NULL -"stable_1_1","2024-01-30 20:18:40.447",NULL,NULL -"stable_1_1","2024-01-30 20:18:41.414",NULL,"1" -"stable_1_1","2024-01-30 20:18:41.449",NULL,NULL -"stable_1_1","2024-01-30 20:18:42.417",NULL,NULL -"stable_1_1","2024-01-30 20:18:42.451",NULL,NULL -"stable_1_1","2024-01-30 20:18:43.419",NULL,NULL -"stable_1_1","2024-01-30 20:18:43.453",NULL,NULL -"!@!@$$^$","2024-01-30 20:18:24.844",1,NULL diff --git a/tests/system-test/2-query/stable_null_childtable.csv b/tests/system-test/2-query/stable_null_childtable.csv deleted file mode 100644 index ec2a2da4fd..0000000000 --- a/tests/system-test/2-query/stable_null_childtable.csv +++ /dev/null @@ -1,64 +0,0 @@ -tbname,ts,q_int,q_binary -"$^%$%^&","2024-01-30 20:18:24.844",1,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.773",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.774",1,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.775",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.776",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.777",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.778",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.779",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.780",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.781",NULL,"1" -"stable_null_childtable_1","2024-01-30 20:18:24.782",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.783",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.794",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.795",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.796",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.797",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.798",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.799",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.800",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.801",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.802",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.803",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.814",1,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.815",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.816",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.817",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.818",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.819",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.820",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.821",NULL,"1" -"stable_null_childtable_1","2024-01-30 20:18:24.822",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.823",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.834",1,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.835",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.836",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.837",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.838",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.839",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.840",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.841",NULL,"1" -"stable_null_childtable_1","2024-01-30 20:18:24.842",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:24.843",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:34.539",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:34.552",1,NULL -"stable_null_childtable_1","2024-01-30 20:18:34.582",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:35.554",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:35.587",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:36.557",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:36.589",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:37.559",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:37.592",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:38.561",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:38.594",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:39.563",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:39.596",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:40.565",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:40.598",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:41.567",NULL,"1" -"stable_null_childtable_1","2024-01-30 20:18:41.600",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:42.569",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:42.602",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:43.571",NULL,NULL -"stable_null_childtable_1","2024-01-30 20:18:43.604",NULL,NULL diff --git a/tests/system-test/2-query/stable_null_data.csv b/tests/system-test/2-query/stable_null_data.csv deleted file mode 100644 index 06534ac559..0000000000 --- a/tests/system-test/2-query/stable_null_data.csv +++ /dev/null @@ -1,64 +0,0 @@ -tbname,ts,q_int,q_binary -"stable_null_data_1","2024-01-30 20:18:24.712",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.713",1,NULL -"stable_null_data_1","2024-01-30 20:18:24.714",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.715",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.716",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.717",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.718",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.719",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.720",NULL,"1" -"stable_null_data_1","2024-01-30 20:18:24.721",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.722",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.733",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.734",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.735",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.736",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.737",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.738",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.739",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.740",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.741",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.742",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.753",1,NULL -"stable_null_data_1","2024-01-30 20:18:24.754",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.755",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.756",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.757",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.758",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.759",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.760",NULL,"1" -"stable_null_data_1","2024-01-30 20:18:24.761",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.762",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.834",1,NULL -"stable_null_data_1","2024-01-30 20:18:24.835",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.836",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.837",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.838",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.839",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.840",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.841",NULL,"1" -"stable_null_data_1","2024-01-30 20:18:24.842",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:24.843",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:34.466",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:34.477",1,NULL -"stable_null_data_1","2024-01-30 20:18:34.506",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:35.479",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:35.512",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:36.481",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:36.514",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:37.483",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:37.516",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:38.485",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:38.518",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:39.487",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:39.520",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:40.489",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:40.522",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:41.491",NULL,"1" -"stable_null_data_1","2024-01-30 20:18:41.524",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:42.493",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:42.526",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:43.495",NULL,NULL -"stable_null_data_1","2024-01-30 20:18:43.528",NULL,NULL -"%^$^&^&","2024-01-30 20:18:24.844",1,NULL From a59fd502cf3830175e95e6e7addcb07f954c36b9 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 19 Feb 2024 04:21:53 +0000 Subject: [PATCH 065/107] vnodes_num --- source/libs/monitor/src/monFramework.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index bf651f1dee..0ce6923326 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -441,10 +441,10 @@ void monGenDnodeInfoTable(SMonInfo *pMonitor) { taos_gauge_set(*metric, io_write_disk_rate, sample_labels); metric = taosHashGet(tsMonitor.metrics, ERRORS, strlen(ERRORS)); - taos_gauge_set(*metric, io_read_disk_rate, sample_labels); + taos_gauge_set(*metric, pStat->errors, sample_labels); metric = taosHashGet(tsMonitor.metrics, VNODES_NUM, strlen(VNODES_NUM)); - taos_gauge_set(*metric, pStat->errors, sample_labels); + taos_gauge_set(*metric, pStat->totalVnodes, sample_labels); metric = taosHashGet(tsMonitor.metrics, MASTERS, strlen(MASTERS)); taos_gauge_set(*metric, pStat->masterNum, sample_labels); From b554887d4d384949d7c0f74765c9bdd0668b1178 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Mon, 19 Feb 2024 14:27:54 +0800 Subject: [PATCH 066/107] enh: insert/delete sql count --- source/client/inc/clientInt.h | 9 ++++++++- source/client/src/clientEnv.c | 5 ++++- source/client/src/clientSqlMonitor.c | 20 ++++++++++++++++---- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 7e52344ba5..989c6614a6 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -438,7 +438,14 @@ void clientSlowQueryMonitorInit(const char* clusterKey); void SlowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); void clientSQLReqMonitorInit(const char* clusterKey); -void sqlReqLog(int64_t rid, bool killed, int32_t code); + +enum { + MONITORSQLTYPESELECT = 0, + MONITORSQLTYPEINSERT = 1, + MONITORSQLTYPEDELETE = 2 +}; + +void sqlReqLog(int64_t rid, bool killed, int32_t code, int8_t type); void clientMonitorClose(const char* clusterKey); diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 902c407eb5..77ca10c905 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -98,6 +98,7 @@ static void deregisterRequest(SRequestObj *pRequest) { pRequest->metric.planCostUs, pRequest->metric.execCostUs); atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration); reqType = SLOW_LOG_TYPE_INSERT; + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEINSERT); } else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) { tscDebug("query duration %" PRId64 "us: parseCost:%" PRId64 "us, ctgCost:%" PRId64 "us, analyseCost:%" PRId64 "us, planCost:%" PRId64 "us, exec:%" PRId64 "us", @@ -105,8 +106,10 @@ static void deregisterRequest(SRequestObj *pRequest) { pRequest->metric.planCostUs, pRequest->metric.execCostUs); atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); - sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code); reqType = SLOW_LOG_TYPE_QUERY; + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPESELECT); + } else if (QUERY_NODE_DELETE_STMT == pRequest->stmtType) { + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEDELETE); } } diff --git a/source/client/src/clientSqlMonitor.c b/source/client/src/clientSqlMonitor.c index 89b91646ff..572af7ff55 100644 --- a/source/client/src/clientSqlMonitor.c +++ b/source/client/src/clientSqlMonitor.c @@ -32,12 +32,24 @@ void clientSQLReqMonitorInit(const char* clusterKey) { createClusterCounter(clusterKey, selectMonitorName, selectMonitorHelp, selectMonitorLabelCount, selectMonitorLabels); } -void clientSQLReqLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result) { - const char* selectMonitorLabelValues[] = {defaultClusterID, "select", user, resultStr(result)}; +void clientSQLReqLog(const char* clusterKey, const char* user, SQL_RESULT_CODE result, int8_t type) { + const char* typeStr; + switch (type) { + case MONITORSQLTYPEDELETE: + typeStr = "delete"; + break; + case MONITORSQLTYPEINSERT: + typeStr = "insert"; + break; + default: + typeStr = "select"; + break; + } + const char* selectMonitorLabelValues[] = {defaultClusterID, typeStr, user, resultStr(result)}; taosClusterCounterInc(clusterKey, selectMonitorName, selectMonitorLabelValues); } -void sqlReqLog(int64_t rid, bool killed, int32_t code) { +void sqlReqLog(int64_t rid, bool killed, int32_t code, int8_t type) { if (!tsEnableMonitor) return; SQL_RESULT_CODE result = SQL_RESULT_SUCCESS; if (TSDB_CODE_SUCCESS != code) { @@ -53,7 +65,7 @@ void sqlReqLog(int64_t rid, bool killed, int32_t code) { if (pTscObj->pAppInfo == NULL) { tscLog("sqlReqLog, not found pAppInfo"); } else { - clientSQLReqLog(pTscObj->pAppInfo->instKey, pTscObj->user, result); + clientSQLReqLog(pTscObj->pAppInfo->instKey, pTscObj->user, result, type); } releaseTscObj(rid); } else { From c55e9b18775cc1027c2d0cb0a291f44526ea9bcf Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 21 Feb 2024 04:12:45 +0000 Subject: [PATCH 067/107] insert user empty --- source/dnode/vnode/src/vnd/vnodeSvr.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 7498431227..108ee706c0 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -1702,10 +1702,12 @@ _exit: atomic_add_fetch_64(&pVnode->statis.nInsertSuccess, pSubmitRsp->affectedRows); atomic_add_fetch_64(&pVnode->statis.nBatchInsert, 1); - const char *sample_labels[] = {VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS, pVnode->monitor.strClusterId, - pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, - pOriginalMsg->info.conn.user, "Success"}; - taos_counter_add(pVnode->monitor.insertCounter, pSubmitRsp->affectedRows, sample_labels); + if(pSubmitRsp->affectedRows > 0 && strlen(pOriginalMsg->info.conn.user) > 0){ + const char *sample_labels[] = {VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS, pVnode->monitor.strClusterId, + pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, + pOriginalMsg->info.conn.user, "Success"}; + taos_counter_add(pVnode->monitor.insertCounter, pSubmitRsp->affectedRows, sample_labels); + } if (code == 0) { atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, 1); From 95a6af54a90c42c10923bd7ed18f948fb6a0cf5c Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 21 Feb 2024 06:33:12 +0000 Subject: [PATCH 068/107] remove monitor_interval --- source/libs/monitor/src/monMain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index a849dc8f06..6c2344826a 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -276,7 +276,7 @@ static void monGenClusterJsonBasic(SMonInfo *pMonitor) { tjsonAddStringToObject(pMonitor->pJson, "first_ep", pInfo->first_ep); tjsonAddDoubleToObject(pMonitor->pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); tjsonAddStringToObject(pMonitor->pJson, "cluster_version", pInfo->version); - tjsonAddDoubleToObject(pMonitor->pJson, "monitor_interval", pInfo->monitor_interval); + //tjsonAddDoubleToObject(pMonitor->pJson, "monitor_interval", pInfo->monitor_interval); } static void monGenVgroupJson(SMonInfo *pMonitor) { From 606aa61c4f5838848c71770e4295c94d6ef80abd Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 21 Feb 2024 08:06:45 +0000 Subject: [PATCH 069/107] remove errors and delete --- source/dnode/vnode/src/inc/vnodeInt.h | 2 +- source/dnode/vnode/src/vnd/vnodeSvr.c | 2 ++ source/libs/monitor/src/monFramework.c | 10 +++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 9d882af1bd..ac28723fc3 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -118,7 +118,7 @@ typedef struct SQueryNode SQueryNode; #define VNODE_METRIC_TAG_VALUE_INSERT_AFFECTED_ROWS "inserted_rows" //#define VNODE_METRIC_TAG_VALUE_INSERT "insert" -#define VNODE_METRIC_TAG_VALUE_DELETE "delete" +//#define VNODE_METRIC_TAG_VALUE_DELETE "delete" // vnd.h typedef int32_t (*_query_reseek_func_t)(void* pQHandle); diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 108ee706c0..e928326c67 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -2029,6 +2029,7 @@ static int32_t vnodeProcessDeleteReq(SVnode *pVnode, int64_t ver, void *pReq, in return code; _err: + /* if(code == TSDB_CODE_SUCCESS){ const char *batch_sample_labels[] = {VNODE_METRIC_TAG_VALUE_DELETE, pVnode->monitor.strClusterId, pVnode->monitor.strDnodeId, tsLocalEp, pVnode->monitor.strVgId, @@ -2041,6 +2042,7 @@ _err: pOriginalMsg->info.conn.user, "Failed"}; taos_counter_inc(pVnode->monitor.insertCounter, batch_sample_labels); } + */ return code; } diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 0ce6923326..15793d07fb 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -71,7 +71,7 @@ extern char* tsMonFwUri; #define IO_WRITE DNODE_TABLE":io_write" #define IO_READ_DISK DNODE_TABLE":io_read_disk" #define IO_WRITE_DISK DNODE_TABLE":io_write_disk" -#define ERRORS DNODE_TABLE":errors" +//#define ERRORS DNODE_TABLE":errors" #define VNODES_NUM DNODE_TABLE":vnodes_num" #define MASTERS DNODE_TABLE":masters" #define HAS_MNODE DNODE_TABLE":has_mnode" @@ -135,10 +135,10 @@ void monInitMonitorFW(){ const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, MEM_TOTAL, DISK_ENGINE, DISK_USED, DISK_TOTAL, NET_IN, - NET_OUT, IO_READ, IO_WRITE, IO_READ_DISK, IO_WRITE_DISK, ERRORS, + NET_OUT, IO_READ, IO_WRITE, IO_READ_DISK, IO_WRITE_DISK, /*ERRORS,*/ VNODES_NUM, MASTERS, HAS_MNODE, HAS_QNODE, HAS_SNODE, DNODE_STATUS, DNODE_LOG_ERROR, DNODE_LOG_INFO, DNODE_LOG_DEBUG, DNODE_LOG_TRACE}; - for(int32_t i = 0; i < 27; i++){ + for(int32_t i = 0; i < 26; i++){ gauge= taos_gauge_new(dnodes_gauges[i], "", dnodes_label_count, dnodes_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ taos_counter_destroy(gauge); @@ -440,8 +440,8 @@ void monGenDnodeInfoTable(SMonInfo *pMonitor) { metric = taosHashGet(tsMonitor.metrics, IO_WRITE_DISK, strlen(IO_WRITE_DISK)); taos_gauge_set(*metric, io_write_disk_rate, sample_labels); - metric = taosHashGet(tsMonitor.metrics, ERRORS, strlen(ERRORS)); - taos_gauge_set(*metric, pStat->errors, sample_labels); + //metric = taosHashGet(tsMonitor.metrics, ERRORS, strlen(ERRORS)); + //taos_gauge_set(*metric, pStat->errors, sample_labels); metric = taosHashGet(tsMonitor.metrics, VNODES_NUM, strlen(VNODES_NUM)); taos_gauge_set(*metric, pStat->totalVnodes, sample_labels); From fa9f48866c3b6b9086e27412c95df356fed2958b Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 21 Feb 2024 20:02:22 +0800 Subject: [PATCH 070/107] update retry --- source/libs/transport/inc/transComm.h | 2 ++ source/libs/transport/src/transCli.c | 4 ++-- source/libs/transport/src/transComm.c | 13 ++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/source/libs/transport/inc/transComm.h b/source/libs/transport/inc/transComm.h index 7483588593..5b18d56d70 100644 --- a/source/libs/transport/inc/transComm.h +++ b/source/libs/transport/inc/transComm.h @@ -427,6 +427,8 @@ SDelayTask* transDQSched(SDelayQueue* queue, void (*func)(void* arg), void* arg, void transDQCancel(SDelayQueue* queue, SDelayTask* task); bool transEpSetIsEqual(SEpSet* a, SEpSet* b); + +bool transEpSetIsEqual2(SEpSet* a, SEpSet* b); /* * init global func */ diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index b6942655a9..63f684fd50 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -2229,7 +2229,7 @@ bool cliResetEpset(STransConnCtx* pCtx, STransMsg* pResp, bool hasEpSet) { EPSET_FORWARD_INUSE(&pCtx->epSet); } } else { - if (!transEpSetIsEqual(&pCtx->epSet, &epSet)) { + if (!transEpSetIsEqual2(&pCtx->epSet, &epSet)) { tDebug("epset not equal, retry new epset1"); transPrintEpSet(&pCtx->epSet); transPrintEpSet(&epSet); @@ -2256,7 +2256,7 @@ bool cliResetEpset(STransConnCtx* pCtx, STransMsg* pResp, bool hasEpSet) { EPSET_FORWARD_INUSE(&pCtx->epSet); } } else { - if (!transEpSetIsEqual(&pCtx->epSet, &epSet)) { + if (!transEpSetIsEqual2(&pCtx->epSet, &epSet)) { tDebug("epset not equal, retry new epset2"); transPrintEpSet(&pCtx->epSet); transPrintEpSet(&epSet); diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index b1fb9a2450..e9ba0128b3 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -70,7 +70,7 @@ int32_t transDecompressMsg(char** msg, int32_t len) { char* buf = taosMemoryCalloc(1, oriLen + sizeof(STransMsgHead)); STransMsgHead* pNewHead = (STransMsgHead*)buf; int32_t decompLen = LZ4_decompress_safe(pCont + sizeof(STransCompMsg), (char*)pNewHead->content, - len - sizeof(STransMsgHead) - sizeof(STransCompMsg), oriLen); + len - sizeof(STransMsgHead) - sizeof(STransCompMsg), oriLen); memcpy((char*)pNewHead, (char*)pHead, sizeof(STransMsgHead)); pNewHead->msgLen = htonl(oriLen + sizeof(STransMsgHead)); @@ -602,6 +602,17 @@ bool transEpSetIsEqual(SEpSet* a, SEpSet* b) { } return true; } +bool transEpSetIsEqual2(SEpSet* a, SEpSet* b) { + if (a->numOfEps != b->numOfEps) { + return false; + } + for (int i = 0; i < a->numOfEps; i++) { + if (strncmp(a->eps[i].fqdn, b->eps[i].fqdn, TSDB_FQDN_LEN) != 0 || a->eps[i].port != b->eps[i].port) { + return false; + } + } + return true; +} static void transInitEnv() { refMgt = transOpenRefMgt(50000, transDestroyExHandle); From 46ee4cd00f00e022d5aa680d51770426bd0d5940 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 00:49:51 +0000 Subject: [PATCH 071/107] uptime --- include/libs/monitor/monitor.h | 3 ++- source/dnode/mnode/impl/src/mndMain.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 55b8117f3d..6c28c77cc7 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -107,7 +107,8 @@ typedef struct { char first_ep[TSDB_EP_LEN]; int32_t first_ep_dnode_id; char version[MON_VER_LEN]; - float master_uptime; // day + //float master_uptime; // day + int64_t master_uptime; //second int32_t monitor_interval; // sec int32_t dbs_total; int32_t stbs_total; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 8b4d8eda8a..249ddb74c6 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -911,7 +911,8 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr if (pObj->id == pMnode->selfDnodeId) { pClusterInfo->first_ep_dnode_id = pObj->id; tstrncpy(pClusterInfo->first_ep, pObj->pDnode->ep, sizeof(pClusterInfo->first_ep)); - pClusterInfo->master_uptime = (float)mndGetClusterUpTime(pMnode) / 86400.0f; + //pClusterInfo->master_uptime = (float)mndGetClusterUpTime(pMnode) / 86400.0f; + pClusterInfo->master_uptime = mndGetClusterUpTime(pMnode); // pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f); tstrncpy(desc.role, syncStr(TAOS_SYNC_STATE_LEADER), sizeof(desc.role)); desc.syncState = TAOS_SYNC_STATE_LEADER; From ee84e2d75e6b3f4ce4c151be405239b1cbaf5942 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 02:00:33 +0000 Subject: [PATCH 072/107] uptime unit --- include/libs/monitor/monitor.h | 3 ++- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index 6c28c77cc7..ecd59a51a8 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -76,7 +76,8 @@ typedef struct { } SMonBasicInfo; typedef struct { - float uptime; // day + //float uptime; // day + int64_t uptime; // second int8_t has_mnode; int8_t has_qnode; int8_t has_snode; diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 3d6be1f433..413135a08c 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -33,7 +33,8 @@ static void dmGetMonitorBasicInfoBasic(SDnode *pDnode, SMonBasicInfo *pInfo) { } static void dmGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { - pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / (86400000.0f); + //pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / (86400000.0f); + pInfo->uptime = taosGetTimestampMs() - pDnode->data.rebootTime; pInfo->has_mnode = pDnode->wrappers[MNODE].required; pInfo->has_qnode = pDnode->wrappers[QNODE].required; pInfo->has_snode = pDnode->wrappers[SNODE].required; From ab3fd3164fbc36a88faaabe1ba00ae500e55010c Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Thu, 22 Feb 2024 11:42:34 +0800 Subject: [PATCH 073/107] fix: tag desc --- source/client/src/slowQueryMonitor.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index 933ef5de16..caa8fe1995 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -27,18 +27,16 @@ const int64_t msInSeconds = 1000; const int64_t msInMinutes = 60 * 1000; static const char* getSlowQueryLableCostDesc(int64_t cost) { - if (cost >= 10000 * msInSeconds) { - return " > 10000 seconds"; - } else if (cost >= 1000 * msInSeconds) { - return " > 1000 seconds"; + if (cost >= 1000 * msInSeconds) { + return "1000s-"; } else if (cost >= 100 * msInSeconds) { - return " > 100 seconds"; + return "100-1000s"; } else if (cost >= 10 * msInSeconds) { - return " > 10 seconds"; + return "10-100s"; } else if (cost >= 3 * msInSeconds) { - return " > 3 seconds"; + return "3-10s"; } - return "< 3 s"; + return "0-3s"; } void clientSlowQueryMonitorInit(const char* clusterKey) { From 2f6fc4a9ce29516234c71202985d573615750e7f Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 04:55:54 +0000 Subject: [PATCH 074/107] grant default --- include/libs/monitor/monitor.h | 2 +- source/dnode/mnode/impl/src/mndMain.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h index ecd59a51a8..256be26999 100644 --- a/include/libs/monitor/monitor.h +++ b/include/libs/monitor/monitor.h @@ -153,7 +153,7 @@ typedef struct { } SMonStbInfo; typedef struct { - uint32_t expire_time; + int64_t expire_time; int64_t timeseries_used; int64_t timeseries_total; } SMonGrantInfo; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 249ddb74c6..b188d314d9 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -989,8 +989,8 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr pGrantInfo->expire_time = (pMnode->grant.expireTimeMS - ms) / 1000; pGrantInfo->timeseries_total = pMnode->grant.timeseriesAllowed; if (pMnode->grant.expireTimeMS == 0) { - pGrantInfo->expire_time = INT32_MAX; - pGrantInfo->timeseries_total = INT32_MAX; + pGrantInfo->expire_time = 0; + pGrantInfo->timeseries_total = 0; } mndReleaseRpc(pMnode); From 607971b51455500695844d2125afda23acceda0a Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 06:54:06 +0000 Subject: [PATCH 075/107] uptime unit --- source/dnode/mgmt/node_mgmt/src/dmMonitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index 413135a08c..21e25f5535 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -34,7 +34,7 @@ static void dmGetMonitorBasicInfoBasic(SDnode *pDnode, SMonBasicInfo *pInfo) { static void dmGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) { //pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) / (86400000.0f); - pInfo->uptime = taosGetTimestampMs() - pDnode->data.rebootTime; + pInfo->uptime = (taosGetTimestampMs() - pDnode->data.rebootTime) /1000.0f; pInfo->has_mnode = pDnode->wrappers[MNODE].required; pInfo->has_qnode = pDnode->wrappers[QNODE].required; pInfo->has_snode = pDnode->wrappers[SNODE].required; From a6f70ad8c203233b625bef6d6d52c9614998daad Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Thu, 22 Feb 2024 16:13:50 +0800 Subject: [PATCH 076/107] fix: slow query desc --- source/client/src/slowQueryMonitor.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/client/src/slowQueryMonitor.c b/source/client/src/slowQueryMonitor.c index caa8fe1995..b41343443d 100644 --- a/source/client/src/slowQueryMonitor.c +++ b/source/client/src/slowQueryMonitor.c @@ -23,17 +23,17 @@ const int slowQueryLabelCount = 4; const char* slowQueryLabels[] = {"cluster_id", "username", "result", "duration"}; static const char* defaultClusterID = ""; -const int64_t msInSeconds = 1000; +const int64_t usInSeconds = 1000 * 1000; const int64_t msInMinutes = 60 * 1000; static const char* getSlowQueryLableCostDesc(int64_t cost) { - if (cost >= 1000 * msInSeconds) { + if (cost >= 1000 * usInSeconds) { return "1000s-"; - } else if (cost >= 100 * msInSeconds) { + } else if (cost >= 100 * usInSeconds) { return "100-1000s"; - } else if (cost >= 10 * msInSeconds) { + } else if (cost >= 10 * usInSeconds) { return "10-100s"; - } else if (cost >= 3 * msInSeconds) { + } else if (cost >= 3 * usInSeconds) { return "3-10s"; } return "0-3s"; From 37fd11adf264c3002ef5f32c199a2322d01fae5c Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 08:53:11 +0000 Subject: [PATCH 077/107] mnode role offline --- source/libs/monitor/src/monFramework.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 15793d07fb..cc0a846e3b 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -615,8 +615,27 @@ void monGenMnodeRoleTable(SMonInfo *pMonitor){ const char *sample_labels[] = {buf, mnode_id, pMnodeDesc->mnode_ep}; + bool dnodeIsOnline = false; + for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) { + SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); + + if(pDnodeDesc->dnode_id == pMnodeDesc->mnode_id){ + if(strcmp(pDnodeDesc->status, "ready") == 0){ + dnodeIsOnline = true; + } + } + } + metric = taosHashGet(tsMonitor.metrics, MNODE_ROLE, strlen(MNODE_ROLE)); - taos_gauge_set(*metric, pMnodeDesc->syncState, sample_labels); + + if(dnodeIsOnline){ + taos_gauge_set(*metric, pMnodeDesc->syncState, sample_labels); + } + else{ + taos_gauge_set(*metric, 0, sample_labels); + } + //metric = taosHashGet(tsMonitor.metrics, MNODE_ROLE, strlen(MNODE_ROLE)); + //taos_gauge_set(*metric, pMnodeDesc->syncState, sample_labels); } } From b9b14c4633b168262fed787bb1022e50e424e46b Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Thu, 22 Feb 2024 17:50:41 +0800 Subject: [PATCH 078/107] fix: monitor client config --- source/common/src/tglobal.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index f89cc1f4fa..72038957e0 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -538,6 +538,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { return -1; if (cfgAddBool(pCfg, "experimental", tsExperimental, CFG_SCOPE_BOTH, CFG_DYN_BOTH) != 0) return -1; + if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0) return -1; + if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 200000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1; return 0; } @@ -1088,6 +1090,8 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { tsQueryMaxConcurrentTables = cfgGetItem(pCfg, "queryMaxConcurrentTables")->i64; tsMetaCacheMaxSize = cfgGetItem(pCfg, "metaCacheMaxSize")->i32; tsSlowLogThreshold = cfgGetItem(pCfg, "slowLogThreshold")->i32; + tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval; + tsMonitorInterval = cfgGetItem(pCfg, "monitorInterval")->i32; if (taosSetSlowLogScope(cfgGetItem(pCfg, "slowLogScope")->str)) { return -1; } From eb670e12ee3e4562407328db29520f0bb5b5d480 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 11:39:57 +0000 Subject: [PATCH 079/107] first_ep --- source/libs/monitor/src/monMain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c index 6c2344826a..4ecc6f1261 100644 --- a/source/libs/monitor/src/monMain.c +++ b/source/libs/monitor/src/monMain.c @@ -273,7 +273,8 @@ static void monGenClusterJsonBasic(SMonInfo *pMonitor) { SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; - tjsonAddStringToObject(pMonitor->pJson, "first_ep", pInfo->first_ep); + //tjsonAddStringToObject(pMonitor->pJson, "first_ep", pInfo->first_ep); + tjsonAddStringToObject(pMonitor->pJson, "first_ep", tsFirst); tjsonAddDoubleToObject(pMonitor->pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id); tjsonAddStringToObject(pMonitor->pJson, "cluster_version", pInfo->version); //tjsonAddDoubleToObject(pMonitor->pJson, "monitor_interval", pInfo->monitor_interval); From c77fee12e03e10b9623b780139ec586e4655fe37 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 22 Feb 2024 12:07:28 +0000 Subject: [PATCH 080/107] mnode alive --- source/libs/monitor/src/monFramework.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index cc0a846e3b..06b4a3ee3b 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -273,9 +273,22 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ for (int32_t i = 0; i < taosArrayGetSize(pInfo->mnodes); ++i) { SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->mnodes, i); + + bool dnodeIsOnline = false; + for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) { + SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i); - if(pMnodeDesc->syncState != 0){ - mnode_alive++; + if(pDnodeDesc->dnode_id == pMnodeDesc->mnode_id){ + if(strcmp(pDnodeDesc->status, "ready") == 0){ + dnodeIsOnline = true; + } + } + } + + if(dnodeIsOnline){ + if(pMnodeDesc->syncState != 0){ + mnode_alive++; + } } } From e4fa6871004c80a928ac89b968bd0190686bb9a0 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 23 Feb 2024 14:36:38 +0800 Subject: [PATCH 081/107] enh: adjust code format in logging msg of mndTransSync --- source/dnode/mnode/impl/src/mndTrans.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 1adc4ed4bf..7c9ea69a02 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -751,8 +751,8 @@ static int32_t mndTransSync(SMnode *pMnode, STrans *pTrans) { pTrans->createdTime); int32_t code = mndSyncPropose(pMnode, pRaw, pTrans->id); if (code != 0) { - mError("trans:%d, failed to sync, errno:%s code:%s createTime:%" PRId64 " saved trans:%d", pTrans->id, terrstr(), - tstrerror(code), pTrans->createdTime, pMnode->syncMgmt.transId); + mError("trans:%d, failed to sync, errno:%s code:0x%x createTime:%" PRId64 " saved trans:%d", pTrans->id, terrstr(), + code, pTrans->createdTime, pMnode->syncMgmt.transId); sdbFreeRaw(pRaw); return -1; } From 7835cb9c4202b98ebc46ea96e582ef07808e754d Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 23 Feb 2024 16:09:16 +0800 Subject: [PATCH 082/107] fix: delete sql count --- source/client/src/clientEnv.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 448adce15a..6054bb6982 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -108,9 +108,10 @@ static void deregisterRequest(SRequestObj *pRequest) { atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); reqType = SLOW_LOG_TYPE_QUERY; sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPESELECT); - } else if (QUERY_NODE_DELETE_STMT == pRequest->stmtType) { - sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEDELETE); - } + } + } + if (QUERY_NODE_DELETE_STMT == pRequest->stmtType) { + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEDELETE); } if (duration >= (tsSlowLogThreshold * 1000000UL)) { From 3233f2dee03b0307f27e25efda664b8b67afa338 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Fri, 23 Feb 2024 17:02:41 +0800 Subject: [PATCH 083/107] fix: insert sql count --- source/client/src/clientEnv.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 6054bb6982..1df50a51da 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -98,7 +98,6 @@ static void deregisterRequest(SRequestObj *pRequest) { pRequest->metric.planCostUs, pRequest->metric.execCostUs); atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration); reqType = SLOW_LOG_TYPE_INSERT; - sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEINSERT); } else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) { tscDebug("query duration %" PRId64 "us: parseCost:%" PRId64 "us, ctgCost:%" PRId64 "us, analyseCost:%" PRId64 "us, planCost:%" PRId64 "us, exec:%" PRId64 "us", @@ -107,10 +106,14 @@ static void deregisterRequest(SRequestObj *pRequest) { atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); reqType = SLOW_LOG_TYPE_QUERY; - sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPESELECT); } } - if (QUERY_NODE_DELETE_STMT == pRequest->stmtType) { + + if (QUERY_NODE_VNODE_MODIFY_STMT == pRequest->stmtType || QUERY_NODE_INSERT_STMT == pRequest->stmtType) { + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEINSERT); + } else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) { + sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPESELECT); + } else if (QUERY_NODE_DELETE_STMT == pRequest->stmtType) { sqlReqLog(pTscObj->id, pRequest->killed, pRequest->code, MONITORSQLTYPEDELETE); } From a164e36b6ddd250fb5eb96f9700d178b9f8aa0ae Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 23 Feb 2024 10:24:00 +0000 Subject: [PATCH 084/107] add remove metric --- include/libs/monitorfw/taos_collector.h | 2 + .../libs/monitorfw/taos_collector_registry.h | 2 + source/libs/monitor/src/monFramework.c | 38 +++++++++------- source/libs/monitorfw/inc/taos_log.h | 4 +- source/libs/monitorfw/inc/taos_map_i.h | 2 + source/libs/monitorfw/src/taos_collector.c | 6 +++ .../monitorfw/src/taos_collector_registry.c | 19 +++++++- source/libs/monitorfw/src/taos_linked_list.c | 33 ++++++++++++++ source/libs/monitorfw/src/taos_map.c | 12 ++++- .../src/taos_metric_formatter_custom.c | 45 ++++++++++++++++--- 10 files changed, 138 insertions(+), 25 deletions(-) diff --git a/include/libs/monitorfw/taos_collector.h b/include/libs/monitorfw/taos_collector.h index 8fe304ed7d..c37cb612d2 100644 --- a/include/libs/monitorfw/taos_collector.h +++ b/include/libs/monitorfw/taos_collector.h @@ -76,6 +76,8 @@ int taos_collector_destroy_generic(void *gen); */ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric); +int taos_collector_remove_metric(taos_collector_t *self, const char* key); + taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name); /** diff --git a/include/libs/monitorfw/taos_collector_registry.h b/include/libs/monitorfw/taos_collector_registry.h index 063e8afb50..81d1f8050c 100644 --- a/include/libs/monitorfw/taos_collector_registry.h +++ b/include/libs/monitorfw/taos_collector_registry.h @@ -86,6 +86,8 @@ taos_metric_t *taos_collector_registry_must_register_metric(taos_metric_t *metri */ int taos_collector_registry_register_metric(taos_metric_t *metric); +int taos_collector_registry_deregister_metric(const char *key); + taos_metric_t *taos_collector_registry_get_metric(char* metric_name); /** diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 06b4a3ee3b..9a2857d442 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -120,17 +120,6 @@ void monInitMonitorFW(){ taosHashPut(tsMonitor.metrics, metric[i], strlen(metric[i]), &gauge, sizeof(taos_gauge_t *)); } - int32_t vgroup_label_count = 3; - const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; - char *vgroup_metrics[] = {TABLES_NUM, STATUS}; - for(int32_t i = 0; i < 2; i++){ - gauge= taos_gauge_new(vgroup_metrics[i], "", vgroup_label_count, vgroup_sample_labels); - if(taos_collector_registry_register_metric(gauge) == 1){ - taos_counter_destroy(gauge); - } - taosHashPut(tsMonitor.metrics, vgroup_metrics[i], strlen(vgroup_metrics[i]), &gauge, sizeof(taos_gauge_t *)); - } - int32_t dnodes_label_count = 3; const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, @@ -316,6 +305,27 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + int32_t vgroup_label_count = 3; + const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; + + if(taos_collector_registry_deregister_metric(TABLES_NUM) != 0){ + uError("failed to delete metric "TABLES_NUM); + } + + taos_gauge_t *tableNumGauge = taos_gauge_new(TABLES_NUM, "", vgroup_label_count, vgroup_sample_labels); + if(taos_collector_registry_register_metric(tableNumGauge) == 1){ + taos_counter_destroy(tableNumGauge); + } + + if(taos_collector_registry_deregister_metric(STATUS) != 0){ + uError("failed to delete metric "STATUS); + } + + taos_gauge_t *statusGauge = taos_gauge_new(STATUS, "", vgroup_label_count, vgroup_sample_labels); + if(taos_collector_registry_register_metric(statusGauge) == 1){ + taos_counter_destroy(statusGauge); + } + char cluster_id[TSDB_CLUSTER_ID_LEN] = {0}; snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); @@ -329,15 +339,13 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ taos_gauge_t **metric = NULL; - metric = taosHashGet(tsMonitor.metrics, TABLES_NUM, strlen(TABLES_NUM)); - taos_gauge_set(*metric, pVgroupDesc->tables_num, sample_labels); + taos_gauge_set(tableNumGauge, pVgroupDesc->tables_num, sample_labels); - metric = taosHashGet(tsMonitor.metrics, STATUS, strlen(STATUS)); int32_t status = 0; if(strcmp(pVgroupDesc->status, "ready") == 0){ status = 1; } - taos_gauge_set(*metric, status, sample_labels); + taos_gauge_set(statusGauge, status, sample_labels); } } diff --git a/source/libs/monitorfw/inc/taos_log.h b/source/libs/monitorfw/inc/taos_log.h index 6d6c9e1fb3..fecbda59e5 100644 --- a/source/libs/monitorfw/inc/taos_log.h +++ b/source/libs/monitorfw/inc/taos_log.h @@ -18,8 +18,10 @@ #ifndef TAOS_LOG_H #define TAOS_LOG_H +//#define TAOS_LOG_ENABLE + #ifdef TAOS_LOG_ENABLE -#define TAOS_LOG(msg) printf("%s %s %s %s %d %s\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__, msg); +#define TAOS_LOG(msg) printf("monitor_log %s %s %s %s %d %s\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__, msg); #else #define TAOS_LOG(msg) #endif // TAOS_LOG_ENABLE diff --git a/source/libs/monitorfw/inc/taos_map_i.h b/source/libs/monitorfw/inc/taos_map_i.h index 808548e96a..55f248b96a 100644 --- a/source/libs/monitorfw/inc/taos_map_i.h +++ b/source/libs/monitorfw/inc/taos_map_i.h @@ -24,6 +24,8 @@ int taos_map_set_free_value_fn(taos_map_t *self, taos_map_node_free_value_fn fre void *taos_map_get(taos_map_t *self, const char *key); +void *taos_map_get_withoutlock(taos_map_t *self, const char *key); + int taos_map_set(taos_map_t *self, const char *key, void *value); int taos_map_delete(taos_map_t *self, const char *key); diff --git a/source/libs/monitorfw/src/taos_collector.c b/source/libs/monitorfw/src/taos_collector.c index 997bf5587c..17d324462c 100644 --- a/source/libs/monitorfw/src/taos_collector.c +++ b/source/libs/monitorfw/src/taos_collector.c @@ -108,6 +108,12 @@ int taos_collector_add_metric(taos_collector_t *self, taos_metric_t *metric) { return taos_map_set(self->metrics, metric->name, metric); } +int taos_collector_remove_metric(taos_collector_t *self, const char* key){ + TAOS_ASSERT(self != NULL); + if (self == NULL) return 1; + return taos_map_delete(self->metrics, key); +} + taos_metric_t* taos_collector_get_metric(taos_collector_t *self, char *metric_name){ TAOS_ASSERT(self != NULL); if (self == NULL) return NULL; diff --git a/source/libs/monitorfw/src/taos_collector_registry.c b/source/libs/monitorfw/src/taos_collector_registry.c index acf2cb4248..55b08775b4 100644 --- a/source/libs/monitorfw/src/taos_collector_registry.c +++ b/source/libs/monitorfw/src/taos_collector_registry.c @@ -123,6 +123,19 @@ int taos_collector_registry_register_metric(taos_metric_t *metric) { return taos_collector_add_metric(default_collector, metric); } +int taos_collector_registry_deregister_metric(const char *key) { + TAOS_ASSERT(metric != NULL); + + taos_collector_t *default_collector = + (taos_collector_t *)taos_map_get(TAOS_COLLECTOR_REGISTRY_DEFAULT->collectors, "default"); + + if (default_collector == NULL) { + return 1; + } + + return taos_collector_remove_metric(default_collector, key); +} + taos_metric_t *taos_collector_registry_get_metric(char* metric_name){ TAOS_ASSERT(metric != NULL); @@ -232,7 +245,11 @@ const char *taos_collector_registry_bridge_new(taos_collector_registry_t *self, SJson* array = tjsonCreateArray(); tjsonAddItemToObject(item, "tables", array); - taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array); + if(taos_metric_formatter_load_metrics_new(self->metric_formatter, self->collectors, ts, format, array) != 0){ + TAOS_LOG("failed to load metrics"); + tjsonDelete(pJson); + return NULL; + } if(tjsonGetArraySize(array) == 0){ tjsonDelete(pJson); diff --git a/source/libs/monitorfw/src/taos_linked_list.c b/source/libs/monitorfw/src/taos_linked_list.c index ab4e23ff29..675400a6fa 100644 --- a/source/libs/monitorfw/src/taos_linked_list.c +++ b/source/libs/monitorfw/src/taos_linked_list.c @@ -147,9 +147,26 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { if (self == NULL) return 1; taos_linked_list_node_t *node; taos_linked_list_node_t *prev_node = NULL; +#ifdef TAOS_LOG_ENABLE + int32_t count = 0; + char tmp[200] = {0}; + + count = 0; + for (node = self->head; node != NULL; node = node->next) { + count++; + } + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif // Locate the node +#ifdef TAOS_LOG_ENABLE + count = 0; +#endif for (node = self->head; node != NULL; node = node->next) { +#ifdef TAOS_LOG_ENABLE + count++; +#endif if (self->compare_fn) { if ((*self->compare_fn)(node->item, item) == TAOS_EQUAL) { break; @@ -162,6 +179,11 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { prev_node = node; } +#ifdef TAOS_LOG_ENABLE + sprintf(tmp, "remove item:%d", count); + TAOS_LOG(tmp); +#endif + if (node == NULL) return 0; if (prev_node) { @@ -185,6 +207,17 @@ int taos_linked_list_remove(taos_linked_list_t *self, void *item) { taos_free(node); node = NULL; self->size--; + +#ifdef TAOS_LOG_ENABLE + count = 0; + for (node = self->head; node != NULL; node = node->next) { + count++; + } + + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif + return 0; } diff --git a/source/libs/monitorfw/src/taos_map.c b/source/libs/monitorfw/src/taos_map.c index fce308f11d..8f0b83884e 100644 --- a/source/libs/monitorfw/src/taos_map.c +++ b/source/libs/monitorfw/src/taos_map.c @@ -215,6 +215,14 @@ void *taos_map_get(taos_map_t *self, const char *key) { return payload; } +void *taos_map_get_withoutlock(taos_map_t *self, const char *key) { + TAOS_ASSERT(self != NULL); + int r = 0; + void *payload = + taos_map_get_internal(key, &self->size, &self->max_size, self->keys, self->addrs, self->free_value_fn); + return payload; +} + static int taos_map_set_internal(const char *key, void *value, size_t *size, size_t *max_size, taos_linked_list_t *keys, taos_linked_list_t **addrs, taos_map_node_free_value_fn free_value_fn, bool destroy_current_value) { @@ -368,10 +376,10 @@ static int taos_map_delete_internal(const char *key, size_t *size, size_t *max_s taos_map_node_t *current_map_node = (taos_map_node_t *)current_node->item; taos_linked_list_compare_t result = taos_linked_list_compare(list, current_map_node, temp_map_node); if (result == TAOS_EQUAL) { - r = taos_linked_list_remove(list, current_node); + r = taos_linked_list_remove(keys, (char*)current_map_node->key); if (r) return r; - r = taos_linked_list_remove(keys, (char *)current_map_node->key); + r = taos_linked_list_remove(list, current_node->item); if (r) return r; (*size)--; diff --git a/source/libs/monitorfw/src/taos_metric_formatter_custom.c b/source/libs/monitorfw/src/taos_metric_formatter_custom.c index d7650098e0..3b1318dfc0 100644 --- a/source/libs/monitorfw/src/taos_metric_formatter_custom.c +++ b/source/libs/monitorfw/src/taos_metric_formatter_custom.c @@ -23,6 +23,7 @@ #include "taos_assert.h" #include "tdef.h" #include "taos_collector_t.h" +#include "taos_log.h" int taos_metric_formatter_load_sample_new(taos_metric_formatter_t *self, taos_metric_sample_t *sample, char *ts, char *format, char *metricName, int32_t metric_type, @@ -207,18 +208,50 @@ int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_m //if(strcmp(collector->name, "custom") != 0 ){ + r = pthread_rwlock_wrlock(metrics->rwlock); + if (r) { + TAOS_LOG("failed to lock"); + return r; + } + +#ifdef TAOS_LOG_ENABLE + int32_t count = 0; +#endif for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; current_node = current_node->next) { +#ifdef TAOS_LOG_ENABLE + count++; +#endif const char *metric_name = (const char *)current_node->item; - taos_metric_t *metric = (taos_metric_t *)taos_map_get(metrics, metric_name); - if (metric == NULL) return 1; + taos_metric_t *metric = (taos_metric_t *)taos_map_get_withoutlock(metrics, metric_name); + if (metric == NULL) { +#ifdef TAOS_LOG_ENABLE + char tmp[200] = {0}; + sprintf(tmp, "fail to get metric(%d):%s", count, metric_name); + TAOS_LOG(tmp); +#endif + continue;; + } r = taos_metric_formatter_load_metric_new(self, metric, ts, format, tableArray); - if (r) return r; + if (r) { + TAOS_LOG("failed to load metric"); + continue; + } + } + +#ifdef TAOS_LOG_ENABLE + char tmp[20] = {0}; + sprintf(tmp, "list count:%d", count); + TAOS_LOG(tmp); +#endif + r = pthread_rwlock_unlock(metrics->rwlock); + if (r) { + TAOS_LOG("failed to unlock"); + return r; } - //} //else{ - + /* for (taos_linked_list_node_t *current_node = metrics->keys->head; current_node != NULL; current_node = current_node->next) { const char *metric_name = (const char *)current_node->item; @@ -227,7 +260,7 @@ int taos_metric_formatter_load_metrics_new(taos_metric_formatter_t *self, taos_m r = taos_metric_formatter_load_metric(self, metric, ts, format); if (r) return r; } - + */ //} } return r; From ddc0aba1d377ce1bc9a4f6773f7f53dcd98164f9 Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 23 Feb 2024 11:13:25 +0000 Subject: [PATCH 085/107] remove cluster metric --- source/libs/monitor/src/monFramework.c | 163 +++++++++++++++---------- 1 file changed, 96 insertions(+), 67 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 9a2857d442..3a5dca3e92 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -105,21 +105,6 @@ void monInitMonitorFW(){ tsMonitor.metrics = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); taos_gauge_t *gauge = NULL; - int32_t label_count =1; - const char *sample_labels[] = {"cluster_id"}; - char *metric[] = {MASTER_UPTIME, DBS_TOTAL, TBS_TOTAL, STBS_TOTAL, VGROUPS_TOTAL, - VGROUPS_ALIVE, VNODES_TOTAL, VNODES_ALIVE, MNODES_TOTAL, MNODES_ALIVE, - CONNECTIONS_TOTAL, TOPICS_TOTAL, STREAMS_TOTAL, - DNODES_TOTAL, DNODES_ALIVE, EXPIRE_TIME, TIMESERIES_USED, - TIMESERIES_TOTAL}; - for(int32_t i = 0; i < 18; i++){ - gauge= taos_gauge_new(metric[i], "", label_count, sample_labels); - if(taos_collector_registry_register_metric(gauge) == 1){ - taos_counter_destroy(gauge); - } - taosHashPut(tsMonitor.metrics, metric[i], strlen(metric[i]), &gauge, sizeof(taos_gauge_t *)); - } - int32_t dnodes_label_count = 3; const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, @@ -156,28 +141,6 @@ void monInitMonitorFW(){ } taosHashPut(tsMonitor.metrics, dnodes_log_gauges[i], strlen(dnodes_log_gauges[i]), &gauge, sizeof(taos_gauge_t *)); } - - int32_t mnodes_role_label_count = 3; - const char *mnodes_role_sample_labels[] = {"cluster_id", "mnode_id", "mnode_ep"}; - char *mnodes_role_gauges[] = {MNODE_ROLE}; - for(int32_t i = 0; i < 1; i++){ - gauge= taos_gauge_new(mnodes_role_gauges[i], "", mnodes_role_label_count, mnodes_role_sample_labels); - if(taos_collector_registry_register_metric(gauge) == 1){ - taos_counter_destroy(gauge); - } - taosHashPut(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); - } - - int32_t vnodes_role_label_count = 4; - const char *vnodes_role_sample_labels[] = {"cluster_id", "vgroup_id", "database_name", "dnode_id"}; - char *vnodes_role_gauges[] = {VNODE_ROLE}; - for(int32_t i = 0; i < 1; i++){ - gauge= taos_gauge_new(vnodes_role_gauges[i], "", vnodes_role_label_count, vnodes_role_sample_labels); - if(taos_collector_registry_register_metric(gauge) == 1){ - taos_counter_destroy(gauge); - } - taosHashPut(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); - } } void monCleanupMonitorFW(){ @@ -191,51 +154,77 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; SMonGrantInfo *pGrantInfo = &pMonitor->mmInfo.grant; + char *metric_names[] = {MASTER_UPTIME, DBS_TOTAL, TBS_TOTAL, STBS_TOTAL, VGROUPS_TOTAL, + VGROUPS_ALIVE, VNODES_TOTAL, VNODES_ALIVE, MNODES_TOTAL, MNODES_ALIVE, + CONNECTIONS_TOTAL, TOPICS_TOTAL, STREAMS_TOTAL, + DNODES_TOTAL, DNODES_ALIVE, EXPIRE_TIME, TIMESERIES_USED, + TIMESERIES_TOTAL}; + + for(int32_t i = 0; i < 18; i++){ + if(taos_collector_registry_deregister_metric(metric_names[i]) != 0){ + uError("failed to delete metric %s", metric_names[i]); + } + + taosHashRemove(tsMonitor.metrics, metric_names[i], strlen(metric_names[i])); + } + if(pBasicInfo->cluster_id == 0) { uError("failed to generate dnode info table since cluster_id is 0"); return; } if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; - //cluster info + //cluster info + taos_gauge_t *gauge = NULL; + int32_t label_count =1; + const char *sample_labels1[] = {"cluster_id"}; + + for(int32_t i = 0; i < 18; i++){ + gauge= taos_gauge_new(metric_names[i], "", label_count, sample_labels1); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, metric_names[i], strlen(metric_names[i]), &gauge, sizeof(taos_gauge_t *)); + } + char buf[TSDB_CLUSTER_ID_LEN] = {0}; snprintf(buf, TSDB_CLUSTER_ID_LEN, "%"PRId64, pBasicInfo->cluster_id); - const char *sample_labels[] = {buf}; + const char *sample_label_values[] = {buf}; taos_gauge_t **metric = NULL; metric = taosHashGet(tsMonitor.metrics, MASTER_UPTIME, strlen(MASTER_UPTIME)); - taos_gauge_set(*metric, pInfo->master_uptime, sample_labels); + taos_gauge_set(*metric, pInfo->master_uptime, sample_label_values); metric = taosHashGet(tsMonitor.metrics, DBS_TOTAL, strlen(DBS_TOTAL)); - taos_gauge_set(*metric, pInfo->dbs_total, sample_labels); + taos_gauge_set(*metric, pInfo->dbs_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, TBS_TOTAL, strlen(TBS_TOTAL)); - taos_gauge_set(*metric, pInfo->tbs_total, sample_labels); + taos_gauge_set(*metric, pInfo->tbs_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, STBS_TOTAL, strlen(STBS_TOTAL)); - taos_gauge_set(*metric, pInfo->stbs_total, sample_labels); + taos_gauge_set(*metric, pInfo->stbs_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, VGROUPS_TOTAL, strlen(VGROUPS_TOTAL)); - taos_gauge_set(*metric, pInfo->vgroups_total, sample_labels); + taos_gauge_set(*metric, pInfo->vgroups_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, VGROUPS_ALIVE, strlen(VGROUPS_ALIVE)); - taos_gauge_set(*metric, pInfo->vgroups_alive, sample_labels); + taos_gauge_set(*metric, pInfo->vgroups_alive, sample_label_values); metric = taosHashGet(tsMonitor.metrics, VNODES_TOTAL, strlen(VNODES_TOTAL)); - taos_gauge_set(*metric, pInfo->vnodes_total, sample_labels); + taos_gauge_set(*metric, pInfo->vnodes_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, VNODES_ALIVE, strlen(VNODES_ALIVE)); - taos_gauge_set(*metric, pInfo->vnodes_alive, sample_labels); + taos_gauge_set(*metric, pInfo->vnodes_alive, sample_label_values); metric = taosHashGet(tsMonitor.metrics, CONNECTIONS_TOTAL, strlen(CONNECTIONS_TOTAL)); - taos_gauge_set(*metric, pInfo->connections_total, sample_labels); + taos_gauge_set(*metric, pInfo->connections_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, TOPICS_TOTAL, strlen(TOPICS_TOTAL)); - taos_gauge_set(*metric, pInfo->topics_toal, sample_labels); + taos_gauge_set(*metric, pInfo->topics_toal, sample_label_values); metric = taosHashGet(tsMonitor.metrics, STREAMS_TOTAL, strlen(STREAMS_TOTAL)); - taos_gauge_set(*metric, pInfo->streams_total, sample_labels); + taos_gauge_set(*metric, pInfo->streams_total, sample_label_values); //dnodes number int32_t dnode_total = taosArrayGetSize(pInfo->dnodes); @@ -250,10 +239,10 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ } metric = taosHashGet(tsMonitor.metrics, DNODES_TOTAL, strlen(DNODES_TOTAL)); - taos_gauge_set(*metric, dnode_total, sample_labels); + taos_gauge_set(*metric, dnode_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, DNODES_ALIVE, strlen(DNODES_ALIVE)); - taos_gauge_set(*metric, dnode_alive, sample_labels); + taos_gauge_set(*metric, dnode_alive, sample_label_values); //mnodes number int32_t mnode_total = taosArrayGetSize(pInfo->mnodes); @@ -282,23 +271,31 @@ void monGenClusterInfoTable(SMonInfo *pMonitor){ } metric = taosHashGet(tsMonitor.metrics, MNODES_TOTAL, strlen(MNODES_TOTAL)); - taos_gauge_set(*metric, mnode_total, sample_labels); + taos_gauge_set(*metric, mnode_total, sample_label_values); metric = taosHashGet(tsMonitor.metrics, MNODES_ALIVE, strlen(MNODES_ALIVE)); - taos_gauge_set(*metric, mnode_alive, sample_labels); + taos_gauge_set(*metric, mnode_alive, sample_label_values); //grant info metric = taosHashGet(tsMonitor.metrics, EXPIRE_TIME, strlen(EXPIRE_TIME)); - taos_gauge_set(*metric, pGrantInfo->expire_time, sample_labels); + taos_gauge_set(*metric, pGrantInfo->expire_time, sample_label_values); metric = taosHashGet(tsMonitor.metrics, TIMESERIES_USED, strlen(TIMESERIES_USED)); - taos_gauge_set(*metric, pGrantInfo->timeseries_used, sample_labels); + taos_gauge_set(*metric, pGrantInfo->timeseries_used, sample_label_values); metric = taosHashGet(tsMonitor.metrics, TIMESERIES_TOTAL, strlen(TIMESERIES_TOTAL)); - taos_gauge_set(*metric, pGrantInfo->timeseries_total, sample_labels); + taos_gauge_set(*metric, pGrantInfo->timeseries_total, sample_label_values); } void monGenVgroupInfoTable(SMonInfo *pMonitor){ + if(taos_collector_registry_deregister_metric(TABLES_NUM) != 0){ + uError("failed to delete metric "TABLES_NUM); + } + + if(taos_collector_registry_deregister_metric(STATUS) != 0){ + uError("failed to delete metric "STATUS); + } + if(pMonitor->dmInfo.basic.cluster_id == 0) return; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; @@ -307,20 +304,10 @@ void monGenVgroupInfoTable(SMonInfo *pMonitor){ int32_t vgroup_label_count = 3; const char *vgroup_sample_labels[] = {"cluster_id", "vgroup_id", "database_name"}; - - if(taos_collector_registry_deregister_metric(TABLES_NUM) != 0){ - uError("failed to delete metric "TABLES_NUM); - } - taos_gauge_t *tableNumGauge = taos_gauge_new(TABLES_NUM, "", vgroup_label_count, vgroup_sample_labels); if(taos_collector_registry_register_metric(tableNumGauge) == 1){ taos_counter_destroy(tableNumGauge); } - - if(taos_collector_registry_deregister_metric(STATUS) != 0){ - uError("failed to delete metric "STATUS); - } - taos_gauge_t *statusGauge = taos_gauge_new(STATUS, "", vgroup_label_count, vgroup_sample_labels); if(taos_collector_registry_register_metric(statusGauge) == 1){ taos_counter_destroy(statusGauge); @@ -617,11 +604,32 @@ void monGenLogDiskTable(SMonInfo *pMonitor){ } void monGenMnodeRoleTable(SMonInfo *pMonitor){ + char *mnodes_role_gauges[] = {MNODE_ROLE}; + + for(int32_t i = 0; i < 1; i++){ + if(taos_collector_registry_deregister_metric(mnodes_role_gauges[i]) != 0){ + uError("failed to delete metric %s", mnodes_role_gauges[i]); + } + + taosHashRemove(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i])); + } + SMonClusterInfo *pInfo = &pMonitor->mmInfo.cluster; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; if(pBasicInfo->cluster_id == 0) return; + taos_gauge_t *gauge = NULL; + int32_t mnodes_role_label_count = 3; + const char *mnodes_role_sample_labels[] = {"cluster_id", "mnode_id", "mnode_ep"}; + for(int32_t i = 0; i < 1; i++){ + gauge= taos_gauge_new(mnodes_role_gauges[i], "", mnodes_role_label_count, mnodes_role_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, mnodes_role_gauges[i], strlen(mnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + char buf[TSDB_CLUSTER_ID_LEN] = {0}; snprintf(buf, TSDB_CLUSTER_ID_LEN, "%" PRId64, pBasicInfo->cluster_id); @@ -661,12 +669,33 @@ void monGenMnodeRoleTable(SMonInfo *pMonitor){ } void monGenVnodeRoleTable(SMonInfo *pMonitor){ + char *vnodes_role_gauges[] = {VNODE_ROLE}; + taos_gauge_t *gauge = NULL; + + for(int32_t i = 0; i < 1; i++){ + if(taos_collector_registry_deregister_metric(vnodes_role_gauges[i]) != 0){ + uError("failed to delete metric %s", vnodes_role_gauges[i]); + } + + taosHashRemove(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i])); + } + SMonVgroupInfo *pInfo = &pMonitor->mmInfo.vgroup; if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; SMonBasicInfo *pBasicInfo = &pMonitor->dmInfo.basic; if(pBasicInfo->cluster_id == 0) return; + int32_t vnodes_role_label_count = 4; + const char *vnodes_role_sample_labels[] = {"cluster_id", "vgroup_id", "database_name", "dnode_id"}; + for(int32_t i = 0; i < 1; i++){ + gauge= taos_gauge_new(vnodes_role_gauges[i], "", vnodes_role_label_count, vnodes_role_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + taosHashPut(tsMonitor.metrics, vnodes_role_gauges[i], strlen(vnodes_role_gauges[i]), &gauge, sizeof(taos_gauge_t *)); + } + char buf[TSDB_CLUSTER_ID_LEN] = {0}; snprintf(buf, TSDB_CLUSTER_ID_LEN, "%" PRId64, pBasicInfo->cluster_id); From ace5983fae48e4e64b8ce6c09c67ff5ddb261fe3 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sat, 24 Feb 2024 07:04:32 +0000 Subject: [PATCH 086/107] remove dnodes status --- source/libs/monitor/src/monFramework.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/source/libs/monitor/src/monFramework.c b/source/libs/monitor/src/monFramework.c index 3a5dca3e92..d58cee7b9a 100644 --- a/source/libs/monitor/src/monFramework.c +++ b/source/libs/monitor/src/monFramework.c @@ -110,9 +110,9 @@ void monInitMonitorFW(){ char *dnodes_gauges[] = {UPTIME, CPU_ENGINE, CPU_SYSTEM, CPU_CORE, MEM_ENGINE, MEM_SYSTEM, MEM_TOTAL, DISK_ENGINE, DISK_USED, DISK_TOTAL, NET_IN, NET_OUT, IO_READ, IO_WRITE, IO_READ_DISK, IO_WRITE_DISK, /*ERRORS,*/ - VNODES_NUM, MASTERS, HAS_MNODE, HAS_QNODE, HAS_SNODE, DNODE_STATUS, + VNODES_NUM, MASTERS, HAS_MNODE, HAS_QNODE, HAS_SNODE, DNODE_LOG_ERROR, DNODE_LOG_INFO, DNODE_LOG_DEBUG, DNODE_LOG_TRACE}; - for(int32_t i = 0; i < 26; i++){ + for(int32_t i = 0; i < 25; i++){ gauge= taos_gauge_new(dnodes_gauges[i], "", dnodes_label_count, dnodes_sample_labels); if(taos_collector_registry_register_metric(gauge) == 1){ taos_counter_destroy(gauge); @@ -502,16 +502,29 @@ void monGenDnodeInfoTable(SMonInfo *pMonitor) { } void monGenDnodeStatusInfoTable(SMonInfo *pMonitor){ + if(taos_collector_registry_deregister_metric(DNODE_STATUS) != 0){ + uError("failed to delete metric "DNODE_STATUS); + } + if(pMonitor->dmInfo.basic.cluster_id == 0) { uError("failed to generate dnode info table since cluster_id is 0"); return; } if (pMonitor->mmInfo.cluster.first_ep_dnode_id == 0) return; + taos_gauge_t *gauge = NULL; + + int32_t dnodes_label_count = 3; + const char *dnodes_sample_labels[] = {"cluster_id", "dnode_id", "dnode_ep"}; + + gauge= taos_gauge_new(DNODE_STATUS, "", dnodes_label_count, dnodes_sample_labels); + if(taos_collector_registry_register_metric(gauge) == 1){ + taos_counter_destroy(gauge); + } + char cluster_id[TSDB_CLUSTER_ID_LEN]; snprintf(cluster_id, TSDB_CLUSTER_ID_LEN, "%"PRId64, pMonitor->dmInfo.basic.cluster_id); - - taos_gauge_t **metric = NULL; + //dnodes status SMonClusterInfo *pClusterInfo = &pMonitor->mmInfo.cluster; @@ -524,13 +537,11 @@ void monGenDnodeStatusInfoTable(SMonInfo *pMonitor){ const char *sample_labels[] = {cluster_id, dnode_id, pDnodeDesc->dnode_ep}; - metric = taosHashGet(tsMonitor.metrics, DNODE_STATUS, strlen(DNODE_STATUS)); - int32_t status = 0; if(strcmp(pDnodeDesc->status, "ready") == 0){ status = 1; } - taos_gauge_set(*metric, status, sample_labels); + taos_gauge_set(gauge, status, sample_labels); } } From 2df6ae111617df634819e20a542136aa4037d5da Mon Sep 17 00:00:00 2001 From: dmchen Date: Sat, 24 Feb 2024 09:48:28 +0000 Subject: [PATCH 087/107] first net_in net_out --- source/os/src/osSysinfo.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index fea7a4f63d..fad5da3f79 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -905,8 +905,15 @@ void taosGetCardInfoDelta(int64_t *receive_bytes, int64_t *transmit_bytes) { int64_t cur_receive_bytes = 0; int64_t cur_transmit_bytes = 0; if (taosGetCardInfo(&cur_receive_bytes, &cur_transmit_bytes) == 0) { - *receive_bytes = cur_receive_bytes - last_receive_bytes; - *transmit_bytes = cur_transmit_bytes - last_transmit_bytes; + if(last_receive_bytes > 0 && last_receive_bytes > 0){ + *receive_bytes = cur_receive_bytes - last_receive_bytes; + *transmit_bytes = cur_transmit_bytes - last_transmit_bytes; + } + else{ + *receive_bytes = 0; + *transmit_bytes = 0; + } + last_receive_bytes = cur_receive_bytes; last_transmit_bytes = cur_transmit_bytes; } else { From 917edde91fca2220a2a73ae50e5dd82d57be7233 Mon Sep 17 00:00:00 2001 From: kailixu Date: Sat, 24 Feb 2024 22:25:30 +0800 Subject: [PATCH 088/107] user sysinfo --- source/common/src/systable.c | 50 +++++++++++++------------- source/libs/parser/src/parTranslater.c | 4 --- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 47eac317ec..ff1eeba0a2 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -223,12 +223,12 @@ static const SSysDbTableSchema userTblDistSchema[] = { }; static const SSysDbTableSchema userUsersSchema[] = { - {.name = "name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "super", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = false}, - {.name = "enable", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = false}, - {.name = "sysinfo", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = false}, - {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false}, - {.name = "allowed_host", .bytes = TSDB_PRIVILEDGE_HOST_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "super", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, + {.name = "enable", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, + {.name = "sysinfo", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, + {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = true}, + {.name = "allowed_host", .bytes = TSDB_PRIVILEDGE_HOST_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; GRANTS_SCHEMA; @@ -304,7 +304,7 @@ static const SSysDbTableSchema subscriptionSchema[] = { static const SSysDbTableSchema vnodesSchema[] = { {.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY, .sysInfo = false}, + {.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_BINARY, .sysInfo = true}, {.name = "status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "role_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = true}, {.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = true}, @@ -312,12 +312,12 @@ static const SSysDbTableSchema vnodesSchema[] = { }; static const SSysDbTableSchema userUserPrivilegesSchema[] = { - {.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "db_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "table_name", .bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "condition", .bytes = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "notes", .bytes = 64 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "db_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "table_name", .bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "condition", .bytes = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "notes", .bytes = 64 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; static const SSysDbTableSchema userViewsSchema[] = { @@ -349,21 +349,21 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = { }; static const SSysDbTableSchema useGrantsFullSchema[] = { - {.name = "grant_name", .bytes = 32 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "display_name", .bytes = 256 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "expire", .bytes = 32 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "limits", .bytes = 512 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "grant_name", .bytes = 32 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "display_name", .bytes = 256 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "expire", .bytes = 32 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "limits", .bytes = 512 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; static const SSysDbTableSchema useGrantsLogsSchema[] = { - {.name = "state", .bytes = 1536 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "active", .bytes = 512 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "machine", .bytes = TSDB_GRANT_LOG_COL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "state", .bytes = 1536 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "active", .bytes = 512 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "machine", .bytes = TSDB_GRANT_LOG_COL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; static const SSysDbTableSchema useMachinesSchema[] = { - {.name = "id", .bytes = TSDB_CLUSTER_ID_LEN + 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, - {.name = "machine", .bytes = 7552 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "id", .bytes = TSDB_CLUSTER_ID_LEN + 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "machine", .bytes = 7552 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; static const SSysTableMeta infosMeta[] = { @@ -395,9 +395,9 @@ static const SSysTableMeta infosMeta[] = { {TSDB_INS_TABLE_VIEWS, userViewsSchema, tListLen(userViewsSchema), false}, {TSDB_INS_TABLE_COMPACTS, userCompactsSchema, tListLen(userCompactsSchema), false}, {TSDB_INS_TABLE_COMPACT_DETAILS, userCompactsDetailSchema, tListLen(userCompactsDetailSchema), false}, - {TSDB_INS_TABLE_GRANTS_FULL, useGrantsFullSchema, tListLen(useGrantsFullSchema), false}, - {TSDB_INS_TABLE_GRANTS_LOGS, useGrantsLogsSchema, tListLen(useGrantsLogsSchema), false}, - {TSDB_INS_TABLE_MACHINES, useMachinesSchema, tListLen(useMachinesSchema), false}, + {TSDB_INS_TABLE_GRANTS_FULL, useGrantsFullSchema, tListLen(useGrantsFullSchema), true}, + {TSDB_INS_TABLE_GRANTS_LOGS, useGrantsLogsSchema, tListLen(useGrantsLogsSchema), true}, + {TSDB_INS_TABLE_MACHINES, useMachinesSchema, tListLen(useMachinesSchema), true}, }; static const SSysDbTableSchema connectionsSchema[] = { diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index cea82ef3fb..c94cf3f174 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -399,10 +399,6 @@ static int32_t getViewMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCac int32_t getTargetMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta, bool couldBeView) { int32_t code = TSDB_CODE_SUCCESS; - if (!pParCxt->enableSysInfo && IS_SYS_DBNAME(pName->dbname)) { - code = TSDB_CODE_PAR_PERMISSION_DENIED; - return code; - } if (pParCxt->async) { code = getTableMetaFromCache(pMetaCache, pName, pMeta); #ifdef TD_ENTERPRISE From d4ef374108a27d1bd3da28ef13310767f9f8a54e Mon Sep 17 00:00:00 2001 From: kailixu Date: Sat, 24 Feb 2024 22:48:28 +0800 Subject: [PATCH 089/107] user sysinfo --- include/common/tgrant.h | 40 ++++++++++---------- tests/script/tsim/user/privilege_sysinfo.sim | 6 +++ 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/include/common/tgrant.h b/include/common/tgrant.h index 6d11608d21..ca9e030117 100644 --- a/include/common/tgrant.h +++ b/include/common/tgrant.h @@ -67,28 +67,28 @@ int32_t grantCheckLE(EGrantType grant); // #ifndef GRANTS_CFG #ifdef TD_ENTERPRISE -#define GRANTS_SCHEMA \ - static const SSysDbTableSchema grantsSchema[] = { \ - {.name = "version", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "expire_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "service_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "expired", .bytes = 5 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "state", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "timeseries", .bytes = 21 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "dnodes", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "cpu_cores", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ +#define GRANTS_SCHEMA \ + static const SSysDbTableSchema grantsSchema[] = { \ + {.name = "version", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "expire_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "service_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "expired", .bytes = 5 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "state", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "timeseries", .bytes = 21 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "dnodes", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "cpu_cores", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ } #else -#define GRANTS_SCHEMA \ - static const SSysDbTableSchema grantsSchema[] = { \ - {.name = "version", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "expire_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "service_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "expired", .bytes = 5 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "state", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "timeseries", .bytes = 21 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "dnodes", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ - {.name = "cpu_cores", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, \ +#define GRANTS_SCHEMA \ + static const SSysDbTableSchema grantsSchema[] = { \ + {.name = "version", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "expire_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "service_time", .bytes = 19 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "expired", .bytes = 5 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "state", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "timeseries", .bytes = 21 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "dnodes", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ + {.name = "cpu_cores", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, \ } #endif // #define GRANT_CFG_ADD diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index 567d963c86..40098504ae 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -129,6 +129,9 @@ sql show topics sql show subscriptions sql show functions sql_error show grants +sql_error show grants full; +sql_error show grants logs; +sql_error show cluster machines; sql show queries sql show connections sql show apps @@ -166,6 +169,9 @@ sql select * from information_schema.ins_topics sql select * from information_schema.ins_subscriptions sql select * from information_schema.ins_streams sql_error select * from information_schema.ins_grants +sql_error select * from information_schema.ins_grants_full +sql_error select * from information_schema.ins_grants_logs +sql_error select * from information_schema.ins_machines sql_error select * from information_schema.ins_vgroups sql select * from information_schema.ins_configs sql_error select * from information_schema.ins_dnode_variables From a38a69557a52ea8c5056d19650cea4b59cd29c5f Mon Sep 17 00:00:00 2001 From: kailixu Date: Sat, 24 Feb 2024 23:05:39 +0800 Subject: [PATCH 090/107] user sysinfo --- source/libs/parser/src/parAuthenticator.c | 2 ++ source/libs/parser/src/parTranslater.c | 1 + tests/script/tsim/user/privilege_sysinfo.sim | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index c2cd4786db..3703c27c66 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -349,6 +349,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: case QUERY_NODE_SHOW_VNODES_STMT: case QUERY_NODE_SHOW_SCORES_STMT: + case QUERY_NODE_SHOW_USERS_STMT: + case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: case QUERY_NODE_SHOW_GRANTS_FULL_STMT: case QUERY_NODE_SHOW_GRANTS_LOGS_STMT: case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT: diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c94cf3f174..c30cc88f67 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -399,6 +399,7 @@ static int32_t getViewMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCac int32_t getTargetMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta, bool couldBeView) { int32_t code = TSDB_CODE_SUCCESS; + if (pParCxt->async) { code = getTableMetaFromCache(pMetaCache, pName, pMeta); #ifdef TD_ENTERPRISE diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index 40098504ae..135e05c3b3 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -101,6 +101,7 @@ sql select * from d2.ntb2 print =============== check show sql_error show users +sql_error show user privileges sql_error show cluster sql_error select * from information_schema.ins_dnodes sql_error select * from information_schema.ins_mnodes @@ -158,7 +159,7 @@ sql_error select * from information_schema.ins_modules sql_error select * from information_schema.ins_qnodes sql_error select * from information_schema.ins_cluster sql_error select * from information_schema.ins_users -sql_error select * from information_schema.ins_user_privilege +sql_error select * from information_schema.ins_user_privileges sql select * from information_schema.ins_databases sql select * from information_schema.ins_functions sql select * from information_schema.ins_indexes From 8ad1ed885192efa4b91f9826fc49c96dba9f907c Mon Sep 17 00:00:00 2001 From: kailixu Date: Sat, 24 Feb 2024 23:08:01 +0800 Subject: [PATCH 091/107] user sysinfo --- source/libs/parser/src/parTranslater.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c30cc88f67..abe50a27da 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -399,7 +399,7 @@ static int32_t getViewMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCac int32_t getTargetMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta, bool couldBeView) { int32_t code = TSDB_CODE_SUCCESS; - + if (pParCxt->async) { code = getTableMetaFromCache(pMetaCache, pName, pMeta); #ifdef TD_ENTERPRISE From 41a79866b123cf022cedda34c262a12957ce8cb1 Mon Sep 17 00:00:00 2001 From: kailixu Date: Sun, 25 Feb 2024 10:23:05 +0800 Subject: [PATCH 092/107] test: check user sysinfo during alter repeatedly --- source/common/src/systable.c | 2 +- source/libs/parser/src/parAuthenticator.c | 1 + tests/script/tsim/user/privilege_sysinfo.sim | 123 ++++++++++++++++++- 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index ff1eeba0a2..25cc5d7c79 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -276,7 +276,7 @@ static const SSysDbTableSchema configSchema[] = { }; static const SSysDbTableSchema variablesSchema[] = { - {.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, + {.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "name", .bytes = TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "value", .bytes = TSDB_CONFIG_VALUE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "scope", .bytes = TSDB_CONFIG_SCOPE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index 3703c27c66..4f523bf4f2 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -347,6 +347,7 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT: case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: + case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT: case QUERY_NODE_SHOW_VNODES_STMT: case QUERY_NODE_SHOW_SCORES_STMT: case QUERY_NODE_SHOW_USERS_STMT: diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index 135e05c3b3..ebdd42e1a8 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -99,7 +99,11 @@ sql select * from d2.stb2 sql select * from d2.ctb2 sql select * from d2.ntb2 -print =============== check show +$loop_cnt = 0 +$loop_flag = 0 + +loop_check_sysinfo_0: +print =============== check show of sysinfo 0 sql_error show users sql_error show user privileges sql_error show cluster @@ -146,7 +150,7 @@ sql_error show dnode 1 variables; sql show variables; -print =============== check information_schema +print =============== check information_schema of sysinfo 0 sql show databases if $rows != 3 then return -1 @@ -177,7 +181,7 @@ sql_error select * from information_schema.ins_vgroups sql select * from information_schema.ins_configs sql_error select * from information_schema.ins_dnode_variables -print =============== check performance_schema +print =============== check performance_schema of sysinfo 0 sql use performance_schema; sql select * from performance_schema.perf_connections sql select * from performance_schema.perf_queries @@ -185,4 +189,115 @@ sql select * from performance_schema.perf_consumers sql select * from performance_schema.perf_trans sql select * from performance_schema.perf_apps -#system sh/exec.sh -n dnode1 -s stop -x SIGINT +goto loop_check_switch + +loop_check_sysinfo_1: +print =============== check show of sysinfo 1 +sql show users +sql show user privileges +sql show cluster +sql select * from information_schema.ins_dnodes +sql select * from information_schema.ins_mnodes +sql show snodes +sql select * from information_schema.ins_qnodes +sql show dnodes +sql show snodes +sql show qnodes +sql show mnodes +sql show db.vgroups +sql_error show db.stables +sql_error show db.tables +sql show indexes from stb from db +sql show databases +sql show d2.vgroups +sql show d2.stables +sql show d2.tables +sql show indexes from stb2 from d2 +#sql_error show create database db +sql_error show create table db.stb; +sql_error show create table db.ctb; +sql_error show create table db.ntb; +sql show streams +sql show consumers +sql show topics +sql show subscriptions +sql show functions +sql show grants +sql show grants full; +sql show grants logs; +sql show cluster machines; +sql show queries +sql show connections +sql show apps +sql show transactions +sql show create database d2 +sql show create table d2.stb2; +sql show create table d2.ctb2; +sql show create table d2.ntb2; +sql show local variables; +sql_error show dnode 1 variables; +sql show variables; + + +print =============== check information_schema of sysinfo 1 +sql show databases +if $rows != 3 then + return -1 +endi + +sql use information_schema; +sql select * from information_schema.ins_dnodes +sql select * from information_schema.ins_mnodes +sql_error select * from information_schema.ins_modules +sql select * from information_schema.ins_qnodes +sql select * from information_schema.ins_cluster +sql select * from information_schema.ins_users +sql select * from information_schema.ins_user_privileges +sql select * from information_schema.ins_databases +sql select * from information_schema.ins_functions +sql select * from information_schema.ins_indexes +sql select * from information_schema.ins_stables +sql select * from information_schema.ins_tables +sql select * from information_schema.ins_tags +sql select * from information_schema.ins_topics +sql select * from information_schema.ins_subscriptions +sql select * from information_schema.ins_streams +sql select * from information_schema.ins_grants +sql select * from information_schema.ins_grants_full +sql select * from information_schema.ins_grants_logs +sql select * from information_schema.ins_machines +sql select * from information_schema.ins_vgroups +sql select * from information_schema.ins_configs +sql_error select * from information_schema.ins_dnode_variables + +print =============== check performance_schema of sysinfo 1 +sql use performance_schema; +sql select * from performance_schema.perf_connections +sql select * from performance_schema.perf_queries +sql select * from performance_schema.perf_consumers +sql select * from performance_schema.perf_trans +sql select * from performance_schema.perf_apps + +loop_check_switch: +if $loop_cnt > 5 then + goto loop_check_end +endi +$loop_cnt = $loop_cnt + 1 + +if $loop_flag == 0 then + system taos -P7100 -s 'alter user sysinfo0 sysinfo 1' + sleep 2000 + $loop_flag = 1 + goto loop_check_sysinfo_1 +else + system taos -P7100 -s 'alter user sysinfo0 sysinfo 0' + sleep 2000 + $loop_flag = 0 + goto loop_check_sysinfo_0 +endi +goto loop_check_sysinfo_0 + +loop_check_end: +print =============== check end + +#system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file From c4b42dbbff701f320640742642ad00b8bbad5796 Mon Sep 17 00:00:00 2001 From: kailixu Date: Sun, 25 Feb 2024 10:34:49 +0800 Subject: [PATCH 093/107] test: check user sysinfo during alter repeatedly --- tests/script/tsim/user/privilege_sysinfo.sim | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index ebdd42e1a8..625b1ec04c 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -99,7 +99,8 @@ sql select * from d2.stb2 sql select * from d2.ctb2 sql select * from d2.ntb2 -$loop_cnt = 0 +$loop_cnt = 5 +$loop_idx = 0 $loop_flag = 0 loop_check_sysinfo_0: @@ -279,19 +280,19 @@ sql select * from performance_schema.perf_trans sql select * from performance_schema.perf_apps loop_check_switch: -if $loop_cnt > 5 then +if $loop_idx > $loop_cnt then goto loop_check_end endi -$loop_cnt = $loop_cnt + 1 +$loop_idx = $loop_idx + 1 if $loop_flag == 0 then system taos -P7100 -s 'alter user sysinfo0 sysinfo 1' - sleep 2000 + sleep 3000 $loop_flag = 1 goto loop_check_sysinfo_1 else system taos -P7100 -s 'alter user sysinfo0 sysinfo 0' - sleep 2000 + sleep 3000 $loop_flag = 0 goto loop_check_sysinfo_0 endi From e27138e4135ec52758e9c83d098249e466f2f743 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sun, 25 Feb 2024 03:45:30 +0000 Subject: [PATCH 094/107] first statis --- source/os/src/osSysinfo.c | 54 ++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index fad5da3f79..173bb982db 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -563,9 +563,9 @@ int32_t taosGetCpuCores(float *numOfCores, bool physical) { } void taosGetCpuUsage(double *cpu_system, double *cpu_engine) { - static int64_t lastSysUsed = 0; - static int64_t lastSysTotal = 0; - static int64_t lastProcTotal = 0; + static int64_t lastSysUsed = -1; + static int64_t lastSysTotal = -1; + static int64_t lastProcTotal = -1; static int64_t curSysUsed = 0; static int64_t curSysTotal = 0; static int64_t curProcTotal = 0; @@ -580,14 +580,20 @@ void taosGetCpuUsage(double *cpu_system, double *cpu_engine) { curSysTotal = curSysUsed + sysCpu.idle; curProcTotal = procCpu.utime + procCpu.stime + procCpu.cutime + procCpu.cstime; - if (curSysTotal - lastSysTotal > 0 && curSysUsed >= lastSysUsed && curProcTotal >= lastProcTotal) { - if (cpu_system != NULL) { - *cpu_system = (curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100; - } - if (cpu_engine != NULL) { - *cpu_engine = (curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100; + if(lastSysUsed >= 0 && lastSysTotal >=0 && lastProcTotal >=0){ + if (curSysTotal - lastSysTotal > 0 && curSysUsed >= lastSysUsed && curProcTotal >= lastProcTotal) { + if (cpu_system != NULL) { + *cpu_system = (curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100; + } + if (cpu_engine != NULL) { + *cpu_engine = (curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100; + } } } + else{ + *cpu_system = 0; + *cpu_engine = 0; + } lastSysUsed = curSysUsed; lastSysTotal = curSysTotal; @@ -821,19 +827,27 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int } void taosGetProcIODelta(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int64_t *write_bytes) { - static int64_t last_rchars = 0; - static int64_t last_wchars = 0; - static int64_t last_read_bytes = 0; - static int64_t last_write_bytes = 0; + static int64_t last_rchars = -1; + static int64_t last_wchars = -1; + static int64_t last_read_bytes = -1; + static int64_t last_write_bytes = -1; static int64_t cur_rchars = 0; static int64_t cur_wchars = 0; static int64_t cur_read_bytes = 0; static int64_t cur_write_bytes = 0; if (taosGetProcIO(&cur_rchars, &cur_wchars, &cur_read_bytes, &cur_write_bytes) == 0) { - *rchars = cur_rchars - last_rchars; - *wchars = cur_wchars - last_wchars; - *read_bytes = cur_read_bytes - last_read_bytes; - *write_bytes = cur_write_bytes - last_write_bytes; + if(last_rchars >=0 && last_wchars >=0 && last_read_bytes >=0 && last_write_bytes >= 0){ + *rchars = cur_rchars - last_rchars; + *wchars = cur_wchars - last_wchars; + *read_bytes = cur_read_bytes - last_read_bytes; + *write_bytes = cur_write_bytes - last_write_bytes; + } + else{ + *rchars = 0; + *wchars = 0; + *read_bytes = 0; + *write_bytes = 0; + } last_rchars = cur_rchars; last_wchars = cur_wchars; last_read_bytes = cur_read_bytes; @@ -900,12 +914,12 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { } void taosGetCardInfoDelta(int64_t *receive_bytes, int64_t *transmit_bytes) { - static int64_t last_receive_bytes = 0; - static int64_t last_transmit_bytes = 0; + static int64_t last_receive_bytes = -1; + static int64_t last_transmit_bytes = -1; int64_t cur_receive_bytes = 0; int64_t cur_transmit_bytes = 0; if (taosGetCardInfo(&cur_receive_bytes, &cur_transmit_bytes) == 0) { - if(last_receive_bytes > 0 && last_receive_bytes > 0){ + if(last_receive_bytes >= 0 && last_transmit_bytes >= 0){ *receive_bytes = cur_receive_bytes - last_receive_bytes; *transmit_bytes = cur_transmit_bytes - last_transmit_bytes; } From 0d5b997d943cefd0160590b5d6ee7fb617596496 Mon Sep 17 00:00:00 2001 From: dmchen Date: Sun, 25 Feb 2024 03:56:12 +0000 Subject: [PATCH 095/107] first set --- source/os/src/osSysinfo.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index 173bb982db..187461826a 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -590,10 +590,6 @@ void taosGetCpuUsage(double *cpu_system, double *cpu_engine) { } } } - else{ - *cpu_system = 0; - *cpu_engine = 0; - } lastSysUsed = curSysUsed; lastSysTotal = curSysTotal; From 6ddd34c4d1def076671ca46cecd5897ab309d1e6 Mon Sep 17 00:00:00 2001 From: kailixu Date: Sun, 25 Feb 2024 15:21:37 +0800 Subject: [PATCH 096/107] other: trigger CI From e1add42485a33dd7238e68cacce62a9a033ad9a9 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Sun, 25 Feb 2024 17:58:20 +0800 Subject: [PATCH 097/107] Update privilege_sysinfo.sim --- tests/script/tsim/user/privilege_sysinfo.sim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index 625b1ec04c..cf87f63b8c 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -296,9 +296,8 @@ else $loop_flag = 0 goto loop_check_sysinfo_0 endi -goto loop_check_sysinfo_0 loop_check_end: print =============== check end -#system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file +#system sh/exec.sh -n dnode1 -s stop -x SIGINT From 4ceb0856131e88851caaa4e9dc614436f15a1ad9 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 01:03:08 +0800 Subject: [PATCH 098/107] enh: coverity of trow --- include/common/trow.h | 4 +- source/common/src/trow.c | 33 ++-- source/common/test/dataformatTest.cpp | 248 ++++++++++++++++---------- 3 files changed, 174 insertions(+), 111 deletions(-) diff --git a/include/common/trow.h b/include/common/trow.h index 8332c10ed2..92713e8e63 100644 --- a/include/common/trow.h +++ b/include/common/trow.h @@ -289,7 +289,7 @@ int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValT */ static FORCE_INLINE void tdSRowInit(SRowBuilder *pBuilder, int16_t sver) { - pBuilder->rowType = TD_ROW_TP; // default STpRow + pBuilder->rowType = pBuilder->rowType; pBuilder->sver = sver; } int32_t tdSRowSetInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBoundCols, int32_t flen); @@ -331,7 +331,7 @@ void tdSTSRowIterReset(STSRowIter *pIter, STSRow *pRow); bool tdSTSRowIterFetch(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCellVal *pVal); bool tdSTSRowIterNext(STSRowIter *pIter, SCellVal *pVal); -int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow); +int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t rowType); bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCellVal *pVal); void tdSRowPrint(STSRow *row, STSchema *pSchema, const char *tag); diff --git a/source/common/src/trow.c b/source/common/src/trow.c index b91562be7a..cf6d4752d9 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -231,7 +231,7 @@ bool tdSTSRowIterGetKvVal(STSRowIter *pIter, col_id_t colId, col_id_t *nIdx, SCe return true; } -#ifdef BUILD_NO_CALL +// #ifdef BUILD_NO_CALL const uint8_t tdVTypeByte[2][3] = {{ // 2 bits TD_VTYPE_NORM_BYTE_II, @@ -439,13 +439,14 @@ bool tdSTSRowIterNext(STSRowIter *pIter, SCellVal *pVal) { return true; } -int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) { +int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t rowType) { STColumn *pTColumn; SColVal *pColVal; int32_t nColVal = taosArrayGetSize(pArray); int32_t varDataLen = 0; int32_t maxVarDataLen = 0; int32_t iColVal = 0; + int32_t nBound = 0; void *varBuf = NULL; bool isAlloc = false; @@ -458,6 +459,9 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) { } else { pColVal = NULL; } + if (pColVal && !COL_VAL_IS_NONE(pColVal)) { + ++nBound; + } if (iColumn == 0) { ASSERT(pColVal && pColVal->cid == pTColumn->colId); @@ -512,10 +516,11 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) { } } - SRowBuilder rb = {0}; + SRowBuilder rb = {.rowType = rowType}; tdSRowInit(&rb, pTSchema->version); - tdSRowSetInfo(&rb, pTSchema->numOfCols, pTSchema->numOfCols, pTSchema->flen); + tdSRowSetInfo(&rb, pTSchema->numOfCols, nBound, pTSchema->flen); tdSRowResetBuf(&rb, *ppRow); + int32_t iBound = 0; iColVal = 0; for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; ++iColumn) { @@ -529,21 +534,28 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) { valType = TD_VTYPE_NONE; } else if (COL_VAL_IS_NULL(pColVal)) { valType = TD_VTYPE_NULL; + ++iBound; } else if (IS_VAR_DATA_TYPE(pTColumn->type)) { varDataSetLen(varBuf, pColVal->value.nData); if (pColVal->value.nData != 0) { memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData); } val = varBuf; + ++iBound; } else { val = (const void *)&pColVal->value.val; + ++iBound; } } else { // pColVal = NULL; valType = TD_VTYPE_NONE; } - tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, pTColumn->offset, iColVal); + if (TD_IS_TP_ROW(rb.pBuf)) { + tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, pTColumn->offset, iColVal); + } else { + tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, rb.offset, iBound); + } ++iColVal; } @@ -761,11 +773,11 @@ int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colTyp int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const void *val, bool isCopyVarData, int8_t colType, int16_t colIdx, int32_t offset, col_id_t colId) { - if ((offset < (int32_t)sizeof(SKvRowIdx)) || (colIdx < 1)) { + if (colIdx < 1) { terrno = TSDB_CODE_INVALID_PARA; + ASSERTS(0, "colIdx is %" PRIi64, colIdx); return terrno; } - offset -= sizeof(SKvRowIdx); --colIdx; #ifdef TD_SUPPORT_BITMAP @@ -779,6 +791,7 @@ int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const vo SKvRowIdx *pColIdx = (SKvRowIdx *)POINTER_SHIFT(TD_ROW_COL_IDX(row), offset); pColIdx->colId = colId; pColIdx->offset = TD_ROW_LEN(row); // the offset include the TD_ROW_HEAD_LEN + pBuilder->offset += sizeof(SKvRowIdx); if (valType == TD_VTYPE_NORM) { char *ptr = (char *)POINTER_SHIFT(row, TD_ROW_LEN(row)); if (IS_VAR_DATA_TYPE(colType)) { @@ -904,6 +917,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) { TD_ROW_SET_LEN(pBuilder->pBuf, len); TD_ROW_SET_SVER(pBuilder->pBuf, pBuilder->sver); TD_ROW_SET_NCOLS(pBuilder->pBuf, pBuilder->nBoundCols); + pBuilder->offset = 0; break; default: terrno = TSDB_CODE_INVALID_PARA; @@ -1056,7 +1070,7 @@ int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColVal) { STColumn *pTColumn = &pTSchema->columns[iCol]; SCellVal cv = {0}; - SValue value = {0}; + // SValue value = {0}; ASSERT((pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID) || (iCol > 0)); @@ -1084,5 +1098,4 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes); } } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/source/common/test/dataformatTest.cpp b/source/common/test/dataformatTest.cpp index b1083e4590..81407c7ef0 100644 --- a/source/common/test/dataformatTest.cpp +++ b/source/common/test/dataformatTest.cpp @@ -13,7 +13,6 @@ * along with this program. If not, see . */ -#if 0 #include #include @@ -59,7 +58,6 @@ STSchema *genSTSchema(int16_t nCols) { case 1: { pSchema[i].type = TSDB_DATA_TYPE_INT; pSchema[i].bytes = TYPE_BYTES[pSchema[i].type]; - ; } break; case 2: { pSchema[i].type = TSDB_DATA_TYPE_BIGINT; @@ -123,7 +121,8 @@ STSchema *genSTSchema(int16_t nCols) { return pResult; } -// ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, c9 bool +// ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, +// c9 bool c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned static int32_t genTestData(const char **data, int16_t nCols, SArray **pArray) { if (!(*pArray)) { *pArray = taosArrayInit(nCols, sizeof(SColVal)); @@ -142,59 +141,76 @@ static int32_t genTestData(const char **data, int16_t nCols, SArray **pArray) { taosArrayPush(*pArray, &colVal); continue; } - switch (i) { case 0: - sscanf(data[i], "%" PRIi64, &colVal.value.ts); + colVal.type = TSDB_DATA_TYPE_TIMESTAMP; + sscanf(data[i], "%" PRIi64, &colVal.value.val); break; case 1: - sscanf(data[i], "%" PRIi32, &colVal.value.i32); + colVal.type = TSDB_DATA_TYPE_INT; + sscanf(data[i], "%" PRIi32, (int32_t *)&colVal.value.val); break; case 2: - sscanf(data[i], "%" PRIi64, &colVal.value.i64); + colVal.type = TSDB_DATA_TYPE_BIGINT; + sscanf(data[i], "%" PRIi64, &colVal.value.val); break; case 3: - sscanf(data[i], "%f", &colVal.value.f); + colVal.type = TSDB_DATA_TYPE_FLOAT; + sscanf(data[i], "%f", (float *)&colVal.value.val); break; case 4: - sscanf(data[i], "%lf", &colVal.value.d); + colVal.type = TSDB_DATA_TYPE_DOUBLE; + sscanf(data[i], "%lf", (double *)&colVal.value.val); break; case 5: { + colVal.type = TSDB_DATA_TYPE_BINARY; int16_t dataLen = strlen(data[i]) + 1; colVal.value.nData = dataLen < 10 ? dataLen : 10; colVal.value.pData = (uint8_t *)data[i]; } break; case 6: { + colVal.type = TSDB_DATA_TYPE_NCHAR; int16_t dataLen = strlen(data[i]) + 1; colVal.value.nData = dataLen < 40 ? dataLen : 40; colVal.value.pData = (uint8_t *)data[i]; // just for test, not real nchar } break; - case 7: - case 9: { + case 7: { + colVal.type = TSDB_DATA_TYPE_TINYINT; int32_t d8; sscanf(data[i], "%" PRId32, &d8); - colVal.value.i8 = (int8_t)d8; - } break; + colVal.value.val = (int8_t)d8; + } case 8: { + colVal.type = TSDB_DATA_TYPE_SMALLINT; int32_t d16; sscanf(data[i], "%" PRId32, &d16); - colVal.value.i16 = (int16_t)d16; + colVal.value.val = (int16_t)d16; + } break; + case 9: { + colVal.type = TSDB_DATA_TYPE_BOOL; + int32_t d8; + sscanf(data[i], "%" PRId32, &d8); + colVal.value.val = (int8_t)d8; } break; case 10: { + colVal.type = TSDB_DATA_TYPE_UTINYINT; uint32_t u8; sscanf(data[i], "%" PRId32, &u8); - colVal.value.u8 = (uint8_t)u8; + colVal.value.val = (uint8_t)u8; } break; case 11: { + colVal.type = TSDB_DATA_TYPE_USMALLINT; uint32_t u16; sscanf(data[i], "%" PRId32, &u16); - colVal.value.u16 = (uint16_t)u16; + colVal.value.val = (uint16_t)u16; } break; case 12: { - sscanf(data[i], "%" PRIu32, &colVal.value.u32); + colVal.type = TSDB_DATA_TYPE_UINT; + sscanf(data[i], "%" PRIu32, (uint32_t *)&colVal.value.val); } break; case 13: { - sscanf(data[i], "%" PRIu64, &colVal.value.u64); + colVal.type = TSDB_DATA_TYPE_UBIGINT; + sscanf(data[i], "%" PRIu64, (uint64_t *)&colVal.value.val); } break; default: ASSERT(0); @@ -215,25 +231,25 @@ int32_t debugPrintSColVal(SColVal *cv, int8_t type) { } switch (type) { case TSDB_DATA_TYPE_BOOL: - printf("%s ", cv->value.i8 == 0 ? "false" : "true"); + printf("%s ", cv->value.val == 0 ? "false" : "true"); break; case TSDB_DATA_TYPE_TINYINT: - printf("%" PRIi8 " ", cv->value.i8); + printf("%" PRIi8 " ", *(int8_t *)&cv->value.val); break; case TSDB_DATA_TYPE_SMALLINT: - printf("%" PRIi16 " ", cv->value.i16); + printf("%" PRIi16 " ", *(int16_t *)&cv->value.val); break; case TSDB_DATA_TYPE_INT: - printf("%" PRIi32 " ", cv->value.i32); + printf("%" PRIi32 " ", *(int32_t *)&cv->value.val); break; case TSDB_DATA_TYPE_BIGINT: - printf("%" PRIi64 " ", cv->value.i64); + printf("%" PRIi64 " ", cv->value.val); break; case TSDB_DATA_TYPE_FLOAT: - printf("%f ", cv->value.f); + printf("%f ", *(float *)&cv->value.val); break; case TSDB_DATA_TYPE_DOUBLE: - printf("%lf ", cv->value.d); + printf("%lf ", *(double *)&cv->value.val); break; case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_GEOMETRY: { @@ -242,7 +258,7 @@ int32_t debugPrintSColVal(SColVal *cv, int8_t type) { printf("%s ", tv); } break; case TSDB_DATA_TYPE_TIMESTAMP: - printf("%" PRIi64 " ", cv->value.i64); + printf("%" PRIi64 " ", cv->value.val); break; case TSDB_DATA_TYPE_NCHAR: { char tv[15] = {0}; @@ -250,16 +266,16 @@ int32_t debugPrintSColVal(SColVal *cv, int8_t type) { printf("%s ", tv); } break; case TSDB_DATA_TYPE_UTINYINT: - printf("%" PRIu8 " ", cv->value.u8); + printf("%" PRIu8 " ", *(uint8_t *)&cv->value.val); break; case TSDB_DATA_TYPE_USMALLINT: - printf("%" PRIu16 " ", cv->value.u16); + printf("%" PRIu16 " ", *(uint16_t *)&cv->value.val); break; case TSDB_DATA_TYPE_UINT: - printf("%" PRIu32 " ", cv->value.u32); + printf("%" PRIu32 " ", *(uint32_t *)&cv->value.val); break; case TSDB_DATA_TYPE_UBIGINT: - printf("%" PRIu64 " ", cv->value.u64); + printf("%" PRIu64 " ", *(uint64_t *)&cv->value.val); break; case TSDB_DATA_TYPE_JSON: printf("JSON "); @@ -286,11 +302,11 @@ int32_t debugPrintSColVal(SColVal *cv, int8_t type) { return 0; } -void debugPrintTSRow(STSRow2 *row, STSchema *pTSchema, const char *tags, int32_t ln) { - // printf("%s:%d %s:v%d:%d ", tags, ln, (row->flags & 0xf0) ? "KV" : "TP", row->sver, row->nData); +void debugPrintTSRow(STSRow *row, STSchema *pTSchema, const char *tags, int32_t ln) { + printf("%s:%d %s:v%d:len-%u ", tags, ln, (row->type) ? "KV" : "TP", row->sver, row->len); for (int16_t i = 0; i < pTSchema->numOfCols; ++i) { SColVal cv = {0}; - tTSRowGet(row, pTSchema, i, &cv); + tTSRowGetVal(row, pTSchema, i, &cv); debugPrintSColVal(&cv, pTSchema->columns[i].type); } printf("\n"); @@ -315,36 +331,36 @@ static int32_t checkSColVal(const char *rawVal, SColVal *cv, int8_t type) { case TSDB_DATA_TYPE_TINYINT: { int32_t d8; sscanf(rawVal, "%" PRId32, &d8); - EXPECT_EQ(cv->value.i8, (int8_t)d8); + EXPECT_EQ((int8_t)cv->value.val, (int8_t)d8); } break; case TSDB_DATA_TYPE_SMALLINT: { int32_t d16; sscanf(rawVal, "%" PRId32, &d16); - EXPECT_EQ(cv->value.i16, (int16_t)d16); + EXPECT_EQ((int16_t)cv->value.val, (int16_t)d16); } break; case TSDB_DATA_TYPE_INT: { - sscanf(rawVal, "%" PRId32, &rawSVal.i32); - EXPECT_EQ(cv->value.i32, rawSVal.i32); + sscanf(rawVal, "%" PRId32, (int32_t *)&rawSVal.val); + EXPECT_EQ((int32_t)cv->value.val, (int32_t)rawSVal.val); } break; case TSDB_DATA_TYPE_BIGINT: { - sscanf(rawVal, "%" PRIi64, &rawSVal.i64); - EXPECT_EQ(cv->value.i64, rawSVal.i64); + sscanf(rawVal, "%" PRIi64, &rawSVal.val); + EXPECT_EQ(cv->value.val, rawSVal.val); } break; case TSDB_DATA_TYPE_FLOAT: { - sscanf(rawVal, "%f", &rawSVal.f); - EXPECT_FLOAT_EQ(cv->value.f, rawSVal.f); + sscanf(rawVal, "%f", (float *)&rawSVal.val); + EXPECT_FLOAT_EQ((float)cv->value.val, (float)rawSVal.val); } break; case TSDB_DATA_TYPE_DOUBLE: { - sscanf(rawVal, "%lf", &rawSVal.d); - EXPECT_DOUBLE_EQ(cv->value.d, rawSVal.d); + sscanf(rawVal, "%lf", (double *)&rawSVal.val); + EXPECT_DOUBLE_EQ((double)cv->value.val, (double)rawSVal.val); } break; case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_GEOMETRY: { EXPECT_STRCASEEQ(rawVal, (const char *)cv->value.pData); } break; case TSDB_DATA_TYPE_TIMESTAMP: { - sscanf(rawVal, "%" PRIi64, &rawSVal.ts); - EXPECT_DOUBLE_EQ(cv->value.ts, rawSVal.ts); + sscanf(rawVal, "%" PRIi64, &rawSVal.val); + EXPECT_DOUBLE_EQ(cv->value.val, rawSVal.val); } break; case TSDB_DATA_TYPE_NCHAR: { EXPECT_STRCASEEQ(rawVal, (const char *)cv->value.pData); // informal nchar comparsion @@ -352,20 +368,20 @@ static int32_t checkSColVal(const char *rawVal, SColVal *cv, int8_t type) { case TSDB_DATA_TYPE_UTINYINT: { uint32_t u8; sscanf(rawVal, "%" PRIu32, &u8); - EXPECT_EQ(cv->value.u8, (uint8_t)u8); + EXPECT_EQ((uint8_t)cv->value.val, (uint8_t)u8); } break; case TSDB_DATA_TYPE_USMALLINT: { uint32_t u16; sscanf(rawVal, "%" PRIu32, &u16); - EXPECT_EQ(cv->value.u16, (uint16_t)u16); + EXPECT_EQ((uint16_t)cv->value.val, (uint16_t)u16); } break; case TSDB_DATA_TYPE_UINT: { - sscanf(rawVal, "%" PRIu32, &rawSVal.u32); - EXPECT_EQ(cv->value.u32, rawSVal.u32); + sscanf(rawVal, "%" PRIu32, (uint32_t *)&rawSVal.val); + EXPECT_EQ((uint32_t)cv->value.val, (uint32_t)rawSVal.val); } break; case TSDB_DATA_TYPE_UBIGINT: { - sscanf(rawVal, "%" PRIu64, &rawSVal.u64); - EXPECT_EQ(cv->value.u64, rawSVal.u64); + sscanf(rawVal, "%" PRIu64, (uint64_t *)&rawSVal.val); + EXPECT_EQ((uint64_t)cv->value.val, (uint64_t)rawSVal.val); } break; case TSDB_DATA_TYPE_JSON: printf("JSON "); @@ -395,36 +411,63 @@ static int32_t checkSColVal(const char *rawVal, SColVal *cv, int8_t type) { return 0; } -static void checkTSRow(const char **data, STSRow2 *row, STSchema *pTSchema) { +static void checkTSRow(const char **data, STSRow *row, STSchema *pTSchema) { for (int16_t i = 0; i < pTSchema->numOfCols; ++i) { SColVal cv = {0}; - tTSRowGet(row, pTSchema, i, &cv); + tTSRowGetVal(row, pTSchema, i, &cv); checkSColVal(data[i], &cv, pTSchema->columns[i].type); } + + STSRowIter rowIter = {.pSchema = pTSchema}; + tdSTSRowIterReset(&rowIter, row); + for (int32_t i = 0; i < pTSchema->numOfCols; ++i) { + STColumn *pCol = pTSchema->columns + i; + SColVal colVal = {0}; + SCellVal cv = {0}; + if (!tdSTSRowIterFetch(&rowIter, pCol->colId, pCol->type, &cv)) { + break; + } + if (tdValTypeIsNone(cv.valType)) { + colVal = COL_VAL_NONE(pCol->colId, pCol->type); + } else if (tdValTypeIsNull(cv.valType)) { + colVal = COL_VAL_NULL(pCol->colId, pCol->type); + } else { + colVal.cid = pCol->colId; + colVal.type = pCol->type; + colVal.flag = CV_FLAG_VALUE; + + if (IS_VAR_DATA_TYPE(pCol->type)) { + colVal.value.nData = varDataLen(cv.val); + colVal.value.pData = (uint8_t *)varDataVal(cv.val); + } else { + memcpy(&colVal.value.val, cv.val, tDataTypes[pCol->type].bytes); + } + } + checkSColVal(data[i], &colVal, pCol->type); + } } TEST(testCase, AllNormTest) { - int16_t nCols = 14; - STSRowBuilder rb = {0}; - STSRow2 *row = nullptr; - SArray *pArray = taosArrayInit(nCols, sizeof(SColVal)); + int16_t nCols = 14; + STSRow *row = nullptr; + SArray *pArray = taosArrayInit(nCols, sizeof(SColVal)); EXPECT_NE(pArray, nullptr); STSchema *pTSchema = genSTSchema(nCols); EXPECT_NE(pTSchema, nullptr); - // ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, - // c9 bool - char *data[14] = {"1653694220000", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "no", "no", "no", "no", "no"}; + // ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, + // c9 bool c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned + char *data[14] = { + "1653694220000", "10", "20", "10.1", "10.1", "binary10", "nchar10", "10", "10", "10", "10", "20", "30", "40"}; - genTestData((const char **)&data, nCols, &pArray); + // genTestData((const char **)&data, nCols, &pArray); - tTSRowNew(&rb, pArray, pTSchema, &row); + // tdSTSRowNew(pArray, pTSchema, &row, TD_ROW_TP); + // debugPrintTSRow(row, pTSchema, __func__, __LINE__); + // tdSRowPrint(row, pTSchema, __func__); + // checkTSRow((const char **)&data, row, pTSchema); - debugPrintTSRow(row, pTSchema, __func__, __LINE__); - checkTSRow((const char **)&data, row, pTSchema); - - tsRowBuilderClear(&rb); taosArrayDestroy(pArray); taosMemoryFree(pTSchema); } @@ -433,7 +476,7 @@ TEST(testCase, AllNormTest) { TEST(testCase, NoneTest) { const static int nCols = 14; const static int nRows = 20; - STSRow2 *row = nullptr; + STSRow *row = nullptr; SArray *pArray = taosArrayInit(nCols, sizeof(SColVal)); EXPECT_NE(pArray, nullptr); @@ -442,42 +485,49 @@ TEST(testCase, NoneTest) { // ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, // c9 bool c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned - const char *data[nRows][nCols] = { - {"1653694220000", "no", "20", "10.1", "10.1", "binary10", "no", "10", "10", "nu", "10", "20", "30", "40"}, - {"1653694220001", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, - {"1653694220002", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, - {"1653694220003", "10", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, - {"1653694220004", "no", "20", "no", "no", "no", "nchar10", "no", "no", "no", "no", "no", "no", "no"}, - {"1653694220005", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, - {"1653694220006", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, - {"1653694220007", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "no", "no", "no", "no", "no"}, - {"1653694220008", "no", "nu", "nu", "nu", "binary10", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "no"}, - {"1653694220009", "no", "nu", "nu", "nu", "binary10", "nu", "nu", "10", "no", "nu", "nu", "nu", "100"}, - {"1653694220010", "-1", "-1", "-1", "-1", "binary10", "nu", "-1", "0", "0", "0", "0", "0", "0"}, - {"1653694220011", "-2147483648", "nu", "nu", "nu", "biy10", "nu", "nu", "32767", "no", "nu", "nu", "nu", "100"}, - {"1653694220012", "2147483647", "nu", "nu", "nu", "ary10", "nu", "nu", "-32768", "no", "nu", "nu", "nu", "100"}, - {"1653694220013", "no", "-9223372036854775818", "nu", "nu", "b1", "nu", "nu", "10", "no", "nu", "nu", "nu", "nu"}, - {"1653694220014", "no", "nu", "nu", "nu", "b0", "nu", "nu", "10", "no", "nu", "nu", "nu", "9223372036854775808"}, - {"1653694220015", "no", "nu", "nu", "nu", "binary30", "char4", "nu", "10", "no", "nu", "nu", "nu", - "18446744073709551615"}, - {"1653694220016", "2147483647", "nu", "nu", "nu", "bin50", "nu", "nu", "10", "no", "nu", "nu", "nu", "100"}, - {"1653694220017", "2147483646", "0", "0", "0", "binary10", "0", "0", "0", "0", "255", "0", "0", "0"}, - {"1653694220018", "no", "-9223372036854775808", "nu", "nu", "binary10", "nu", "nu", "10", "no", "nu", "nu", - "4294967295", "100"}, - {"1653694220019", "no", "9223372036854775807", "nu", "nu", "bin10", "nu", "nu", "10", "no", "254", "nu", "nu", - "no"}}; + // const int8_t rowType[nRows] = {TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, + // TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, + // TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP}; + const int8_t rowType[nRows] = {TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, + TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, + TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP}; +const char *data[nRows][nCols] = { + // {"1653694220000", "no", "20", "10.1", "10.1", "binary10", "no", "10", "10", "nu", "10", "20", "30", "40"}, + // {"1653694220001", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + // {"1653694220002", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + // {"1653694220003", "10", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + {"1653694220004", "no", "20", "no", "no", "no", "nchar10", "no", "no", "no", "no", "no", "no", "no"}, + {"1653694220005", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, + {"1653694220006", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, + {"1653694220007", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "no", "no", "no", "no", "no"}, + {"1653694220008", "no", "nu", "nu", "nu", "binary10", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "no"}, + {"1653694220009", "no", "nu", "nu", "nu", "binary10", "nu", "nu", "10", "no", "nu", "nu", "nu", "100"}, + {"1653694220010", "-1", "-1", "-1", "-1", "binary10", "nu", "-1", "0", "0", "0", "0", "0", "0"}, + {"1653694220011", "-2147483648", "nu", "nu", "nu", "biy10", "nu", "nu", "32767", "no", "nu", "nu", "nu", "100"}, + {"1653694220012", "2147483647", "nu", "nu", "nu", "ary10", "nu", "nu", "-32768", "no", "nu", "nu", "nu", "100"}, + {"1653694220013", "no", "-9223372036854775818", "nu", "nu", "b1", "nu", "nu", "10", "no", "nu", "nu", "nu", "nu"}, + {"1653694220014", "no", "nu", "nu", "nu", "b0", "nu", "nu", "10", "no", "nu", "nu", "nu", "9223372036854775808"}, + {"1653694220015", "no", "nu", "nu", "nu", "binary30", "char4", "nu", "10", "no", "nu", "nu", "nu", + "18446744073709551615"}, + {"1653694220016", "2147483647", "nu", "nu", "nu", "bin50", "nu", "nu", "10", "no", "nu", "nu", "nu", "100"}, + {"1653694220017", "2147483646", "0", "0", "0", "binary10", "0", "0", "0", "0", "255", "0", "0", "0"}, + {"1653694220018", "no", "-9223372036854775808", "nu", "nu", "binary10", "nu", "nu", "10", "no", "nu", "nu", + "4294967295", "100"}, + {"1653694220019", "no", "9223372036854775807", "nu", "nu", "bin10", "nu", "nu", "10", "no", "254", "nu", "nu", + "no"}}; - for (int r = 0; r < nRows; ++r) { - genTestData((const char **)&data[r], nCols, &pArray); - tTSRowNew(NULL, pArray, pTSchema, &row); - debugPrintTSRow(row, pTSchema, __func__, __LINE__); // debug print - checkTSRow((const char **)&data[r], row, pTSchema); // check - tTSRowFree(row); - taosArrayClear(pArray); +for (int r = 0; r < nRows; ++r) { + printf("%s:%d index:%d\n", __func__, __LINE__, r); + genTestData((const char **)&data[r], nCols, &pArray); + tdSTSRowNew(pArray, pTSchema, &row, rowType[r]); + debugPrintTSRow(row, pTSchema, __func__, __LINE__); // debug print + tdSRowPrint(row, pTSchema, __func__); + checkTSRow((const char **)&data[r], row, pTSchema); // check + taosMemoryFreeClear(row); + taosArrayClear(pArray); } taosArrayDestroy(pArray); taosMemoryFree(pTSchema); } -#endif #endif \ No newline at end of file From c54dfc36c20992d72ad4647f67de90bdb3c57066 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 01:35:18 +0800 Subject: [PATCH 099/107] enh: coverity for dataformatTest --- source/common/src/trow.c | 21 +++++++++++++++----- source/common/test/dataformatTest.cpp | 28 +++++++++++++-------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/source/common/src/trow.c b/source/common/src/trow.c index cf6d4752d9..e2a8d5d5c3 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -444,6 +444,7 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t r SColVal *pColVal; int32_t nColVal = taosArrayGetSize(pArray); int32_t varDataLen = 0; + int32_t nonVarDataLen = 0; int32_t maxVarDataLen = 0; int32_t iColVal = 0; int32_t nBound = 0; @@ -488,16 +489,26 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t r } } } + } else { + if(pColVal && COL_VAL_IS_VALUE(pColVal)) { + nonVarDataLen += TYPE_BYTES[pTColumn->type]; + } } } ++iColVal; } - if (!(*ppRow)) { - *ppRow = (STSRow *)taosMemoryCalloc( - 1, sizeof(STSRow) + pTSchema->flen + varDataLen + TD_BITMAP_BYTES(pTSchema->numOfCols - 1)); - isAlloc = true; + int32_t rowTotalLen = 0; + if (rowType == TD_ROW_TP) { + rowTotalLen = sizeof(STSRow) + pTSchema->flen + varDataLen + TD_BITMAP_BYTES(pTSchema->numOfCols - 1); + } else { + rowTotalLen = sizeof(STSRow) + sizeof(col_id_t) + varDataLen + nonVarDataLen + (nBound - 1) * sizeof(SKvRowIdx) + + TD_BITMAP_BYTES(nBound - 1); + } + if (!(*ppRow)) { + *ppRow = (STSRow *)taosMemoryCalloc(1, rowTotalLen); + isAlloc = true; } if (!(*ppRow)) { @@ -554,7 +565,7 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t r if (TD_IS_TP_ROW(rb.pBuf)) { tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, pTColumn->offset, iColVal); } else { - tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, rb.offset, iBound); + tdAppendColValToRow(&rb, pTColumn->colId, pTColumn->type, valType, val, true, rb.offset, iBound - 1); } ++iColVal; diff --git a/source/common/test/dataformatTest.cpp b/source/common/test/dataformatTest.cpp index 81407c7ef0..80631fa1b3 100644 --- a/source/common/test/dataformatTest.cpp +++ b/source/common/test/dataformatTest.cpp @@ -461,13 +461,14 @@ TEST(testCase, AllNormTest) { char *data[14] = { "1653694220000", "10", "20", "10.1", "10.1", "binary10", "nchar10", "10", "10", "10", "10", "20", "30", "40"}; - // genTestData((const char **)&data, nCols, &pArray); + genTestData((const char **)&data, nCols, &pArray); - // tdSTSRowNew(pArray, pTSchema, &row, TD_ROW_TP); - // debugPrintTSRow(row, pTSchema, __func__, __LINE__); - // tdSRowPrint(row, pTSchema, __func__); - // checkTSRow((const char **)&data, row, pTSchema); + tdSTSRowNew(pArray, pTSchema, &row, TD_ROW_TP); + debugPrintTSRow(row, pTSchema, __func__, __LINE__); + tdSRowPrint(row, pTSchema, __func__); + checkTSRow((const char **)&data, row, pTSchema); + taosMemoryFreeClear(row); taosArrayDestroy(pArray); taosMemoryFree(pTSchema); } @@ -485,17 +486,15 @@ TEST(testCase, NoneTest) { // ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5 binary(10), c6 nchar(10), c7 tinyint, c8 smallint, // c9 bool c10 tinyint unsigned, c11 smallint unsigned, c12 int unsigned, c13 bigint unsigned - // const int8_t rowType[nRows] = {TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, - // TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, - // TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP}; - const int8_t rowType[nRows] = {TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, - TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, + const int8_t rowType[nRows] = {TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, + TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_KV, TD_ROW_TP}; + const char *data[nRows][nCols] = { - // {"1653694220000", "no", "20", "10.1", "10.1", "binary10", "no", "10", "10", "nu", "10", "20", "30", "40"}, - // {"1653694220001", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, - // {"1653694220002", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, - // {"1653694220003", "10", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + {"1653694220000", "no", "20", "10.1", "10.1", "binary10", "no", "10", "10", "nu", "10", "20", "30", "40"}, + {"1653694220001", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + {"1653694220002", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, + {"1653694220003", "10", "10", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"}, {"1653694220004", "no", "20", "no", "no", "no", "nchar10", "no", "no", "no", "no", "no", "no", "no"}, {"1653694220005", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, {"1653694220006", "no", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu"}, @@ -517,7 +516,6 @@ const char *data[nRows][nCols] = { "no"}}; for (int r = 0; r < nRows; ++r) { - printf("%s:%d index:%d\n", __func__, __LINE__, r); genTestData((const char **)&data[r], nCols, &pArray); tdSTSRowNew(pArray, pTSchema, &row, rowType[r]); debugPrintTSRow(row, pTSchema, __func__, __LINE__); // debug print From 785d1672b849a12e0bc220a23810d7144ab63e0d Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 02:05:00 +0800 Subject: [PATCH 100/107] test: add test for dataformat --- source/common/test/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/common/test/CMakeLists.txt b/source/common/test/CMakeLists.txt index eb79e79afa..51c733e796 100644 --- a/source/common/test/CMakeLists.txt +++ b/source/common/test/CMakeLists.txt @@ -35,6 +35,10 @@ target_include_directories( PUBLIC "${TD_SOURCE_DIR}/include/common" PUBLIC "${TD_SOURCE_DIR}/include/util" ) +add_test( + NAME dataformatTest + COMMAND dataformatTest +) # tmsg test # add_executable(tmsgTest "") From 9cd6da76d90f81a039aa6d56586eaff3680ecead Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 02:10:30 +0800 Subject: [PATCH 101/107] other: trigger CI From bc456e61832dfeff7d40248a2ef0d759ff241383 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 08:51:06 +0800 Subject: [PATCH 102/107] fix: grammar of init on windows --- source/common/test/dataformatTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/common/test/dataformatTest.cpp b/source/common/test/dataformatTest.cpp index 80631fa1b3..ab7496a474 100644 --- a/source/common/test/dataformatTest.cpp +++ b/source/common/test/dataformatTest.cpp @@ -418,7 +418,8 @@ static void checkTSRow(const char **data, STSRow *row, STSchema *pTSchema) { checkSColVal(data[i], &cv, pTSchema->columns[i].type); } - STSRowIter rowIter = {.pSchema = pTSchema}; + STSRowIter rowIter = {0}; + rowIter.pSchema = pTSchema; tdSTSRowIterReset(&rowIter, row); for (int32_t i = 0; i < pTSchema->numOfCols; ++i) { STColumn *pCol = pTSchema->columns + i; From 17ae867ec6215ac629bb7026484154fb6aef2a7c Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 09:07:11 +0800 Subject: [PATCH 103/107] fix: grammar of init on windows --- source/common/src/trow.c | 12 ++++++++++-- source/common/test/dataformatTest.cpp | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/common/src/trow.c b/source/common/src/trow.c index e2a8d5d5c3..6a6758f834 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -137,6 +137,7 @@ int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pVa return TSDB_CODE_SUCCESS; } +#if 0 int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pValType) { if (!pBitmap || colIdx < 0) { terrno = TSDB_CODE_INVALID_PARA; @@ -177,16 +178,19 @@ int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pVal } return TSDB_CODE_SUCCESS; } +#endif int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValType, int8_t bitmapMode) { switch (bitmapMode) { case 0: tdGetBitmapValTypeII(pBitmap, colIdx, pValType); break; +#if 0 case -1: case 1: tdGetBitmapValTypeI(pBitmap, colIdx, pValType); break; +#endif default: terrno = TSDB_CODE_INVALID_PARA; return TSDB_CODE_FAILED; @@ -628,7 +632,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell return true; } - +#if 0 int32_t tdSetBitmapValTypeI(void *pBitmap, int16_t colIdx, TDRowValT valType) { if (!pBitmap || colIdx < 0) { terrno = TSDB_CODE_INVALID_PARA; @@ -678,6 +682,7 @@ int32_t tdSetBitmapValTypeI(void *pBitmap, int16_t colIdx, TDRowValT valType) { } return TSDB_CODE_SUCCESS; } +#endif int32_t tdGetKvRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int32_t offset, int16_t colIdx) { #ifdef TD_SUPPORT_BITMAP @@ -854,7 +859,7 @@ int32_t tdAppendColValToTpRow(SRowBuilder *pBuilder, TDRowValT valType, const vo return 0; } - +#if 0 int32_t tdSRowSetExtendedInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBoundCols, int32_t flen, int32_t allNullLen, int32_t boundNullLen) { if ((boundNullLen > 0) && (allNullLen > 0) && (nBoundCols > 0)) { @@ -890,6 +895,7 @@ int32_t tdSRowSetExtendedInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBou #endif return TSDB_CODE_SUCCESS; } +#endif int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) { pBuilder->pBuf = (STSRow *)pBuf; @@ -1065,10 +1071,12 @@ int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int case 0: tdSetBitmapValTypeII(pBitmap, colIdx, valType); break; +#if 0 case -1: case 1: tdSetBitmapValTypeI(pBitmap, colIdx, valType); break; +#endif default: terrno = TSDB_CODE_INVALID_PARA; return TSDB_CODE_FAILED; diff --git a/source/common/test/dataformatTest.cpp b/source/common/test/dataformatTest.cpp index ab7496a474..8bc7d47ebf 100644 --- a/source/common/test/dataformatTest.cpp +++ b/source/common/test/dataformatTest.cpp @@ -428,13 +428,14 @@ static void checkTSRow(const char **data, STSRow *row, STSchema *pTSchema) { if (!tdSTSRowIterFetch(&rowIter, pCol->colId, pCol->type, &cv)) { break; } + + colVal.cid = pCol->colId; + colVal.type = pCol->type; if (tdValTypeIsNone(cv.valType)) { - colVal = COL_VAL_NONE(pCol->colId, pCol->type); + colVal.flag = CV_FLAG_NONE; } else if (tdValTypeIsNull(cv.valType)) { - colVal = COL_VAL_NULL(pCol->colId, pCol->type); + colVal.flag = CV_FLAG_NULL; } else { - colVal.cid = pCol->colId; - colVal.type = pCol->type; colVal.flag = CV_FLAG_VALUE; if (IS_VAR_DATA_TYPE(pCol->type)) { From 4afd45992a1b7a68834db76aac23bbc7f7ff055e Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 09:30:33 +0800 Subject: [PATCH 104/107] fix: sysinfo of dnode variables --- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 4 ++-- tests/script/tsim/user/privilege_sysinfo.sim | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index fa59f56496..aa5e87e8b1 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -360,12 +360,12 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) { terrno = TSDB_CODE_INVALID_MSG; return -1; } - +#if 0 if (strcmp(retrieveReq.user, TSDB_DEFAULT_USER) != 0) { terrno = TSDB_CODE_MND_NO_RIGHTS; return -1; } - +#endif if (strcasecmp(retrieveReq.tb, TSDB_INS_TABLE_DNODE_VARIABLES)) { terrno = TSDB_CODE_INVALID_MSG; return -1; diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index cf87f63b8c..f193e375d9 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -236,7 +236,7 @@ sql show create table d2.stb2; sql show create table d2.ctb2; sql show create table d2.ntb2; sql show local variables; -sql_error show dnode 1 variables; +sql show dnode 1 variables; sql show variables; @@ -269,7 +269,7 @@ sql select * from information_schema.ins_grants_logs sql select * from information_schema.ins_machines sql select * from information_schema.ins_vgroups sql select * from information_schema.ins_configs -sql_error select * from information_schema.ins_dnode_variables +sql select * from information_schema.ins_dnode_variables print =============== check performance_schema of sysinfo 1 sql use performance_schema; From 12ef8897bf28c15f2b1ccb860b32dfa20e4fbe32 Mon Sep 17 00:00:00 2001 From: kailixu Date: Mon, 26 Feb 2024 09:39:45 +0800 Subject: [PATCH 105/107] enh: remove obsolote code --- source/common/src/trow.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source/common/src/trow.c b/source/common/src/trow.c index 6a6758f834..6e9278c630 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -1089,7 +1089,6 @@ int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColVal) { STColumn *pTColumn = &pTSchema->columns[iCol]; SCellVal cv = {0}; - // SValue value = {0}; ASSERT((pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID) || (iCol > 0)); From 6e891b01450c7d3902eb7005f6c1e8d6ad332a23 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 26 Feb 2024 10:22:34 +0800 Subject: [PATCH 106/107] fix(stream): add into buffer before start the create stream trans. --- source/dnode/mnode/impl/src/mndStream.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 56adfa9072..8da56d2d46 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -721,6 +721,11 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) { goto _OVER; } + taosThreadMutexLock(&execInfo.lock); + mDebug("stream stream:%s tasks register into node list", createReq.name); + saveStreamTasksInfo(&streamObj, &execInfo); + taosThreadMutexUnlock(&execInfo.lock); + // execute creation if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -730,12 +735,6 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) { mndTransDrop(pTrans); - taosThreadMutexLock(&execInfo.lock); - - mDebug("stream tasks register into node list"); - saveStreamTasksInfo(&streamObj, &execInfo); - taosThreadMutexUnlock(&execInfo.lock); - SName dbname = {0}; tNameFromString(&dbname, createReq.sourceDB, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); From 5c4f0ae053af2c84d2c0f51aedbd06ee0280ab97 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Mon, 26 Feb 2024 09:54:39 +0800 Subject: [PATCH 107/107] set max delay info --- source/libs/executor/src/streamcountwindowoperator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/streamcountwindowoperator.c b/source/libs/executor/src/streamcountwindowoperator.c index 93bff984d3..f9c7b51316 100644 --- a/source/libs/executor/src/streamcountwindowoperator.c +++ b/source/libs/executor/src/streamcountwindowoperator.c @@ -438,7 +438,7 @@ void doResetCountWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock) { pCur = pAggSup->stateStore.streamStateSessionSeekKeyCurrentNext(pAggSup->pState, &key); } while (1) { - SSessionKey tmpKey = {0}; + SSessionKey tmpKey = {.groupId = gpDatas[i], .win.skey = INT64_MIN, .win.ekey = INT64_MIN}; int32_t code = pAggSup->stateStore.streamStateSessionGetKVByCur(pCur, &tmpKey, (void **)&pPos, &size); if (code != TSDB_CODE_SUCCESS || tmpKey.win.skey > endDatas[i]) { pAggSup->stateStore.streamStateFreeCur(pCur);