Skip to content

Commit 8473e46

Browse files
committed
fixed concurrent alert file loading issue with messageids
1 parent 2b80439 commit 8473e46

File tree

5 files changed

+62
-70
lines changed

5 files changed

+62
-70
lines changed

src/main/java/com/pega/gcs/logviewer/model/AlertLogEntryModel.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ protected void postProcess(LogEntry logEntry, ArrayList<String> logEntryValueLis
131131
alertMessageThresholdKPI, this, locale);
132132

133133
alertMessageReportModelMap.put(alertId, alertMessageReportModel);
134+
134135
} catch (Exception e) {
135-
Map<Integer, AlertMessage> alertMessageMap = AlertMessageListProvider.getInstance()
136-
.getAlertMessageMap();
137-
String alertMessageId = alertMessageMap.get(alertId).getMessageID();
136+
137+
AlertMessage alertMessage = AlertMessageListProvider.getInstance().getAlertMessage(alertId);
138+
String alertMessageId = (alertMessage != null) ? alertMessage.getMessageID() : null;
139+
138140
LOG.error("Error building alert report model for Id: " + alertId + " Alert Id: " + alertMessageId, e);
139141
}
140142
}
@@ -167,10 +169,7 @@ private void processLogSeriesCollection(Map<String, LogSeriesCollection> logTime
167169
Integer alertId = alertLogEntry.getAlertId();
168170
double observedKPI = alertLogEntry.getObservedKPI();
169171

170-
Map<Integer, AlertMessage> alertMessageMap = AlertMessageListProvider.getInstance().getAlertMessageMap();
171-
172-
// alertMessage should not be null as AlertLogParser should have added unidentified AlertIds
173-
AlertMessage alertMessage = alertMessageMap.get(alertId);
172+
AlertMessage alertMessage = AlertMessageListProvider.getInstance().getAlertMessage(alertId);
174173

175174
String messageId = alertMessage.getMessageID();
176175
boolean isCritical = Severity.CRITICAL.equals(alertMessage.getSeverity());

src/main/java/com/pega/gcs/logviewer/model/alert/AlertMessageListProvider.java

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Map;
1717
import java.util.Set;
1818
import java.util.TreeMap;
19+
import java.util.concurrent.atomic.AtomicInteger;
1920

2021
import javax.xml.XMLConstants;
2122
import javax.xml.transform.stream.StreamSource;
@@ -35,12 +36,13 @@ public class AlertMessageListProvider {
3536

3637
private static final String ALERT_MESSAGE_LIST_XML = "/AlertMessageList.xml";
3738

38-
private static AlertMessageListProvider _INSTANCE;
39+
// checking for null is not thread safe; static initialisation
40+
private static AlertMessageListProvider _INSTANCE = new AlertMessageListProvider();
3941

4042
private Map<Integer, AlertMessage> alertMessageMap;
4143

4244
// can store additional unknown alert message id's found during parsing
43-
private static int adhocAlertId;
45+
private AtomicInteger adhocAlertId;
4446

4547
private Map<String, Integer> messageIdAlertIdMap;
4648

@@ -54,6 +56,8 @@ private AlertMessageListProvider() {
5456
alertMessageMap = null;
5557
messageIdAlertIdMap = null;
5658

59+
adhocAlertId = new AtomicInteger(10000);
60+
5761
InputStream amlInputStream = FileUtilities.getResourceAsStreamFromUserDir(getClass(), ALERT_MESSAGE_LIST_XML);
5862

5963
if (amlInputStream != null) {
@@ -115,23 +119,48 @@ private AlertMessageListProvider() {
115119
} else {
116120
LOG.info("AlertMessageList.xml could not be found");
117121
}
122+
}
118123

119-
adhocAlertId = 10000;
124+
public Integer getAlertId(String messageId) {
120125

126+
Integer alertId = messageIdAlertIdMap.get(messageId);
127+
128+
if (alertId == null) {
129+
AlertMessage alertMessage = addNewAlertMessage(messageId);
130+
alertId = alertMessage.getId();
131+
}
132+
133+
return alertId;
121134
}
122135

123-
/*
124-
* returns unmodifiableMap use addNewAlertMessage to append to this map
125-
*/
126-
public Map<Integer, AlertMessage> getAlertMessageMap() {
127-
return Collections.unmodifiableMap(alertMessageMap);
136+
public AlertMessage getAlertMessage(String messageId) {
137+
138+
Integer alertId = getAlertId(messageId);
139+
140+
AlertMessage alertMessage = alertMessageMap.get(alertId);
141+
142+
return alertMessage;
143+
}
144+
145+
public AlertMessage getAlertMessage(Integer alertId) {
146+
147+
AlertMessage alertMessage = alertMessageMap.get(alertId);
148+
149+
return alertMessage;
128150
}
129151

130-
/*
131-
* returns unmodifiableMap use addNewAlertMessage to append to this map
132-
*/
133-
public Map<String, Integer> getMessageIdAlertIdMap() {
134-
return Collections.unmodifiableMap(messageIdAlertIdMap);
152+
private synchronized AlertMessage addNewAlertMessage(String messageId) {
153+
154+
int id = adhocAlertId.incrementAndGet();
155+
AlertMessage alertMessage = new AlertMessage();
156+
alertMessage.setId(id);
157+
alertMessage.setMessageID(messageId);
158+
alertMessage.setSeverity(Severity.NORMAL);
159+
160+
alertMessageMap.put(id, alertMessage);
161+
messageIdAlertIdMap.put(messageId, id);
162+
163+
return alertMessage;
135164
}
136165

137166
public Map<String, List<String>> getAlertMessageTypeMap() {
@@ -147,23 +176,14 @@ public List<String> getCriticalAlertList() {
147176
}
148177

149178
public static AlertMessageListProvider getInstance() {
150-
if (_INSTANCE == null) {
151-
_INSTANCE = new AlertMessageListProvider();
152-
}
153179

154-
return _INSTANCE;
155-
}
180+
// checking for null is not thread safe; static initialisation
181+
//
182+
// if (_INSTANCE == null) {
183+
// _INSTANCE = new AlertMessageListProvider();
184+
// }
156185

157-
public int getNextAdhocAlertId() {
158-
return adhocAlertId++;
159-
}
160-
161-
public void addNewAlertMessage(AlertMessage alertMessage) {
162-
Integer id = alertMessage.getId();
163-
String messageId = alertMessage.getMessageID();
164-
165-
alertMessageMap.put(id, alertMessage);
166-
messageIdAlertIdMap.put(messageId, id);
186+
return _INSTANCE;
167187
}
168188

169189
public static void main(String[] args) {

src/main/java/com/pega/gcs/logviewer/parser/AlertLogParser.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import java.util.Date;
1717
import java.util.List;
1818
import java.util.Locale;
19-
import java.util.Map;
2019
import java.util.regex.Matcher;
2120
import java.util.regex.Pattern;
2221

@@ -28,7 +27,6 @@
2827
import com.pega.gcs.logviewer.model.LogEntryKey;
2928
import com.pega.gcs.logviewer.model.LogEntryModel;
3029
import com.pega.gcs.logviewer.model.PALStatisticName;
31-
import com.pega.gcs.logviewer.model.alert.AlertMessageList.AlertMessage;
3230
import com.pega.gcs.logviewer.model.alert.AlertMessageListProvider;
3331

3432
public class AlertLogParser extends LogParser {
@@ -270,20 +268,7 @@ private AlertLogEntry buildLogEntry() {
270268

271269
AlertMessageListProvider alertMessageListProvider = AlertMessageListProvider.getInstance();
272270

273-
Map<String, Integer> messageIdAlertIdMap = alertMessageListProvider.getMessageIdAlertIdMap();
274-
275-
Integer alertId = messageIdAlertIdMap.get(messageIdStr);
276-
277-
if (alertId == null) {
278-
// get an arbitrary id.
279-
alertId = alertMessageListProvider.getNextAdhocAlertId();
280-
281-
AlertMessage alertMessage = new AlertMessage();
282-
alertMessage.setId(alertId);
283-
alertMessage.setMessageID(messageIdStr);
284-
alertMessageListProvider.addNewAlertMessage(alertMessage);
285-
286-
}
271+
Integer alertId = alertMessageListProvider.getAlertId(messageIdStr);
287272

288273
String observedKPIStr = fields[observedKPIIndex];
289274
long observedKPI = Long.parseLong(observedKPIStr);

src/main/java/com/pega/gcs/logviewer/report/alert/AlertMessageReportModelFactory.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import java.util.Collections;
1414
import java.util.List;
1515
import java.util.Locale;
16-
import java.util.Map;
1716

1817
import com.pega.gcs.fringecommon.log4j2.Log4j2Helper;
1918
import com.pega.gcs.logviewer.model.AlertLogEntryModel;
@@ -39,14 +38,12 @@ public static AlertMessageReportModelFactory getInstance() {
3938
return _INSTANCE;
4039
}
4140

42-
public AlertMessageReportModel getAlertMessageReportModel(int alertId, long thresholdKPI,
41+
public AlertMessageReportModel getAlertMessageReportModel(Integer alertId, long thresholdKPI,
4342
AlertLogEntryModel alertLogEntryModel, Locale locale) {
4443

4544
AlertMessageListProvider alertMessageListProvider = AlertMessageListProvider.getInstance();
4645

47-
Map<Integer, AlertMessage> alertMessageMap = alertMessageListProvider.getAlertMessageMap();
48-
49-
AlertMessage alertMessage = alertMessageMap.get(alertId);
46+
AlertMessage alertMessage = alertMessageListProvider.getAlertMessage(alertId);
5047

5148
return getAlertMessageReportModel(alertMessage, thresholdKPI, alertLogEntryModel, locale);
5249

@@ -99,23 +96,21 @@ public static void main(String[] args) {
9996

10097
AlertMessageListProvider alertMessageListProvider = AlertMessageListProvider.getInstance();
10198

102-
Map<Integer, AlertMessage> alertMessageMap = alertMessageListProvider.getAlertMessageMap();
103-
10499
AlertMessageReportModelFactory alertMessageReportModelFactory = AlertMessageReportModelFactory.getInstance();
105100

106101
List<String> messageIdList = new ArrayList<>(AlertMessageListProvider.getInstance().getMessageIdSet());
107102
Collections.sort(messageIdList);
108103

109104
List<String> unImplementedList = new ArrayList<>();
110105

111-
for (AlertMessage alertMessage : alertMessageMap.values()) {
106+
for (String messageId : alertMessageListProvider.getMessageIdSet()) {
107+
108+
AlertMessage alertMessage = alertMessageListProvider.getAlertMessage(messageId);
112109

113110
AlertMessageReportModel alertMessageReportModel;
114111
alertMessageReportModel = alertMessageReportModelFactory.getAlertMessageReportModel(alertMessage, 0, null,
115112
Locale.getDefault());
116113

117-
String messageId = alertMessage.getMessageID();
118-
119114
if (alertMessageReportModel != null) {
120115
LOG.info("Report Model for message id: " + messageId + " " + alertMessageReportModel.toString());
121116
} else {

src/main/java/com/pega/gcs/logviewer/report/alert/AlertSummaryJPanel.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,7 @@ private JPanel getGeneralJPanel(String alertMessageId) {
170170
titleJLabel.setHorizontalAlignment(SwingConstants.CENTER);
171171

172172
AlertMessageListProvider alertMessageListProvider = AlertMessageListProvider.getInstance();
173-
Map<Integer, AlertMessage> alertMessageMap = alertMessageListProvider.getAlertMessageMap();
174-
Map<String, Integer> messageIdAlertIdMap = alertMessageListProvider.getMessageIdAlertIdMap();
175-
176-
Integer alertId = messageIdAlertIdMap.get(alertMessageId);
177-
178-
AlertMessage alertMessage = alertMessageMap.get(alertId);
173+
AlertMessage alertMessage = alertMessageListProvider.getAlertMessage(alertMessageId);
179174

180175
JPanel alertMessageJPanel = getAlertMessageJPanel(alertMessage);
181176

@@ -530,9 +525,7 @@ private JPanel getAlertMessageReportJPanel(LogSeriesCollection logTimeSeriesColl
530525

531526
String messageId = logTimeSeriesCollection.getName();
532527

533-
Map<String, Integer> messageIdAlertIdMap = AlertMessageListProvider.getInstance().getMessageIdAlertIdMap();
534-
535-
Integer alertId = messageIdAlertIdMap.get(messageId);
528+
Integer alertId = AlertMessageListProvider.getInstance().getAlertId(messageId);
536529

537530
if (alertId != null) {
538531

0 commit comments

Comments
 (0)