This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 659c610 [Fix][UI Next][V1.0.0-Alpha] Fix the monitoring center does
not support multiple worker. (#9061)
659c610 is described below
commit 659c610457c566160b9211764580eab93fdf8c01
Author: songjianet <[email protected]>
AuthorDate: Mon Mar 21 20:00:25 2022 +0800
[Fix][UI Next][V1.0.0-Alpha] Fix the monitoring center does not support
multiple worker. (#9061)
---
.../src/service/modules/monitor/types.ts | 8 +-
.../src/views/monitor/servers/master/index.tsx | 4 +-
.../views/monitor/servers/worker/index.module.scss | 32 +---
.../src/views/monitor/servers/worker/index.tsx | 212 +++++++++++----------
.../src/views/monitor/servers/worker/use-worker.ts | 18 +-
.../views/monitor/servers/worker/worker-modal.tsx | 80 ++++++++
.../task-group/option/components/form-modal.tsx | 21 +-
7 files changed, 233 insertions(+), 142 deletions(-)
diff --git a/dolphinscheduler-ui-next/src/service/modules/monitor/types.ts
b/dolphinscheduler-ui-next/src/service/modules/monitor/types.ts
index 4361542..371b367 100644
--- a/dolphinscheduler-ui-next/src/service/modules/monitor/types.ts
+++ b/dolphinscheduler-ui-next/src/service/modules/monitor/types.ts
@@ -25,7 +25,7 @@ interface DatabaseRes {
date: string
}
-interface MasterRes {
+interface MasterNode {
id: number
host: string
port: number
@@ -35,14 +35,14 @@ interface MasterRes {
lastHeartbeatTime: string
}
-interface WorkerRes {
+interface WorkerNode {
id: number
host: string
port: number
- zkDirectories: string[]
+ zkDirectories: Array<string>
resInfo: string
createTime: string
lastHeartbeatTime: string
}
-export { DatabaseRes, MasterRes, WorkerRes }
+export { DatabaseRes, MasterNode, WorkerNode }
diff --git
a/dolphinscheduler-ui-next/src/views/monitor/servers/master/index.tsx
b/dolphinscheduler-ui-next/src/views/monitor/servers/master/index.tsx
index 2d5f116..d1ca9fc 100644
--- a/dolphinscheduler-ui-next/src/views/monitor/servers/master/index.tsx
+++ b/dolphinscheduler-ui-next/src/views/monitor/servers/master/index.tsx
@@ -23,7 +23,7 @@ import styles from './index.module.scss'
import Card from '@/components/card'
import Gauge from '@/components/chart/modules/Gauge'
import Modal from '@/components/modal'
-import type { MasterRes } from '@/service/modules/monitor/types'
+import type { MasterNode } from '@/service/modules/monitor/types'
import type { Ref } from 'vue'
import type { TableColumns } from 'naive-ui/es/data-table/src/interface'
@@ -33,7 +33,7 @@ const master = defineComponent({
const showModalRef = ref(false)
const { t } = useI18n()
const { getMaster } = useMaster()
- const masterRef: Ref<Array<MasterRes>> = ref(getMaster())
+ const masterRef: Ref<Array<MasterNode>> = ref(getMaster())
const columnsRef: TableColumns<any> = [
{ title: '#', key: 'index' },
{ title: t('monitor.master.directory'), key: 'directory' }
diff --git
a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.module.scss
b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.module.scss
index f882aff..c7cfae9 100644
---
a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.module.scss
+++
b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.module.scss
@@ -23,29 +23,6 @@
min-height: 400px;
}
-.header-card {
- margin-bottom: 8px;
-
- .content {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .left {
- margin-right: 20px;
- }
- }
-
- .link-btn {
- color: #579cd8;
- cursor: pointer;
-
- &:hover {
- color: #80bef7;
- }
- }
-}
-
.card {
@include base;
}
@@ -54,3 +31,12 @@
@include base;
color: dodgerblue;
}
+
+.link-btn {
+ color: #579cd8;
+ cursor: pointer;
+
+ &:hover {
+ color: #80bef7;
+ }
+}
diff --git
a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.tsx
b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.tsx
index 4c556d2..7de5c39 100644
--- a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.tsx
+++ b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/index.tsx
@@ -15,122 +15,136 @@
* limitations under the License.
*/
-import { defineComponent, ref } from 'vue'
-import { NGrid, NGi, NCard, NNumberAnimation, NDataTable } from 'naive-ui'
+import { defineComponent, onMounted, ref, toRefs } from 'vue'
+import { NGrid, NGi, NCard, NNumberAnimation, NSpace } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import { useWorker } from './use-worker'
import styles from './index.module.scss'
import Card from '@/components/card'
import Gauge from '@/components/chart/modules/Gauge'
-import Modal from '@/components/modal'
-import type { WorkerRes } from '@/service/modules/monitor/types'
+import WorkerModal from './worker-modal'
import type { Ref } from 'vue'
-import type { TableColumns } from 'naive-ui/es/data-table/src/interface'
+import type { RowData } from 'naive-ui/es/data-table/src/interface'
+import type { WorkerNode } from '@/service/modules/monitor/types'
const master = defineComponent({
name: 'master',
setup() {
const showModalRef = ref(false)
const { t } = useI18n()
- const { getWorker } = useWorker()
- const workerRef: Ref<Array<WorkerRes>> = ref(getWorker())
- const columnsRef: TableColumns<any> = [
- { title: '#', key: 'index', render: (row, index) => index + 1 },
- { title: t('monitor.worker.directory'), key: 'directory' }
- ]
+ const { variables, getTableWorker } = useWorker()
+ const zkDirectoryRef: Ref<Array<RowData>> = ref([])
- return { t, workerRef, showModalRef, columnsRef }
+ const clickDetails = (zkDirectories: Array<string>) => {
+ zkDirectoryRef.value = zkDirectories.map((zkItem) => {
+ return {
+ directory: zkItem
+ }
+ })
+ showModalRef.value = true
+ }
+
+ const onConfirmModal = () => {
+ showModalRef.value = false
+ }
+
+ onMounted(() => {
+ getTableWorker()
+ })
+
+ return {
+ t,
+ ...toRefs(variables),
+ clickDetails,
+ onConfirmModal,
+ showModalRef,
+ zkDirectoryRef
+ }
},
render() {
- const { t, workerRef, columnsRef } = this
+ const { t, clickDetails, onConfirmModal, showModalRef, zkDirectoryRef } =
+ this
return (
- <div>
- <NCard class={styles['header-card']}>
- <div class={styles['content']}>
- <p>
- <span class={styles.left}>{`${t('monitor.worker.host')}: ${
- workerRef[0] ? workerRef[0].host : ' - '
- }`}</span>
- <span
- class={styles['link-btn']}
- onClick={() => (this.showModalRef = true)}
- >
- {t('monitor.worker.directory_detail')}
- </span>
- </p>
- <p>
- <span class={styles.left}>{`${t('monitor.worker.create_time')}:
${
- workerRef[0] ? workerRef[0].createTime : ' - '
- }`}</span>
- <span>{`${t('monitor.worker.last_heartbeat_time')}: ${
- workerRef[0] ? workerRef[0].lastHeartbeatTime : ' - '
- }`}</span>
- </p>
- </div>
- </NCard>
- <NGrid x-gap='12' cols='3'>
- <NGi>
- <Card title={t('monitor.worker.cpu_usage')}>
- <div class={styles.card}>
- {workerRef[0] && (
- <Gauge
- data={(
- JSON.parse(workerRef[0].resInfo).cpuUsage * 100
- ).toFixed(2)}
- />
- )}
- </div>
- </Card>
- </NGi>
- <NGi>
- <Card title={t('monitor.worker.memory_usage')}>
- <div class={styles.card}>
- {workerRef[0] && (
- <Gauge
- data={(
- JSON.parse(workerRef[0].resInfo).memoryUsage * 100
- ).toFixed(2)}
- />
- )}
- </div>
- </Card>
- </NGi>
- <NGi>
- <Card title={t('monitor.worker.load_average')}>
- <div class={[styles.card, styles['load-average']]}>
- {workerRef[0] && (
- <NNumberAnimation
- precision={2}
- from={0}
- to={JSON.parse(workerRef[0].resInfo).loadAverage}
- />
- )}
- </div>
- </Card>
- </NGi>
- </NGrid>
- <Modal
- title={t('monitor.worker.directory_detail')}
- show={this.showModalRef}
- cancelShow={false}
- onConfirm={() => (this.showModalRef = false)}
- >
- {{
- default: () =>
- workerRef[0] && (
- <NDataTable
- columns={columnsRef}
- data={workerRef[0].zkDirectories.map((item, unused) => {
- return { directory: item }
- })}
- striped
- size={'small'}
- />
- )
- }}
- </Modal>
- </div>
+ <>
+ <NSpace vertical size={25}>
+ {this.data.map((item: WorkerNode) => {
+ return (
+ <NSpace vertical>
+ <NCard>
+ <NSpace justify='space-between'>
+ <NSpace>
+ <span>{`${t('monitor.worker.host')}: ${
+ item ? item.host : ' - '
+ }`}</span>
+ <span
+ class={styles['link-btn']}
+ onClick={() => clickDetails(item.zkDirectories)}
+ >
+ {t('monitor.worker.directory_detail')}
+ </span>
+ </NSpace>
+ <NSpace>
+ <span>{`${t('monitor.worker.create_time')}: ${
+ item ? item.createTime : ' - '
+ }`}</span>
+ <span>{`${t('monitor.worker.last_heartbeat_time')}: ${
+ item ? item.lastHeartbeatTime : ' - '
+ }`}</span>
+ </NSpace>
+ </NSpace>
+ </NCard>
+ <NGrid x-gap='12' cols='3'>
+ <NGi>
+ <Card title={t('monitor.worker.cpu_usage')}>
+ <div class={styles.card}>
+ {item && (
+ <Gauge
+ data={(
+ JSON.parse(item.resInfo).cpuUsage * 100
+ ).toFixed(2)}
+ />
+ )}
+ </div>
+ </Card>
+ </NGi>
+ <NGi>
+ <Card title={t('monitor.worker.memory_usage')}>
+ <div class={styles.card}>
+ {item && (
+ <Gauge
+ data={(
+ JSON.parse(item.resInfo).memoryUsage * 100
+ ).toFixed(2)}
+ />
+ )}
+ </div>
+ </Card>
+ </NGi>
+ <NGi>
+ <Card title={t('monitor.worker.load_average')}>
+ <div class={[styles.card, styles['load-average']]}>
+ {item && (
+ <NNumberAnimation
+ precision={2}
+ from={0}
+ to={JSON.parse(item.resInfo).loadAverage}
+ />
+ )}
+ </div>
+ </Card>
+ </NGi>
+ </NGrid>
+ </NSpace>
+ )
+ })}
+ </NSpace>
+ <WorkerModal
+ showModal={showModalRef}
+ data={zkDirectoryRef}
+ onConfirmModal={onConfirmModal}
+ />
+ </>
)
}
})
diff --git
a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/use-worker.ts
b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/use-worker.ts
index 20bb858..06ec70b 100644
--- a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/use-worker.ts
+++ b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/use-worker.ts
@@ -15,14 +15,26 @@
* limitations under the License.
*/
+import { reactive } from 'vue'
import { useAsyncState } from '@vueuse/core'
import { listWorker } from '@/service/modules/monitor'
+import type { WorkerNode } from '@/service/modules/monitor/types'
export function useWorker() {
- const getWorker = () => {
- const { state } = useAsyncState(listWorker(), [])
+ const variables = reactive({
+ data: []
+ })
+
+ const getTableWorker = () => {
+ const { state } = useAsyncState(
+ listWorker().then((res: Array<WorkerNode>) => {
+ variables.data = res as any
+ }),
+ []
+ )
+
return state
}
- return { getWorker }
+ return { variables, getTableWorker }
}
diff --git
a/dolphinscheduler-ui-next/src/views/monitor/servers/worker/worker-modal.tsx
b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/worker-modal.tsx
new file mode 100644
index 0000000..f90ab5c
--- /dev/null
+++ b/dolphinscheduler-ui-next/src/views/monitor/servers/worker/worker-modal.tsx
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+import { defineComponent } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { NDataTable } from 'naive-ui'
+import Modal from '@/components/modal'
+import type { PropType } from 'vue'
+import type {
+ RowData,
+ TableColumns
+} from 'naive-ui/es/data-table/src/interface'
+
+const props = {
+ showModal: {
+ type: Boolean as PropType<boolean>,
+ default: false
+ },
+ data: {
+ type: Array as PropType<Array<RowData>>,
+ default: () => []
+ }
+}
+
+const WorkerModal = defineComponent({
+ props,
+ emits: ['confirmModal'],
+ setup(props, ctx) {
+ const { t } = useI18n()
+ const columnsRef: TableColumns<any> = [
+ { title: '#', key: 'index', render: (row, index) => index + 1 },
+ { title: t('monitor.worker.directory'), key: 'directory' }
+ ]
+
+ const onConfirm = () => {
+ ctx.emit('confirmModal')
+ }
+
+ return { t, columnsRef, onConfirm }
+ },
+ render() {
+ const { t, columnsRef, onConfirm } = this
+
+ return (
+ <Modal
+ title={t('monitor.worker.directory_detail')}
+ show={this.showModal}
+ cancelShow={false}
+ onConfirm={onConfirm}
+ >
+ {{
+ default: () => (
+ <NDataTable
+ columns={columnsRef}
+ data={this.data}
+ striped
+ size={'small'}
+ />
+ )
+ }}
+ </Modal>
+ )
+ }
+})
+
+export default WorkerModal
diff --git
a/dolphinscheduler-ui-next/src/views/resource/task-group/option/components/form-modal.tsx
b/dolphinscheduler-ui-next/src/views/resource/task-group/option/components/form-modal.tsx
index 011a366..47be759 100644
---
a/dolphinscheduler-ui-next/src/views/resource/task-group/option/components/form-modal.tsx
+++
b/dolphinscheduler-ui-next/src/views/resource/task-group/option/components/form-modal.tsx
@@ -115,21 +115,20 @@ const FormModal = defineComponent({
placeholder={t('resource.task_group_option.please_enter_name')}
/>
</NFormItem>
- { this.status === 0 && (
- <NFormItem
+ {this.status === 0 && (
+ <NFormItem
label={t('resource.task_group_option.project_name')}
path='projectCode'
- >
+ >
<NSelect
- options={projectOptions}
- v-model:value={this.formData.projectCode}
- placeholder={t(
- 'resource.task_group_option.please_select_project'
- )}
+ options={projectOptions}
+ v-model:value={this.formData.projectCode}
+ placeholder={t(
+ 'resource.task_group_option.please_select_project'
+ )}
/>
- </NFormItem>
- )
- }
+ </NFormItem>
+ )}
<NFormItem
label={t('resource.task_group_option.resource_pool_size')}
path='groupSize'