This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch oap-alarm
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 0ec95ac9f6db60d7932f0f8300d2199ba9697719
Author: Gao Hongtao <[email protected]>
AuthorDate: Mon Feb 10 11:08:13 2020 +0800

    Add trace log
    
     * Trace alarm rule reader
     * Trace the process of running alarm rule, especailly the moving of window
     * Add toString method to relevant class for tracing
---
 oap-server/server-alarm-plugin/pom.xml             |  5 ++
 .../oap/server/core/alarm/provider/AlarmRule.java  |  2 +
 .../core/alarm/provider/AlarmRulesWatcher.java     |  3 +
 .../oap/server/core/alarm/provider/Rules.java      |  1 +
 .../server/core/alarm/provider/RunningRule.java    | 67 ++++++++++++++++++++++
 .../src/test/resources/log4j2-test.xml             | 36 ++++++++++++
 6 files changed, 114 insertions(+)

diff --git a/oap-server/server-alarm-plugin/pom.xml 
b/oap-server/server-alarm-plugin/pom.xml
index 26e13c7..90f42eb 100644
--- a/oap-server/server-alarm-plugin/pom.xml
+++ b/oap-server/server-alarm-plugin/pom.xml
@@ -37,6 +37,11 @@
             <artifactId>library-util</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-ext</artifactId>
+            <version>${slf4j.version}</version>
+        </dependency>
     </dependencies>
 
 
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 93f59f0..5b2afd1 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
@@ -27,6 +27,7 @@ import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import lombok.ToString;
 
 /**
  * @author wusheng
@@ -36,6 +37,7 @@ import lombok.Setter;
 @AllArgsConstructor
 @Setter(AccessLevel.PUBLIC)
 @Getter(AccessLevel.PUBLIC)
+@ToString
 public class AlarmRule {
     private String alarmRuleName;
 
diff --git 
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
 
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
index abfecc9..e944377 100644
--- 
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
+++ 
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
@@ -38,6 +39,7 @@ import java.util.Map;
  * @author kezhenxu94
  * @since 6.5.0
  */
+@Slf4j
 public class AlarmRulesWatcher extends ConfigChangeWatcher {
     @Getter
     private volatile Map<String, List<RunningRule>> runningContext;
@@ -90,6 +92,7 @@ public class AlarmRulesWatcher extends ConfigChangeWatcher {
         this.rules = newRules;
         this.runningContext = newRunningContext;
         this.alarmRuleRunningRuleMap = newAlarmRuleRunningRuleMap;
+        log.info("Update alarm rules to {}", rules);
     }
 
     @Override
diff --git 
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
 
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
index e7a2e34..0e7e581 100644
--- 
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
+++ 
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
@@ -23,6 +23,7 @@ import lombok.*;
 
 @Setter(AccessLevel.PUBLIC)
 @Getter(AccessLevel.PUBLIC)
+@ToString
 public class Rules {
     private List<AlarmRule> rules;
     private List<String> webhooks;
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 a39b269..0840626 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
@@ -18,6 +18,11 @@
 
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import lombok.RequiredArgsConstructor;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
 import org.apache.skywalking.oap.server.core.analysis.metrics.*;
@@ -39,6 +44,7 @@ import java.util.concurrent.locks.ReentrantLock;
  *
  * @author wusheng
  */
+@Slf4j
 public class RunningRule {
     private static DateTimeFormatter TIME_BUCKET_FORMATTER = 
DateTimeFormat.forPattern("yyyyMMddHHmm");
 
@@ -85,17 +91,26 @@ public class RunningRule {
     public void in(MetaInAlarm meta, Metrics metrics) {
         if (!meta.getMetricsName().equals(metricsName)) {
             //Don't match rule, exit.
+            if (log.isTraceEnabled()) {
+                log.trace("Metric names are inconsistent, {}-{}", 
meta.getMetricsName(), metricsName);
+            }
             return;
         }
 
         if (CollectionUtils.isNotEmpty(includeNames)) {
             if (!includeNames.contains(meta.getName())) {
+                if (log.isTraceEnabled()) {
+                    log.trace("{} isn't in the including list {}", 
meta.getName(), includeNames);
+                }
                 return;
             }
         }
 
         if (CollectionUtils.isNotEmpty(excludeNames)) {
             if (excludeNames.contains(meta.getName())) {
+                if (log.isTraceEnabled()) {
+                    log.trace("{} is in the excluding list {}", 
meta.getName(), excludeNames);
+                }
                 return;
             }
         }
@@ -114,6 +129,7 @@ public class RunningRule {
                 valueType = MetricsValueType.MULTI_INTS;
                 threshold.setType(MetricsValueType.MULTI_INTS);
             } else {
+                log.warn("Unsupported value type {}", valueType);
                 return;
             }
         }
@@ -204,6 +220,9 @@ public class RunningRule {
             } finally {
                 lock.unlock();
             }
+            if (log.isTraceEnabled()) {
+                log.trace("Move window {}", transformValues(values));
+            }
         }
 
         public void add(Metrics metrics) {
@@ -226,6 +245,9 @@ public class RunningRule {
                 if (minutes >= values.size()) {
                     // too old data
                     // also should happen, but maybe if agent/probe mechanism 
time is not right.
+                    if (log.isTraceEnabled()) {
+                        log.trace("Timebucket is {}, endTime is {} and value 
size is {}", timeBucket, this.endTime, values.size());
+                    }
                     return;
                 }
 
@@ -233,6 +255,9 @@ public class RunningRule {
             } finally {
                 this.lock.unlock();
             }
+            if (log.isTraceEnabled()) {
+                log.trace("Add metric {} to window {}", metrics, 
transformValues(this.values));
+            }
         }
 
         public AlarmMessage checkAlarm() {
@@ -293,6 +318,9 @@ public class RunningRule {
                     case MULTI_INTS:
                         int[] ivalueArray = ((MultiIntValuesHolder) 
metrics).getValues();
                         Integer[] iaexpected = 
RunningRule.this.threshold.getIntValuesThreshold();
+                        if (log.isTraceEnabled()) {
+                            log.trace("Value array is {}, expected array is 
{}", ivalueArray, iaexpected);
+                        }
                         for (int i = 0; i < ivalueArray.length; i++) {
                             ivalue = ivalueArray[i];
                             Integer iNullableExpected = 0;
@@ -303,6 +331,9 @@ public class RunningRule {
                                 }
                             }
                             if (op.test(iNullableExpected, ivalue)) {
+                                if (log.isTraceEnabled()) {
+                                    log.trace("Matched, expected {}, value 
{}", iNullableExpected, ivalue);
+                                }
                                 matchCount++;
                                 break;
                             }
@@ -311,6 +342,9 @@ public class RunningRule {
                 }
             }
 
+            if (log.isTraceEnabled()) {
+                log.trace("Match count is {}, threshold is {}", matchCount, 
countThreshold);
+            }
             // Reach the threshold in current bucket.
             return matchCount >= countThreshold;
         }
@@ -322,4 +356,37 @@ public class RunningRule {
             }
         }
     }
+
+    private LinkedList<TraceLogMetric> transformValues(final 
LinkedList<Metrics> values) {
+        LinkedList<TraceLogMetric> r = new LinkedList<>();
+        values.forEach(m -> {
+            if (m == null) {
+                r.add(null);
+                return;
+            }
+            switch (valueType) {
+                case LONG:
+                    r.add(new TraceLogMetric(m.getTimeBucket(), new Number[] 
{((LongValueHolder)m).getValue()}));
+                    break;
+                case INT:
+                    r.add(new TraceLogMetric(m.getTimeBucket(), new Number[] 
{((IntValueHolder)m).getValue()}));
+                    break;
+                case DOUBLE:
+                    r.add(new TraceLogMetric(m.getTimeBucket(), new Number[] 
{((DoubleValueHolder)m).getValue()}));
+                    break;
+                case MULTI_INTS:
+                    int[] iArr = ((MultiIntValuesHolder)m).getValues();
+                    r.add(new TraceLogMetric(m.getTimeBucket(), 
Arrays.stream(iArr).boxed().toArray(Number[]::new)));
+                    break;
+            }
+        });
+        return r;
+    }
+
+    @RequiredArgsConstructor
+    @ToString
+    private static class TraceLogMetric {
+        private final long timeBucket;
+        private final Number[] value;
+    }
 }
diff --git a/oap-server/server-alarm-plugin/src/test/resources/log4j2-test.xml 
b/oap-server/server-alarm-plugin/src/test/resources/log4j2-test.xml
new file mode 100644
index 0000000..b440b5e
--- /dev/null
+++ b/oap-server/server-alarm-plugin/src/test/resources/log4j2-test.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  ~
+  -->
+
+<Configuration status="INFO">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout charset="UTF-8" pattern="%d - %c -%-4r [%t] %-5p %x 
-  %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <logger name="org.eclipse.jetty" level="INFO"/>
+        <logger name="org.apache.zookeeper" level="INFO"/>
+        <logger name="org.elasticsearch.common.network.IfConfig" level="INFO"/>
+        <logger name="io.grpc.netty" level="INFO"/>
+        <logger name="org.apache.skywalking.oap.server.core.alarm.provider" 
level="TRACE"/>
+        <Root level="INFO">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>

Reply via email to