From d264f914d57ebef3be14c6885739c57c7106ad65 Mon Sep 17 00:00:00 2001 From: Daming Date: Thu, 2 Jul 2020 22:05:03 +0800 Subject: [PATCH] Fix timebucket conversion issue (#5014) --- .../oap/server/core/analysis/TimeBucket.java | 4 +- .../server/core/analysis/TimeBucketTest.java | 80 +++++++++++++++++++ .../influxdb/query/AggregationQuery.java | 4 +- .../plugin/influxdb/query/MetricsQuery.java | 4 +- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java 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 59ea7c48c..3694546e9 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 @@ -104,6 +104,7 @@ public class TimeBucket { public static long getTimestamp(long timeBucket, DownSampling downsampling) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(0); + switch (downsampling) { case Second: calendar.set(Calendar.SECOND, (int) (timeBucket % 100)); @@ -117,11 +118,12 @@ public class TimeBucket { case Day: calendar.set(Calendar.DAY_OF_MONTH, (int) (timeBucket % 100)); timeBucket /= 100; + calendar.set(Calendar.MONTH, (int) (timeBucket % 100) - 1); + calendar.set(Calendar.YEAR, (int) (timeBucket / 100)); break; default: throw new UnexpectedException("Unknown downsampling value."); } - return calendar.getTimeInMillis(); } 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 new file mode 100644 index 000000000..201d4368e --- /dev/null +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/TimeBucketTest.java @@ -0,0 +1,80 @@ +/* + * 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.skywalking.oap.server.core.analysis; + +import java.util.concurrent.TimeUnit; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import static java.util.concurrent.TimeUnit.DAYS; +import static java.util.concurrent.TimeUnit.HOURS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; + +@RunWith(Parameterized.class) +public class TimeBucketTest { + private static final long NOW = System.currentTimeMillis(); + + @Parameterized.Parameters + public static Object[][] parameters() { + return new Object[][] { + { + DownSampling.Second, + SECONDS, + MILLISECONDS.toSeconds(NOW) + }, + { + DownSampling.Minute, + MINUTES, + MILLISECONDS.toMinutes(NOW) + }, + { + DownSampling.Hour, + HOURS, + MILLISECONDS.toHours(NOW) + }, + { + DownSampling.Day, + DAYS, + MILLISECONDS.toDays(NOW) + }, + }; + } + + private DownSampling downSampling; + private TimeUnit unit; + private long time; + + public TimeBucketTest(DownSampling downSampling, TimeUnit unit, long time) { + this.downSampling = downSampling; + this.unit = unit; + this.time = time; + } + + @Test + public void testConversion() { + long timestamp = TimeBucket + .getTimestamp(TimeBucket.getTimeBucket(NOW, downSampling)); + Assert.assertEquals(timestamp, unit.toMillis(time)); + } + +} diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/AggregationQuery.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/AggregationQuery.java index cdd94f41f..bce8bdc53 100644 --- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/AggregationQuery.java +++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/AggregationQuery.java @@ -79,8 +79,8 @@ public class AggregationQuery implements IAggregationQueryDAO { }); } final SelectSubQueryImpl subQuery = where - .and(gte(InfluxClient.TIME, InfluxClient.timeInterval(duration.getStartTimeBucket()))) - .and(lte(InfluxClient.TIME, InfluxClient.timeInterval(duration.getEndTimeBucket()))) + .and(gte(InfluxClient.TIME, duration.getStartTimestamp())) + .and(lte(InfluxClient.TIME, duration.getEndTimestamp())) .groupBy(InfluxConstants.TagName.ENTITY_ID); query.setSubQuery(subQuery); diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java index b45749dfa..dc8842aa8 100644 --- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java +++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/MetricsQuery.java @@ -82,8 +82,8 @@ public class MetricsQuery implements IMetricsQueryDAO { } queryWhereQuery - .and(gte(InfluxClient.TIME, InfluxClient.timeInterval(duration.getStartTimeBucket()))) - .and(lte(InfluxClient.TIME, InfluxClient.timeInterval(duration.getEndTimeBucket()))) + .and(gte(InfluxClient.TIME, duration.getStartTimestamp())) + .and(lte(InfluxClient.TIME, duration.getEndTimestamp())) .groupBy(InfluxConstants.TagName.ENTITY_ID); List seriesList = client.queryForSeries(queryWhereQuery);