This is an automated email from the ASF dual-hosted git repository.
dingtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozhera.git
The following commit(s) were added to refs/heads/master by this push:
new 6bfb8fcf feat: add new interface (#656)
6bfb8fcf is described below
commit 6bfb8fcfb96a089f4505a52d5fb18b1d848d6594
Author: Xue <[email protected]>
AuthorDate: Fri Apr 3 16:22:14 2026 +0800
feat: add new interface (#656)
* feat: add new interface
* feat: add new interface
* fix: Fix the bug where temporary files are not cleared when exporting the
log.
* fix: Modify the interface version of Dubbo
* fix: Modify the interface version of Dubbo
---------
Co-authored-by: wodiwudi <[email protected]>
---
.../ozhera/app/api/service/HeraAppService.java | 2 +
.../ozhera/app/controller/AppController.java | 5 +
.../app/service/impl/HeraAppServiceImpl.java | 25 ++++
.../ozhera/log/manager/domain/SearchLog.java | 14 +-
.../ozhera/log/manager/service/HeraAppService.java | 2 +
.../manager/service/impl/EsDataServiceImpl.java | 153 +++++++++++----------
.../manager/service/impl/HeraAppServiceImpl.java | 5 +
.../service/impl/LogAgentApiServiceImpl.java | 2 +-
.../src/main/resources/config.properties | 1 +
.../src/main/resources/config/open.properties | 1 +
10 files changed, 132 insertions(+), 78 deletions(-)
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 cb438b83..f155085f 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<AppBaseInfo> queryAppInfoWithLog(String appName, Integer type);
+ List<AppBaseInfo> queryAppInfoWithLogLatest(String appName, Integer type,
Integer count);
+
List<AppBaseInfo> 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 8f63ab7d..78c09e81 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 class AppController {
return heraAppService.queryAppInfoWithLog(appName, type);
}
+ @GetMapping("query/app/log/latest")
+ public List<AppBaseInfo> 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 8bc92657..23cf9ddb 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 class HeraAppServiceImpl implements HeraAppService {
return appBaseInfos;
}
+ @Override
+ public List<AppBaseInfo> 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<AppBaseInfo> 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<AppBaseInfo> querySpecifiedAppInfoWithLog(String appName,
Integer limit, Integer type) {
List<AppBaseInfo> 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 bc19a63b..d8eec71c 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 class SearchLog {
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 acae2812..3a3b686e 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<AppBaseInfo> queryAppInfoWithLog(String appName, Integer type);
+ List<AppBaseInfo> queryAppInfoWithLogLatest(String appName, Integer type,
Integer limit);
+
List<AppBaseInfo> 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 07f2b170..6f1509fd 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 class EsDataServiceImpl implements EsDataService,
LogDataService, EsDataB
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<String> 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<LogDTO> logDTOResult = this.logQuery(logQuery);
- if (logDTOResult.getCode() != CommonError.Success.getCode() ||
logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() ==
null || logDTOResult.getData().getLogDataDTOList().isEmpty()) {
- break;
- }
- List<Map<String, Object>> 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<String> 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<LogDTO> logDTOResult = this.logQuery(logQuery);
+ if (logDTOResult.getCode() != CommonError.Success.getCode() ||
logDTOResult.getData() == null || logDTOResult.getData().getLogDataDTOList() ==
null || logDTOResult.getData().getLogDataDTOList().isEmpty()) {
+ break;
+ }
+ List<Map<String, Object>> 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<String, Object> 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<String, Object> 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 d203dd3f..def5966f 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 class HeraAppServiceImpl implements HeraAppService {
return heraAppService.queryAppInfoWithLog(appName, type);
}
+ @Override
+ public List<AppBaseInfo> queryAppInfoWithLogLatest(String appName, Integer
type, Integer limit){
+ return heraAppService.queryAppInfoWithLogLatest(appName, type, limit);
+ }
+
@Override
public List<AppBaseInfo> 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 216b7c0e..572d6a53 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.ArrayList;
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 0eab2587..321b5277 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 48a3eafe..172e323e 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
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]