diff --git a/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java b/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java index cb438b83b..f155085fc 100644 --- a/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java +++ b/ozhera-app/app-api/src/main/java/org/apache/ozhera/app/api/service/HeraAppService.java @@ -35,6 +35,8 @@ public interface HeraAppService { List queryAppInfoWithLog(String appName, Integer type); + List queryAppInfoWithLogLatest(String appName, Integer type, Integer count); + List queryAllExistsApp(); AppBaseInfo queryById(Long id); diff --git a/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java b/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java index 8f63ab7d5..78c09e813 100644 --- a/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java +++ b/ozhera-app/app-server/src/main/java/org/apache/ozhera/app/controller/AppController.java @@ -77,6 +77,11 @@ public List queryAppInfoWithLog(String appName, Integer type) { return heraAppService.queryAppInfoWithLog(appName, type); } + @GetMapping("query/app/log/latest") + public List queryAppInfoWithLog(String appName, Integer type, Integer limit) { + return heraAppService.queryAppInfoWithLogLatest(appName, type, limit); + } + @PostMapping("/hera/app/add") public Result heraAppAdd(@RequestBody HeraAppBaseInfo heraAppBaseInfo) { if (StringUtils.isBlank(heraAppBaseInfo.getBindId()) || StringUtils.isBlank(heraAppBaseInfo.getAppName())) { diff --git a/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java b/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java index 8bc926578..23cf9ddba 100644 --- a/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java +++ b/ozhera-app/app-service/src/main/java/org/apache/ozhera/app/service/impl/HeraAppServiceImpl.java @@ -109,6 +109,31 @@ public List queryAppInfoWithLog(String appName, Integer type) { return appBaseInfos; } + @Override + public List queryAppInfoWithLogLatest(String appName, Integer type, Integer count){ + Integer platformType = null; + Integer appType = null; + if (Objects.nonNull(type)) { + appType = appTypeServiceExtension.getAppTypeLog(type); + platformType = appTypeServiceExtension.getAppPlatForm(type); + } + List appBaseInfos; + if(appName != null && appName.isBlank()){ + appBaseInfos = heraAppBaseInfoMapper.queryAppInfo(appName, platformType, appType); + }else{ + appBaseInfos = heraAppBaseInfoMapper.queryLatestAppInfo(count, platformType, appType); + } + + if (CollectionUtils.isNotEmpty(appBaseInfos)) { + appBaseInfos = appBaseInfos.parallelStream().map(appBaseInfo -> { + appBaseInfo.setPlatformName(appTypeServiceExtension.getPlatformName(appBaseInfo.getPlatformType())); + appBaseInfo.setAppTypeName(appTypeServiceExtension.getAppTypeName(appBaseInfo.getAppType())); + return appBaseInfo; + }).collect(Collectors.toList()); + } + return appBaseInfos; + } + @Override public List querySpecifiedAppInfoWithLog(String appName, Integer limit, Integer type) { List appBaseInfos; diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java index bc19a63bb..d8eec71c7 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/domain/SearchLog.java @@ -354,19 +354,19 @@ public void downLogFileV2(Workbook excel, String fileName) throws IOException { Down.down(fileName); } catch (Exception e) { log.error("downLogFile error,fileName:{}", fileName, e); + throw e; } finally { - if (excel != null) { - excel.close(); - if (excel instanceof SXSSFWorkbook sxssf) { - sxssf.dispose(); - } - } if (fos != null) { - fos.close(); + try { + fos.close(); + } catch (Exception e) { + log.error("Error closing FileOutputStream", e); + } } if (file != null) { file.delete(); } + // Note: Workbook cleanup (close/dispose) is handled by the caller } } diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java index acae2812c..3a3b686ed 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/HeraAppService.java @@ -35,6 +35,8 @@ public interface HeraAppService { List queryAppInfoWithLog(String appName, Integer type); + List queryAppInfoWithLogLatest(String appName, Integer type, Integer limit); + List queryAllExistsApp(); AppBaseInfo queryById(Long id); diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java index 07f2b1707..6f1509fdd 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/EsDataServiceImpl.java @@ -750,87 +750,100 @@ public void logExport(LogQuery logQuery) throws Exception { final int rowsPerSheet = 5000; //each sheet is fixed at 5000 rows final int maxPage = 100; //max pages, the upper limit of the number of rows: 5000*100 int page = 1; - Workbook workbook = new SXSSFWorkbook(); - String title = generateTitle(logQuery); - List headers = null; - Object[] lastSortValues = null; - logQuery.setIsDownload(true); - while(page <= maxPage) { - logQuery.setPageSize(rowsPerSheet); - logQuery.setPage(page); - //Prevent errors when performing deep paging in the ES database - logQuery.setSearchAfter(lastSortValues); - - Result logDTOResult = this.logQuery(logQuery); - if (logDTOResult.getCode() != CommonError.Success.getCode() || logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() == null || logDTOResult.getData().getLogDataDTOList().isEmpty()) { - break; - } - List> list = logDTOResult.getData().getLogDataDTOList().stream().map(logDataDto -> ExportUtils.SplitTooLongContent(logDataDto)).collect(Collectors.toList()); - - if (list == null || list.isEmpty()) { - break; - } + SXSSFWorkbook workbook = new SXSSFWorkbook(); + try { + String title = generateTitle(logQuery); + List headers = null; + Object[] lastSortValues = null; + logQuery.setIsDownload(true); + while (page <= maxPage) { + logQuery.setPageSize(rowsPerSheet); + logQuery.setPage(page); + //Prevent errors when performing deep paging in the ES database + logQuery.setSearchAfter(lastSortValues); + + Result logDTOResult = this.logQuery(logQuery); + if (logDTOResult.getCode() != CommonError.Success.getCode() || logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() == null || logDTOResult.getData().getLogDataDTOList().isEmpty()) { + break; + } + List> list = logDTOResult.getData().getLogDataDTOList().stream().map(logDataDto -> ExportUtils.SplitTooLongContent(logDataDto)).collect(Collectors.toList()); - if (page == 1){ - headers = new ArrayList<>(list.getFirst().keySet()); - } + if (list == null || list.isEmpty()) { + break; + } - //If the table header is empty, then obtain the header from the current page. - if (headers == null || headers.isEmpty()) { - headers = new ArrayList<>(list.getFirst().keySet()); - } + if (page == 1) { + headers = new ArrayList<>(list.getFirst().keySet()); + } - Sheet sheet = workbook.createSheet("Sheet" + page); - int dataBeginRow; - - if (title != null && !title.isEmpty() && page == 1) { //only the first sheet has a title - Row titleRow = sheet.createRow(0); - Cell cell = titleRow.createCell(0); - cell.setCellValue(title); - CellStyle titleStyle = workbook.createCellStyle(); - titleStyle.setAlignment((short)2); - titleStyle.setVerticalAlignment((short)1); - Font titleFont = workbook.createFont(); - titleFont.setBoldweight((short)700); - titleStyle.setFont(titleFont); - cell.setCellStyle(titleStyle); - titleRow.setHeight((short)450); - dataBeginRow = list != null && !list.isEmpty() ? ((Map)list.get(0)).size() - 1 : 5; - sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, dataBeginRow)); - } + //If the table header is empty, then obtain the header from the current page. + if (headers == null || headers.isEmpty()) { + headers = new ArrayList<>(list.getFirst().keySet()); + } - if (list != null && !list.isEmpty()) { - CellStyle headerStyle = workbook.createCellStyle(); - headerStyle.setAlignment((short)2); - headerStyle.setBorderBottom((short)2); - headerStyle.setBorderTop((short)2); - int headRowIndex = title != null && !title.isEmpty() && page == 1 ? 1 : 0; - Row headRow = sheet.createRow(headRowIndex); - int i = 0; - for (String h : headers){ - Cell cell = headRow.createCell(i++); - cell.setCellValue(h); - cell.setCellStyle(headerStyle); + Sheet sheet = workbook.createSheet("Sheet" + page); + int dataBeginRow; + + if (title != null && !title.isEmpty() && page == 1) { //only the first sheet has a title + Row titleRow = sheet.createRow(0); + Cell cell = titleRow.createCell(0); + cell.setCellValue(title); + CellStyle titleStyle = workbook.createCellStyle(); + titleStyle.setAlignment((short) 2); + titleStyle.setVerticalAlignment((short) 1); + Font titleFont = workbook.createFont(); + titleFont.setBoldweight((short) 700); + titleStyle.setFont(titleFont); + cell.setCellStyle(titleStyle); + titleRow.setHeight((short) 450); + dataBeginRow = list != null && !list.isEmpty() ? ((Map) list.get(0)).size() - 1 : 5; + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, dataBeginRow)); } - dataBeginRow = title != null && !title.isEmpty() && page == 1 ? 2 : 1; + if (list != null && !list.isEmpty()) { + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment((short) 2); + headerStyle.setBorderBottom((short) 2); + headerStyle.setBorderTop((short) 2); + int headRowIndex = title != null && !title.isEmpty() && page == 1 ? 1 : 0; + Row headRow = sheet.createRow(headRowIndex); + int i = 0; + for (String h : headers) { + Cell cell = headRow.createCell(i++); + cell.setCellValue(h); + cell.setCellStyle(headerStyle); + } - for(int j = 0; j < list.size(); ++j) { - Row row = sheet.createRow(dataBeginRow++); - Map rowMap = list.get(j); - for (int k = 0; k < headers.size(); k++){ - Cell cell = row.createCell(k); - Object val = rowMap.get(headers.get(k)); - cell.setCellValue(val == null ? "" : val.toString()); + dataBeginRow = title != null && !title.isEmpty() && page == 1 ? 2 : 1; + + for (int j = 0; j < list.size(); ++j) { + Row row = sheet.createRow(dataBeginRow++); + Map rowMap = list.get(j); + for (int k = 0; k < headers.size(); k++) { + Cell cell = row.createCell(k); + Object val = rowMap.get(headers.get(k)); + cell.setCellValue(val == null ? "" : val.toString()); + } } } + lastSortValues = logDTOResult.getData().getThisSortValue(); + page++; + } + // Download + String fileName = String.format("%s_log.xlsx", logQuery.getLogstore()); + searchLog.downLogFileV2(workbook, fileName); + } finally { + // Ensure temporary files are cleaned up even if an exception occurs + if (workbook != null) { + try { + workbook.close(); + } catch (Exception e) { + log.error("Error closing workbook", e); + } finally { + workbook.dispose(); + } } - lastSortValues = logDTOResult.getData().getThisSortValue(); - page++; } - // Download - String fileName = String.format("%s_log.xlsx", logQuery.getLogstore()); - searchLog.downLogFileV2(workbook, fileName); } private String generateTitle(LogQuery logQuery) { diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java index d203dd3f9..def5966fa 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/HeraAppServiceImpl.java @@ -62,6 +62,11 @@ public List queryAppInfoWithLog(String appName, Integer type) { return heraAppService.queryAppInfoWithLog(appName, type); } + @Override + public List queryAppInfoWithLogLatest(String appName, Integer type, Integer limit){ + return heraAppService.queryAppInfoWithLogLatest(appName, type, limit); + } + @Override public List querySpecifiedAppInfoWithLog(String appName, Integer limit, Integer type) { return heraAppService.querySpecifiedAppInfoWithLog(appName, limit, type); diff --git a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java index 216b7c0e7..572d6a531 100644 --- a/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java +++ b/ozhera-log/log-manager/src/main/java/org/apache/ozhera/log/manager/service/impl/LogAgentApiServiceImpl.java @@ -48,7 +48,7 @@ import java.util.List; @Slf4j -@Service(interfaceClass = LogAgentApiService.class, group = "$dubbo.group", timeout = 10000) +@Service(interfaceClass = LogAgentApiService.class, group = "$dubbo.api.group", timeout = 10000) public class LogAgentApiServiceImpl implements LogAgentApiService { @Resource diff --git a/ozhera-log/log-manager/src/main/resources/config.properties b/ozhera-log/log-manager/src/main/resources/config.properties index 0eab25870..321b52775 100644 --- a/ozhera-log/log-manager/src/main/resources/config.properties +++ b/ozhera-log/log-manager/src/main/resources/config.properties @@ -46,6 +46,7 @@ miline_rocketmq_consumer_group=${miline_rocketmq_consumer_group} #dubbo dubbo_app_name=${dubbo_app_name} dubbo.group=${dubbo.group} +dubbo.api.group=${dubbo.api.group} dubbo.env.group=${dubbo.env.group} dubbo_reg_check=${dubbo_reg_check} dubbo_reg_address=${dubbo_reg_address} diff --git a/ozhera-log/log-manager/src/main/resources/config/open.properties b/ozhera-log/log-manager/src/main/resources/config/open.properties index 48a3eafed..172e323e5 100644 --- a/ozhera-log/log-manager/src/main/resources/config/open.properties +++ b/ozhera-log/log-manager/src/main/resources/config/open.properties @@ -49,6 +49,7 @@ app.env=test #dubbo dubbo_app_name=milog dubbo.group= +dubbo.api.group=open dubbo.env.group=open dubbo_reg_check=false dubbo_reg_address=nacos://nacos:80