From 05388945776d81ea97a1c6a4047415addca8600e Mon Sep 17 00:00:00 2001 From: Saramanda9988 <2074730050@qq.com> Date: Tue, 13 Jan 2026 13:53:22 +0800 Subject: [PATCH] fix: fix TAG type mismatch by introducing schema version for TDengine --- .../tsdb/tdengine/TdEngineDataStorage.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/tdengine/TdEngineDataStorage.java b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/tdengine/TdEngineDataStorage.java index b81bc5b4016..85e905f31d9 100644 --- a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/tdengine/TdEngineDataStorage.java +++ b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/tdengine/TdEngineDataStorage.java @@ -68,8 +68,14 @@ public class TdEngineDataStorage extends AbstractHistoryDataStorage { private static final String INSTANCE_NULL = "''"; private static final String CONSTANTS_CREATE_DATABASE = "CREATE DATABASE IF NOT EXISTS %s"; private static final String INSERT_TABLE_DATA_SQL = "INSERT INTO `%s` USING `%s` TAGS (%s) VALUES %s"; - private static final String CREATE_SUPER_TABLE_SQL = "CREATE STABLE IF NOT EXISTS `%s` %s TAGS (monitor BIGINT)"; + private static final String CREATE_SUPER_TABLE_SQL = "CREATE STABLE IF NOT EXISTS `%s` %s TAGS (instance NCHAR(128))"; private static final String NO_SUPER_TABLE_ERROR = "Table does not exist"; + /** + * schema version suffix - increment when TAG definition changes. + * v1: instance BIGINT (original monitorId like 123456789) + * v2: instance NCHAR(128) (supports string instance values like 127.0.0.1:8080) + */ + private static final String SUPER_TABLE_VERSION = "_v2"; private static final String QUERY_HISTORY_WITH_INSTANCE_SQL = "SELECT ts, metric_labels, `%s` FROM `%s` WHERE metric_labels = '%s' AND ts >= now - %s order by ts desc"; @@ -185,7 +191,7 @@ public void saveData(CollectRep.MetricsData metricsData) { String instance = metricsData.getInstance(); String app = metricsData.getApp(); String metrics = metricsData.getMetrics(); - String superTable = getTable(app, metrics, "_super"); + String superTable = getSuperTable(app, metrics); String table = getTable(app, metrics, instance); StringBuilder sqlBuffer = new StringBuilder(); int i = 0; @@ -246,7 +252,7 @@ public void saveData(CollectRep.MetricsData metricsData) { sqlBuffer.append(" ").append(String.format(sqlRowBuffer.toString(), formatStringValue(JsonUtil.toJson(labels)))); } - String insertDataSql = String.format(INSERT_TABLE_DATA_SQL, table, superTable, instance, sqlBuffer); + String insertDataSql = String.format(INSERT_TABLE_DATA_SQL, table, superTable, "'" + formatStringValue(instance) + "'", sqlBuffer); if (log.isDebugEnabled()) { log.debug(insertDataSql); @@ -325,7 +331,12 @@ private static String getTable(String app, String metrics, String instance) { .replace("[", "_") .replace("]", "_"); } - return app + "_" + metrics + "_" + instance; + return app + "_" + metrics + "_" + instance + SUPER_TABLE_VERSION; + } + + @NotNull + private static String getSuperTable(String app, String metrics) { + return app + "_" + metrics + "_super" + SUPER_TABLE_VERSION; } private String formatStringValue(String value) {