This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 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 094eeb8 Add alarm metrics OP >= and <=, and refactor the operator
logics (#4221)
094eeb8 is described below
commit 094eeb870f0948b892fa478e9058809e1d3d79a9
Author: kezhenxu94 <[email protected]>
AuthorDate: Mon Jan 13 00:50:37 2020 +0800
Add alarm metrics OP >= and <=, and refactor the operator logics (#4221)
* Add alarm metrics OP >= and <=, and refactor the operator logics
* Add unit test for OP
Co-authored-by: 吴晟 Wu Sheng <[email protected]>
---
docs/en/setup/backend/backend-alarm.md | 2 +-
.../oap/server/core/alarm/provider/OP.java | 45 +++++++++++++-
.../server/core/alarm/provider/RunningRule.java | 70 +++-------------------
.../oap/server/core/alarm/provider/OPTest.java} | 39 +++++++-----
.../core/analysis/metrics/PercentileMetrics.java | 9 ++-
5 files changed, 83 insertions(+), 82 deletions(-)
diff --git a/docs/en/setup/backend/backend-alarm.md
b/docs/en/setup/backend/backend-alarm.md
index e13d915..d277958 100644
--- a/docs/en/setup/backend/backend-alarm.md
+++ b/docs/en/setup/backend/backend-alarm.md
@@ -17,7 +17,7 @@ endpoint name.
For multiple values metrics, such as **percentile**, the threshold is an
array. Described like `value1, value2, value3, value4, value5`.
Each value could the threshold for each value of the metrics. Set the value to
`-` if don't want to trigger alarm by this or some of the values.
Such as in **percentile**, `value1` is threshold of P50, and `-, -, value3,
value4, value5` means, there is no threshold for P50 and P75 in percentile
alarm rule.
-- **OP**. Operator, support `>`, `<`, `=`. Welcome to contribute all OPs.
+- **OP**. Operator, support `>`, `>=`, `<`, `<=`, `=`. Welcome to contribute
all OPs.
- **Period**. How long should the alarm rule should be checked. This is a time
window, which goes with the
backend deployment env time.
- **Count**. In the period window, if the number of **value**s over
threshold(by OP), reaches count, alarm
diff --git
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
index 6618538..653ebb1 100644
---
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
+++
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
@@ -18,19 +18,62 @@
package org.apache.skywalking.oap.server.core.alarm.provider;
+import static java.util.Objects.requireNonNull;
+
public enum OP {
- GREATER, LESS, EQUAL;
+ GREATER {
+ @Override
+ public boolean test(final Number expected, final Number actual) {
+ return requireNonNull(actual, "actual").doubleValue() >
requireNonNull(expected, "expected").doubleValue();
+ }
+ },
+
+ GREATER_EQ {
+ @Override
+ public boolean test(final Number expected, final Number actual) {
+ return requireNonNull(actual, "actual").doubleValue() >=
requireNonNull(expected, "expected").doubleValue();
+ }
+ },
+
+ LESS {
+ @Override
+ public boolean test(final Number expected, final Number actual) {
+ return requireNonNull(actual, "actual").doubleValue() <
requireNonNull(expected, "expected").doubleValue();
+ }
+ },
+
+ LESS_EQ {
+ @Override
+ public boolean test(final Number expected, final Number actual) {
+ return requireNonNull(actual, "actual").doubleValue() <=
requireNonNull(expected, "expected").doubleValue();
+ }
+ },
+
+ // NOTICE: double equal is not reliable in Java,
+ // match result is not predictable
+ EQUAL {
+ @Override
+ public boolean test(final Number expected, final Number actual) {
+ return requireNonNull(actual, "actual").doubleValue() ==
requireNonNull(expected, "expected").doubleValue();
+ }
+ };
public static OP get(String op) {
switch (op) {
case ">":
return GREATER;
+ case ">=":
+ return GREATER_EQ;
case "<":
return LESS;
+ case "<=":
+ return LESS_EQ;
case "==":
return EQUAL;
default:
throw new IllegalArgumentException("unknown op, " + op);
}
}
+
+ public abstract boolean test(final Number expected, final Number actual);
}
diff --git
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
index da1fa33..8b6f86c 100644
---
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
+++
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
@@ -292,63 +292,27 @@ public class RunningRule {
case LONG:
long lvalue = ((LongValueHolder)metrics).getValue();
long lexpected =
RunningRule.this.threshold.getLongThreshold();
- switch (op) {
- case GREATER:
- if (lvalue > lexpected)
- matchCount++;
- break;
- case LESS:
- if (lvalue < lexpected)
- matchCount++;
- break;
- case EQUAL:
- if (lvalue == lexpected)
- matchCount++;
- break;
+ if (op.test(lexpected, lvalue)) {
+ matchCount++;
}
break;
case INT:
int ivalue = ((IntValueHolder)metrics).getValue();
int iexpected =
RunningRule.this.threshold.getIntThreshold();
- switch (op) {
- case LESS:
- if (ivalue < iexpected)
- matchCount++;
- break;
- case GREATER:
- if (ivalue > iexpected)
- matchCount++;
- break;
- case EQUAL:
- if (ivalue == iexpected)
- matchCount++;
- break;
+ if (op.test(iexpected, ivalue)) {
+ matchCount++;
}
break;
case DOUBLE:
double dvalue =
((DoubleValueHolder)metrics).getValue();
double dexpected =
RunningRule.this.threshold.getDoubleThreshold();
- switch (op) {
- case EQUAL:
- // NOTICE: double equal is not reliable in
Java,
- // match result is not predictable
- if (dvalue == dexpected)
- matchCount++;
- break;
- case GREATER:
- if (dvalue > dexpected)
- matchCount++;
- break;
- case LESS:
- if (dvalue < dexpected)
- matchCount++;
- break;
+ if (op.test(dexpected, dvalue)) {
+ matchCount++;
}
break;
case MULTI_INTS:
int[] ivalueArray =
((MultiIntValuesHolder)metrics).getValues();
Integer[] iaexpected =
RunningRule.this.threshold.getIntValuesThreshold();
- MULTI_VALUE_CHECK:
for (int i = 0; i < ivalueArray.length; i++) {
ivalue = ivalueArray[i];
Integer iNullableExpected = 0;
@@ -358,25 +322,9 @@ public class RunningRule {
continue;
}
}
- switch (op) {
- case LESS:
- if (ivalue < iNullableExpected) {
- matchCount++;
- break MULTI_VALUE_CHECK;
- }
- break;
- case GREATER:
- if (ivalue > iNullableExpected) {
- matchCount++;
- break MULTI_VALUE_CHECK;
- }
- break;
- case EQUAL:
- if (ivalue == iNullableExpected) {
- matchCount++;
- break MULTI_VALUE_CHECK;
- }
- break;
+ if (op.test(iNullableExpected, ivalue)) {
+ matchCount++;
+ break;
}
}
break;
diff --git
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
similarity index 53%
copy from
oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
copy to
oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
index 6618538..f26f999 100644
---
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/OP.java
+++
b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
@@ -18,19 +18,30 @@
package org.apache.skywalking.oap.server.core.alarm.provider;
-public enum OP {
- GREATER, LESS, EQUAL;
+import org.junit.Test;
- public static OP get(String op) {
- switch (op) {
- case ">":
- return GREATER;
- case "<":
- return LESS;
- case "==":
- return EQUAL;
- default:
- throw new IllegalArgumentException("unknown op, " + op);
- }
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author kezhenxu94
+ */
+public class OPTest {
+ @Test
+ public void test() {
+ assertTrue(OP.EQUAL.test(123, 123));
+ assertTrue(OP.EQUAL.test(123L, 123L));
+ assertTrue(OP.EQUAL.test(123.0D, 123.0D));
+
+ assertTrue(OP.GREATER.test(122, 123));
+ assertTrue(OP.GREATER.test(122L, 123L));
+ assertTrue(OP.GREATER.test(122.0D, 123.0D));
+
+ assertTrue(OP.GREATER_EQ.test(122, 123));
+ assertTrue(OP.GREATER_EQ.test(122L, 123L));
+ assertTrue(OP.GREATER_EQ.test(122.0D, 123.0D));
+
+ assertTrue(OP.LESS.test(124, 123));
+ assertTrue(OP.LESS.test(124L, 123L));
+ assertTrue(OP.LESS.test(124.0D, 123.0D));
}
-}
+}
\ No newline at end of file
diff --git
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
index 5f86cab..a622250 100644
---
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
+++
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java
@@ -89,11 +89,10 @@ public abstract class PercentileMetrics extends
GroupMetrics implements MultiInt
}
int count = 0;
- IntKeyLongValue[] sortedData =
dataset.values().stream().sorted(new Comparator<IntKeyLongValue>() {
- @Override public int compare(IntKeyLongValue o1,
IntKeyLongValue o2) {
- return o1.getKey() - o2.getKey();
- }
- }).toArray(IntKeyLongValue[]::new);
+ IntKeyLongValue[] sortedData = dataset.values()
+ .stream()
+
.sorted(Comparator.comparingInt(IntKeyLongValue::getKey))
+
.toArray(IntKeyLongValue[]::new);
for (IntKeyLongValue element : sortedData) {
count += element.getValue();
for (int i = index; i < roofs.length; i++) {