function overviewYarnJob(cluster, search, queue, yarnQueue) {
return {
className: 'font-mono',
type: 'service',
api: `\${base}/overview/yarn-job?cluster=${cluster}&search=${search}`,
interval: 10000,
silentPolling: true,
body: [
{
type: 'tpl',
className: 'mr-1 font-bold',
tpl: `${cluster}`,
},
queue === undefined ? {} : {
type: 'service',
className: 'inline ml-2',
api: `\${base}/overview/queue?queue=compaction-queue-${cluster}`,
body: [
{
type: 'tpl',
tpl: '${PADSTART(size, 2)}',
}
]
},
overviewYarnCluster(cluster, yarnQueue),
'(',
{
type: 'tpl',
tpl: '${PADSTART(total, 3)}',
},
',',
{
type: 'tpl',
tpl: '${PADSTART(scheduling, 3)}',
},
',',
{
type: 'tpl',
tpl: '${PADSTART(running, 3)}',
},
',',
{
type: 'tpl',
tpl: '${PADSTART(failure, 3)}',
},
')',
]
}
}
function color(number) {
let color = 'text-success'
if (number > 30) {
color = 'text-primary'
}
if (number > 80) {
color = 'text-danger'
}
return color
}
function overviewYarnCluster(cluster, queue) {
return {
type: 'service',
className: 'inline',
api: {
method: 'get',
url: `\${base}/overview/yarn-cluster`,
data: {
cluster: cluster,
queue: queue,
},
adaptor: function (payload, response) {
let rootUsed = (payload['data']['root']['usedCapacity'] * 100 / payload['data']['root']['capacity']).toFixed(0)
let targetUsed = (payload['data']['target']['absoluteUsedCapacity'] * 100 / payload['data']['target']['absoluteMaxCapacity']).toFixed(0)
return {
...payload,
data: {
...payload.data,
rootUsed: rootUsed,
rootUsedColor: color(rootUsed),
targetUsed: targetUsed,
targetUsedColor: color(targetUsed),
}
}
}
},
interval: 10000,
silentPolling: true,
body: [
'(',
{
type: 'tpl',
className: 'font-bold',
tpl: '${PADSTART(ROUND(rootUsed), 3)}%',
},
',',
{
type: 'tpl',
tpl: '${PADSTART(ROUND(targetUsed), 3)}%',
},
')'
],
}
}
function overviewTab() {
return {
title: '概览',
tab: [
{
type: 'service',
// language=JavaScript
dataProvider: 'const timer = setInterval(() => {\n setData({date: new Date().toLocaleString()})\n}, 1000)\nreturn () => {\n clearInterval(timer)\n}',
body: [
'当前时间:',
{
type: 'tpl',
className: 'font-bold',
tpl: '${date}'
}
]
},
{type: 'divider'},
{
type: 'service',
api: '${base}/overview',
interval: 60000,
silentPolling: true,
body: [
{
type: 'tpl',
tpl: '逻辑表:${table_total}',
},
'
',
{
type: 'tpl',
tpl: 'Hudi表:${hudi_total}',
},
'
',
{
type: 'tpl',
tpl: '重点表:${focus_count}',
},
'
',
{
type: 'tpl',
tpl: '普通表:${normal_count}',
},
]
},
{type: 'divider'},
overviewYarnJob('b5-sync', 'Sync', undefined, 'default'),
{type: 'divider'},
{
type: 'service',
api: `\${base}/overview/queue?queue=compaction-queue-pre`,
body: [
{
type: 'tpl',
tpl: 'Pre:${size}',
}
]
},
'集群 压缩队列任务数(集群总资源使用,队列资源使用)(总压缩任务数,调度中任务数,运行中任务数,失败任务数)',
overviewYarnJob('b1', 'Compaction', 'compaction-queue-b1', 'datalake'),
overviewYarnJob('b5', 'Compaction', 'compaction-queue-b5', 'ten_iap.datalake'),
overviewYarnJob('a4', 'Compaction', 'compaction-queue-a4', 'ten_iap.datalake'),
{type: 'divider'},
{
type: 'service',
api: '${base}/overview/version',
body: [
'版本:',
{
type: 'tpl',
className: 'font-bold',
tpl: '${version}',
},
'
',
'未接收,未跨天',
'
',
'重点表:',
{
type: 'tpl',
tpl: '${PADSTART(unReceive.focus, 3)},${PADSTART(unSchedule.focus, 3)}',
},
'
',
'普通表:',
{
type: 'tpl',
tpl: '${PADSTART(unReceive.normal, 3)},${PADSTART(unSchedule.normal, 3)}',
},
]
}
]
}
}