Fix timebucket conversion issue (#5014)

This commit is contained in:
Daming 2020-07-02 22:05:03 +08:00 committed by GitHub
parent 00619a9a3d
commit d264f914d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 5 deletions

View File

@ -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();
}

View File

@ -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));
}
}

View File

@ -79,8 +79,8 @@ public class AggregationQuery implements IAggregationQueryDAO {
});
}
final SelectSubQueryImpl<SelectQueryImpl> 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);

View File

@ -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<QueryResult.Series> seriesList = client.queryForSeries(queryWhereQuery);