This is an automated email from the ASF dual-hosted git repository.
yinyijun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 2f5cfa9d5d [improve] VM write request sets up gzip compression and
adds saveData unit tests (#3595)
2f5cfa9d5d is described below
commit 2f5cfa9d5d0230d557f9523aa3f50cf8e4279405
Author: Cyanty <[email protected]>
AuthorDate: Thu Jul 24 19:18:17 2025 +0800
[improve] VM write request sets up gzip compression and adds saveData unit
tests (#3595)
Co-authored-by: Calvin <[email protected]>
Co-authored-by: Sherlock Yin <[email protected]>
---
.../src/main/resources/application-test.yml | 94 ++++++++-
.../src/main/resources/application.yml | 2 +
.../tsdb/vm/VictoriaMetricsDataStorage.java | 27 ++-
.../history/tsdb/vm/VictoriaMetricsProperties.java | 12 +-
.../tsdb/vm/VictoriaMetricsDataStorageTest.java | 221 +++++++++++++++++++++
.../tsdb/vm/VictoriaMetricsPropertiesTest.java | 61 ++++++
.../conf/application.yml | 2 +
.../conf/application.yml | 2 +
8 files changed, 412 insertions(+), 9 deletions(-)
diff --git a/hertzbeat-manager/src/main/resources/application-test.yml
b/hertzbeat-manager/src/main/resources/application-test.yml
index fc32e324b3..bd76e9d932 100644
--- a/hertzbeat-manager/src/main/resources/application-test.yml
+++ b/hertzbeat-manager/src/main/resources/application-test.yml
@@ -22,6 +22,7 @@ spring:
url: jdbc:h2:./data/test;MODE=MYSQL
hikari:
max-lifetime: 120000
+
jpa:
show-sql: false
database-platform: org.eclipse.persistence.platform.database.MySQLPlatform
@@ -30,8 +31,10 @@ spring:
eclipselink:
logging:
level: SEVERE
+
flyway:
enabled: false
+
mail:
host: smtp.exmail.qq.com
username: [email protected]
@@ -55,26 +58,57 @@ warehouse:
jpa:
enabled: true
expire-time: 1h
+ max-history-record-num: 6000
victoria-metrics:
enabled: false
url: http://localhost:8428
username: root
password: root
insert:
- buffer-size: 1000
+ buffer-size: 100
flush-interval: 3
+ compression:
+ enabled: false
+ cluster:
+ enabled: false
+ select:
+ url: http://localhost:8481
+ username: root
+ password: root
+ insert:
+ url: http://localhost:8480
+ username: root
+ password: root
+ buffer-size: 1000
+ flush-interval: 3
td-engine:
enabled: false
driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
url: jdbc:TAOS-RS://127.0.0.1:6041/hertzbeat
username: root
password: taosdata
+ greptime:
+ enabled: false
+ grpc-endpoints: localhost:4001
+ http-endpoint: http://localhost:4000
+ database: public
+ username: greptime
+ password: greptime
iot-db:
enabled: false
host: 127.0.0.1
rpc-port: 6667
username: root
password: root
+ query-timeout-in-ms: -1
+ expire-time: '7776000000'
+ influxdb:
+ enabled: false
+ server-url: http://127.0.0.1:8086
+ username: root
+ password: root
+ expire-time: '30d'
+ replication: 1
# store real-time metrics data, enable only one below
real-time:
memory:
@@ -92,6 +126,58 @@ warehouse:
# redis db index, default: DB0
db: 0
+alerter:
+ # custom console url
+ console-url: https://console.tancloud.io
+ # we work
+ we-work-webhook-url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=
+ # ding ding talk
+ ding-talk-webhook-url: https://oapi.dingtalk.com/robot/send?access_token=
+ # fei shu fly book
+ fly-book-webhook-url: https://open.feishu.cn/open-apis/bot/v2/hook/
+ # telegram
+ telegram-webhook-url: https://api.telegram.org/bot%s/sendMessage
+ # discord
+ discord-webhook-url: https://discord.com/api/v9/channels/%s/messages
+ # serverChan
+ server-chan-webhook-url: https://sctapi.ftqq.com/%s.send
+ # gotify
+ gotify-webhook-url: http://127.0.0.1/message?token=%s
+ # alert inhibit ttl unit ms, default 14400000(4 hours)
+ inhibit:
+ ttl: 14400000
+ sms:
+ enable: false
+ type: tencent
+ tencent:
+ secret-id:
+ secret-key:
+ app-id:
+ sign-name:
+ template-id:
+ alibaba:
+ access-key-id:
+ access-key-secret:
+ sign-name:
+ template-code:
+ unisms:
+ # auth-mode: simple or hmac
+ auth-mode: simple
+ access-key-id: YOUR_ACCESS_KEY_ID
+ # hmac mode need to fill in access-key-secret
+ access-key-secret: YOUR_ACCESS_KEY_SECRET
+ signature: YOUR_SMS_SIGNATURE
+ template-id: YOUR_TEMPLATE_ID
+ smslocal:
+ api-key: YOUR_API_KEY_HERE
+ aws:
+ access-key-id: YOUR_ACCESS_KEY_ID
+ access-key-secret: YOUR_ACCESS_KEY_SECRET
+ region: AWS_REGION_FOR_END_USER_MESSAGING
+ twilio:
+ account-sid: YOUR_ACCOUNT_SID
+ auth-token: YOUR_AUTH_TOKEN
+ twilio-phone-number: YOUR_TWILIO_PHONE_NUMBER
scheduler:
server:
enabled: true
@@ -100,13 +186,13 @@ scheduler:
grafana:
enabled: false
url: http://127.0.0.1:3000
+ expose-url: http://127.0.0.1:3000
username: admin
password: admin
-# AI config
# See the documentation for details :
https://hertzbeat.apache.org/zh-cn/docs/help/aiConfig
ai:
- # AI Type:zhiPu、alibabaAi、kimiAi、sparkDesk
+ # AI Type:zhiPu、alibabaAi、kimiAi、sparkDesk、ollama、openRouter
type:
# Model name:glm-4、qwen-turboo、moonshot-v1-8k、generalv3.5
model:
@@ -114,3 +200,5 @@ ai:
api-key:
#At present, only IFLYTEK large model needs to be filled in
api-secret:
+ # The URL of the ollama AI service
+ api-url:
diff --git a/hertzbeat-manager/src/main/resources/application.yml
b/hertzbeat-manager/src/main/resources/application.yml
index dcd30990fb..69027e88a6 100644
--- a/hertzbeat-manager/src/main/resources/application.yml
+++ b/hertzbeat-manager/src/main/resources/application.yml
@@ -140,6 +140,8 @@ warehouse:
insert:
buffer-size: 100
flush-interval: 3
+ compression:
+ enabled: false
cluster:
enabled: false
select:
diff --git
a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorage.java
b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorage.java
index 59e504c51e..afd38cbabb 100644
---
a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorage.java
+++
b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorage.java
@@ -17,6 +17,7 @@
package org.apache.hertzbeat.warehouse.store.history.tsdb.vm;
+import java.io.ByteArrayOutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URI;
@@ -35,6 +36,7 @@ import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
+import java.util.zip.GZIPOutputStream;
import com.google.common.collect.Maps;
import lombok.AllArgsConstructor;
@@ -113,8 +115,8 @@ public class VictoriaMetricsDataStorage extends
AbstractHistoryDataStorage {
this.restTemplate = restTemplate;
victoriaMetricsProp = victoriaMetricsProperties;
serverAvailable = checkVictoriaMetricsDatasourceAvailable();
- serverAvailable = checkVictoriaMetricsDatasourceAvailable();
- insertConfig = victoriaMetricsProperties.insert() == null ? new
VictoriaMetricsProperties.InsertConfig(100, 3) :
victoriaMetricsProperties.insert();
+ insertConfig = victoriaMetricsProperties.insert() == null ? new
VictoriaMetricsProperties.InsertConfig(100, 3,
+ new VictoriaMetricsProperties.Compression(false)) :
victoriaMetricsProperties.insert();
metricsBufferQueue = new
LinkedBlockingQueue<>(insertConfig.bufferSize());
initializeFlushTimer();
}
@@ -605,6 +607,7 @@ public class VictoriaMetricsDataStorage extends
AbstractHistoryDataStorage {
}
if (metricsFlushTimer != null && !metricsFlushTimer.isStop()) {
metricsFlushTimer.newTimeout(this,
insertConfig.flushInterval(), TimeUnit.SECONDS);
+ log.debug("[Victoria Metrics] Rescheduled next flush task
in {} seconds.", insertConfig.flushInterval());
}
} catch (Exception e) {
log.error("[VictoriaMetrics] flush task error: {}",
e.getMessage(), e);
@@ -625,11 +628,29 @@ public class VictoriaMetricsDataStorage extends
AbstractHistoryDataStorage {
String encodedAuth = Base64Util.encode(authStr);
headers.add(HttpHeaders.AUTHORIZATION, NetworkConstants.BASIC
+ SignConstants.BLANK + encodedAuth);
}
+
StringBuilder stringBuilder = new StringBuilder();
for (VictoriaMetricsContent content : contentList) {
stringBuilder.append(JsonUtil.toJson(content)).append("\n");
}
- HttpEntity<String> httpEntity = new
HttpEntity<>(stringBuilder.toString(), headers);
+ String payload = stringBuilder.toString();
+
+ Object httpEntity;
+ if (insertConfig.compression().enabled()) {
+ // enable compression
+ headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
+ // compress the payload using gzip
+ try (ByteArrayOutputStream bos = new
ByteArrayOutputStream(payload.length());
+ GZIPOutputStream gzip = new GZIPOutputStream(bos)) {
+ gzip.write(payload.getBytes(StandardCharsets.UTF_8));
+ // finishes writing compressed data before the gzip stream
is closed.
+ gzip.finish();
+ httpEntity = new HttpEntity<>(bos.toByteArray(), headers);
+ }
+ } else {
+ httpEntity = new HttpEntity<>(payload, headers);
+ }
+
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(victoriaMetricsProp.url() + IMPORT_PATH,
httpEntity, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
diff --git
a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsProperties.java
b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsProperties.java
index 42e7571000..dccb01ca03 100644
---
a/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsProperties.java
+++
b/hertzbeat-warehouse/src/main/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsProperties.java
@@ -26,8 +26,11 @@ import
org.springframework.boot.context.properties.bind.DefaultValue;
/**
* Victoria metrics configuration information.
*/
-
-@ConfigurationProperties(prefix =
ConfigConstants.FunctionModuleConstants.WAREHOUSE + SignConstants.DOT +
WarehouseConstants.STORE + SignConstants.DOT +
WarehouseConstants.HistoryName.VM)
+@ConfigurationProperties(prefix =
ConfigConstants.FunctionModuleConstants.WAREHOUSE
+ + SignConstants.DOT
+ + WarehouseConstants.STORE
+ + SignConstants.DOT
+ + WarehouseConstants.HistoryName.VM)
public record VictoriaMetricsProperties(@DefaultValue("false") boolean enabled,
@DefaultValue("http://localhost:8428")
String url,
String username,
@@ -35,7 +38,10 @@ public record
VictoriaMetricsProperties(@DefaultValue("false") boolean enabled,
InsertConfig insert) {
record InsertConfig(@DefaultValue("100") int bufferSize,
- @DefaultValue("3") int flushInterval) {
+ @DefaultValue("3") int flushInterval,
+ Compression compression) {
+ }
+ record Compression(@DefaultValue("false") boolean enabled) {
}
}
diff --git
a/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorageTest.java
b/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorageTest.java
new file mode 100644
index 0000000000..37957499e2
--- /dev/null
+++
b/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsDataStorageTest.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.hertzbeat.warehouse.store.history.tsdb.vm;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.startsWith;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.times;
+
+import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
+import org.apache.arrow.vector.types.pojo.FieldType;
+import org.apache.hertzbeat.common.constants.CommonConstants;
+import org.apache.hertzbeat.common.constants.MetricDataConstants;
+import org.apache.hertzbeat.common.entity.arrow.ArrowCell;
+import org.apache.hertzbeat.common.entity.arrow.RowWrapper;
+import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.awaitility.Awaitility;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test case for {@link VictoriaMetricsDataStorage}
+ */
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class VictoriaMetricsDataStorageTest {
+
+ @Mock
+ private VictoriaMetricsProperties victoriaMetricsProperties;
+
+ @Mock
+ private RestTemplate restTemplate;
+
+ @Mock
+ private ResponseEntity<String> responseEntity;
+
+ private VictoriaMetricsDataStorage victoriaMetricsDataStorage;
+
+ @BeforeEach
+ void setUp() {
+ when(victoriaMetricsProperties.enabled()).thenReturn(true);
+
when(victoriaMetricsProperties.url()).thenReturn("http://localhost:8428");
+ when(victoriaMetricsProperties.username()).thenReturn("root");
+ when(victoriaMetricsProperties.password()).thenReturn("root");
+ // on successful write, VictoriaMetrics returns HTTP 204 (No Content)
+ when(responseEntity.getStatusCode()).thenReturn(HttpStatus.NO_CONTENT);
+ when(restTemplate.exchange(anyString(), eq(HttpMethod.GET),
any(HttpEntity.class), eq(String.class)))
+ .thenReturn(responseEntity);
+ when(restTemplate.postForEntity(anyString(), any(HttpEntity.class),
eq(String.class)))
+ .thenReturn(responseEntity);
+ }
+
+ @Test
+ void testSaveDataInitialization() {
+ // using the default insertion policy, schedule a task once upon
object instantiation (with second-level time granularity)
+ victoriaMetricsDataStorage = new
VictoriaMetricsDataStorage(victoriaMetricsProperties, restTemplate);
+ // execute one-time data insertion
+ victoriaMetricsDataStorage.saveData(generateMockedMetricsData());
+ // wait for the timer's first insertion task execution and verify if
it was called once
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() ->
+ verify(restTemplate, times(1)).postForEntity(
+ startsWith(victoriaMetricsProperties.url()),
+ any(HttpEntity.class),
+ eq(String.class)
+ )
+ );
+ }
+
+ @Test
+ void testSaveDataBySize() {
+ // verify insert process for buffer size, with the flush interval
defined as an unreachable state
+ when(victoriaMetricsProperties.insert()).thenReturn(new
VictoriaMetricsProperties.InsertConfig(
+ 10, Integer.MAX_VALUE, new
VictoriaMetricsProperties.Compression(false)));
+ victoriaMetricsDataStorage = new
VictoriaMetricsDataStorage(victoriaMetricsProperties, restTemplate);
+
+ victoriaMetricsDataStorage.saveData(generateMockedMetricsData());
+ // wait for the timer to execute its first insertion task
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() ->
+ verify(restTemplate, times(1)).postForEntity(
+ startsWith(victoriaMetricsProperties.url()),
+ any(HttpEntity.class),
+ eq(String.class)
+ )
+ );
+
+ // triggers the buffer size insertion condition
+ for (int i = 0; i < 10 * 0.8; i++) {
+ victoriaMetricsDataStorage.saveData(generateMockedMetricsData());
+ }
+ // wait for the timer to execute the task again
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() ->
+ verify(restTemplate, times(2)).postForEntity(
+ startsWith(victoriaMetricsProperties.url()),
+ any(HttpEntity.class),
+ eq(String.class)
+ )
+ );
+ }
+
+ @Test
+ void testSaveDataByTime() {
+ // verify insert process for flush interval and set the buffer size to
an unreachable state
+ when(victoriaMetricsProperties.insert()).thenReturn(new
VictoriaMetricsProperties.InsertConfig(
+ 10000, 2, new VictoriaMetricsProperties.Compression(false)));
+ victoriaMetricsDataStorage = new
VictoriaMetricsDataStorage(victoriaMetricsProperties, restTemplate);
+
+ victoriaMetricsDataStorage.saveData(generateMockedMetricsData());
+ // wait for the timer to execute its first insertion task
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() ->
+ verify(restTemplate, times(1)).postForEntity(
+ startsWith(victoriaMetricsProperties.url()),
+ any(HttpEntity.class),
+ eq(String.class)
+ )
+ );
+
+ victoriaMetricsDataStorage.saveData(generateMockedMetricsData());
+ // wait for the flush interval to be triggered
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() ->
+ verify(restTemplate, times(2)).postForEntity(
+ startsWith(victoriaMetricsProperties.url()),
+ any(),
+ eq(String.class)
+ ));
+ }
+
+ @AfterEach
+ void stop() {
+ if (victoriaMetricsDataStorage != null) {
+ victoriaMetricsDataStorage.destroy();
+ }
+ }
+
+ // for historical data insertion (which mandates preparatory steps),
instantiate a mock MetricsData object
+ public static CollectRep.MetricsData generateMockedMetricsData() {
+ CollectRep.MetricsData mockMetricsData =
Mockito.mock(CollectRep.MetricsData.class);
+
+ when(mockMetricsData.getId()).thenReturn(0L);
+ when(mockMetricsData.getMetrics()).thenReturn("cpu");
+ when(mockMetricsData.getTime()).thenReturn(System.currentTimeMillis());
+ when(mockMetricsData.getCode()).thenReturn(CollectRep.Code.SUCCESS);
+ when(mockMetricsData.getApp()).thenReturn("app");
+
+ CollectRep.ValueRow mockValueRow =
Mockito.mock(CollectRep.ValueRow.class);
+ List<String> columnValues = List.of("server-test-01", "68.7");
+ when(mockValueRow.getColumnsList()).thenReturn(columnValues);
+ when(mockValueRow.getColumns(0)).thenReturn("server-test-01");
+ when(mockValueRow.getColumns(1)).thenReturn("68.7");
+ List<CollectRep.ValueRow> mockValueRowsList = List.of(mockValueRow);
+ when(mockMetricsData.getValues()).thenReturn(mockValueRowsList);
+
+ CollectRep.Field instanceField = Mockito.mock(CollectRep.Field.class);
+ when(instanceField.getName()).thenReturn("instance");
+ CollectRep.Field usageField = Mockito.mock(CollectRep.Field.class);
+ when(usageField.getName()).thenReturn("usage");
+ CollectRep.Field systemField = Mockito.mock(CollectRep.Field.class);
+ when(systemField.getName()).thenReturn("system");
+ List<CollectRep.Field> mockFields = List.of(instanceField, usageField,
systemField);
+ when(mockMetricsData.getFields()).thenReturn(mockFields);
+
+ ArrowType instanceArrowType = new ArrowType.Utf8();
+ FieldType instanceFieldType = new FieldType(true, instanceArrowType,
null, null);
+ Field instanceRealField = new Field("instance", instanceFieldType,
null);
+ ArrowCell instanceCell = Mockito.mock(ArrowCell.class);
+ when(instanceCell.getField()).thenReturn(instanceRealField);
+ when(instanceCell.getValue()).thenReturn("server-test-01");
+
when(instanceCell.getMetadataAsBoolean(MetricDataConstants.LABEL)).thenReturn(true);
+
when(instanceCell.getMetadataAsByte(MetricDataConstants.TYPE)).thenReturn(CommonConstants.TYPE_STRING);
+
+ ArrowCell usageCell = Mockito.mock(ArrowCell.class);
+ when(usageCell.getField()).thenReturn(instanceRealField);
+ when(usageCell.getValue()).thenReturn("68.7");
+
when(usageCell.getMetadataAsBoolean(MetricDataConstants.LABEL)).thenReturn(false);
+
when(usageCell.getMetadataAsByte(MetricDataConstants.TYPE)).thenReturn(CommonConstants.TYPE_NUMBER);
+ List<ArrowCell> mockCells = List.of(instanceCell, usageCell);
+
+ RowWrapper mockRowWrapper = Mockito.mock(RowWrapper.class);
+ when(mockRowWrapper.hasNextRow()).thenReturn(true).thenReturn(false);
+ when(mockRowWrapper.nextRow()).thenReturn(mockRowWrapper);
+ when(mockRowWrapper.cellStream()).thenAnswer(invocation ->
mockCells.stream());
+ when(mockMetricsData.readRow()).thenReturn(mockRowWrapper);
+ return mockMetricsData;
+ }
+
+}
diff --git
a/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsPropertiesTest.java
b/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsPropertiesTest.java
new file mode 100644
index 0000000000..1ad1873966
--- /dev/null
+++
b/hertzbeat-warehouse/src/test/java/org/apache/hertzbeat/warehouse/store/history/tsdb/vm/VictoriaMetricsPropertiesTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.hertzbeat.warehouse.store.history.tsdb.vm;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import
org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * Test case for {@link VictoriaMetricsProperties}
+ */
+@EnableConfigurationProperties(value = VictoriaMetricsProperties.class)
+@SpringBootTest(
+ classes = VictoriaMetricsPropertiesTest.class,
+ properties = {
+ "warehouse.store.victoria-metrics.enabled=true",
+ "warehouse.store.victoria-metrics.username=test_user",
+ "warehouse.store.victoria-metrics.insert.buffer-size=999",
+
"warehouse.store.victoria-metrics.insert.compression.enabled=true"
+ }
+)
+class VictoriaMetricsPropertiesTest {
+
+ @Autowired
+ private VictoriaMetricsProperties properties;
+
+ @Test
+ void propertiesShouldBeInjectedAndCorrectlyBound() {
+ assertThat(properties).isNotNull();
+ assertThat(properties.enabled()).isTrue();
+ // url not configured, default value injected
+ assertThat(properties.url()).isEqualTo("http://localhost:8428");
+ assertThat(properties.username()).isEqualTo("test_user");
+ // password not configured, null injected
+ assertThat(properties.password()).isNull();
+ assertThat(properties.insert()).isNotNull();
+ assertThat(properties.insert().bufferSize()).isEqualTo(999);
+ // flush-interval not configured, default value is 3
+ assertThat(properties.insert().flushInterval()).isEqualTo(3);
+ assertThat(properties.insert().compression()).isNotNull();
+ assertThat(properties.insert().compression().enabled()).isTrue();
+ }
+
+}
diff --git
a/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml
b/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml
index 11b132a7d0..d009cd1a70 100644
---
a/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml
+++
b/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml
@@ -128,6 +128,8 @@ warehouse:
insert:
buffer-size: 100
flush-interval: 3
+ compression:
+ enabled: false
# store real-time metrics data, enable only one below
real-time:
memory:
diff --git
a/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml
b/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml
index f608fc2c5f..14601a6ad5 100644
---
a/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml
+++
b/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml
@@ -127,6 +127,8 @@ warehouse:
insert:
buffer-size: 100
flush-interval: 3
+ compression:
+ enabled: false
# store real-time metrics data, enable only one below
real-time:
memory:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]