2022-03-31 15:52:17 +08:00
|
|
|
<template>
|
2022-03-31 19:07:46 +08:00
|
|
|
<div style="height: 100%;width: 100%">
|
|
|
|
|
<div class="time-line-header">
|
2022-04-01 15:43:14 +08:00
|
|
|
<span>{{$t('alert.relatedAlerts')}}</span>
|
2022-04-01 19:02:24 +08:00
|
|
|
<div class="scope-icon-box">
|
|
|
|
|
<div class="scope-box" v-for="item in scopeList" :class="item.isSelect ? 'is-select' : ''" :key="item.type" @click="scopeChange(item)" :title="item.label">
|
|
|
|
|
<i class="nz-icon" :class="selectIcon(item)" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-03-31 19:07:46 +08:00
|
|
|
</div>
|
2022-04-01 15:43:14 +08:00
|
|
|
<el-timeline v-my-loading="loading" v-if="!noData && timeLineData.length">
|
2022-03-31 19:07:46 +08:00
|
|
|
<el-timeline-item
|
|
|
|
|
v-for="(item,index) in timeLineData"
|
|
|
|
|
:key="item.id"
|
|
|
|
|
:class="{
|
|
|
|
|
'only': timeLineData.length === 1 ,
|
2022-04-01 15:43:14 +08:00
|
|
|
'has-time': item.startAt,
|
|
|
|
|
'last': index === timeLineData.length-1 && index !==0
|
2022-03-31 19:07:46 +08:00
|
|
|
}"
|
2022-04-01 15:43:14 +08:00
|
|
|
:color="item.severity.color"
|
2022-03-31 19:07:46 +08:00
|
|
|
:timestamp="item.startAt?item.startAt: ''"
|
|
|
|
|
placement="top">
|
|
|
|
|
<div >
|
|
|
|
|
<div class='margin-b-10'>
|
|
|
|
|
<span slot="title-icon" v-if="item['state']" style="margin-left: 5px" class="alert-message-state" :class="{'gray-bg': item['state'] == 3, 'red-bg': item['state'] == 1,'yellow-bg': item['state'] == 2}">{{$t(stateOptions.find(state=>state.value == item['state']).label)}}</span>
|
|
|
|
|
<span class="time-line-item-header"> {{item.alertRule.name}}</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<span v-for="(label, i) in labelsSort(JSON.parse(item.labels))" :key="i">
|
|
|
|
|
<span
|
|
|
|
|
@mouseenter="labelHover(item, label.label, true, true, $event)"
|
|
|
|
|
@mouseleave="labelHover(item, label.label, false, true,)">
|
|
|
|
|
<nz-alert-tag
|
|
|
|
|
v-if="label.label !== 'alertname' && label.label !== 'severity'" :key="label.label" :cursor-point="tagType(label.label) !== 'info'"
|
|
|
|
|
:label="label.label"
|
|
|
|
|
:type="tagType(label.label)"
|
|
|
|
|
style="margin: 5px 0 5px 5px;"
|
|
|
|
|
>
|
|
|
|
|
{{label.value}}
|
|
|
|
|
</nz-alert-tag>
|
|
|
|
|
</span>
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-timeline-item>
|
2022-04-01 17:58:57 +08:00
|
|
|
<div v-if="timeLineData.length >= total" style="text-align: center">{{$t('overall.noMoreData')}}</div>
|
2022-04-01 15:43:14 +08:00
|
|
|
<div v-else class="load-more-box">
|
|
|
|
|
<el-button size="small" @click="getTimeLineData()" :loading="loading">{{$t('overall.loadMore')}}}</el-button>
|
|
|
|
|
</div>
|
2022-03-31 19:07:46 +08:00
|
|
|
</el-timeline>
|
2022-04-01 09:53:02 +08:00
|
|
|
<div class="table-no-data" v-else>
|
|
|
|
|
<svg class="icon" aria-hidden="true">
|
|
|
|
|
<use xlink:href="#nz-icon-no-data-list"></use>
|
|
|
|
|
</svg>
|
|
|
|
|
<div class="table-no-data__title">No results found</div>
|
|
|
|
|
</div>
|
2022-03-31 19:07:46 +08:00
|
|
|
<alertLabel
|
|
|
|
|
v-if="alertLabelShow"
|
2022-04-01 15:43:14 +08:00
|
|
|
:alertTableDialog="true"
|
2022-03-31 19:07:46 +08:00
|
|
|
:id="alertLabelId"
|
|
|
|
|
:that="alertLabelObj"
|
|
|
|
|
:type="alertLabelType"
|
|
|
|
|
></alertLabel>
|
2022-03-31 15:52:17 +08:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
2022-03-31 19:07:46 +08:00
|
|
|
import { alertMessage as alertMessageConstant } from '@/components/common/js/constants'
|
|
|
|
|
import alertMessageLabelMixin from '@/components/common/alert/alertMessageLabelMixin'
|
|
|
|
|
import alertLabelMixin from '@/components/common/mixin/alertLabelMixin'
|
|
|
|
|
|
2022-03-31 15:52:17 +08:00
|
|
|
export default {
|
|
|
|
|
name: 'alertMessageInfoTimeLine',
|
|
|
|
|
props: {
|
|
|
|
|
infoData: {
|
|
|
|
|
type: Object
|
2022-03-31 19:07:46 +08:00
|
|
|
},
|
|
|
|
|
time: {}
|
|
|
|
|
},
|
|
|
|
|
mixins: [alertMessageLabelMixin, alertLabelMixin],
|
|
|
|
|
computed: {
|
|
|
|
|
severityData () {
|
|
|
|
|
return this.$store.getters.severityData
|
2022-03-31 15:52:17 +08:00
|
|
|
}
|
|
|
|
|
},
|
2022-04-01 09:54:46 +08:00
|
|
|
watch: {
|
|
|
|
|
time: {
|
2022-04-01 15:43:14 +08:00
|
|
|
immediate: true,
|
2022-04-01 09:54:46 +08:00
|
|
|
deep: true,
|
|
|
|
|
handler (n) {
|
|
|
|
|
if (n && n.length) {
|
2022-04-01 15:43:14 +08:00
|
|
|
this.pageNo = 1
|
|
|
|
|
this.getTimeLineData()
|
2022-04-01 09:54:46 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2022-03-31 15:52:17 +08:00
|
|
|
data () {
|
|
|
|
|
return {
|
2022-03-31 19:07:46 +08:00
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 20,
|
2022-04-01 18:02:48 +08:00
|
|
|
scope: ['asset', 'datacenter', 'project', 'module', 'endpoint', 'alertrule', 'hash'],
|
2022-03-31 19:07:46 +08:00
|
|
|
timeLineData: [],
|
|
|
|
|
lastDataTime: '',
|
|
|
|
|
loading: false,
|
|
|
|
|
dateFormatStr: localStorage.getItem('nz-default-dateFormat') ? localStorage.getItem('nz-default-dateFormat') : 'YYYY-MM-DD HH:ss:mm',
|
|
|
|
|
noData: false,
|
2022-04-01 09:53:02 +08:00
|
|
|
stateOptions: alertMessageConstant.states,
|
|
|
|
|
scopeList: [{
|
|
|
|
|
key: 'asset',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.asset')
|
|
|
|
|
}, {
|
|
|
|
|
key: 'datacenter',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.dc')
|
|
|
|
|
}, {
|
|
|
|
|
key: 'project',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.project')
|
|
|
|
|
}, {
|
|
|
|
|
key: 'module',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.module')
|
|
|
|
|
}, {
|
|
|
|
|
key: 'endpoint',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.endpoint')
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: 'alertrule',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('alert.alertRule')
|
|
|
|
|
}, {
|
|
|
|
|
key: 'hash',
|
2022-04-01 19:02:24 +08:00
|
|
|
isSelect: true,
|
2022-04-01 09:53:02 +08:00
|
|
|
label: this.$t('overall.hash')
|
|
|
|
|
}
|
|
|
|
|
],
|
2022-04-01 19:02:24 +08:00
|
|
|
total: 20,
|
|
|
|
|
scopeChangeTimer: null
|
2022-03-31 19:07:46 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
mounted () {
|
2022-04-01 15:43:14 +08:00
|
|
|
// this.getTimeLineData(1)
|
2022-03-31 19:07:46 +08:00
|
|
|
const dateFormatStr = localStorage.getItem('nz-default-dateFormat')
|
|
|
|
|
if (dateFormatStr) {
|
|
|
|
|
this.dateFormatStr = dateFormatStr.split(' ')[0]
|
|
|
|
|
} else {
|
|
|
|
|
this.dateFormatStr = 'YYYY-MM-DD'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
2022-04-01 15:43:14 +08:00
|
|
|
getTimeLineData () {
|
2022-03-31 19:07:46 +08:00
|
|
|
this.noData = false
|
|
|
|
|
this.loading = true
|
|
|
|
|
const params = {
|
2022-04-01 15:43:14 +08:00
|
|
|
pageNo: this.pageNo,
|
2022-03-31 19:07:46 +08:00
|
|
|
pageSize: this.pageSize,
|
2022-04-01 19:02:24 +08:00
|
|
|
scope: this.scopeList.filter(item => item.isSelect).map(item => item.key).join(','),
|
2022-03-31 19:07:46 +08:00
|
|
|
id: this.infoData.id,
|
|
|
|
|
state: '',
|
2022-04-01 15:43:14 +08:00
|
|
|
startAt: this.timezoneToUtcTimeStr(this.time[0] * 1000, 'YYYY-MM-DD HH:mm:ss'),
|
|
|
|
|
endAt: this.timezoneToUtcTimeStr(this.time[1] * 1000, 'YYYY-MM-DD HH:mm:ss'),
|
2022-03-31 19:07:46 +08:00
|
|
|
orderBy: '-startAt'
|
|
|
|
|
}
|
|
|
|
|
this.$get('/alert/message/rel', params).then(res => {
|
|
|
|
|
this.loading = false
|
|
|
|
|
if (res.code === 200) {
|
2022-04-01 09:53:02 +08:00
|
|
|
this.total = res.data.total
|
2022-04-01 15:43:14 +08:00
|
|
|
if (this.pageNo == 1) {
|
2022-03-31 19:07:46 +08:00
|
|
|
this.timeLineData = res.data.list
|
|
|
|
|
} else {
|
|
|
|
|
this.timeLineData.push(...res.data.list)
|
|
|
|
|
}
|
2022-04-01 15:43:14 +08:00
|
|
|
this.disposeTime(this.pageNo)
|
2022-03-31 19:07:46 +08:00
|
|
|
this.noData = false
|
2022-04-01 09:53:02 +08:00
|
|
|
this.pageNo++
|
2022-03-31 19:07:46 +08:00
|
|
|
} else {
|
|
|
|
|
this.noData = true
|
|
|
|
|
}
|
|
|
|
|
}).catch(() => {
|
|
|
|
|
this.loading = false
|
|
|
|
|
this.noData = true
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
disposeTime (pageNo) {
|
|
|
|
|
let i = (pageNo - 1) * this.pageSize
|
|
|
|
|
for (i; i < this.timeLineData.length; i++) {
|
|
|
|
|
const lastDataTime = this.timestampStr(this.timeLineData[i].startAt, this.dateFormatStr)
|
2022-04-01 15:43:14 +08:00
|
|
|
this.timeLineData[i].color = '#fa8'
|
2022-03-31 19:07:46 +08:00
|
|
|
if (this.lastDataTime !== lastDataTime) {
|
|
|
|
|
this.lastDataTime = lastDataTime
|
|
|
|
|
this.timeLineData[i].startAt = lastDataTime
|
|
|
|
|
} else {
|
|
|
|
|
this.timeLineData[i].startAt = ''
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-04-01 09:53:02 +08:00
|
|
|
},
|
2022-04-01 19:02:24 +08:00
|
|
|
selectIcon (item) {
|
|
|
|
|
switch (item.key) {
|
|
|
|
|
case 'asset' : return 'nz-icon-overview-project'
|
|
|
|
|
case 'datacenter' : return 'nz-icon-Datacenter2'
|
|
|
|
|
case 'project' : return 'nz-icon-project'
|
|
|
|
|
case 'module' : return 'nz-icon-overview-module'
|
|
|
|
|
case 'endpoint' : return 'nz-icon-overview-endpoint'
|
|
|
|
|
case 'alertrule' : return 'nz-icon-Alertrule'
|
|
|
|
|
case 'hash' : return 'nz-icon-module5'
|
|
|
|
|
}
|
|
|
|
|
return 'nz-icon-module5'
|
|
|
|
|
},
|
|
|
|
|
scopeChange (scope) {
|
|
|
|
|
if (this.scopeChangeTimer) {
|
|
|
|
|
clearInterval(this.scopeChangeTimer)
|
|
|
|
|
this.scopeChangeTimer = null
|
|
|
|
|
}
|
|
|
|
|
this.loading = true
|
|
|
|
|
const isSelectArr = this.scopeList.filter(item => item.isSelect)
|
|
|
|
|
if (isSelectArr.length === this.scopeList.length) {
|
|
|
|
|
this.scopeList.forEach(item => {
|
|
|
|
|
item.isSelect = false
|
|
|
|
|
})
|
|
|
|
|
scope.isSelect = !scope.isSelect
|
|
|
|
|
} else if (isSelectArr.length === 1 && isSelectArr[0].type === scope.type) {
|
|
|
|
|
this.scopeList.forEach(item => {
|
|
|
|
|
item.isSelect = true
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
scope.isSelect = !scope.isSelect
|
|
|
|
|
}
|
|
|
|
|
this.scopeChangeTimer = setTimeout(() => {
|
|
|
|
|
this.pageNo = 1
|
|
|
|
|
this.getTimeLineData()
|
|
|
|
|
}, 100)
|
2022-03-31 15:52:17 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
|
|
</style>
|