Unverified Commit 4b361617 authored by aiwenmo's avatar aiwenmo Committed by GitHub

[Feature-644][admin,web] add snapshotinfo ,taskmanagerConfig && update configInfo of DevOps

[Feature-644][admin,web] add snapshotinfo ,taskmanagerConfig && update configInfo of DevOps 
parents 5e71add4 e8148e7f
......@@ -14,6 +14,7 @@ public class JobInfoDetail {
private ClusterConfiguration clusterConfiguration;
private History history;
private JobHistory jobHistory;
private JobManagerConfiguration jobManagerConfiguration;
private Integer refreshCount;
public JobInfoDetail(Integer id) {
......@@ -53,6 +54,13 @@ public class JobInfoDetail {
this.clusterConfiguration = clusterConfiguration;
}
public void setJobManagerConfiguration(JobManagerConfiguration jobMangerConfiguration) {
this.jobManagerConfiguration = jobMangerConfiguration;
}
public JobManagerConfiguration getJobManagerConfiguration() {
return jobManagerConfiguration;
}
public History getHistory() {
return history;
}
......
package com.dlink.model;
import lombok.Data;
import java.util.Map;
/**
* @program: dlink
* @description: JobManager 配置信息
* @author: zhumingye
* @create: 2022-06-26 10:53
*/
@Data
public class JobManagerConfiguration {
private Map<String, String> metrics ;
private Map<String, String> jobManagerConfig;
private String jobManagerLog;
private String jobManagerStdout;
}
......@@ -2,6 +2,7 @@ package com.dlink.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dlink.alert.*;
import com.dlink.api.FlinkAPI;
import com.dlink.assertion.Assert;
import com.dlink.assertion.Asserts;
import com.dlink.assertion.Tips;
......@@ -40,10 +41,7 @@ import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 任务 服务实现类
......@@ -572,6 +570,40 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
jobInfoDetail.setCluster(cluster);
History history = historyService.getById(jobInstance.getHistoryId());
history.setConfig(JSONUtil.parseObject(history.getConfigJson()));
JobManagerConfiguration jobManagerConfiguration = new JobManagerConfiguration();
if(Asserts.isNotNullString(history.getJobManagerAddress())) {
FlinkAPI flinkAPI = FlinkAPI.build(history.getJobManagerAddress());
Map<String, String> jobManagerMetricsMap = new HashMap<String, String>(); //获取jobManager metrics
List<LinkedHashMap> jobManagerMetricsItemsList = JSONUtil.toList(JSONUtil.toJsonString(flinkAPI.getJobManagerMetrics()), LinkedHashMap.class);
jobManagerMetricsItemsList.forEach(mapItems -> {
String configKey = (String) mapItems.get("id");
String configValue = (String) mapItems.get("value");
if (Asserts.isNotNullString( configKey) && Asserts.isNotNullString(configValue)) {
jobManagerMetricsMap.put(configKey, configValue);
}
});
Map<String, String> jobManagerConfigMap = new HashMap<String, String>();//获取jobManager配置信息
List<LinkedHashMap> jobManagerConfigMapItemsList = JSONUtil.toList(JSONUtil.toJsonString(flinkAPI.getJobManagerConfig()), LinkedHashMap.class);
jobManagerConfigMapItemsList.forEach(mapItems -> {
String configKey = (String) mapItems.get("key");
String configValue = (String) mapItems.get("value");
if (Asserts.isNotNullString( configKey) && Asserts.isNotNullString(configValue)) {
jobManagerConfigMap.put(configKey, configValue);
}
});
String jobMangerLog = flinkAPI.getJobManagerLog(); //获取jobManager日志
String jobManagerStdOut = flinkAPI.getJobManagerStdOut(); //获取jobManager标准输出日志
jobManagerConfiguration.setMetrics(jobManagerMetricsMap);
jobManagerConfiguration.setJobManagerConfig(jobManagerConfigMap);
jobManagerConfiguration.setJobManagerLog(jobMangerLog);
jobManagerConfiguration.setJobManagerStdout(jobManagerStdOut);
jobInfoDetail.setJobManagerConfiguration(jobManagerConfiguration);
}
if (Asserts.isNotNull(history) && Asserts.isNotNull(history.getClusterConfigurationId())) {
jobInfoDetail.setClusterConfiguration(clusterConfigurationService.getClusterConfigById(history.getClusterConfigurationId()));
}
......
This diff is collapsed.
import {Descriptions, Empty, Tabs} from 'antd';
import CodeShow from "@/components/Common/CodeShow";
const {TabPane} = Tabs;
const ClusterConfiguration = (props: any) => {
const {} = props;
const {job} = props;
const getMetricsConfigForm =() => {
let formList = [];
let tempData = job?.jobManagerConfiguration?.metrics;
for (let key in tempData) {
formList.push(
<Descriptions.Item label={key}>
{tempData[key]}
</Descriptions.Item>
)
}
return formList
}
const getJobManagerConfigForm = () => {
let formList = [];
let tempData = job?.jobManagerConfiguration?.jobManagerConfig;
for (let key in tempData) {
formList.push(
<Descriptions.Item label={key}>
{tempData[key]}
</Descriptions.Item>
)
}
return formList
}
return (<>
<Tabs defaultActiveKey="metrics" size="small" tabPosition="top" style={{
border: "1px solid #f0f0f0",
}}>
<TabPane tab={<span>&nbsp; Metrics &nbsp;</span>} key="metrics">
<Descriptions bordered size="small" column={1}>
{getMetricsConfigForm()}
</Descriptions>
</TabPane>
<TabPane tab={<span>&nbsp; Configuration &nbsp;</span>} key="configuration">
<Descriptions bordered size="small" column={1}>
{getJobManagerConfigForm()}
</Descriptions>
</TabPane>
<TabPane tab={<span>&nbsp; Logs &nbsp;</span>} key="logs">
{(job?.jobManagerConfiguration?.jobManagerLog === ""|| job?.jobManagerConfig?.jobManagerLog === null) ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
: <CodeShow code={job?.jobManagerConfiguration?.jobManagerLog} language='java' height='500px'/>
}
</TabPane>
<TabPane tab={<span>&nbsp; Stdout &nbsp;</span>} key="stdout">
{(job?.jobManagerConfiguration?.jobManagerStdout === ""|| job?.jobManagerConfig?.jobManagerStdout === null) ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
: <CodeShow code={job?.jobManagerConfiguration?.jobManagerStdout} language='java' height='500px'/>
}
</TabPane>
</Tabs>
</>)
};
export default ClusterConfiguration;
import {Descriptions, Typography, Tag} from 'antd';
import {
RocketOutlined
} from '@ant-design/icons';
import {Descriptions, Tag, Typography} from 'antd';
import {RocketOutlined} from '@ant-design/icons';
const {Text, Link} = Typography;
......@@ -10,7 +8,8 @@ const Config = (props: any) => {
const {job} = props;
return (<>
<Descriptions bordered size="small">
<>
<Descriptions bordered size="small" title={"Dinky Job Configuration"}>
<Descriptions.Item label="执行模式">{job?.history?.type ? (
<Tag color="blue" key={job?.history?.type}>
<RocketOutlined/> {job?.history?.type}
......@@ -18,33 +17,66 @@ const Config = (props: any) => {
) : undefined}
</Descriptions.Item>
<Descriptions.Item label="集群实例">
{job?.cluster?.alias?<Link>{job?.cluster?.alias}</Link>:'-'}
{job?.cluster?.alias ? <Link>{job?.cluster?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="集群配置">
{job?.clusterConfiguration?.alias?<Link>{job?.clusterConfiguration?.alias}</Link>:'-'}
{job?.clusterConfiguration?.alias ? <Link>{job?.clusterConfiguration?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="共享会话">
{job?.history?.session?<Link>{job?.history?.session}</Link>:'禁用'}
{job?.history?.session ? <Link>{job?.history?.session}</Link> : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="片段机制">{job?.history?.config.useSqlFragment?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="语句集">{job?.history?.config.useStatementSet?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="任务类型">{job?.history?.config.isJarTask?'Jar':'FlinkSQL'}</Descriptions.Item>
<Descriptions.Item label="批模式">{job?.history?.config.useBatchModel?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="片段机制">{job?.history?.config.useSqlFragment ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="语句集">{job?.history?.config.useStatementSet ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="任务类型">{job?.history?.config.isJarTask ? 'Jar' : 'FlinkSQL'}</Descriptions.Item>
<Descriptions.Item label="批模式">{job?.history?.config.useBatchModel ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="CheckPoint">{job?.history?.config.checkpoint}</Descriptions.Item>
<Descriptions.Item label="SavePoint机制">
{job?.history?.config.savePointStrategy=='NONE'?'禁用':
job?.history?.config.savePointStrategy=='LATEST'?'最近一次':
job?.history?.config.savePointStrategy=='EARLIEST'?'最早一次':
job?.history?.config.savePointStrategy=='CUSTOM'?'指定一次':'禁用'}
{job?.history?.config.savePointStrategy == 'NONE' ? '禁用' :
job?.history?.config.savePointStrategy == 'LATEST' ? '最近一次' :
job?.history?.config.savePointStrategy == 'EARLIEST' ? '最早一次' :
job?.history?.config.savePointStrategy == 'CUSTOM' ? '指定一次' : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="SavePoint" span={2}>{job?.history?.config.savePointPath}</Descriptions.Item>
<Descriptions.Item label="Flink Configuration" span={3}><Text code>{JSON.stringify(job?.history?.config.config)}</Text></Descriptions.Item>
{job?.jar?<>
{job?.jar ? <>
<Descriptions.Item label="Jar 路径">{job?.jar?.path}</Descriptions.Item>
<Descriptions.Item label="Jar 主类">{job?.jar?.mainClass}</Descriptions.Item>
<Descriptions.Item label="Jar 入参">{job?.jar?.paras}</Descriptions.Item>
</>:undefined}
</> : undefined}
</Descriptions>
</>
<br/><br/>
<>
<Descriptions bordered size="small" title={"Flink Job Configuration"}>
<Descriptions.Item label="Execution Mode">
<Tag color="blue" title={"Execution Mode"}>
{job?.jobHistory?.config['execution-config']['execution-mode']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Restart Strategy">
<Tag color="blue" title={"Restart Strategy"}>
{job?.jobHistory?.config['execution-config']['restart-strategy']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Job Parallelism">
<Tag color="blue" title={"Job Parallelism"}>
{job?.jobHistory?.config['execution-config']['job-parallelism']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Object Reuse Mode">
<Tag color="blue" title={"Object Reuse Mode"}>
{job?.jobHistory?.config['execution-config']['object-reuse-mode'].toString()}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Flink User Configuration" span={3}>
<Text
code>{JSON.stringify(job?.jobHistory?.config['execution-config']['user-config'])}</Text>
</Descriptions.Item>
</Descriptions>
</>
</>)
};
......
import React, {useEffect, useState} from 'react';
import {useEffect, useState} from 'react';
import {history, useLocation} from 'umi';
import {ClusterOutlined, EllipsisOutlined, FireOutlined, RedoOutlined, RocketOutlined} from '@ant-design/icons';
import {Button, Dropdown, Empty, Menu, message, Modal, Space, Tag, Typography} from 'antd';
......@@ -17,6 +17,8 @@ import Exception from "@/pages/DevOps/JobInfo/Exception";
import FlinkSQL from "@/pages/DevOps/JobInfo/FlinkSQL";
import Alert from "@/pages/DevOps/JobInfo/Alert";
import DataMap from "@/pages/DevOps/JobInfo/DataMap";
import CheckPoints from "@/pages/DevOps/JobInfo/CheckPoints";
import ClusterConfiguration from "@/pages/DevOps/JobInfo/ClusterConfiguration";
const {Link} = Typography;
......@@ -257,8 +259,8 @@ const JobInfo = (props: any) => {
<ProCard>
{tabKey === 'base' ? <BaseInfo job={job}/> : undefined}
{tabKey === 'config' ? <Config job={job}/> : undefined}
{tabKey === 'cluster' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'snapshot' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'cluster' ? <ClusterConfiguration job={job}/> : undefined}
{tabKey === 'snapshot' ? <CheckPoints job={job}/> : undefined}
{tabKey === 'exception' ? <Exception job={job}/> : undefined}
{tabKey === 'log' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'optimize' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
......
......@@ -45,6 +45,8 @@ export type JobInfoDetail = {
cluster: ClusterTableListItem,
clusterConfiguration: ClusterConfigurationTableListItem,
history: HistoryItem,
jobHistory: JobHistoryItem,
jobManagerConfiguration : JobManagerConfiguration
jar: JarTableListItem
}
......@@ -58,3 +60,28 @@ export type VerticesTableListItem = {
endTime: string,
tasks: any,
}
export type JobHistoryItem = {
id: number,
job: string,
exceptions: string,
checkpoints: string,
checkpointsConfig: string,
config: string,
jar: string,
cluster: string,
clusterConfiguration: string,
updateTime: string,
}
export type JobManagerConfiguration = {
metrics: string ,
jobManagerConfig: string,
jobManagerLog : string,
jobManagerStdout: string,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment