You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2023/03/29 09:30:47 UTC

[skywalking] branch master updated: Support alarm metric OP `!=` (#10610)

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 886589c15c Support alarm metric OP `!=` (#10610)
886589c15c is described below

commit 886589c15c6225d18e7ca170a814f94bcf0abbff
Author: innerpeacez <in...@gmail.com>
AuthorDate: Wed Mar 29 17:30:31 2023 +0800

    Support alarm metric OP `!=` (#10610)
---
 docs/en/changes/changes.md                         |  1 +
 docs/en/setup/backend/backend-alarm.md             |  2 +-
 .../oap/server/core/alarm/provider/AlarmRule.java  |  1 -
 .../oap/server/core/alarm/provider/OP.java         | 29 +++++++++++------
 .../oap/server/core/alarm/provider/OPTest.java     | 38 +++++++++++++++-------
 5 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 38073edeb5..b76c3f3272 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -21,6 +21,7 @@
 * Fix PromQL HTTP API `/api/v1/labels` response missing `service` label.
 * Fix possible NPE when initialize `IntList`.
 * Support parse PromQL expression has empty labels in the braces for metadata query.
+* Support alarm metric OP `!=`.
 
 #### UI
 * Revert: cpm5d function. This feature is cancelled from backend.
diff --git a/docs/en/setup/backend/backend-alarm.md b/docs/en/setup/backend/backend-alarm.md
index 83025c3bda..f93856fbd4 100644
--- a/docs/en/setup/backend/backend-alarm.md
+++ b/docs/en/setup/backend/backend-alarm.md
@@ -43,7 +43,7 @@ The four label settings mentioned above must implement `LabeledValueHolder`.*
 For multiple-value metrics, such as **percentile**, the threshold is an array. It is described as:  `value1, value2, value3, value4, value5`.
 Each value may serve as the threshold for each value of the metrics. Set the value to `-` if you do not wish to trigger the Alarm by one or more of the values.  
 For example, in **percentile**, `value1` is the threshold of P50, and `-, -, value3, value4, value5` means that there is no threshold for P50 and P75 in the percentile alarm rule.
-- **OP**. The operator. It supports `>`, `>=`, `<`, `<=`, `==`. We welcome contributions of all OPs.
+- **OP**. The operator. It supports `>`, `>=`, `<`, `<=`, `==`, `!=`. We welcome contributions of all OPs.
 - **Period**. The size of metrics cache in minutes for checking the alarm conditions. This is a time window that corresponds to the backend deployment env time.
 - **Count**. Within a period window, if the number of times which **value** goes over the threshold (based on OP) reaches `count`, then an alarm will be sent.
 - **Only as condition**. Indicates if the rule can send notifications or if it simply serves as a condition of the composite rule.
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
index 86bced4349..70a9c43ff5 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
@@ -36,7 +36,6 @@ import lombok.ToString;
 @ToString
 public class AlarmRule {
     private String alarmRuleName;
-
     private String metricsName;
     private ArrayList<String> includeNames;
     private String includeNamesRegex;
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 653ebb1315..7ae660972b 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
@@ -21,28 +21,28 @@ package org.apache.skywalking.oap.server.core.alarm.provider;
 import static java.util.Objects.requireNonNull;
 
 public enum OP {
-    GREATER {
+    GT {
         @Override
         public boolean test(final Number expected, final Number actual) {
             return requireNonNull(actual, "actual").doubleValue() > requireNonNull(expected, "expected").doubleValue();
         }
     },
 
-    GREATER_EQ {
+    GTE {
         @Override
         public boolean test(final Number expected, final Number actual) {
             return requireNonNull(actual, "actual").doubleValue() >= requireNonNull(expected, "expected").doubleValue();
         }
     },
 
-    LESS {
+    LT {
         @Override
         public boolean test(final Number expected, final Number actual) {
             return requireNonNull(actual, "actual").doubleValue() < requireNonNull(expected, "expected").doubleValue();
         }
     },
 
-    LESS_EQ {
+    LTE {
         @Override
         public boolean test(final Number expected, final Number actual) {
             return requireNonNull(actual, "actual").doubleValue() <= requireNonNull(expected, "expected").doubleValue();
@@ -51,25 +51,34 @@ public enum OP {
 
     // NOTICE: double equal is not reliable in Java,
     // match result is not predictable
-    EQUAL {
+    EQ {
         @Override
         public boolean test(final Number expected, final Number actual) {
             return requireNonNull(actual, "actual").doubleValue() == requireNonNull(expected, "expected").doubleValue();
         }
+    },
+
+    NEQ {
+        @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;
+                return GT;
             case ">=":
-                return GREATER_EQ;
+                return GTE;
             case "<":
-                return LESS;
+                return LT;
             case "<=":
-                return LESS_EQ;
+                return LTE;
             case "==":
-                return EQUAL;
+                return EQ;
+            case "!=":
+                return NEQ;
             default:
                 throw new IllegalArgumentException("unknown op, " + op);
         }
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
index c18f800442..8051f344e6 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/OPTest.java
@@ -25,20 +25,34 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 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.EQ.test(123, 123));
+        assertTrue(OP.EQ.test(123L, 123L));
+        assertTrue(OP.EQ.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.NEQ.test(124, 123));
+        assertTrue(OP.NEQ.test(124L, 123L));
+        assertTrue(OP.NEQ.test(124.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.GT.test(122, 123));
+        assertTrue(OP.GT.test(122L, 123L));
+        assertTrue(OP.GT.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));
+        assertTrue(OP.GTE.test(122, 123));
+        assertTrue(OP.GTE.test(122L, 123L));
+        assertTrue(OP.GTE.test(122.0D, 123.0D));
+        assertTrue(OP.GTE.test(122, 122));
+        assertTrue(OP.GTE.test(122L, 122L));
+        assertTrue(OP.GTE.test(122.0D, 122.0D));
+
+        assertTrue(OP.LT.test(124, 123));
+        assertTrue(OP.LT.test(124L, 123L));
+        assertTrue(OP.LT.test(124.0D, 123.0D));
+
+        assertTrue(OP.LTE.test(124, 124));
+        assertTrue(OP.LTE.test(124L, 124L));
+        assertTrue(OP.LTE.test(124.0D, 124.0D));
+        assertTrue(OP.LTE.test(124, 123));
+        assertTrue(OP.LTE.test(124L, 123L));
+        assertTrue(OP.LTE.test(124.0D, 123.0D));
     }
 }