This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 641163cf1d BanyanDB: fix storage and query Tag autocomplete data 
(#12432)
641163cf1d is described below

commit 641163cf1d02397c131d1f6c4139e520c1ed7bc6
Author: Wan Kai <[email protected]>
AuthorDate: Thu Jul 11 23:19:07 2024 +0800

    BanyanDB: fix storage and query Tag autocomplete data (#12432)
---
 docs/en/changes/changes.md                         |  1 +
 .../oap/server/core/analysis/TimeBucket.java       | 29 +++++++++++++++++
 .../searchtag/TagAutocompleteDispatcher.java       |  4 ++-
 .../oap/server/core/query/DurationUtils.java       | 30 ++++++++++++++++++
 .../oap/server/core/query/input/Duration.java      |  8 +++++
 .../oap/server/core/analysis/TimeBucketTest.java   | 11 +++++++
 .../oap/server/core/query/DurationTest.java        | 36 ++++++++++++++++++++++
 .../measure/BanyanDBTagAutocompleteQueryDAO.java   | 24 +++++++++------
 .../common/dao/JDBCTagAutoCompleteQueryDAO.java    | 13 ++++----
 .../{autocomplete.yml => autocomplete-keys.yml}    |  5 +--
 .../{autocomplete.yml => autocomplete-value.yml}   |  0
 test/e2e-v2/cases/zipkin/zipkin-cases.yaml         |  4 ++-
 12 files changed, 143 insertions(+), 22 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index ccaf6f1023..f41d34f202 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -30,6 +30,7 @@
 * Support tracing topology query for debugging.
 * Fix expression of graph `Current QPS` in MySQL dashboard.
 * Support tracing logs query for debugging.
+* BanyanDB: fix Tag autocomplete data storage and query.
 
 #### UI
 * Highlight search log keywords.
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/TimeBucket.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/TimeBucket.java
index 8c32c5e29e..dae5271bac 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/TimeBucket.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/TimeBucket.java
@@ -163,4 +163,33 @@ public class TimeBucket {
                 throw new UnexpectedException("Unknown downsampling value.");
         }
     }
+
+    /**
+     * Retain the minute time bucket to day time bucket. The format of 
timeBucket in minute format is "yyyyMMddHHmm", `HHmm` will be set to `0000`.
+     * minuteTimeBucket `202407112218` will be converted to `202407110000`.
+     * @param minuteTimeBucket minuteTimeBucket
+     * @return minute time bucket in day precision
+     */
+    public static long retainToDay4MinuteBucket(long minuteTimeBucket) {
+        if (isMinuteBucket(minuteTimeBucket)) {
+            return minuteTimeBucket / 10000 * 10000;
+        } else {
+            throw new UnexpectedException("Current time bucket is not a minute 
time bucket");
+        }
+    }
+
+    /**
+     * Retain the minute time bucket to day time bucket. The format of 
timeBucket in minute format is "yyyyMMddHHmm", `HHmm` will be set to `2359`.
+     * minuteTimeBucket `202407112218` will be converted to `202407112359`.
+     * @param minuteTimeBucket minuteTimeBucket
+     * @return minute time bucket in day precision
+     */
+    public static long retainToDayLastMin4MinuteBucket(long minuteTimeBucket) {
+        if (isMinuteBucket(minuteTimeBucket)) {
+            return minuteTimeBucket / 10000 * 10000 + 2359;
+        } else {
+            throw new UnexpectedException("Current time bucket is not a minute 
time bucket");
+        }
+    }
 }
+
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/searchtag/TagAutocompleteDispatcher.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/searchtag/TagAutocompleteDispatcher.java
index 7b3e262619..3c73420f44 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/searchtag/TagAutocompleteDispatcher.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/searchtag/TagAutocompleteDispatcher.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.analysis.manual.searchtag;
 
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import 
org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.source.TagAutocomplete;
 
@@ -30,7 +31,8 @@ public class TagAutocompleteDispatcher implements 
SourceDispatcher<TagAutocomple
         autocomplete.setTagKey(source.getTagKey());
         autocomplete.setTagValue(source.getTagValue());
         autocomplete.setTagType(source.getTagType().name());
-        autocomplete.setTimeBucket(source.getTimeBucket());
+        // change the precision in Day for reduce the storage
+        
autocomplete.setTimeBucket(TimeBucket.retainToDay4MinuteBucket(source.getTimeBucket()));
         MetricsStreamProcessor.getInstance().in(autocomplete);
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/DurationUtils.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/DurationUtils.java
index 02a6dda313..b65cb9a40c 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/DurationUtils.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/DurationUtils.java
@@ -85,6 +85,36 @@ public enum DurationUtils {
         throw new UnexpectedException("Unsupported step " + step.name());
     }
 
+    public long startTimeDurationToMinuteTimeBucket(Step step, String dateStr) 
{
+        long minTimeBucket = convertToTimeBucket(step, dateStr);
+        switch (step) {
+            case DAY:
+                return minTimeBucket * 100 * 100;
+            case HOUR:
+                return minTimeBucket * 100;
+            case MINUTE:
+                return minTimeBucket;
+            case SECOND:
+                return minTimeBucket / 100;
+        }
+        throw new UnexpectedException("Unsupported step " + step.name());
+    }
+
+    public long endTimeDurationToMinuteTimeBucket(Step step, String dateStr) {
+        long minTimeBucket = convertToTimeBucket(step, dateStr);
+        switch (step) {
+            case DAY:
+                return (minTimeBucket * 100 + 23) * 100 + 59;
+            case HOUR:
+                return minTimeBucket * 100 + 59;
+            case MINUTE:
+                return minTimeBucket;
+            case SECOND:
+                return minTimeBucket / 100;
+        }
+        throw new UnexpectedException("Unsupported step " + step.name());
+    }
+
     public List<PointOfTime> getDurationPoints(Step step, long 
startTimeBucket, long endTimeBucket) {
         DateTime dateTime = parseToDateTime(step, startTimeBucket);
 
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/Duration.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/Duration.java
index eecbc3a596..9cda596c52 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/Duration.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/Duration.java
@@ -65,6 +65,14 @@ public class Duration {
         return DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(step, 
end);
     }
 
+    public long getStartTimeBucketInMin() {
+        return 
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(step, start);
+    }
+
+    public long getEndTimeBucketInMin() {
+        return DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(step, 
end);
+    }
+
     /**
      * Assemble time point based on {@link #step} and {@link #start} / {@link 
#end}
      */
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java
index 26115eac53..05ea84c218 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.analysis;
 
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
@@ -64,4 +65,14 @@ public class TimeBucketTest {
         }
         Assertions.assertEquals(instance.getTimeInMillis(), timestamp);
     }
+
+    @Test
+    public void testRetainToDay4MinuteBucket() {
+        Assertions.assertEquals(202407110000L, 
TimeBucket.retainToDay4MinuteBucket(202407112218L));
+    }
+
+    @Test
+    public void testRetainToDayLastMin4MinuteBucket() {
+        Assertions.assertEquals(202407112359L, 
TimeBucket.retainToDayLastMin4MinuteBucket(202407112218L));
+    }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/DurationTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/DurationTest.java
index a1fc53af0c..9b421c060c 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/DurationTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/DurationTest.java
@@ -91,4 +91,40 @@ public class DurationTest {
         Assertions.assertTrue(Arrays.asList(20220910L, 20220911L, 20220912L)
                                 
.equals(pointOfTimes.stream().map(PointOfTime::getPoint).collect(Collectors.toList())));
     }
+
+    @Test
+    public void testStartTimeDurationToMinuteTimeBucket() {
+        Assertions.assertEquals(
+            202209080000L, 
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(Step.DAY, 
"2022-09-08"));
+        Assertions.assertEquals(
+            202209081000L, 
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(Step.HOUR, 
"2022-09-08 10"));
+        Assertions.assertEquals(
+            202209081010L, 
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(Step.MINUTE, 
"2022-09-08 1010"));
+        Assertions.assertEquals(
+            202209081010L, 
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(Step.SECOND, 
"2022-09-08 101010"));
+        try {
+            
DurationUtils.INSTANCE.startTimeDurationToMinuteTimeBucket(Step.HOUR, 
"2022-09-08 30");
+            Assertions.fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            Assertions.assertTrue(true);
+        }
+    }
+
+    @Test
+    public void testEndTimeDurationToMinuteTimeBucket() {
+        Assertions.assertEquals(
+            202209082359L, 
DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(Step.DAY, 
"2022-09-08"));
+        Assertions.assertEquals(
+            202209081059L, 
DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(Step.HOUR, "2022-09-08 
10"));
+        Assertions.assertEquals(
+            202209081010L, 
DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(Step.MINUTE, 
"2022-09-08 1010"));
+        Assertions.assertEquals(
+            202209081010L, 
DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(Step.SECOND, 
"2022-09-08 101010"));
+        try {
+            
DurationUtils.INSTANCE.endTimeDurationToMinuteTimeBucket(Step.HOUR, "2022-09-08 
30");
+            Assertions.fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            Assertions.assertTrue(true);
+        }
+    }
 }
diff --git 
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBTagAutocompleteQueryDAO.java
 
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBTagAutocompleteQueryDAO.java
index 9b8e2fa0e7..026925f645 100644
--- 
a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBTagAutocompleteQueryDAO.java
+++ 
b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBTagAutocompleteQueryDAO.java
@@ -54,12 +54,16 @@ public class BanyanDBTagAutocompleteQueryDAO extends 
AbstractBanyanDBDAO impleme
     @Override
     public Set<String> queryTagAutocompleteKeys(TagType tagType, int limit, 
Duration duration) throws IOException {
         MetadataRegistry.Schema schema = 
MetadataRegistry.INSTANCE.findMetadata(TagAutocompleteData.INDEX_NAME, 
DownSampling.Minute);
-        long startTB = 0;
-        long endTB = 0;
+        long startMinTB = 0;
+        long endMinTB = 0;
         if (nonNull(duration)) {
-            startTB = 
TimeBucket.getMinuteTimeBucket(duration.getStartTimestamp());
-            endTB = TimeBucket.getMinuteTimeBucket(duration.getEndTimestamp());
+            startMinTB = duration.getStartTimeBucketInMin();
+            endMinTB = duration.getEndTimeBucketInMin();
         }
+
+        long startTB = TimeBucket.retainToDay4MinuteBucket(startMinTB);
+        long endTB = TimeBucket.retainToDayLastMin4MinuteBucket(endMinTB);
+
         TimestampRange range = null;
         if (startTB > 0 && endTB > 0) {
             range = new TimestampRange(TimeBucket.getTimestamp(startTB), 
TimeBucket.getTimestamp(endTB));
@@ -91,15 +95,15 @@ public class BanyanDBTagAutocompleteQueryDAO extends 
AbstractBanyanDBDAO impleme
     @Override
     public Set<String> queryTagAutocompleteValues(TagType tagType, String 
tagKey, int limit, Duration duration) throws IOException {
         MetadataRegistry.Schema schema = 
MetadataRegistry.INSTANCE.findMetadata(TagAutocompleteData.INDEX_NAME, 
DownSampling.Minute);
-        long startSecondTB = 0;
-        long endSecondTB = 0;
+        long startMinTB = 0;
+        long endMinTB = 0;
         if (nonNull(duration)) {
-            startSecondTB = duration.getStartTimeBucketInSec();
-            endSecondTB = duration.getEndTimeBucketInSec();
+            startMinTB = duration.getStartTimeBucketInMin();
+            endMinTB = duration.getEndTimeBucketInMin();
         }
 
-        long startTB = startSecondTB / 1000000 * 10000;
-        long endTB = endSecondTB / 1000000 * 10000 + 2359;
+        long startTB = TimeBucket.retainToDay4MinuteBucket(startMinTB);
+        long endTB = TimeBucket.retainToDayLastMin4MinuteBucket(endMinTB);
 
         TimestampRange range = null;
         if (startTB > 0 && endTB > 0) {
diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCTagAutoCompleteQueryDAO.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCTagAutoCompleteQueryDAO.java
index 6564e26bdf..f4ddca69f8 100644
--- 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCTagAutoCompleteQueryDAO.java
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCTagAutoCompleteQueryDAO.java
@@ -20,6 +20,7 @@ package 
org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
+import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import 
org.apache.skywalking.oap.server.core.analysis.manual.searchtag.TagAutocompleteData;
 import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.TagType;
 import org.apache.skywalking.oap.server.core.query.input.Duration;
@@ -125,15 +126,15 @@ public class JDBCTagAutoCompleteQueryDAO implements 
ITagAutoCompleteQueryDAO {
                                                 final Duration duration,
                                                 final StringBuilder sql,
                                                 final List<Object> condition) {
-        long startSecondTB = 0;
-        long endSecondTB = 0;
+        long startMinTB = 0;
+        long endMinTB = 0;
         if (nonNull(duration)) {
-            startSecondTB = duration.getStartTimeBucketInSec();
-            endSecondTB = duration.getEndTimeBucketInSec();
+            startMinTB = duration.getStartTimeBucketInMin();
+            endMinTB = duration.getEndTimeBucketInMin();
         }
 
-        long startTB = startSecondTB / 1000000 * 10000;
-        long endTB = endSecondTB / 1000000 * 10000 + 2359;
+        long startTB = TimeBucket.retainToDay4MinuteBucket(startMinTB);
+        long endTB = TimeBucket.retainToDayLastMin4MinuteBucket(endMinTB);
 
         sql.append(" and ");
         sql.append(TagAutocompleteData.TAG_TYPE).append(" = ?");
diff --git a/test/e2e-v2/cases/zipkin/expected/autocomplete.yml 
b/test/e2e-v2/cases/zipkin/expected/autocomplete-keys.yml
similarity index 97%
copy from test/e2e-v2/cases/zipkin/expected/autocomplete.yml
copy to test/e2e-v2/cases/zipkin/expected/autocomplete-keys.yml
index 0b6ed23a7b..29ccb631b1 100644
--- a/test/e2e-v2/cases/zipkin/expected/autocomplete.yml
+++ b/test/e2e-v2/cases/zipkin/expected/autocomplete-keys.yml
@@ -13,7 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-[
-  "GET",
-  "POST"
-]
+["http.method"]
diff --git a/test/e2e-v2/cases/zipkin/expected/autocomplete.yml 
b/test/e2e-v2/cases/zipkin/expected/autocomplete-value.yml
similarity index 100%
rename from test/e2e-v2/cases/zipkin/expected/autocomplete.yml
rename to test/e2e-v2/cases/zipkin/expected/autocomplete-value.yml
diff --git a/test/e2e-v2/cases/zipkin/zipkin-cases.yaml 
b/test/e2e-v2/cases/zipkin/zipkin-cases.yaml
index 995c7e2b3a..2a2c263d8a 100644
--- a/test/e2e-v2/cases/zipkin/zipkin-cases.yaml
+++ b/test/e2e-v2/cases/zipkin/zipkin-cases.yaml
@@ -27,5 +27,7 @@ cases:
   - query: curl 
http://${oap_host}:${oap_9412}/zipkin/api/v2/traces?serviceName=frontend&remoteServiceName=backend&spanName=get&annotationQuery=wr&limit=1
     expected: expected/traces.yml
   # autocomplete
+  - query: curl http://${oap_host}:${oap_9412}/zipkin/api/v2/autocompleteKeys
+    expected: expected/autocomplete-keys.yml
   - query: curl 
http://${oap_host}:${oap_9412}/zipkin/api/v2/autocompleteValues?key=http.method
-    expected: expected/autocomplete.yml
+    expected: expected/autocomplete-value.yml

Reply via email to