diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProxyController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProxyController.java index d5504d5aca..a449cc6670 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProxyController.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/ProxyController.java @@ -20,15 +20,17 @@ import org.apache.streampark.console.base.exception.ApiAlertException; import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.FlinkApplication; +import org.apache.streampark.console.core.entity.SparkApplication; +import org.apache.streampark.console.core.enums.EngineTypeEnum; import org.apache.streampark.console.core.enums.UserTypeEnum; import org.apache.streampark.console.core.service.ProxyService; import org.apache.streampark.console.core.service.application.ApplicationLogService; import org.apache.streampark.console.core.service.application.FlinkApplicationManageService; +import org.apache.streampark.console.core.service.application.SparkApplicationManageService; import org.apache.streampark.console.core.util.ServiceHelper; import org.apache.streampark.console.system.entity.Member; import org.apache.streampark.console.system.entity.User; import org.apache.streampark.console.system.service.MemberService; -import org.apache.streampark.console.system.service.UserService; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -53,16 +55,16 @@ public class ProxyController { private ProxyService proxyService; @Autowired - private FlinkApplicationManageService applicationManageService; + private FlinkApplicationManageService flinkApplicationManageService; @Autowired - private ApplicationLogService logService; + private SparkApplicationManageService sparkApplicationManageService; @Autowired - private MemberService memberService; + private ApplicationLogService logService; @Autowired - private UserService userService; + private MemberService memberService; @GetMapping("{type}/{id}/assets/**") public ResponseEntity proxyFlinkAssets(HttpServletRequest request, @PathVariable("type") String type, @@ -79,15 +81,17 @@ public ResponseEntity proxyFlink(HttpServletRequest request, @PathVariable("t private ResponseEntity proxy(String type, HttpServletRequest request, Long id) throws Exception { ApplicationLog log; - FlinkApplication app; - switch (type) { case "flink": - app = applicationManageService.getApp(id); - checkProxyApp(app); - return proxyService.proxyFlink(request, app); - case "cluster": - return proxyService.proxyCluster(request, id); + FlinkApplication flinkApplication = flinkApplicationManageService.getApp(id); + checkProxyApp(flinkApplication.getTeamId()); + return proxyService.proxyFlink(request, flinkApplication); + case "spark": + SparkApplication sparkApplication = sparkApplicationManageService.getApp(id); + checkProxyApp(sparkApplication.getTeamId()); + return proxyService.proxySpark(request, sparkApplication); + case "flink_cluster": + return proxyService.proxyFlinkCluster(request, id); case "history": log = logService.getById(id); checkProxyAppLog(log); @@ -101,14 +105,12 @@ private ResponseEntity proxy(String type, HttpServletRequest request, Long id } } - private void checkProxyApp(FlinkApplication app) { - ApiAlertException.throwIfNull(app, "Invalid operation, application is invalid."); - + private void checkProxyApp(Long teamId) { User user = ServiceHelper.getLoginUser(); ApiAlertException.throwIfNull(user, "Permission denied, please login first."); if (user.getUserType() != UserTypeEnum.ADMIN) { - Member member = memberService.getByTeamIdUserName(app.getTeamId(), user.getUsername()); + Member member = memberService.getByTeamIdUserName(teamId, user.getUsername()); ApiAlertException.throwIfNull(member, "Permission denied, this job not created by the current user, And the job cannot be found in the current user's team."); } @@ -116,7 +118,13 @@ private void checkProxyApp(FlinkApplication app) { private void checkProxyAppLog(ApplicationLog log) { ApiAlertException.throwIfNull(log, "Invalid operation, The application log not found."); - FlinkApplication app = applicationManageService.getById(log.getAppId()); - checkProxyApp(app); + if (log.getJobType() == EngineTypeEnum.FLINK.getCode()) { + FlinkApplication app = flinkApplicationManageService.getById(log.getAppId()); + checkProxyApp(app.getTeamId()); + } + if (log.getJobType() == EngineTypeEnum.SPARK.getCode()) { + SparkApplication app = sparkApplicationManageService.getById(log.getAppId()); + checkProxyApp(app.getTeamId()); + } } } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkApplicationController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkApplicationController.java index d34e728dc3..e0849291f6 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkApplicationController.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkApplicationController.java @@ -23,15 +23,15 @@ import org.apache.streampark.console.base.domain.RestResponse; import org.apache.streampark.console.base.exception.InternalException; import org.apache.streampark.console.core.annotation.AppChangeEvent; +import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.FlinkApplicationBackUp; import org.apache.streampark.console.core.entity.SparkApplication; -import org.apache.streampark.console.core.entity.SparkApplicationLog; import org.apache.streampark.console.core.enums.AppExistsStateEnum; import org.apache.streampark.console.core.service.ResourceService; +import org.apache.streampark.console.core.service.application.ApplicationLogService; import org.apache.streampark.console.core.service.application.FlinkApplicationBackUpService; import org.apache.streampark.console.core.service.application.SparkApplicationActionService; import org.apache.streampark.console.core.service.application.SparkApplicationInfoService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; import org.apache.streampark.console.core.service.application.SparkApplicationManageService; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -69,7 +69,7 @@ public class SparkApplicationController { private FlinkApplicationBackUpService backUpService; @Autowired - private SparkApplicationLogService applicationLogService; + private ApplicationLogService applicationLogService; @Autowired private ResourceService resourceService; @@ -202,8 +202,8 @@ public RestResponse backups(FlinkApplicationBackUp backUp, RestRequest request) } @PostMapping("opt_log") - public RestResponse optionlog(SparkApplicationLog applicationLog, RestRequest request) { - IPage applicationList = applicationLogService.getPage(applicationLog, request); + public RestResponse optionlog(ApplicationLog applicationLog, RestRequest request) { + IPage applicationList = applicationLogService.getPage(applicationLog, request); return RestResponse.success(applicationList); } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkProxyController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkProxyController.java deleted file mode 100644 index fa68395eab..0000000000 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SparkProxyController.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.streampark.console.core.controller; - -import org.apache.streampark.console.base.exception.ApiAlertException; -import org.apache.streampark.console.core.entity.SparkApplication; -import org.apache.streampark.console.core.entity.SparkApplicationLog; -import org.apache.streampark.console.core.enums.UserTypeEnum; -import org.apache.streampark.console.core.service.ProxyService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; -import org.apache.streampark.console.core.service.application.SparkApplicationManageService; -import org.apache.streampark.console.core.util.ServiceHelper; -import org.apache.streampark.console.system.entity.Member; -import org.apache.streampark.console.system.entity.User; -import org.apache.streampark.console.system.service.MemberService; - -import org.apache.shiro.authz.annotation.RequiresPermissions; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; - -@Slf4j -@Validated -@RestController -@RequestMapping("spark/proxy") -public class SparkProxyController { - - @Autowired - private ProxyService proxyService; - - @Autowired - private SparkApplicationManageService applicationManageService; - - @Autowired - private SparkApplicationLogService logService; - - @Autowired - private MemberService memberService; - - @GetMapping("{type}/{id}/**") - @RequiresPermissions("app:view") - public ResponseEntity proxySpark(HttpServletRequest request, @PathVariable("type") String type, - @PathVariable("id") Long id) throws Exception { - return proxy(type, request, id); - } - - private ResponseEntity proxy(String type, HttpServletRequest request, Long id) throws Exception { - SparkApplicationLog log; - - switch (type) { - case "yarn": - log = logService.getById(id); - checkProxyAppLog(log); - return proxyService.proxyYarn(request, log); - default: - return ResponseEntity.notFound().build(); - } - } - - private void checkProxyApp(SparkApplication app) { - ApiAlertException.throwIfNull(app, "Invalid operation, application is invalid."); - - User user = ServiceHelper.getLoginUser(); - ApiAlertException.throwIfNull(user, "Permission denied, please login first."); - - if (user.getUserType() != UserTypeEnum.ADMIN) { - Member member = memberService.getByTeamIdUserName(app.getTeamId(), user.getUsername()); - ApiAlertException.throwIfNull(member, - "Permission denied, this job not created by the current user, And the job cannot be found in the current user's team."); - } - } - - private void checkProxyAppLog(SparkApplicationLog log) { - ApiAlertException.throwIfNull(log, "Invalid operation, The application log not found."); - SparkApplication app = applicationManageService.getById(log.getAppId()); - checkProxyApp(app); - } -} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplication.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplication.java index c1efe432c3..7d58641368 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplication.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplication.java @@ -110,7 +110,7 @@ public class SparkApplication extends BaseEntity { * driver pod name for spark on K8s.(will be supported in the future) */ @TableField(updateStrategy = FieldStrategy.IGNORED) - private String appId; + private String clusterId; private String yarnQueue; @@ -509,7 +509,7 @@ public int hashCode() { public static class SFunc { public static final SFunction ID = SparkApplication::getId; - public static final SFunction APP_ID = SparkApplication::getAppId; + public static final SFunction APP_ID = SparkApplication::getClusterId; public static final SFunction START_TIME = SparkApplication::getStartTime; public static final SFunction END_TIME = SparkApplication::getEndTime; public static final SFunction DURATION = SparkApplication::getDuration; diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplicationLog.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplicationLog.java deleted file mode 100644 index 8c51c92ed5..0000000000 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SparkApplicationLog.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.streampark.console.core.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -import java.util.Date; - -@Data -@TableName("t_spark_log") -@Slf4j -public class SparkApplicationLog { - - @TableId(type = IdType.AUTO) - private Long id; - /** appId */ - private Long appId; - /** applicationId */ - private String sparkAppId; - /** tracking url of current spark application */ - private String trackUrl; - /** start status */ - private Boolean success; - /** option name */ - private Integer optionName; - /** option time */ - private Date optionTime; - /** exception at the start */ - private String exception; - /** The user who operates the application */ - private Long userId; -} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/mapper/SparkApplicationLogMapper.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/mapper/SparkApplicationLogMapper.java deleted file mode 100644 index c9e77768a5..0000000000 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/mapper/SparkApplicationLogMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.streampark.console.core.mapper; - -import org.apache.streampark.console.core.entity.SparkApplicationLog; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -public interface SparkApplicationLogMapper extends BaseMapper { -} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/ProxyService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/ProxyService.java index c9f269cbf3..8722db5a63 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/ProxyService.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/ProxyService.java @@ -19,7 +19,7 @@ import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.FlinkApplication; -import org.apache.streampark.console.core.entity.SparkApplicationLog; +import org.apache.streampark.console.core.entity.SparkApplication; import org.springframework.http.ResponseEntity; @@ -29,11 +29,11 @@ public interface ProxyService { ResponseEntity proxyFlink(HttpServletRequest request, FlinkApplication app) throws Exception; - ResponseEntity proxyYarn(HttpServletRequest request, SparkApplicationLog log) throws Exception; + ResponseEntity proxySpark(HttpServletRequest request, SparkApplication app) throws Exception; ResponseEntity proxyYarn(HttpServletRequest request, ApplicationLog log) throws Exception; ResponseEntity proxyHistory(HttpServletRequest request, ApplicationLog log) throws Exception; - ResponseEntity proxyCluster(HttpServletRequest request, Long clusterId) throws Exception; + ResponseEntity proxyFlinkCluster(HttpServletRequest request, Long clusterId) throws Exception; } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/SparkApplicationLogService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/SparkApplicationLogService.java deleted file mode 100644 index 7c3687cbc8..0000000000 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/SparkApplicationLogService.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.streampark.console.core.service.application; - -import org.apache.streampark.console.base.domain.RestRequest; -import org.apache.streampark.console.core.entity.SparkApplicationLog; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; - -/** This interface is used to record spark application operation logs */ -public interface SparkApplicationLogService extends IService { - - /** - * Retrieves a page of {@link SparkApplicationLog} objects based on the provided parameters. - * - * @param sparkApplicationLog The {@link SparkApplicationLog} object containing the search criteria. - * @param request The {@link RestRequest} object used for pagination and sorting. - * @return An {@link IPage} containing the retrieved {@link SparkApplicationLog} objects. - */ - IPage getPage(SparkApplicationLog sparkApplicationLog, RestRequest request); - - /** - * remove application log by application id - * - * @param appId The id of the application to be removed - */ - void removeByAppId(Long appId); -} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/AppBuildPipeServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkAppBuildPipeServiceImpl.java similarity index 99% rename from streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/AppBuildPipeServiceImpl.java rename to streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkAppBuildPipeServiceImpl.java index 2a44de2fa7..462892af12 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/AppBuildPipeServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkAppBuildPipeServiceImpl.java @@ -116,7 +116,7 @@ @Service @Slf4j @Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class) -public class AppBuildPipeServiceImpl +public class FlinkAppBuildPipeServiceImpl extends ServiceImpl implements diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkApplicationActionServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkApplicationActionServiceImpl.java index 005a15dd19..cd0344fdb7 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkApplicationActionServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/FlinkApplicationActionServiceImpl.java @@ -49,6 +49,7 @@ import org.apache.streampark.console.core.enums.CheckPointTypeEnum; import org.apache.streampark.console.core.enums.ConfigFileTypeEnum; import org.apache.streampark.console.core.enums.DistributedTaskEnum; +import org.apache.streampark.console.core.enums.EngineTypeEnum; import org.apache.streampark.console.core.enums.FlinkAppStateEnum; import org.apache.streampark.console.core.enums.OperationEnum; import org.apache.streampark.console.core.enums.OptionStateEnum; @@ -270,6 +271,7 @@ public void cancel(FlinkApplication appParam) throws Exception { application.setState(FlinkAppStateEnum.CANCELLING.getValue()); ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.FLINK.getCode()); applicationLog.setOptionName(OperationEnum.CANCEL.getValue()); applicationLog.setAppId(application.getId()); applicationLog.setTrackingUrl(application.getJobManagerUrl()); @@ -517,6 +519,7 @@ public void start(FlinkApplication appParam, boolean auto) throws Exception { @Nonnull private ApplicationLog constructAppLog(FlinkApplication application) { ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.FLINK.getCode()); applicationLog.setOptionName(OperationEnum.START.getValue()); applicationLog.setAppId(application.getId()); applicationLog.setOptionTime(new Date()); diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkAppBuildPipeServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkAppBuildPipeServiceImpl.java index f62c7e9d5d..167652d220 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkAppBuildPipeServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkAppBuildPipeServiceImpl.java @@ -30,14 +30,15 @@ import org.apache.streampark.console.base.util.WebUtils; import org.apache.streampark.console.core.bean.Dependency; import org.apache.streampark.console.core.entity.AppBuildPipeline; +import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.Message; import org.apache.streampark.console.core.entity.Resource; import org.apache.streampark.console.core.entity.SparkApplication; import org.apache.streampark.console.core.entity.SparkApplicationConfig; -import org.apache.streampark.console.core.entity.SparkApplicationLog; import org.apache.streampark.console.core.entity.SparkEnv; import org.apache.streampark.console.core.entity.SparkSql; import org.apache.streampark.console.core.enums.CandidateTypeEnum; +import org.apache.streampark.console.core.enums.EngineTypeEnum; import org.apache.streampark.console.core.enums.NoticeTypeEnum; import org.apache.streampark.console.core.enums.OptionStateEnum; import org.apache.streampark.console.core.enums.ReleaseStateEnum; @@ -47,10 +48,10 @@ import org.apache.streampark.console.core.service.ResourceService; import org.apache.streampark.console.core.service.SparkEnvService; import org.apache.streampark.console.core.service.SparkSqlService; +import org.apache.streampark.console.core.service.application.ApplicationLogService; import org.apache.streampark.console.core.service.application.SparkAppBuildPipeService; import org.apache.streampark.console.core.service.application.SparkApplicationConfigService; import org.apache.streampark.console.core.service.application.SparkApplicationInfoService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; import org.apache.streampark.console.core.service.application.SparkApplicationManageService; import org.apache.streampark.console.core.util.ServiceHelper; import org.apache.streampark.console.core.watcher.SparkAppHttpWatcher; @@ -111,13 +112,13 @@ public class SparkAppBuildPipeServiceImpl private MessageService messageService; @Autowired - private SparkApplicationManageService applicationManageService; + private ApplicationLogService applicationLogService; @Autowired - private SparkApplicationInfoService applicationInfoService; + private SparkApplicationManageService applicationManageService; @Autowired - private SparkApplicationLogService applicationLogService; + private SparkApplicationInfoService applicationInfoService; @Autowired private SparkAppHttpWatcher sparkAppHttpWatcher; @@ -145,7 +146,8 @@ public boolean buildApplication(@Nonnull Long appId, boolean forceBuild) { checkBuildEnv(appId, forceBuild); SparkApplication app = applicationManageService.getById(appId); - SparkApplicationLog applicationLog = new SparkApplicationLog(); + ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.SPARK.getCode()); applicationLog.setOptionName(RELEASE.getValue()); applicationLog.setAppId(app.getId()); applicationLog.setOptionTime(new Date()); diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationActionServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationActionServiceImpl.java index eb55aaf750..5586bbfe81 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationActionServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationActionServiceImpl.java @@ -32,14 +32,15 @@ import org.apache.streampark.console.base.exception.ApiAlertException; import org.apache.streampark.console.base.exception.ApplicationException; import org.apache.streampark.console.core.entity.AppBuildPipeline; +import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.Resource; import org.apache.streampark.console.core.entity.SparkApplication; import org.apache.streampark.console.core.entity.SparkApplicationConfig; -import org.apache.streampark.console.core.entity.SparkApplicationLog; import org.apache.streampark.console.core.entity.SparkEnv; import org.apache.streampark.console.core.entity.SparkSql; import org.apache.streampark.console.core.enums.ConfigFileTypeEnum; import org.apache.streampark.console.core.enums.DistributedTaskEnum; +import org.apache.streampark.console.core.enums.EngineTypeEnum; import org.apache.streampark.console.core.enums.ReleaseStateEnum; import org.apache.streampark.console.core.enums.SparkAppStateEnum; import org.apache.streampark.console.core.enums.SparkOperationEnum; @@ -50,11 +51,11 @@ import org.apache.streampark.console.core.service.SparkEnvService; import org.apache.streampark.console.core.service.SparkSqlService; import org.apache.streampark.console.core.service.VariableService; +import org.apache.streampark.console.core.service.application.ApplicationLogService; import org.apache.streampark.console.core.service.application.SparkAppBuildPipeService; import org.apache.streampark.console.core.service.application.SparkApplicationActionService; import org.apache.streampark.console.core.service.application.SparkApplicationConfigService; import org.apache.streampark.console.core.service.application.SparkApplicationInfoService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; import org.apache.streampark.console.core.util.ServiceHelper; import org.apache.streampark.console.core.watcher.SparkAppHttpWatcher; import org.apache.streampark.flink.packer.pipeline.BuildResult; @@ -114,7 +115,7 @@ public class SparkApplicationActionServiceImpl private SparkApplicationConfigService configService; @Autowired - private SparkApplicationLogService applicationLogService; + private ApplicationLogService applicationLogService; @Autowired private SparkEnvService sparkEnvService; @@ -212,11 +213,12 @@ public void cancel(SparkApplication appParam) throws Exception { SparkApplication application = getById(appParam.getId()); application.setState(SparkAppStateEnum.STOPPING.getValue()); - SparkApplicationLog applicationLog = new SparkApplicationLog(); + ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.SPARK.getCode()); applicationLog.setOptionName(SparkOperationEnum.CANCEL.getValue()); applicationLog.setAppId(application.getId()); applicationLog.setOptionTime(new Date()); - applicationLog.setSparkAppId(application.getAppId()); + applicationLog.setClusterId(application.getClusterId()); applicationLog.setUserId(ServiceHelper.getUserId()); application.setOptionTime(new Date()); this.baseMapper.updateById(application); @@ -236,7 +238,7 @@ public void cancel(SparkApplication appParam) throws Exception { sparkEnv.getSparkVersion(), SparkDeployMode.of(application.getDeployMode()), stopProper, - application.getAppId()); + application.getClusterId()); CompletableFuture stopFuture = CompletableFuture.supplyAsync(() -> SparkClient.cancel(stopRequest), executorService); @@ -304,7 +306,8 @@ public void start(SparkApplication appParam, boolean auto) throws Exception { // 2) update app state to starting... starting(application); - SparkApplicationLog applicationLog = new SparkApplicationLog(); + ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.SPARK.getCode()); applicationLog.setOptionName(SparkOperationEnum.START.getValue()); applicationLog.setAppId(application.getId()); applicationLog.setOptionTime(new Date()); @@ -387,10 +390,10 @@ public void start(SparkApplication appParam, boolean auto) throws Exception { applicationLog.setSuccess(true); application.resolveScheduleConf(response.sparkProperties()); if (StringUtils.isNoneEmpty(response.sparkAppId())) { - application.setAppId(response.sparkAppId()); + application.setClusterId(response.sparkAppId()); } - applicationLog.setSparkAppId(response.sparkAppId()); - applicationLog.setTrackUrl(response.trackingUrl()); + applicationLog.setClusterId(response.sparkAppId()); + applicationLog.setTrackingUrl(response.trackingUrl()); application.setStartTime(new Date()); application.setEndTime(null); diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationLogServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationLogServiceImpl.java deleted file mode 100644 index 34ce31cd38..0000000000 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationLogServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.streampark.console.core.service.application.impl; - -import org.apache.streampark.console.base.domain.RestRequest; -import org.apache.streampark.console.base.mybatis.pager.MybatisPager; -import org.apache.streampark.console.core.entity.SparkApplicationLog; -import org.apache.streampark.console.core.mapper.SparkApplicationLogMapper; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@Service -@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) -public class SparkApplicationLogServiceImpl extends ServiceImpl - implements - SparkApplicationLogService { - - @Override - public IPage getPage(SparkApplicationLog sparkApplicationLog, RestRequest request) { - request.setSortField("option_time"); - Page page = MybatisPager.getPage(request); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(SparkApplicationLog::getAppId, sparkApplicationLog.getAppId()); - return this.page(page, queryWrapper); - } - - @Override - public void removeByAppId(Long appId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(SparkApplicationLog::getAppId, appId); - this.remove(queryWrapper); - } -} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationManageServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationManageServiceImpl.java index 1cd542347a..618d53b26b 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationManageServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/application/impl/SparkApplicationManageServiceImpl.java @@ -46,10 +46,10 @@ import org.apache.streampark.console.core.service.SparkSqlService; import org.apache.streampark.console.core.service.YarnQueueService; import org.apache.streampark.console.core.service.application.AppBuildPipeService; +import org.apache.streampark.console.core.service.application.ApplicationLogService; import org.apache.streampark.console.core.service.application.ApplicationService; import org.apache.streampark.console.core.service.application.SparkApplicationBackUpService; import org.apache.streampark.console.core.service.application.SparkApplicationConfigService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; import org.apache.streampark.console.core.service.application.SparkApplicationManageService; import org.apache.streampark.console.core.util.ServiceHelper; import org.apache.streampark.flink.packer.pipeline.PipelineStatusEnum; @@ -107,7 +107,7 @@ public class SparkApplicationManageServiceImpl private SparkApplicationConfigService configService; @Autowired - private SparkApplicationLogService applicationLogService; + private ApplicationLogService applicationLogService; @Autowired private SparkSqlService sparkSqlService; @@ -153,9 +153,7 @@ public void persistMetrics(SparkApplication appParam) { @Override public boolean mapping(SparkApplication appParam) { - boolean mapping = this.baseMapper.mapping(appParam); - SparkApplication application = getById(appParam.getId()); - return mapping; + return this.baseMapper.mapping(appParam); } @Override diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/FlinkSavepointServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/FlinkSavepointServiceImpl.java index 32303ea072..3a93e42f73 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/FlinkSavepointServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/FlinkSavepointServiceImpl.java @@ -32,6 +32,7 @@ import org.apache.streampark.console.core.entity.FlinkEnv; import org.apache.streampark.console.core.entity.FlinkSavepoint; import org.apache.streampark.console.core.enums.CheckPointTypeEnum; +import org.apache.streampark.console.core.enums.EngineTypeEnum; import org.apache.streampark.console.core.enums.OperationEnum; import org.apache.streampark.console.core.enums.OptionStateEnum; import org.apache.streampark.console.core.mapper.FlinkSavepointMapper; @@ -189,6 +190,7 @@ public void trigger(Long appId, @Nullable String savepointPath, @Nullable Boolea @Nonnull private ApplicationLog getApplicationLog(FlinkApplication application) { ApplicationLog applicationLog = new ApplicationLog(); + applicationLog.setJobType(EngineTypeEnum.FLINK.getCode()); applicationLog.setOptionName(OperationEnum.SAVEPOINT.getValue()); applicationLog.setAppId(application.getId()); applicationLog.setTrackingUrl(application.getJobManagerUrl()); diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/ProxyServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/ProxyServiceImpl.java index 4dac800990..59dbd3004d 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/ProxyServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/ProxyServiceImpl.java @@ -22,7 +22,7 @@ import org.apache.streampark.console.core.entity.ApplicationLog; import org.apache.streampark.console.core.entity.FlinkApplication; import org.apache.streampark.console.core.entity.FlinkCluster; -import org.apache.streampark.console.core.entity.SparkApplicationLog; +import org.apache.streampark.console.core.entity.SparkApplication; import org.apache.streampark.console.core.service.FlinkClusterService; import org.apache.streampark.console.core.service.ProxyService; import org.apache.streampark.console.core.watcher.FlinkK8sWatcherWrapper; @@ -95,7 +95,6 @@ public void handleError(@Nonnull ClientHttpResponse response) { @Override public ResponseEntity proxyFlink(HttpServletRequest request, FlinkApplication app) throws Exception { ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); - String url = null; switch (app.getDeployModeEnum()) { case YARN_PER_JOB: @@ -129,22 +128,25 @@ public ResponseEntity proxyFlink(HttpServletRequest request, FlinkApplication } @Override - public ResponseEntity proxyYarn(HttpServletRequest request, ApplicationLog log) throws Exception { - ResponseEntity.BodyBuilder builder = ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); - String yarnId = log.getClusterId(); - if (StringUtils.isBlank(yarnId)) { - return builder.body("The yarn application id is null."); + public ResponseEntity proxySpark(HttpServletRequest request, SparkApplication app) throws Exception { + ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); + switch (app.getDeployModeEnum()) { + case YARN_CLIENT: + case YARN_CLUSTER: + String yarnURL = YarnUtils.getRMWebAppProxyURL(); + String url = yarnURL + "/proxy/" + app.getClusterId(); + url += getRequestURL(request, "/proxy/spark/" + app.getId()); + return proxyYarnRequest(request, url); + default: + throw new UnsupportedOperationException( + "unsupported deployMode ".concat(app.getDeployModeEnum().getName())); } - String yarnURL = YarnUtils.getRMWebAppProxyURL(); - String url = yarnURL + "/proxy/" + yarnId + "/"; - url += getRequestURL(request, "/proxy/yarn/" + log.getId()); - return proxyYarnRequest(request, url); } @Override - public ResponseEntity proxyYarn(HttpServletRequest request, SparkApplicationLog log) throws Exception { + public ResponseEntity proxyYarn(HttpServletRequest request, ApplicationLog log) throws Exception { ResponseEntity.BodyBuilder builder = ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); - String yarnId = log.getSparkAppId(); + String yarnId = log.getClusterId(); if (StringUtils.isBlank(yarnId)) { return builder.body("The yarn application id is null."); } @@ -167,7 +169,7 @@ public ResponseEntity proxyHistory(HttpServletRequest request, ApplicationLog } @Override - public ResponseEntity proxyCluster(HttpServletRequest request, Long clusterId) throws Exception { + public ResponseEntity proxyFlinkCluster(HttpServletRequest request, Long clusterId) throws Exception { ResponseEntity.BodyBuilder builder = ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); FlinkCluster cluster = flinkClusterService.getById(clusterId); if (cluster == null) { @@ -178,7 +180,7 @@ public ResponseEntity proxyCluster(HttpServletRequest request, Long clusterId return builder.body("The cluster address is invalid."); } - url += getRequestURL(request, "/proxy/cluster/" + clusterId); + url += getRequestURL(request, "/proxy/flink_cluster/" + clusterId); switch (cluster.getFlinkDeployModeEnum()) { case YARN_PER_JOB: case YARN_APPLICATION: diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/utils/AlertTemplateUtils.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/utils/AlertTemplateUtils.java index c0b23a76cd..a255037331 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/utils/AlertTemplateUtils.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/utils/AlertTemplateUtils.java @@ -120,7 +120,7 @@ public static AlertTemplate createAlertTemplate(SparkApplication application, Sp return AlertTemplate.builder() .duration(application.getStartTime(), application.getEndTime()) .jobName(application.getAppName()) - .link(application.getDeployModeEnum(), application.getAppId()) + .link(application.getDeployModeEnum(), application.getClusterId()) .startTime(application.getStartTime()) .endTime(application.getEndTime()) .restart(application.isNeedRestartOnFailed(), application.getRestartCount()) diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/watcher/SparkAppHttpWatcher.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/watcher/SparkAppHttpWatcher.java index 696864687a..1ebad767ad 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/watcher/SparkAppHttpWatcher.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/watcher/SparkAppHttpWatcher.java @@ -29,11 +29,9 @@ import org.apache.streampark.console.core.metrics.spark.SparkApplicationSummary; import org.apache.streampark.console.core.metrics.yarn.YarnAppInfo; import org.apache.streampark.console.core.service.DistributedTaskService; -import org.apache.streampark.console.core.service.SparkEnvService; import org.apache.streampark.console.core.service.alert.AlertService; import org.apache.streampark.console.core.service.application.SparkApplicationActionService; import org.apache.streampark.console.core.service.application.SparkApplicationInfoService; -import org.apache.streampark.console.core.service.application.SparkApplicationLogService; import org.apache.streampark.console.core.service.application.SparkApplicationManageService; import org.apache.streampark.console.core.utils.AlertTemplateUtils; @@ -80,12 +78,6 @@ public class SparkAppHttpWatcher { @Autowired private SparkApplicationInfoService applicationInfoService; - @Autowired - private SparkApplicationLogService applicationLogService; - - @Autowired - private SparkEnvService sparkEnvService; - @Autowired private DistributedTaskService distributedTaskService; @@ -227,7 +219,7 @@ private void getStateFromYarn(SparkApplication application) throws Exception { log.info( "[StreamPark][SparkAppHttpWatcher] getStateFromYarn, app {} was ended, appId is {}, state is {}", application.getId(), - application.getAppId(), + application.getClusterId(), sparkAppStateEnum); application.setEndTime(new Date()); if (appFinalStatus.equals(FinalApplicationStatus.FAILED)) { @@ -329,12 +321,12 @@ public static Collection getWatchingApps() { } private YarnAppInfo httpYarnAppInfo(SparkApplication application) throws Exception { - String reqURL = "ws/v1/cluster/apps/".concat(application.getAppId()); + String reqURL = "ws/v1/cluster/apps/".concat(application.getClusterId()); return yarnRestRequest(reqURL, YarnAppInfo.class); } private Job[] httpJobsStatus(SparkApplication application) throws IOException { String format = "proxy/%s/api/v1/applications/%s/jobs"; - String reqURL = String.format(format, application.getAppId(), application.getAppId()); + String reqURL = String.format(format, application.getClusterId(), application.getClusterId()); return yarnRestRequest(reqURL, Job[].class); } diff --git a/streampark-console/streampark-console-service/src/main/resources/db/schema-h2.sql b/streampark-console/streampark-console-service/src/main/resources/db/schema-h2.sql index dd2de39867..623b9a1396 100644 --- a/streampark-console/streampark-console-service/src/main/resources/db/schema-h2.sql +++ b/streampark-console/streampark-console-service/src/main/resources/db/schema-h2.sql @@ -570,7 +570,7 @@ create table if not exists `t_spark_app` ( `jar_check_sum` bigint default null, `app_properties` text comment 'Arbitrary Spark configuration property in key=value format (e.g. spark.driver.cores=1)', `app_args` text comment 'Arguments passed to the main method of your main class', - `app_id` varchar(64) default null comment '(1)application_id on yarn(2)driver_pod_name on k8s', + `cluster_id` varchar(64) default null comment '(1)application_id on yarn(2)driver_pod_name on k8s', `yarn_queue` varchar(128) default null, `k8s_master_url` varchar(128) default null, `k8s_container_image` varchar(128) default null, @@ -610,24 +610,6 @@ create table if not exists `t_spark_app` ( primary key(`id`) ); - --- ---------------------------- --- Table structure for t_spark_log --- ---------------------------- -create table if not exists `t_spark_log` ( - `id` bigint generated by default as identity not null, - `app_id` bigint default null, - `spark_app_id` varchar(64) default null, - `track_url` varchar(255) default null, - `success` tinyint default null, - `exception` text , - `option_time` datetime default null, - `option_name` tinyint default null, - `user_id` bigint default null comment 'operator user id', - primary key(`id`) -); - - -- ---------------------------- -- Table structure for t_spark_effective -- ---------------------------- diff --git a/streampark-console/streampark-console-service/src/main/resources/mapper/core/SparkApplicationMapper.xml b/streampark-console/streampark-console-service/src/main/resources/mapper/core/SparkApplicationMapper.xml index 037a2c1861..f1011cb9b6 100644 --- a/streampark-console/streampark-console-service/src/main/resources/mapper/core/SparkApplicationMapper.xml +++ b/streampark-console/streampark-console-service/src/main/resources/mapper/core/SparkApplicationMapper.xml @@ -53,8 +53,8 @@ and t.app_name like concat('%', '${app.appName}', '%') - - and t.app_id = #{app.appId} + + and t.cluster_id = #{app.clusterId} and t.state = #{app.state} @@ -92,8 +92,8 @@ update t_spark_app - - app_id=#{app.appId}, + + cluster_id=#{app.clusterId}, end_time=null, state=14, @@ -117,8 +117,8 @@ update t_spark_app - - app_id=#{app.appId}, + + cluster_id=#{app.clusterId}, tracking=#{app.tracking}, diff --git a/streampark-console/streampark-console-webapp/src/api/spark/app.type.ts b/streampark-console/streampark-console-webapp/src/api/spark/app.type.ts index 574d0036a2..41704111b6 100644 --- a/streampark-console/streampark-console-webapp/src/api/spark/app.type.ts +++ b/streampark-console/streampark-console-webapp/src/api/spark/app.type.ts @@ -53,6 +53,7 @@ export interface SparkApplication { appProperties?: string; appArgs?: string; appId?: string; + clusterId?: string; yarnQueue?: string; yarnQueueName?: string; yarnQueueLabel?: string; diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/View.vue b/streampark-console/streampark-console-webapp/src/views/flink/app/View.vue index 68c032cb4e..99cea85a21 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/View.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/View.vue @@ -113,7 +113,6 @@ dataSource.forEach((x) => { x.expanded = [ { - appId: x.appId, jmMemory: x.jmMemory, tmMemory: x.tmMemory, totalTM: x.totalTM, diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue index 7df156c9df..f33a12e7a4 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue @@ -393,14 +393,14 @@ Cancel -