Unverified Commit 713aab46 authored by mydq's avatar mydq Committed by GitHub

Bug pr jobhistory field null (#756)

* fix:dlink平台详情查看信息对象兼容为null问题

* job history null

* fix:blink域名问题

* } add

* dlink文件问题

* superfluous dir remove
Co-authored-by: 's avatarsongshilian <songshilian@qiangungun.com>
parent d301cdd4
......@@ -32,6 +32,8 @@ import com.dlink.service.JobHistoryService;
import com.dlink.utils.JSONUtil;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.Objects;
/**
* JobHistoryServiceImpl
*
......@@ -92,7 +94,8 @@ public class JobHistoryServiceImpl extends SuperServiceImpl<JobHistoryMapper, Jo
try {
JsonNode jobInfo = FlinkAPI.build(jobManagerHost).getJobInfo(jobId);
if(jobInfo.has(FlinkRestResultConstant.ERRORS)){
return jobHistory;
final JobHistory dbHistory = getById(id);
return Objects.isNull(dbHistory) ? jobHistory : dbHistory;
}
JsonNode exception = FlinkAPI.build(jobManagerHost).getException(jobId);
JsonNode checkPoints = FlinkAPI.build(jobManagerHost).getCheckPoints(jobId);
......
......@@ -45,8 +45,8 @@ const CheckPoints = (props: any) => {
const {job} = props;
const actionRef = useRef<ActionType>();
const JsonParseObject = (item : any ) =>{
return JSON.parse(JSON.stringify(item))
const JsonParseObject = (item: any) => {
return JSON.parse(JSON.stringify(item))
}
......@@ -57,9 +57,11 @@ const CheckPoints = (props: any) => {
return (
<>
{JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> :
<Descriptions bordered size="small" column={1}>
<Descriptions.Item label="CheckPoint Counts">
<Tag color="blue" title={"Total"} >
<Tag color="blue" title={"Total"}>
<RocketOutlined/> Total: {counts.total}
</Tag>
<Tag color="red" title={"Failed"}>
......@@ -78,7 +80,7 @@ const CheckPoints = (props: any) => {
<Descriptions.Item label="Latest Completed CheckPoint">
<Tag color="green" title={"Latest Completed CheckPoint"}>
{latest.completed === null ? 'None' :
{latest.completed === null ? 'None' :
JsonParseObject(latest.completed).external_path
}
</Tag>
......@@ -86,19 +88,19 @@ const CheckPoints = (props: any) => {
<Descriptions.Item label="Latest Failed CheckPoint">
{latest.failed === null ?
<Tag color="red" title={"Latest Failed CheckPoint"}>
{'None'}
</Tag> :
<Tag color="red" title={"Latest Failed CheckPoint"}>
{'None'}
</Tag> :
<>
<Tag color="red" title={"Latest Failed CheckPoint"}>
{"id: " + JsonParseObject(latest.failed).id}
</Tag>
<Tag color="red" title={"Latest Failed CheckPoint"}>
{ "Fail Time: " + moment(JsonParseObject(latest.failed).failure_timestamp).format('YYYY-MM-DD HH:mm:ss')}
</Tag>
{"Fail Time: " + moment(JsonParseObject(latest.failed).failure_timestamp).format('YYYY-MM-DD HH:mm:ss')}
</Tag>
<Tag color="red" title={"Latest Failed CheckPoint"}>
{"Cause: " + JsonParseObject(latest.failed).failure_message}
</Tag>
</Tag>
</>
}
</Descriptions.Item>
......@@ -118,12 +120,12 @@ const CheckPoints = (props: any) => {
</Tag>
</Descriptions.Item>
</Descriptions>
}
</>
)
}
const getSummary = (checkpoints : any) => {
const getSummary = (checkpoints: any) => {
let end_to_end_duration = JsonParseObject(JsonParseObject(checkpoints.summary)).end_to_end_duration
let state_size = JsonParseObject(JsonParseObject(checkpoints.summary)).state_size
......@@ -133,6 +135,8 @@ const CheckPoints = (props: any) => {
return (
<>
{JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> :
<Descriptions bordered size="small" column={1}>
<Descriptions.Item label="End to End Duration">
<Tag color="blue" title={"Max"}>
......@@ -194,6 +198,7 @@ const CheckPoints = (props: any) => {
</Tag>
</Descriptions.Item>
</Descriptions>
}
</>
)
}
......@@ -219,7 +224,7 @@ const CheckPoints = (props: any) => {
});
}
const getHistory = (checkpoints : any) => {
const getHistory = (checkpoints: any) => {
const checkPointsList: CheckPointsDetailInfo[] = [];
checkpoints?.history?.forEach((entity: CheckPointsDetailInfo) => {
......@@ -299,7 +304,7 @@ const CheckPoints = (props: any) => {
render: (dom, entity) => {
return <>
{entity.status === 'COMPLETED' ?
<Button onClick={() => recoveryCheckPoint(entity)}>此处恢复</Button> : undefined}
<Button onClick={() => recoveryCheckPoint(entity)}>此处恢复</Button> : undefined}
</>
},
},
......@@ -330,10 +335,12 @@ const CheckPoints = (props: any) => {
}
const getConfiguration = (checkpointsConfig : any) => {
const getConfiguration = (checkpointsConfig: any) => {
let checkpointsConfigInfo = JsonParseObject(checkpointsConfig)
return (
<>
{JSON.stringify(job?.jobHistory?.checkpointsConfig).includes("errors") ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> :
<Descriptions bordered size="small" column={1}>
<Descriptions.Item label="Checkpointing Mode">
<Tag color="blue" title={"Checkpointing Mode"}>
......@@ -343,19 +350,19 @@ const CheckPoints = (props: any) => {
<Descriptions.Item label="Checkpoint Storage">
<Tag color="blue" title={"Checkpoint Storage"}>
{checkpointsConfigInfo.checkpoint_storage ? checkpointsConfigInfo.checkpoint_storage : 'Disabled'}
{checkpointsConfigInfo.checkpoint_storage ? checkpointsConfigInfo.checkpoint_storage : 'Disabled'}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="State Backend">
<Tag color="blue" title={"State Backend"}>
{checkpointsConfigInfo.state_backend ? checkpointsConfigInfo.state_backend : 'Disabled'}
{checkpointsConfigInfo.state_backend ? checkpointsConfigInfo.state_backend : 'Disabled'}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Interval">
<Tag color="blue" title={"Interval"}>
{checkpointsConfigInfo.interval }
{checkpointsConfigInfo.interval}
</Tag>
</Descriptions.Item>
......@@ -379,7 +386,7 @@ const CheckPoints = (props: any) => {
<Descriptions.Item label="Unaligned Checkpoints ">
<Tag color="blue" title={"Unaligned Checkpoints"}>
{checkpointsConfigInfo.unaligned_checkpoints ? 'Enabled' : 'Disabled'}
{checkpointsConfigInfo.unaligned_checkpoints ? 'Enabled' : 'Disabled'}
</Tag>
</Descriptions.Item>
......@@ -391,7 +398,7 @@ const CheckPoints = (props: any) => {
{JsonParseObject(checkpointsConfigInfo.externalization).enabled && (
<Descriptions.Item label="Delete On Cancellation">
<Tag color="blue" title={"Delete On Cancellation"}>
{ JsonParseObject(checkpointsConfigInfo.externalization).delete_on_cancellation ? 'Enabled' : 'Disabled'}
{JsonParseObject(checkpointsConfigInfo.externalization).delete_on_cancellation ? 'Enabled' : 'Disabled'}
</Tag>
</Descriptions.Item>
)}
......@@ -403,6 +410,7 @@ const CheckPoints = (props: any) => {
</Tag>
</Descriptions.Item>
</Descriptions>
}
</>
)
}
......@@ -454,7 +462,11 @@ const CheckPoints = (props: any) => {
<ProTable<SavePointTableListItem>
columns={columns}
style={{width: '100%'}}
request={(params, sorter, filter) => queryData(url, {taskId: job?.instance.taskId, ...params, sorter, filter})}
request={(params, sorter, filter) => queryData(url, {
taskId: job?.instance.taskId, ...params,
sorter,
filter
})}
actionRef={actionRef}
rowKey="id"
pagination={{
......@@ -468,11 +480,12 @@ const CheckPoints = (props: any) => {
}
return (<>
{(job?.jobHistory?.checkpoints || job?.jobHistory?.checkpointsConfig) &&
<Tabs defaultActiveKey="overview" size="small" tabPosition="top" style={{
border: "1px solid #f0f0f0",
}}>
<TabPane tab={<span>&nbsp; Overview &nbsp;</span>} key="overview">
{ !JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
{!JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
getOverview(JsonParseObject(job?.jobHistory?.checkpoints)) :
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>}
</TabPane>
......@@ -482,24 +495,23 @@ const CheckPoints = (props: any) => {
</TabPane>
<TabPane tab={<span>&nbsp; Summary &nbsp;</span>} key="summary">
{ !JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
{!JSON.stringify(job?.jobHistory?.checkpoints).includes("errors") ?
getSummary(JsonParseObject(job?.jobHistory?.checkpoints)) :
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
}
</TabPane>
<TabPane tab={<span>&nbsp; Configuration &nbsp;</span>} key="configuration">
{ !JSON.stringify(job?.jobHistory?.checkpointsConfig).includes("errors") ?
{!JSON.stringify(job?.jobHistory?.checkpointsConfig).includes("errors") ?
getConfiguration(JsonParseObject(job?.jobHistory?.checkpointsConfig)) :
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
}
</TabPane>
<TabPane tab={<span>&nbsp; SavePoint &nbsp;</span>} key="savepoint">
{getSavePoint()}
</TabPane>
</Tabs>
{getSavePoint()}
</TabPane>
</Tabs>}
</>)
};
export default CheckPoints;
......@@ -26,78 +26,81 @@ const {Text, Link} = Typography;
const Config = (props: any) => {
const {job} = props;
return (<>
<>
<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}
</Tag>
) : undefined}
</Descriptions.Item>
<Descriptions.Item label="集群实例">
{job?.cluster?.alias ? <Link>{job?.cluster?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="集群配置">
{job?.clusterConfiguration?.alias ? <Link>{job?.clusterConfiguration?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="共享会话">
{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="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' ? '指定一次' : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="SavePoint" span={2}>{job?.history?.config.savePointPath}</Descriptions.Item>
{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}
</Descriptions>
</>
<br/><br/>
<>
{ ! JSON.stringify(job?.jobHistory?.config).includes("errors") &&
<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>
{
job?.jobHistory?.config && <>
<>
<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}
</Tag>
) : undefined}
</Descriptions.Item>
<Descriptions.Item label="集群实例">
{job?.cluster?.alias ? <Link>{job?.cluster?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="集群配置">
{job?.clusterConfiguration?.alias ? <Link>{job?.clusterConfiguration?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="共享会话">
{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="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' ? '指定一次' : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="SavePoint" span={2}>{job?.history?.config.savePointPath}</Descriptions.Item>
{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}
</Descriptions>
</>
<br/><br/>
<>
{!JSON.stringify(job?.jobHistory?.config).includes("errors") &&
<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="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="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>
}
</>
<Descriptions.Item label="Flink User Configuration" span={3}>
<Text
code>{JSON.stringify(job?.jobHistory?.config['execution-config']['user-config'])}</Text>
</Descriptions.Item>
</Descriptions>
}
</>
</>
}
</>)
};
......
......@@ -33,7 +33,7 @@ const DataMap = (props: any) => {
setData(undefined);
const res = getLineage(job.instance?.id);
res.then((result)=>{
result.datas.tables.forEach(table => {
result.datas?.tables.forEach(table => {
table.isExpand = true;
table.isFold = false;
});
......
......@@ -28,16 +28,17 @@ const Exception = (props: any) => {
const {job} = props;
return (<>
<Tabs defaultActiveKey="RootException" size="small" tabPosition="top" style={{
{job.jobHistory?.exceptions && <Tabs defaultActiveKey="RootException" size="small" tabPosition="top" style={{
border: "1px solid #f0f0f0"
}}>
<TabPane tab={<span>Root Exception</span>} key="RootException">
<CodeShow code={job.jobHistory?.exceptions['root-exception'] as string} language='java' height='500px'/>
</TabPane>
<TabPane tab={<span>Exception History</span>} key="ExceptionHistory">
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
</TabPane>
</Tabs>
</Tabs>}
</>)
};
......
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