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>
