blob: ae3f6a1a61b980ab601ec76394a449706fd715c7 [file] [log] [blame]
<!--
- 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.
-->
<template>
<el-row class="job-dashboard">
<el-row :gutter="16" class="row">
<el-col :span="16">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{ $t("historyDashboard.successAndFailCount") }}</span>
</div>
<el-row>
<el-col :span="8" class="col">
<h2>{{ $t("historyDashboard.jobInfoForOneMinute") }}</h2>
<v-chart :options="lastMinute"/>
</el-col>
<el-col :span="8" class="col">
<h2>{{ $t("historyDashboard.jobInfoForOneHour") }}</h2>
<v-chart :options="lastHour"/>
</el-col>
<el-col :span="8" class="col">
<h2>{{ $t("historyDashboard.jobInfoForOneWeek") }}</h2>
<v-chart :options="lastWeek"/>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{ $t("historyDashboard.jobType") }}</span>
</div>
<el-row>
<el-col class="col">
<h2>{{ $t("historyDashboard.jobExecutionTypeJob") }}</h2>
<v-chart :options="executionType"/>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row class="row">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{ $t("historyDashboard.successAndFailCount") }}</span>
</div>
<el-row>
<v-chart :options="result"/>
</el-row>
</el-card>
</el-row>
<el-row class="row">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{ $t("historyDashboard.jobTaskRunningCount") }}</span>
</div>
<el-row>
<v-chart :options="running"/>
</el-row>
</el-card>
</el-row>
<el-row class="row">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>{{ $t("historyDashboard.currentJobsCount") }}</span>
</div>
<el-row>
<v-chart :options="register"/>
</el-row>
</el-card>
</el-row>
</el-row>
</template>
<script>
import ECharts from 'vue-echarts'
import 'echarts/lib/chart/pie'
import 'echarts/lib/chart/line'
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/legend'
import moment from 'moment'
import API from './api'
export default {
name: 'JobDashboard',
components: {
'v-chart': ECharts
},
data() {
return {
color: ['rgb(105, 167, 225)', 'rgb(120, 230, 117)'],
lastMinute: {},
lastHour: {},
lastWeek: {},
executionType: {},
register: {},
running: {},
result: {}
}
},
created() {
this.getTasksPeriod()
this.getJobsExecutionType()
this.getJobsRegister()
this.getJobsRunning()
this.getTasksResults()
},
methods: {
getTasksResults() {
const params = {
since: 'last24hours'
}
API.getTasksResults(params).then(res => {
const series1 = []
const series2 = []
if (res.model && res.model.length) {
res.model.forEach(item => {
series1.push([moment(item.statisticsTime).format('HH:00'), item.successCount])
series2.push([moment(item.statisticsTime).format('HH:00'), item.failedCount])
})
}
this.result = {
color: this.color,
tooltip: {
trigger: 'axis'
},
legend: {
data: [this.$t('historyDashboard').jobSuccessCount, this.$t('historyDashboard').jobFailureCount],
bottom: 0
},
grid: {
left: '3%',
right: '4%',
bottom: '9%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false
},
yAxis: {
type: 'value'
},
series: [{
name: this.$t('historyDashboard').jobSuccessCount,
type: 'line',
data: series1
}, {
name: this.$t('historyDashboard').jobFailureCount,
type: 'line',
data: series2
}]
}
})
},
getJobsRunning() {
const params = {
since: 'lastWeek'
}
API.getJobsRunning(params).then(res => {
API.getTasksRunning(params).then(resp => {
if (resp.model && res.model.length) {
const jobSeries = []
const taskSeries = []
if (res.model && res.model.length) {
res.model && res.model.forEach(item => {
jobSeries.push([moment(item.statisticsTime).format('MM-DD'), item.runningCount])
})
}
if (resp.model && resp.model.length) {
resp.model && resp.model.forEach(item => {
taskSeries.push([moment(item.statisticsTime).format('MM-DD'), item.runningCount])
})
}
this.running = {
color: this.color,
tooltip: {
trigger: 'axis'
},
legend: {
data: [this.$t('historyDashboard').taskRunningCount, this.$t('historyDashboard').jobRunningCount],
bottom: 0
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false
},
yAxis: {
type: 'value'
},
series: [{
name: this.$t('historyDashboard').taskRunningCount,
type: 'line',
data: taskSeries
}, {
name: this.$t('historyDashboard').jobRunningCount,
type: 'line',
data: jobSeries
}]
}
}
})
})
},
getJobsRegister() {
API.getJobsRegister().then(res => {
const series = []
if (res.model && res.model.length) {
res.model && res.model.forEach(item => {
series.push([moment(item.statisticsTime).format('HH:mm'), item.registeredCount])
})
}
this.register = {
color: this.color,
tooltip: {
trigger: 'axis'
},
legend: {
data: [this.$t('historyDashboard').currentJobsCount],
bottom: 0
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false
},
yAxis: {
type: 'value'
},
series: [{
name: this.$t('historyDashboard').currentJobsCount,
type: 'line',
data: series
}]
}
})
},
getJobsExecutionType() {
API.getJobsExecutionType().then(res => {
const { model } = res
this.executionType = {
color: this.color,
tooltip: {
trigger: 'item',
formatter: '{b}<br/>{c}'
},
series: [
{
name: 'jobtype',
type: 'pie',
radius: '35%',
center: ['50%', '50%'],
data: [
{ value: model.transientJobCount, name: 'TRANSI', label: { formatter: '{b}:\n' + this.percentage(model.transientJobCount, model.transientJobCount + model.daemonJobCount) }},
{ value: model.daemonJobCount, name: 'DAEMON', label: { formatter: '{b}:\n' + this.percentage(model.daemonJobCount, model.transientJobCount + model.daemonJobCount) }}
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
})
},
getTasksPeriod() {
API.getTasksPeriod('lastMinute').then(res => {
const { model } = res
model.successCount = 40
model.failedCount = 60
this.lastMinute = {
color: this.color,
tooltip: {
trigger: 'item',
formatter: '{b}<br/>{c}'
},
series: [
{
name: 'lastMinute',
type: 'pie',
radius: '35%',
center: ['50%', '50%'],
data: [
{ value: model.successCount, name: this.$t('historyDashboard').success, label: { formatter: '{b}:\n' + this.percentage(model.successCount, model.successCount + model.failedCount) }},
{ value: model.failedCount, name: this.$t('historyDashboard').failed, label: { formatter: '{b}:\n' + this.percentage(model.failedCount, model.successCount + model.failedCount) }}
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
})
API.getTasksPeriod('lastHour').then(res => {
const { model } = res
this.lastHour = {
color: this.color,
tooltip: {
trigger: 'item',
formatter: '{b}<br/>{c}'
},
series: [
{
name: 'lastHour',
type: 'pie',
radius: '35%',
center: ['50%', '50%'],
data: [
{ value: model.successCount, name: this.$t('historyDashboard').success, label: { formatter: '{b}:\n' + this.percentage(model.successCount, model.successCount + model.failedCount) }},
{ value: model.failedCount, name: this.$t('historyDashboard').failed, label: { formatter: '{b}:\n' + this.percentage(model.failedCount, model.successCount + model.failedCount) }}
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
})
API.getTasksPeriod('lastWeek').then(res => {
const { model } = res
this.lastWeek = {
color: this.color,
tooltip: {
trigger: 'item',
formatter: '{b}<br/>{c}'
},
series: [
{
name: 'lastWeek',
type: 'pie',
radius: '35%',
center: ['50%', '50%'],
data: [
{ value: model.successCount, name: this.$t('historyDashboard').success, label: { formatter: '{b}:\n' + this.percentage(model.successCount, model.successCount + model.failedCount) }},
{ value: model.failedCount, name: this.$t('historyDashboard').failed, label: { formatter: '{b}:\n' + this.percentage(model.failedCount, model.successCount + model.failedCount) }}
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
})
},
percentage(value, count) {
if (value === 0) {
return '0.0%'
}
return Number((value / count) * 100).toFixed(1) + '%'
}
}
}
</script>
<style lang="scss" scoped>
.job-dashboard {
padding: 0 16px;
h2 {
font-size: 14px;
}
.col {
text-align: center;
}
.row {
margin-top: 16px;
}
}
.echarts {
height: 300px;
width: 100%;
}
</style>