This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nezha-nezha-fronted/nezha-fronted/src/components/common/alert/alertMessageInfoTimeLine.vue

335 lines
9.6 KiB
Vue
Raw Normal View History

2022-03-31 15:52:17 +08:00
<template>
2022-04-20 16:57:14 +08:00
<div style="height: 100%; width: 100%" class="message-time-line">
2022-03-31 19:07:46 +08:00
<div class="time-line-header">
<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"
>
2022-04-01 19:02:24 +08:00
<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"
2022-03-31 19:07:46 +08:00
: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"
: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 class="alert-message-summary">{{ item.summary }}</div>
<div class="alert-message-startAt">
<span>Start time:</span>
2022-04-20 16:57:14 +08:00
<span>{{utcTimeToTimezoneStr(item.startTime)}}</span>
<span>Duration:</span>
<span>{{getDuration(item)}}</span>
2022-03-31 19:07:46 +08:00
</div>
<div class="alert-message-labels">
2022-03-31 19:07:46 +08:00
<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)"
2022-03-31 19:07:46 +08:00
>
<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>
2022-03-31 19:07:46 +08:00
</span>
</div>
</div>
</el-timeline-item>
<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>
2022-04-01 15:43:14 +08:00
</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>
import { alertMessage as alertMessageConstant } from "@/components/common/js/constants";
import alertMessageLabelMixin from "@/components/common/alert/alertMessageLabelMixin";
import alertLabelMixin from "@/components/common/mixin/alertLabelMixin";
import { calcDurationByStringTimeB } from '@/components/common/js/tools.js'
2022-03-31 15:52:17 +08:00
export default {
name: "alertMessageInfoTimeLine",
2022-03-31 15:52:17 +08:00
props: {
infoData: {
type: Object,
2022-03-31 19:07:46 +08:00
},
time: {},
2022-03-31 19:07:46 +08:00
},
mixins: [alertMessageLabelMixin, alertLabelMixin],
computed: {
severityData() {
return this.$store.getters.severityData;
},
getDuration () {
return function (record) {
if (record.endAt) {
return calcDurationByStringTimeB(record.startTime, record.endAt)
}
return calcDurationByStringTimeB(record.startTime, this.nowTime)
}
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) {
2022-04-01 09:54:46 +08:00
if (n && n.length) {
this.pageNo = 1;
2022-04-20 16:57:14 +08:00
this.lastDataTime = ''
this.getTimeLineData();
2022-04-01 09:54:46 +08:00
}
},
},
2022-04-01 09:54:46 +08:00
},
data() {
2022-03-31 15:52:17 +08:00
return {
2022-03-31 19:07:46 +08:00
pageNo: 1,
pageSize: 20,
scope: [
"asset",
"datacenter",
"project",
"module",
"endpoint",
"alertrule",
"hash",
],
2022-03-31 19:07:46 +08:00
timeLineData: [],
lastDataTime: "",
2022-03-31 19:07:46 +08:00
loading: false,
dateFormatStr: localStorage.getItem("nz-default-dateFormat")
? localStorage.getItem("nz-default-dateFormat")
: "YYYY-MM-DD HH:ss:mm",
2022-03-31 19:07:46 +08:00
noData: false,
2022-04-01 09:53:02 +08:00
stateOptions: alertMessageConstant.states,
scopeList: [
{
key: "asset",
isSelect: true,
label: this.$t("overall.asset"),
},
{
key: "datacenter",
isSelect: true,
label: this.$t("overall.dc"),
},
{
key: "project",
isSelect: true,
label: this.$t("overall.project"),
},
{
key: "module",
isSelect: true,
label: this.$t("overall.module"),
},
{
key: "endpoint",
isSelect: true,
label: this.$t("overall.endpoint"),
},
{
key: "alertrule",
isSelect: true,
label: this.$t("alert.alertRule"),
},
{
key: "hash",
isSelect: true,
label: this.$t("overall.hash"),
},
2022-04-01 09:53:02 +08:00
],
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)
const dateFormatStr = localStorage.getItem("nz-default-dateFormat");
2022-03-31 19:07:46 +08:00
if (dateFormatStr) {
this.dateFormatStr = dateFormatStr.split(" ")[0];
2022-03-31 19:07:46 +08:00
} else {
this.dateFormatStr = "YYYY-MM-DD";
2022-03-31 19:07:46 +08:00
}
},
methods: {
getTimeLineData() {
this.noData = false;
this.loading = true;
2022-03-31 19:07:46 +08:00
const params = {
2022-04-01 15:43:14 +08:00
pageNo: this.pageNo,
2022-03-31 19:07:46 +08:00
pageSize: this.pageSize,
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: "",
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"
),
orderBy: "-startAt",
};
this.$get("/alert/message/rel", params)
.then((res) => {
this.loading = false;
if (res.code === 200) {
this.total = res.data.total;
if (this.pageNo == 1) {
this.timeLineData = res.data.list;
} else {
this.timeLineData.push(...res.data.list);
}
this.disposeTime(this.pageNo);
this.noData = false;
this.pageNo++;
2022-03-31 19:07:46 +08:00
} else {
this.noData = true;
2022-03-31 19:07:46 +08:00
}
})
.catch(() => {
this.loading = false;
this.noData = true;
});
2022-03-31 19:07:46 +08:00
},
disposeTime(pageNo) {
let i = (pageNo - 1) * this.pageSize;
2022-03-31 19:07:46 +08:00
for (i; i < this.timeLineData.length; i++) {
2022-04-20 16:57:14 +08:00
const lastDataTime = this.utcTimeToTimezoneStr(
this.timeLineData[i].startAt,
this.dateFormatStr
);
this.timeLineData[i].color = "#fa8";
this.timeLineData[i].startTime = this.timeLineData[i].startAt;
2022-03-31 19:07:46 +08:00
if (this.lastDataTime !== lastDataTime) {
this.lastDataTime = lastDataTime;
this.timeLineData[i].startAt = lastDataTime;
2022-03-31 19:07:46 +08:00
} else {
this.timeLineData[i].startAt = "";
2022-03-31 19:07:46 +08:00
}
}
2022-04-01 09:53:02 +08:00
},
selectIcon(item) {
2022-04-01 19:02:24 +08:00
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";
2022-04-01 19:02:24 +08:00
}
return "nz-icon-module5";
2022-04-01 19:02:24 +08:00
},
scopeChange(scope) {
2022-04-01 19:02:24 +08:00
if (this.scopeChangeTimer) {
clearInterval(this.scopeChangeTimer);
this.scopeChangeTimer = null;
2022-04-01 19:02:24 +08:00
}
this.loading = true;
const isSelectArr = this.scopeList.filter((item) => item.isSelect);
2022-04-01 19:02:24 +08:00
if (isSelectArr.length === this.scopeList.length) {
this.scopeList.forEach((item) => {
item.isSelect = false;
});
scope.isSelect = !scope.isSelect;
} else if (isSelectArr.length === 1 && isSelectArr[0].key === scope.key) {
this.scopeList.forEach((item) => {
item.isSelect = true;
});
2022-04-01 19:02:24 +08:00
} else {
scope.isSelect = !scope.isSelect;
2022-04-01 19:02:24 +08:00
}
this.scopeChangeTimer = setTimeout(() => {
this.pageNo = 1;
2022-04-20 16:57:14 +08:00
this.lastDataTime = ''
this.getTimeLineData();
}, 100);
},
},
};
2022-03-31 15:52:17 +08:00
</script>
<style scoped>
</style>