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 c48cdf3c4d Fix potential NPE in the `AlarmStatusQueryHandler`. (#13513)
c48cdf3c4d is described below
commit c48cdf3c4d20bf16c6218da1a35f288dcc4629f3
Author: Wan Kai <[email protected]>
AuthorDate: Wed Sep 24 10:31:54 2025 +0800
Fix potential NPE in the `AlarmStatusQueryHandler`. (#13513)
---
docs/en/changes/changes.md | 1 +
.../core/alarm/provider/AlarmModuleProvider.java | 2 ++
.../server/core/alarm/provider/AlarmRulesWatcher.java | 3 ++-
.../skywalking/oap/server/core/alarm/AlarmModule.java | 2 +-
...{AlarmModule.java => AlarmRulesWatcherService.java} | 18 ++----------------
.../oap/query/debug/AlarmStatusQueryHandler.java | 14 +++++++++-----
6 files changed, 17 insertions(+), 23 deletions(-)
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 16f5850045..470752b29e 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -100,6 +100,7 @@
* Refactor Kubernetes coordinator to be more accurate about node readiness.
* Bump up netty to 4.2.5.Final.
* BanyanDB: fix log query missing order by condition, and fix missing service
id condition when query by instance id or endpoint id.
+* Fix potential NPE in the `AlarmStatusQueryHandler`.
#### UI
diff --git
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmModuleProvider.java
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmModuleProvider.java
index 8acac27b30..8a3e5ef52c 100644
---
a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmModuleProvider.java
+++
b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmModuleProvider.java
@@ -25,6 +25,7 @@ import
org.apache.skywalking.oap.server.configuration.api.ConfigurationModule;
import
org.apache.skywalking.oap.server.configuration.api.DynamicConfigurationService;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
+import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
import org.apache.skywalking.oap.server.core.alarm.AlarmStandardPersistence;
import org.apache.skywalking.oap.server.core.alarm.MetricsNotify;
import org.apache.skywalking.oap.server.library.module.ModuleDefine;
@@ -59,6 +60,7 @@ public class AlarmModuleProvider extends ModuleProvider {
alarmRulesWatcher = new AlarmRulesWatcher(new Rules(), this,
getManager());
notifyHandler = new NotifyHandler(alarmRulesWatcher, getManager());
this.registerServiceImplementation(MetricsNotify.class, notifyHandler);
+ this.registerServiceImplementation(AlarmRulesWatcherService.class,
alarmRulesWatcher);
}
@Override
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 f826469834..5d834d1efd 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
@@ -31,6 +31,7 @@ import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher;
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
+import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
import
org.apache.skywalking.oap.server.core.alarm.provider.dingtalk.DingtalkSettings;
import
org.apache.skywalking.oap.server.core.alarm.provider.discord.DiscordSettings;
import
org.apache.skywalking.oap.server.core.alarm.provider.feishu.FeishuSettings;
@@ -50,7 +51,7 @@ import
org.apache.skywalking.oap.server.library.module.ModuleProvider;
* @since 6.5.0
*/
@Slf4j
-public class AlarmRulesWatcher extends ConfigChangeWatcher {
+public class AlarmRulesWatcher extends ConfigChangeWatcher implements
AlarmRulesWatcherService {
@Getter
private volatile Map<String, List<RunningRule>> runningContext;
private volatile Map<AlarmRule, RunningRule> alarmRuleRunningRuleMap;
diff --git
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
index 1a2f23aff9..843cd961af 100644
---
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
+++
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
@@ -34,6 +34,6 @@ public class AlarmModule extends ModuleDefine {
@Override
public Class[] services() {
- return new Class[] {MetricsNotify.class};
+ return new Class[] {MetricsNotify.class,
AlarmRulesWatcherService.class};
}
}
diff --git
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRulesWatcherService.java
similarity index 65%
copy from
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
copy to
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRulesWatcherService.java
index 1a2f23aff9..ee189b52b8 100644
---
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
+++
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRulesWatcherService.java
@@ -18,22 +18,8 @@
package org.apache.skywalking.oap.server.core.alarm;
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.Service;
-/**
- * Alarm module define the main bridge entrance of the alarm implementor.
- * <p>
- * SkyWalking supports alarm implementation pluggable.
- */
-public class AlarmModule extends ModuleDefine {
- public static final String NAME = "alarm";
-
- public AlarmModule() {
- super(NAME);
- }
+public interface AlarmRulesWatcherService extends Service {
- @Override
- public Class[] services() {
- return new Class[] {MetricsNotify.class};
- }
}
diff --git
a/oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/AlarmStatusQueryHandler.java
b/oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/AlarmStatusQueryHandler.java
index b277970306..3c653d7d6c 100644
---
a/oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/AlarmStatusQueryHandler.java
+++
b/oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/AlarmStatusQueryHandler.java
@@ -31,8 +31,8 @@ import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
+import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmEntity;
-import
org.apache.skywalking.oap.server.core.alarm.provider.AlarmModuleProvider;
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmRulesWatcher;
import org.apache.skywalking.oap.server.core.alarm.provider.RunningRule;
import
org.apache.skywalking.oap.server.core.analysis.metrics.DoubleValueHolder;
@@ -55,10 +55,8 @@ public class AlarmStatusQueryHandler {
private AlarmRulesWatcher getAlarmRulesWatcher() {
if (alarmRulesWatcher == null) {
-
- AlarmModuleProvider provider = (AlarmModuleProvider)
moduleManager.find(AlarmModule.NAME)
- .provider();
- alarmRulesWatcher = provider.getAlarmRulesWatcher();
+ alarmRulesWatcher = (AlarmRulesWatcher)
moduleManager.find(AlarmModule.NAME)
+
.provider().getService(AlarmRulesWatcherService.class);
}
return alarmRulesWatcher;
}
@@ -79,6 +77,9 @@ public class AlarmStatusQueryHandler {
Map<String, RunningRule> runningRules =
getAlarmRulesWatcher().getRunningContext().values().stream().flatMap(List::stream)
.collect(Collectors.toMap(RunningRule::getRuleName, r -> r));
RunningRule rule = runningRules.get(ruleName);
+ if (rule == null) {
+ return HttpResponse.of(MediaType.JSON_UTF_8, "{}");
+ }
JsonObject runningRuleInfo = new JsonObject();
runningRuleInfo.addProperty("ruleName", rule.getRuleName());
runningRuleInfo.addProperty("expression", rule.getExpression());
@@ -137,6 +138,9 @@ public class AlarmStatusQueryHandler {
Map<String, RunningRule> runningRules =
getAlarmRulesWatcher().getRunningContext().values().stream().flatMap(List::stream)
.collect(Collectors.toMap(RunningRule::getRuleName, r -> r));
RunningRule rule = runningRules.get(ruleName);
+ if (rule == null) {
+ return HttpResponse.of(MediaType.JSON_UTF_8, "{}");
+ }
Map<AlarmEntity, RunningRule.Window> windows = rule.getWindows();
RunningRule.Window window = windows.keySet().stream().filter(e ->
e.getName().equals(entityName)).map(windows::get)
.findFirst().orElse(null);