This is an automated email from the ASF dual-hosted git repository.
zhaoqingran pushed a commit to branch doris
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/doris by this push:
new d3e783f7a ```fix(doris): create database if not exists and optimize
query SQLChange DorisDataStorage to use "CREATE DATABASE IF NOT EXISTS" syntax
for idempotent database creation. Optimize history data querying by adding
'metrics = %s' condition to SQL queries to avoid scanning all metrics and
improve performance. Streamline instance value retrieval in
getHistoryIntervalMetricData by checking for empty JSON strings. Enhance code
maintainability by refactoring SQL query construct [...]
d3e783f7a is described below
commit d3e783f7aef693ee09ef6f88ead9f63e40e46e13
Author: zqr10159 <[email protected]>
AuthorDate: Wed Aug 28 17:25:15 2024 +0800
```fix(doris): create database if not exists and optimize query SQLChange
DorisDataStorage to use "CREATE DATABASE IF NOT EXISTS" syntax for idempotent
database creation.
Optimize history data querying by adding 'metrics = %s' condition to SQL
queries to avoid
scanning all metrics and improve performance. Streamline instance value
retrieval in
getHistoryIntervalMetricData by checking for empty JSON strings. Enhance
code maintainability
by refactoring SQL query construction and database connection management
using HikariCP
more effectively.
```
---
.../store/history/doris/DorisDataStorage.java | 64 ++++++++++------------
1 file changed, 28 insertions(+), 36 deletions(-)
diff --git
a/warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/doris/DorisDataStorage.java
b/warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/doris/DorisDataStorage.java
index 150926697..99793885a 100644
---
a/warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/doris/DorisDataStorage.java
+++
b/warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/doris/DorisDataStorage.java
@@ -18,10 +18,12 @@
package org.apache.hertzbeat.warehouse.store.history.doris;
+import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Connection;
+import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -49,7 +51,7 @@ import org.springframework.stereotype.Component;
@ConditionalOnProperty(prefix = "warehouse.store.doris", name = "enabled",
havingValue = "true")
@Slf4j
public class DorisDataStorage extends AbstractHistoryDataStorage {
- private final static String CREATE_DATABASE_SQL = "CREATE DATABASE %s;";
+ private final static String CREATE_DATABASE_SQL = "CREATE DATABASE IF NOT
EXISTS %s;";
private final static String CREATE_TABLE_SQL = """
CREATE TABLE IF NOT EXISTS %s (
@@ -82,16 +84,16 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
);
""";
- private static final String QUERY_HISTORY_SQL = "SELECT UNIX_TIMESTAMP(ts)
* 1000 as ts, v['%s'], metrics, label FROM %s WHERE ts >= now() - interval %s
and monitor_id = %s order by ts desc;";
+ private static final String QUERY_HISTORY_SQL = "SELECT UNIX_TIMESTAMP(ts)
* 1000 as ts, v['%s'], label FROM %s WHERE ts >= now() - interval %s and
monitor_id = %s and metrics = '%s' order by ts desc;";
- private static final String QUERY_HISTORY_WITH_LABEL_SQL = "SELECT
UNIX_TIMESTAMP(ts) * 1000 as ts, v['%s'], metrics, label FROM %s WHERE ts >=
now() - interval %s and monitor_id = %s and label = '%s' order by ts desc;";
+ private static final String QUERY_HISTORY_WITH_LABEL_SQL = "SELECT
UNIX_TIMESTAMP(ts) * 1000 as ts, v['%s'], label FROM %s WHERE ts >= now() -
interval %s and monitor_id = %s and label = '%s' and metrics = '%s' order by ts
desc;";
private static final String QUERY_INSTANCE_SQL = "SELECT DISTINCT label
FROM %s WHERE ts >= now() - interval 1 WEEK and metrics = '%s';";
private static final String QUERY_HISTORY_INTERVAL_WITH_INSTANCE_SQL = """
- WITH base_data AS (
+ WITH data AS (
SELECT
- UNIX_TIMESTAMP(ts) * 1000 asts,
+ CAST(UNIX_TIMESTAMP(ts) * 1000 as bigint) as ts,
CAST(v['%s'] AS DOUBLE) AS value
FROM
%s
@@ -106,7 +108,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
value,
FIRST_VALUE(value) OVER (ORDER BY ts ASC) AS first
FROM
- base_data
+ data
)
SELECT
MIN(ts) AS first_ts,
@@ -116,7 +118,6 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
MAX(value) AS max
FROM
first_value_cte;
-
""";
@@ -131,22 +132,17 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
}
ZoneId systemZoneId = ZoneId.systemDefault();
String zoneIdString = systemZoneId.getId();
- this.hikariDataSource = new HikariDataSource();
- this.hikariDataSource.setJdbcUrl("jdbc:mysql://" +
dorisProperties.host() + ":" + dorisProperties.jdbcPort()
- +
"/mysql?useUnicode=true&characterEncoding=utf8&useTimezone=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone="+zoneIdString);
- this.hikariDataSource.setUsername(dorisProperties.username());
- this.hikariDataSource.setPassword(dorisProperties.password());
- this.hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
- // minimum number of idle connection
- this.hikariDataSource.setMinimumIdle(10);
- // maximum number of connection in the pool
- this.hikariDataSource.setMaximumPoolSize(10);
- // maximum wait milliseconds for get connection from pool
- this.hikariDataSource.setConnectionTimeout(30000);
- // maximum lifetime for each connection
- this.hikariDataSource.setMaxLifetime(0);
- // max idle time for recycle idle connection
- this.hikariDataSource.setIdleTimeout(0);
+ HikariConfig hikariConfig = new HikariConfig();
+ hikariConfig.setJdbcUrl("jdbc:mysql://" + dorisProperties.host() + ":"
+ dorisProperties.jdbcPort()
+ +
"/hertzbeat?useUnicode=true&characterEncoding=utf8&useTimezone=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone="+zoneIdString);
+ hikariConfig.setUsername(dorisProperties.username());
+ hikariConfig.setPassword(dorisProperties.password());
+ hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
+ hikariConfig.setMinimumIdle(2);
+ hikariConfig.setMaximumPoolSize(10);
+ hikariConfig.setIdleTimeout(30000);
+ hikariConfig.setConnectionTimeout(30000);
+ this.hikariDataSource = new HikariDataSource(hikariConfig);
// createDatabase(dorisProperties.database());
this.serverAvailable = true;
if (hikariDataSource.isRunning()) {
@@ -156,7 +152,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
private void createDatabase(String database) {
try (Connection connection = hikariDataSource.getConnection()) {
- connection.prepareStatement(String.format(CREATE_DATABASE_SQL,
database)).executeUpdate();
+
connection.createStatement().execute(String.format(CREATE_DATABASE_SQL,
database));
} catch (SQLException e) {
log.error("[warehouse doris]--Error: {}", e.getMessage(), e);
}
@@ -164,7 +160,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
private void createTable(String tableName) {
try (Connection connection = hikariDataSource.getConnection()) {
- connection.createStatement().execute("USE " +
dorisProperties.database());
+ connection.createStatement().execute("USE
%s;".formatted(dorisProperties.database()));
String createTableSql = String.format(CREATE_TABLE_SQL, tableName,
dorisProperties.expireTime());
connection.createStatement().executeUpdate(createTableSql);
} catch (SQLException e) {
@@ -196,8 +192,8 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
}
String interval = history2interval(history);
- String selectSql = label == null ? String.format(QUERY_HISTORY_SQL,
metric, getTableName(app), interval, monitorId)
- : String.format(QUERY_HISTORY_WITH_LABEL_SQL, metric,
getTableName(app), interval, monitorId, label);
+ String selectSql = label == null ? String.format(QUERY_HISTORY_SQL,
metric, getTableName(app), interval, monitorId, metrics)
+ : String.format(QUERY_HISTORY_WITH_LABEL_SQL, metric,
getTableName(app), interval, monitorId, label, metrics);
try (Connection connection = hikariDataSource.getConnection()) {
connection.createStatement().execute("USE " +
dorisProperties.database());
ResultSet resultSet =
connection.createStatement().executeQuery(selectSql);
@@ -207,7 +203,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
double value = resultSet.getDouble(2);
String strValue = double2decimalString(value);
- String instanceValue = resultSet.getString(4);
+ String instanceValue = resultSet.getString(3);
if (instanceValue == null ||
StringUtils.isBlank(instanceValue)) {
instanceValue = "";
}
@@ -231,6 +227,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
* @param metrics metrics
* @param metric metric
* @param label label
+ *
* @param history history range
* @return metrics data
*/
@@ -252,7 +249,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
ResultSet resultSet = statement.executeQuery(selectSql)) {
while (resultSet.next()) {
String instanceValue = resultSet.getString(1);
- if (instanceValue == null ||
StringUtils.isBlank(instanceValue)) {
+ if (instanceValue == null ||
StringUtils.isBlank(instanceValue) || instanceValue.equals("{}")) {
instances.add("''");
} else {
instances.add(instanceValue);
@@ -264,12 +261,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
}
Map<String, List<Value>> instanceValuesMap = new
HashMap<>(instances.size());
for (String instanceValue : instances) {
- String selectSql =
String.format(QUERY_HISTORY_INTERVAL_WITH_INSTANCE_SQL, metric, table, label,
metric,
- table, instanceValue, history2interval(history));
-
- if (log.isDebugEnabled()) {
- log.debug("[warehouse greptime] getHistoryIntervalMetricData
sql: {}", selectSql);
- }
+ String selectSql =
String.format(QUERY_HISTORY_INTERVAL_WITH_INSTANCE_SQL, metric, table,
instanceValue, metric);
List<Value> values =
instanceValuesMap.computeIfAbsent(instanceValue, k -> new LinkedList<>());
try (Connection connection = hikariDataSource.getConnection();
@@ -290,7 +282,7 @@ public class DorisDataStorage extends
AbstractHistoryDataStorage {
values.add(value);
}
} catch (Exception e) {
- log.error("[warehouse greptime] failed to
getHistoryIntervalMetricData: {}", e.getMessage(), e);
+ log.error("[warehouse doris] failed to
getHistoryIntervalMetricData: {}", e.getMessage(), e);
}
}
return instanceValuesMap;}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]