From a6d0366c22a666e47742d34cbc0b8a1426f64e9f Mon Sep 17 00:00:00 2001 From: Jared Tan Date: Mon, 16 Dec 2019 22:20:30 +0800 Subject: [PATCH] support min function. (#4072) * support min function. * fix logical bug and update test case. * the same here. --- .../analysis/metrics/MinDoubleMetrics.java | 53 +++++++++++ .../core/analysis/metrics/MinLongMetrics.java | 53 +++++++++++ .../analysis/metrics/MaxLongMetricsTest.java | 4 +- .../analysis/metrics/MinLongMetricsTest.java | 93 +++++++++++++++++++ 4 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetricsTest.java diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java new file mode 100644 index 000000000..349a75d76 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java @@ -0,0 +1,53 @@ +/* + * 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.metrics; + +import lombok.Getter; +import lombok.Setter; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.Entrance; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.MetricsFunction; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.SourceFrom; +import org.apache.skywalking.oap.server.core.storage.annotation.Column; + +/** + * @author jian.tan + */ + +@MetricsFunction(functionName = "minDouble") +public abstract class MinDoubleMetrics extends Metrics implements DoubleValueHolder { + + protected static final String VALUE = "value"; + + @Getter @Setter @Column(columnName = VALUE, isValue = true) private double value = Double.MAX_VALUE; + + @Entrance + public final void combine(@SourceFrom double count) { + if (count < this.value) { + this.value = count; + } + } + + @Override public final void combine(Metrics metrics) { + MinDoubleMetrics minDoubleMetrics = (MinDoubleMetrics)metrics; + combine(minDoubleMetrics.value); + } + + @Override public void calculate() { + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java new file mode 100644 index 000000000..8d370d9e0 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java @@ -0,0 +1,53 @@ +/* + * 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.metrics; + +import lombok.Getter; +import lombok.Setter; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.Entrance; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.MetricsFunction; +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.SourceFrom; +import org.apache.skywalking.oap.server.core.storage.annotation.Column; + +/** + * @author jian.tan + */ + +@MetricsFunction(functionName = "min") +public abstract class MinLongMetrics extends Metrics implements LongValueHolder { + + protected static final String VALUE = "value"; + + @Getter @Setter @Column(columnName = VALUE, isValue = true) private long value = Long.MAX_VALUE; + + @Entrance + public final void combine(@SourceFrom long count) { + if (count < this.value) { + this.value = count; + } + } + + @Override public final void combine(Metrics metrics) { + MinLongMetrics minLongMetrics = (MinLongMetrics)metrics; + combine(minLongMetrics.value); + } + + @Override public void calculate() { + } +} diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java index aa7d467d9..4244687c8 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java @@ -44,8 +44,8 @@ public class MaxLongMetricsTest { impl.combine(5); MaxLongMetricsImpl impl2 = new MaxLongMetricsImpl(); - impl.combine(2); - impl.combine(6); + impl2.combine(2); + impl2.combine(6); impl.combine(impl2); Assert.assertEquals(10, impl.getValue()); diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetricsTest.java new file mode 100644 index 000000000..b656464d8 --- /dev/null +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetricsTest.java @@ -0,0 +1,93 @@ +/* + * 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.metrics; + +import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author jian.tan + */ + +public class MinLongMetricsTest { + + @Test + public void testEntranceCombine() { + MinLongMetricsImpl impl = new MinLongMetricsImpl(); + impl.combine(10); + impl.combine(5); + impl.combine(20); + impl.calculate(); + Assert.assertEquals(5, impl.getValue()); + + MinLongMetricsImpl impl2 = new MinLongMetricsImpl(); + impl2.combine(10); + impl2.combine(0); + impl2.combine(10000); + impl2.calculate(); + + Assert.assertEquals(0, impl2.getValue()); + } + + @Test + public void testSelfCombine() { + MinLongMetricsImpl impl = new MinLongMetricsImpl(); + impl.combine(10); + impl.combine(5); + + MinLongMetricsImpl impl2 = new MinLongMetricsImpl(); + impl2.combine(2); + impl2.combine(6); + + impl.combine(impl2); + Assert.assertEquals(2, impl.getValue()); + } + + public class MinLongMetricsImpl extends MinLongMetrics { + + @Override public String id() { + return null; + } + + @Override public Metrics toHour() { + return null; + } + + @Override public Metrics toDay() { + return null; + } + + @Override public Metrics toMonth() { + return null; + } + + @Override public int remoteHashCode() { + return 0; + } + + @Override public void deserialize(RemoteData remoteData) { + + } + + @Override public RemoteData.Builder serialize() { + return null; + } + } +}