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);

Reply via email to