Skip to content

Commit c48cdf3

Browse files
authored
Fix potential NPE in the AlarmStatusQueryHandler. (#13513)
1 parent 360384e commit c48cdf3

File tree

6 files changed

+40
-7
lines changed

6 files changed

+40
-7
lines changed

docs/en/changes/changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
* Refactor Kubernetes coordinator to be more accurate about node readiness.
101101
* Bump up netty to 4.2.5.Final.
102102
* BanyanDB: fix log query missing order by condition, and fix missing service id condition when query by instance id or endpoint id.
103+
* Fix potential NPE in the `AlarmStatusQueryHandler`.
103104

104105
#### UI
105106

oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmModuleProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.skywalking.oap.server.configuration.api.DynamicConfigurationService;
2626
import org.apache.skywalking.oap.server.core.CoreModule;
2727
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
28+
import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
2829
import org.apache.skywalking.oap.server.core.alarm.AlarmStandardPersistence;
2930
import org.apache.skywalking.oap.server.core.alarm.MetricsNotify;
3031
import org.apache.skywalking.oap.server.library.module.ModuleDefine;
@@ -59,6 +60,7 @@ public void prepare() throws ServiceNotProvidedException, ModuleStartException {
5960
alarmRulesWatcher = new AlarmRulesWatcher(new Rules(), this, getManager());
6061
notifyHandler = new NotifyHandler(alarmRulesWatcher, getManager());
6162
this.registerServiceImplementation(MetricsNotify.class, notifyHandler);
63+
this.registerServiceImplementation(AlarmRulesWatcherService.class, alarmRulesWatcher);
6264
}
6365

6466
@Override

oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import lombok.extern.slf4j.Slf4j;
3232
import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher;
3333
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
34+
import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
3435
import org.apache.skywalking.oap.server.core.alarm.provider.dingtalk.DingtalkSettings;
3536
import org.apache.skywalking.oap.server.core.alarm.provider.discord.DiscordSettings;
3637
import org.apache.skywalking.oap.server.core.alarm.provider.feishu.FeishuSettings;
@@ -50,7 +51,7 @@
5051
* @since 6.5.0
5152
*/
5253
@Slf4j
53-
public class AlarmRulesWatcher extends ConfigChangeWatcher {
54+
public class AlarmRulesWatcher extends ConfigChangeWatcher implements AlarmRulesWatcherService {
5455
@Getter
5556
private volatile Map<String, List<RunningRule>> runningContext;
5657
private volatile Map<AlarmRule, RunningRule> alarmRuleRunningRuleMap;

oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ public AlarmModule() {
3434

3535
@Override
3636
public Class[] services() {
37-
return new Class[] {MetricsNotify.class};
37+
return new Class[] {MetricsNotify.class, AlarmRulesWatcherService.class};
3838
}
3939
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
package org.apache.skywalking.oap.server.core.alarm;
20+
21+
import org.apache.skywalking.oap.server.library.module.Service;
22+
23+
public interface AlarmRulesWatcherService extends Service {
24+
25+
}

oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/AlarmStatusQueryHandler.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
import java.util.stream.Collectors;
3232
import lombok.extern.slf4j.Slf4j;
3333
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
34+
import org.apache.skywalking.oap.server.core.alarm.AlarmRulesWatcherService;
3435
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmEntity;
35-
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmModuleProvider;
3636
import org.apache.skywalking.oap.server.core.alarm.provider.AlarmRulesWatcher;
3737
import org.apache.skywalking.oap.server.core.alarm.provider.RunningRule;
3838
import org.apache.skywalking.oap.server.core.analysis.metrics.DoubleValueHolder;
@@ -55,10 +55,8 @@ public AlarmStatusQueryHandler(final ModuleManager manager) {
5555

5656
private AlarmRulesWatcher getAlarmRulesWatcher() {
5757
if (alarmRulesWatcher == null) {
58-
59-
AlarmModuleProvider provider = (AlarmModuleProvider) moduleManager.find(AlarmModule.NAME)
60-
.provider();
61-
alarmRulesWatcher = provider.getAlarmRulesWatcher();
58+
alarmRulesWatcher = (AlarmRulesWatcher) moduleManager.find(AlarmModule.NAME)
59+
.provider().getService(AlarmRulesWatcherService.class);
6260
}
6361
return alarmRulesWatcher;
6462
}
@@ -79,6 +77,9 @@ public HttpResponse getAlarmRuleByName(@Param("ruleName") String ruleName) {
7977
Map<String, RunningRule> runningRules = getAlarmRulesWatcher().getRunningContext().values().stream().flatMap(List::stream)
8078
.collect(Collectors.toMap(RunningRule::getRuleName, r -> r));
8179
RunningRule rule = runningRules.get(ruleName);
80+
if (rule == null) {
81+
return HttpResponse.of(MediaType.JSON_UTF_8, "{}");
82+
}
8283
JsonObject runningRuleInfo = new JsonObject();
8384
runningRuleInfo.addProperty("ruleName", rule.getRuleName());
8485
runningRuleInfo.addProperty("expression", rule.getExpression());
@@ -137,6 +138,9 @@ public HttpResponse getAlarmRuleContext(@Param("ruleName") String ruleName, @Par
137138
Map<String, RunningRule> runningRules = getAlarmRulesWatcher().getRunningContext().values().stream().flatMap(List::stream)
138139
.collect(Collectors.toMap(RunningRule::getRuleName, r -> r));
139140
RunningRule rule = runningRules.get(ruleName);
141+
if (rule == null) {
142+
return HttpResponse.of(MediaType.JSON_UTF_8, "{}");
143+
}
140144
Map<AlarmEntity, RunningRule.Window> windows = rule.getWindows();
141145
RunningRule.Window window = windows.keySet().stream().filter(e -> e.getName().equals(entityName)).map(windows::get)
142146
.findFirst().orElse(null);

0 commit comments

Comments
 (0)