Skip to content

Commit

Permalink
adding support for Pega CloudK log pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
vargm committed Feb 5, 2025
1 parent a12166f commit d15af1f
Show file tree
Hide file tree
Showing 16 changed files with 1,340 additions and 206 deletions.
43 changes: 28 additions & 15 deletions src/main/java/com/pega/gcs/logviewer/LogMessagesExportDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public class LogMessagesExportDialog extends JDialog {
private File logFile;

public enum ParseOption {
DELIMITER, JSON
DELIMITER, JSON, XML
}

public LogMessagesExportDialog(LogTableModel logTableModel, ImageIcon appIcon, Component parent) {
Expand Down Expand Up @@ -136,24 +136,31 @@ private LogMessagesLoggerSelectPanel getLogMessagesLoggerSelectPanel() {

if (logMessagesLoggerSelectPanel == null) {

List<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntryList = new ArrayList<>();

LogTableModel logTableModel = getLogTableModel();

LogEntryModel logEntryModel = logTableModel.getLogEntryModel();
Map<LogEntryColumn, Integer> logEntryColumnIndexMap = logEntryModel.getLogEntryColumnIndexMap();

int loggerColumnIndex = logEntryColumnIndexMap.get(LogEntryColumn.LOGGER);
Integer loggerColumnIndex = logEntryColumnIndexMap.get(LogEntryColumn.LOGGER);

if (loggerColumnIndex != null) {

Set<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntrySet;
loggerColumnEntrySet = logTableModel.getColumnFilterEntrySet(loggerColumnIndex);
Set<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntrySet;
loggerColumnEntrySet = logTableModel.getColumnFilterEntrySet(loggerColumnIndex);

// making a copy
Kryo kryo = new Kryo();
// making a copy
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(false);
kryo.register(TreeSet.class);
kryo.register(CheckBoxMenuItemPopupEntry.class);

Set<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntrySetCopy;
loggerColumnEntrySetCopy = kryo.copy(loggerColumnEntrySet);
Set<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntrySetCopy;
loggerColumnEntrySetCopy = kryo.copy(loggerColumnEntrySet);

List<CheckBoxMenuItemPopupEntry<LogEntryKey>> loggerColumnEntryList;
loggerColumnEntryList = new ArrayList<>(loggerColumnEntrySetCopy);
loggerColumnEntryList.addAll(loggerColumnEntrySetCopy);
}

logMessagesLoggerSelectPanel = new LogMessagesLoggerSelectPanel(loggerColumnEntryList);

Expand Down Expand Up @@ -582,17 +589,23 @@ protected void performExport() {

LogMessagesLoggerSelectPanel logMessagesLoggerSelectPanel = getLogMessagesLoggerSelectPanel();

List<CheckBoxMenuItemPopupEntry<LogEntryKey>> selectedLoggerColumnEntryList;
selectedLoggerColumnEntryList = logMessagesLoggerSelectPanel.getSelectedLoggerColumnEntryList();
boolean isEmptyLoggerColumnEntryList = logMessagesLoggerSelectPanel.isEmptyLoggerColumnEntryList();

// collate log entry indexes for export
Set<LogEntryKey> logEntrySet = new TreeSet<>();

for (CheckBoxMenuItemPopupEntry<LogEntryKey> loggerColumnEntry : selectedLoggerColumnEntryList) {
if (isEmptyLoggerColumnEntryList) {
// TODO
} else {
List<CheckBoxMenuItemPopupEntry<LogEntryKey>> selectedLoggerColumnEntryList;
selectedLoggerColumnEntryList = logMessagesLoggerSelectPanel.getSelectedLoggerColumnEntryList();

List<LogEntryKey> rowIndexList = loggerColumnEntry.getRowIndexList();
for (CheckBoxMenuItemPopupEntry<LogEntryKey> loggerColumnEntry : selectedLoggerColumnEntryList) {

logEntrySet.addAll(rowIndexList);
List<LogEntryKey> rowIndexList = loggerColumnEntry.getRowIndexList();

logEntrySet.addAll(rowIndexList);
}
}

final int rowCount = logEntrySet.size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ protected List<LogEntryKey> doInBackground() throws Exception {

break;

case XML:

break;

default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -504,4 +504,8 @@ public List<CheckBoxMenuItemPopupEntry<LogEntryKey>> getSelectedLoggerColumnEntr
return selectedLoggerColumnEntryList;
}

public boolean isEmptyLoggerColumnEntryList() {
return loggerColumnEntryList.size() == 0;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
public abstract class AbstractLogPattern {

public enum LogType {
PEGA_ALERT, PEGA_RULES, PEGA_CLUSTER, PEGA_DATAFLOW, PEGA_DDSMETRIC
PEGA_ALERT, PEGA_RULES, PEGA_CLUSTER, PEGA_DATAFLOW, PEGA_DDSMETRIC, PEGA_CLOUDK_ISTIO, PEGA_CLOUDK_ACCESS_LOG
}

private LogType logType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,29 @@ private Log4jPatternManager() {
name = "7.x - SOCKET_RECIEVER";
patStr = "%d [%20.20t] [%20.20X{tenantid}] [%20.20X{app}] (%30.30c{3}) %-5p %X{stack} %X{userid} - %m%n";
socketRecieverLog4jPattern = logPatternFactory.getLog4jPattern(LogType.PEGA_RULES, name, patStr, false);

// PEGA_CLOUDK_ISTIO
name = "PEGA_CLOUDK_ISTIO";
// [%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS%
// %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS% \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT%
// %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"
// \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS%
// %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n
patStr = "%d{yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSX} [%X{start_time}] \"%X{req_path}\" %X{response_code} %X{response_flags} %X{response_c"
+ "ode_details} %X{conn_term_details} \"%X{us_trans_fail_reason}\" %X{bytes_received} %X{bytes_sent} %X{duration} %X{resp_x"
+ "_e_us_serv_time} \"%X{req_x_forwarded_for}\" \"%X{req_user_agent}\" \"%X{req_x_request_id}\" \"%X{req_authority}\" \"%X{"
+ "us_host}\" %X{us_cluster} %X{us_local_address} %X{ds_local_address} %X{ds_remote_address} %X{requested_server_name} %X{r"
+ "oute_name}";
log4jPattern = logPatternFactory.getLog4jPattern(LogType.PEGA_CLOUDK_ISTIO, name, patStr, false);
addToLog4jPatternTypeMap(log4jPattern);

// PEGA_CLOUDK_ACCESS_LOG
name = "PEGA_CLOUDK_ACCESS_LOG";
// %{X-Forwarded-For}i %h %l %u %t &quot;%r&quot; %s %b %D %I
patStr = "%d{yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSX} %X{req_x_forwarded_for} %X{remote_host} %X{remote_username} %X{remote_user} [%X{st"
+ "art_time}] \"%X{req_path}\" %X{response_code} %X{bytes_sent} %X{duration} %X{req_thread_name}";
log4jPattern = logPatternFactory.getLog4jPattern(LogType.PEGA_CLOUDK_ACCESS_LOG, name, patStr, false);
addToLog4jPatternTypeMap(log4jPattern);
}

public static Log4jPatternManager getInstance() {
Expand Down Expand Up @@ -202,6 +225,20 @@ public Set<Log4jPattern> getDefaultDdsMetricLog4jPatternSet() {
return Collections.unmodifiableSet(log4jPatternTypeMap.get(LogType.PEGA_DDSMETRIC));
}

public Set<Log4jPattern> getDefaultPegaCloudKIstioLog4jPatternSet() {

Map<LogType, Set<Log4jPattern>> log4jPatternTypeMap = getLog4jPatternTypeMap();

return Collections.unmodifiableSet(log4jPatternTypeMap.get(LogType.PEGA_CLOUDK_ISTIO));
}

public Set<Log4jPattern> getDefaultPegaCloudKAccessLog4jPatternSet() {

Map<LogType, Set<Log4jPattern>> log4jPatternTypeMap = getLog4jPatternTypeMap();

return Collections.unmodifiableSet(log4jPatternTypeMap.get(LogType.PEGA_CLOUDK_ACCESS_LOG));
}

public Log4jPattern getSocketRecieverLog4jPattern() {
return socketRecieverLog4jPattern;
}
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/com/pega/gcs/logviewer/model/JsonLogEntry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

package com.pega.gcs.logviewer.model;

import java.awt.Color;
import java.util.ArrayList;

import javax.swing.JPanel;

import com.pega.gcs.logviewer.LogTableModel;

public class JsonLogEntry extends LogEntry {

private static final long serialVersionUID = -2296850212910350176L;

public JsonLogEntry(LogEntryKey logEntryKey, ArrayList<String> logEntryValueList, String logEntryText) {

super(logEntryKey, logEntryValueList, logEntryText);

}

@Override
public Color getForegroundColor() {
// TODO Auto-generated method stub
return null;
}

@Override
public Color getBackgroundColor() {
// TODO Auto-generated method stub
return null;
}

@Override
public JPanel getDetailsPanel(LogTableModel logTableModel) {
// TODO Auto-generated method stub
return null;
}

}
96 changes: 96 additions & 0 deletions src/main/java/com/pega/gcs/logviewer/model/JsonLogEntryModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@

package com.pega.gcs.logviewer.model;

import java.nio.charset.Charset;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.pega.gcs.fringecommon.log4j2.Log4j2Helper;
import com.pega.gcs.logviewer.LogViewerUtil;

public class JsonLogEntryModel extends LogEntryModel {

private static final Log4j2Helper LOG = new Log4j2Helper(JsonLogEntryModel.class);

public JsonLogEntryModel(DateTimeFormatter modelDateTimeFormatter, ZoneId modelZoneId, ZoneId displayZoneId) {
super(modelDateTimeFormatter, modelZoneId, displayZoneId);
}

@Override
public void rebuildLogTimeSeriesCollectionSet(Locale locale) throws Exception {
// TODO Auto-generated method stub

}

@Override
public Set<LogSeriesCollection> getLogTimeSeriesCollectionSet(boolean filtered, Locale locale) throws Exception {
// TODO Auto-generated method stub
return null;
}

@Override
public Set<LogIntervalMarker> getLogIntervalMarkerSet() {
// TODO Auto-generated method stub
return null;
}

@Override
public LogEntryColumn[] getReportTableColumns() {
// TODO Auto-generated method stub
return null;
}

@Override
public String getTypeName() {
return "JSON";
}

@Override
protected void postProcess(LogEntry logEntry, ArrayList<String> logEntryValueList, Charset charset, Locale locale) {
// TODO Auto-generated method stub

}

public void addLogEntry(int logEntryIndex, Map<String, String> fieldMap, String logEntryText) {

List<LogEntryColumn> logEntryColumnList = getLogEntryColumnList();
DateTimeFormatter modelDateTimeFormatter = getModelDateTimeFormatter();
ZoneId modelZoneId = getModelZoneId();

ArrayList<String> columnValueList = new ArrayList<String>();

columnValueList.add(String.valueOf(logEntryIndex));

String timestampStr = null;

for (LogEntryColumn logEntryColumn : logEntryColumnList) {

String columnId = logEntryColumn.getColumnId();
String columnValue = fieldMap.get(columnId);
columnValueList.add(columnValue);

if (logEntryColumn.equals(LogEntryColumn.TIMESTAMP)) {
timestampStr = columnValue;
}
}

try {

long logEntryTime = LogViewerUtil.getTimeMillis(timestampStr, modelDateTimeFormatter, modelZoneId);

LogEntryKey logEntryKey = new LogEntryKey(logEntryIndex, logEntryTime);

JsonLogEntry jsonLogEntry = new JsonLogEntry(logEntryKey, columnValueList, logEntryText);

} catch (Exception e) {
LOG.error(e);
}
}

}
Loading

0 comments on commit d15af1f

Please sign in to comment.