aops-hermes/014-add-conf-trace-info-function.patch

499 lines
18 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 42c3bb00c3398b65ee65c5fd62f5796b23a9bd46 Mon Sep 17 00:00:00 2001
From: smjiao <smjiao@isoftstone.com>
Date: Thu, 27 Jun 2024 15:07:40 +0800
Subject: [PATCH 09/10] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=BA=AF=E6=BA=90?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BF=BD=E6=BA=AF=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/configuration.js | 21 +++-
src/config/router.config.js | 12 +-
.../TranscationDomainConfigurations.vue | 4 +-
.../TranscationDomainManagement.vue | 100 ++++++++--------
.../components/AddTranscationDomainModal.vue | 29 ++++-
.../components/QueryRealConfsDrawer.vue | 108 +++++++++++++++++-
6 files changed, 212 insertions(+), 62 deletions(-)
diff --git a/src/api/configuration.js b/src/api/configuration.js
index 37f7b0d..e25c686 100644
--- a/src/api/configuration.js
+++ b/src/api/configuration.js
@@ -1,5 +1,4 @@
import request from '@/vendor/ant-design-pro/utils/request';
-import qs from 'qs';
const api = {
domainList: '/domain/queryDomain', // 获取域信息列表
@@ -13,7 +12,8 @@ const api = {
batchSyncConf: '/confs/batch/syncConf', // 将当前业务域的配置批量同步到各主机
queryRealConfs: '/confs/queryRealConfs', // 获取主机当前配置
queryExpectedConfs: '/confs/queryExpectedConfs', // 获取主机配置日志
- queryHostAndStatus: '/manage/host/sync/status/get' // 获取业务域下的主机及其同步状态
+ queryHostAndStatus: '/manage/host/sync/status/get', // 获取业务域下的主机及其同步状态
+ queryConfTraceInfos: '/conftrace/query' // 获取业务域下单个主机的单个配置文件监控记录
};
export default api;
@@ -147,3 +147,20 @@ export function batchSyncConf(domainName, hostIds) {
}
});
}
+
+// 获取业务域下单个hostId的单个文件监控记录
+export function queryConfTraceInfos(parameter) {
+ return request({
+ url: api.queryConfTraceInfos,
+ method: 'post',
+ data: {
+ domain_name: parameter.domainName,
+ host_id: parameter.hostId,
+ conf_name: parameter.confName,
+ sort: 'create_time',
+ direction: 'desc',
+ page: parameter.page || 1,
+ per_page: parameter.per_page || 10
+ }
+ });
+}
diff --git a/src/config/router.config.js b/src/config/router.config.js
index 6e7b70c..6730a81 100644
--- a/src/config/router.config.js
+++ b/src/config/router.config.js
@@ -3,10 +3,11 @@ import {UserLayout, BasicLayout} from '@/vendor/ant-design-pro/layouts';
const RouteView = {
name: 'RouteView',
- render: (h) => h('router-view')
+ render: h => h('router-view')
};
const routeMap = {
+
/**
* @title: 路由名称。通过i18nRender转换成不同语种
* @path: 路由链接
@@ -812,8 +813,8 @@ export const asyncRouterMap = [
breadcrumbName:
routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement
.title,
- path: routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement
- .path
+ path:
+ routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement.path
}
]
}
@@ -839,8 +840,8 @@ export const asyncRouterMap = [
breadcrumbName:
routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement
.title,
- path: routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement
- .path
+ path:
+ routeMap.configuration.children.TranscationDomainView.children.TranscationDomainManagement.path
},
{
breadcrumbName:
@@ -856,6 +857,7 @@ export const asyncRouterMap = [
path: routeMap.configuration.children.TranscationDomainConfigurations.path,
name: 'transcationDomainConfigurations',
component: RouteView,
+ hidden: true,
hideChildrenInMenu: true,
// $noDomain is used for the case where domain are not selected.
redirect: routeMap.configuration.children.TranscationDomainConfigurations.path + '/$noDomain',
diff --git a/src/views/configuration/TranscationDomainConfigurations.vue b/src/views/configuration/TranscationDomainConfigurations.vue
index b20e233..26fad7e 100644
--- a/src/views/configuration/TranscationDomainConfigurations.vue
+++ b/src/views/configuration/TranscationDomainConfigurations.vue
@@ -105,7 +105,7 @@
:columns="confChangeColumns"
:data-source="manageConfChange[0].changeLog"
:expandIconAsCell="false"
- :expandIconColumnIndex="4"
+ :expandIconColumnIndex="2"
:expandIcon="(props) => this.customExpandIcon(props)"
:pagination="false"
bordered>
@@ -247,14 +247,12 @@ export default {
},
confChangeColumns() {
return [
- {title: '变更ID', dataIndex: 'changeId', key: 'changeId'},
{
title: '变更时间',
dataIndex: 'date',
key: 'date',
customRender: (text, record, index) => dateFormat('YYYY-mm-dd HH:MM:SS', text)
},
- {title: '变更人', dataIndex: 'author', key: 'author'},
{title: '变更原因', dataIndex: 'changeReason', key: 'changeReason'},
{title: '变更详情', dataIndex: '', key: 'x', align: 'center'}
];
diff --git a/src/views/configuration/TranscationDomainManagement.vue b/src/views/configuration/TranscationDomainManagement.vue
index d94469d..45b2e78 100644
--- a/src/views/configuration/TranscationDomainManagement.vue
+++ b/src/views/configuration/TranscationDomainManagement.vue
@@ -3,55 +3,44 @@
<page-header-wrapper :breadcrumb="breadcrumb">
<a-card :bordered="false" class="aops-theme">
<div>
- <h3 class="card-title">业务域列表</h3>
- <span>共有业务域{{ domainData.length }}个</span>
+ <a-row class="aops-app-table-control-row" type="flex" justify="space-between">
+ <a-col>
+ <h3 class="card-title">业务域列表</h3>
+ <span>共有业务域{{ domainData.length }}个</span>
+ </a-col>
+ <a-col>
+ <a-row type="flex" :gutter="70">
+ <a-col>
+ <add-transcation-domain-modal :onSuccess="handleAddSuccess"/>
+ </a-col>
+ <a-col>
+ <a-button @click="getDomainList"> <a-icon type="redo" />刷新 </a-button>
+ </a-col>
+ </a-row>
+ </a-col>
+ </a-row>
</div>
<div>
- <a-list
+ <a-table
+ :rowKey="rowKey"
+ :columns="columns"
+ :data-source="domainData"
:loading="domainLoading"
- :data-source="cardListData"
- :grid="{gutter: 24, xl: 3, lg: 3, md: 2, sm: 1, xs: 1}"
- >
- <a-list-item slot="renderItem" slot-scope="domain, index">
- <a-card :bodyStyle="{padding: 0}" :bordered="false" :class="index !== 0 ? 'aops-theme-incard' : ''">
- <div class="aops-card-body">
- <router-link :to="`${domain.domainName || ''}`">
- <div class="aops-card-content">
- <h3>{{ `业务域 ${domain.domainName}` }}</h3>
- </div>
- </router-link>
- <div class="aops-card-bottom">
- <a-row type="flex" justify="space-between">
- <a-col>priority</a-col>
- <a-col>
- <router-link :to="`/configuration/transcation-domain-configurations/${domain.domainName}`">
- 查看域内配置
- </router-link>
- <a-divider type="vertical" />
- <a-dropdown>
- <a class="ant-dropdown-link" @click="(e) => e.preventDefault()">
- 更多 <a-icon type="down" />
- </a>
- <a-menu slot="overlay">
- <a-menu-item>
- <a href="javascript:;" @click="showAddHostDrawer(domain.domainName)">添加主机</a>
- </a-menu-item>
- <a-menu-item>
- <a href="javascript:;" @click="delDomain(domain.domainName)">删除</a>
- </a-menu-item>
- </a-menu>
- </a-dropdown>
- </a-col>
- </a-row>
- </div>
- </div>
- <add-transcation-domain-modal :onSuccess="handleAddSuccess" v-if="index === 0" />
- </a-card>
- </a-list-item>
- </a-list>
- <a-row type="flex" justify="center" v-show="showNumber < domainData.length + 1">
- <a-col><a-button @click="showMore">加载更多</a-button></a-col>
- </a-row>
+ :pagination="false">
+ <span slot="action" slot-scope="domain">
+ <router-link :to="`${domain.domainName || ''}`">
+ 业务域详情
+ </router-link>
+ <span> | </span>
+ <router-link :to="`/configuration/transcation-domain-configurations/${domain.domainName}`">
+ 查看域内配置
+ </router-link>
+ <span> | </span>
+ <a @click="showAddHostDrawer(domain.domainName)">添加主机</a>
+ <span> | </span>
+ <a @click="delDomain(domain.domainName)">删除</a>
+ </span>
+ </a-table>
</div>
</a-card>
<drawer-view title="添加主机" ref="addHostDrawer" :bodyStyle="{paddingBottom: '80px'}">
@@ -85,10 +74,27 @@ export default {
domainData: [],
showNumber: 6,
domainLoading: false,
- domainName: ''
+ domainName: '',
+ rowKey: 'domainName'
};
},
computed: {
+ columns() {
+ return [
+ {
+ dataIndex: 'domainName',
+ width: '50%',
+ key: 'domainName',
+ title: '业务域名称'
+ },
+ {
+ key: 'operation',
+ width: '50%',
+ title: '操作',
+ scopedSlots: {customRender: 'action'}
+ }
+ ];
+ },
// 自定义面包屑内容
breadcrumb() {
const routes = this.$route.meta.diyBreadcrumb.map((route) => {
diff --git a/src/views/configuration/components/AddTranscationDomainModal.vue b/src/views/configuration/components/AddTranscationDomainModal.vue
index cad671d..6718203 100644
--- a/src/views/configuration/components/AddTranscationDomainModal.vue
+++ b/src/views/configuration/components/AddTranscationDomainModal.vue
@@ -1,6 +1,6 @@
<template>
<div class="aops-add-domain" @click="showModal">
- <a-icon type="plus" />
+ <a-button type="primary">创建业务域</a-button>
<a-modal
title="创建业务域"
:visible="visible"
@@ -25,6 +25,12 @@
v-decorator="['priority', {rules: [{required: false, message: '请输入优先级'}]}]">
</a-input>
</a-form-item>
+ <a-form-item label="监控开关">
+ <a-switch v-model="traceIsActive" @change="handleTraceSwitchChange" checked-children="on" un-checked-children="off" />
+ </a-form-item>
+ <a-form-item label="告警开关">
+ <a-switch v-model="warningIsActive" @change="handleWarningSwitchChange" checked-children="on" un-checked-children="off" />
+ </a-form-item>
</a-form>
</a-modal>
</div>
@@ -45,6 +51,9 @@ export default {
return {
visible: false,
isLoading: false,
+ traceIsActive: false,
+ warningIsActive: false,
+ text: 'ON',
form: this.$form.createForm(this, {name: 'addHostGroup'})
};
},
@@ -62,6 +71,8 @@ export default {
const _this = this;
this.isLoading = true;
values.priority = 0;
+ values.conf_change_flag = this.traceIsActive
+ values.report_flag = this.warningIsActive
createDomain(values)
.then(function (res) {
_this.$message.success(res.message);
@@ -93,6 +104,22 @@ export default {
}
// 26个大小写字母。数字。下划线。底划线。小数点.
cb();
+ },
+ handleTraceSwitchChange() {
+ this.traceIsActive = !this.traceIsActive;
+ if (this.traceIsActive) {
+ this.traceIsActive = false
+ } else {
+ this.traceIsActive = true
+ }
+ },
+ handleWarningSwitchChange() {
+ this.warningIsActive = !this.warningIsActive;
+ if (this.warningIsActive) {
+ this.warningIsActive = false
+ } else {
+ this.warningIsActive = true
+ }
}
}
};
diff --git a/src/views/configuration/components/QueryRealConfsDrawer.vue b/src/views/configuration/components/QueryRealConfsDrawer.vue
index 68cdcad..26a6c01 100644
--- a/src/views/configuration/components/QueryRealConfsDrawer.vue
+++ b/src/views/configuration/components/QueryRealConfsDrawer.vue
@@ -4,7 +4,7 @@
<h1>主机当前配置</h1>
<div>主机:{{ host.hostId }}</div>
<div>IP地址{{ host.ip }}</div>
- <a-collapse>
+ <a-collapse @change="handlePanelChange">
<a-collapse-panel v-for="item in confs" :key="item.filePath" :header="`配置项:${item.filePath}`">
<div class="conf-description">
<a-descriptions title="属性" :column="2">
@@ -41,6 +41,21 @@
{{ item.confContents }}
</div>
</div>
+ <div class="conf-trace">
+ <a-row type="flex" justify="space-between" class="conf-content-header">
+ <a-col>
+ <div class="ant-descriptions-title">操作记录:</div>
+ </a-col>
+ </a-row>
+ <div>当前显示{{ confTraceInfos.length }}条监控信息</div>
+ <a-table
+ :rowKey="rowKey"
+ :columns="columns"
+ :data-source="confTraceInfos"
+ :loading="isLoading"
+ :pagination="pagination"
+ @change="handlePanelChange"/>
+ </div>
<template slot="extra" v-if="item.syncStatus === 'NOT SYNC'">
<a-icon type="close-circle" theme="twoTone" two-tone-color="#ff0000" />
<span style="color: #ff0000">&nbsp;与业务域配置不一致</span>
@@ -81,21 +96,31 @@
<script>
import Vue from 'vue';
+import MyPageHeaderWrapper from '@/views/utils/MyPageHeaderWrapper';
import {Collapse} from 'ant-design-vue';
import CompareDiffView from './CompareDiffView';
import {checkIsDiff} from '../utils/compareContent';
-import {queryRealConfs} from '@/api/configuration';
+import {queryConfTraceInfos, queryRealConfs} from '@/api/configuration';
+import {isArray} from 'ant-design-vue/lib/_util/vue-types/utils';
Vue.use(Collapse);
const Diff = require('diff');
+const defaultPagination = {
+ current: 1,
+ pageSize: 10,
+ showTotal: (total) => `总计 ${total} 项`,
+ showSizeChanger: true,
+ showQuickJumper: true
+};
export default {
name: 'QueryRealConfsDrawer',
inject: ['onload'], // 来自祖辈们provide中声明的参数、方法
components: {
Collapse,
- CompareDiffView
+ CompareDiffView,
+ MyPageHeaderWrapper
},
props: {
confsOfDomain: {
@@ -113,10 +138,15 @@ export default {
collapseIsLoading: false,
confsOfHost: [],
confs: [],
+ confTraceInfos: [],
confsNotInHost: [],
host: {},
compareDrawerVisible: false,
- comparedConf: {}
+ comparedConf: {},
+ pagination: defaultPagination,
+ isLoading: false,
+ rowKey: 'conf_name',
+ temp_conf: ''
};
},
watch: {
@@ -128,6 +158,47 @@ export default {
}
},
methods: {
+ handlePanelChange(row) {
+ if (Object.keys(row).length !== 0) {
+ if (isArray(row)) {
+ this.temp_conf = row[0]
+ this.handleConfTraceChange(row[0]);
+ } else {
+ const confName = this.temp_conf
+ this.pagination.current = row.current
+ this.pagination.pageSize = row.pageSize
+ this.handleConfTraceChange(confName);
+ }
+ }
+ },
+ handleConfTraceChange(confName) {
+ const _this = this
+ const pagination = this.pagination || {};
+ this.isLoading = true;
+ queryConfTraceInfos({
+ domainName: _this.domainName,
+ hostId: _this.host.hostId,
+ confName: confName,
+ page: pagination.current,
+ per_page: pagination.pageSize
+ })
+ .then((res) => {
+ _this.confTraceInfos = res.data.conf_trace_infos || [];
+ _this.totalCount = res.data.total_count
+ _this.pagination = {
+ ..._this.pagination,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ total: res.data.total_count || (res.data.total_count === 0 ? 0 : pagination.total)
+ };
+ })
+ .catch((err) => {
+ _this.$message.error(err.response.message || err.response.data.detail || err.message);
+ })
+ .finally(() => {
+ _this.isLoading = false;
+ });
+ },
getRealConfsList(hostId) {
const _this = this;
_this.collapseIsLoading = true;
@@ -186,6 +257,35 @@ export default {
this.compareDrawerVisible = false;
}
},
+ computed: {
+ columns() {
+ return [
+ {
+ dataIndex: 'create_time',
+ title: '时间',
+ width: '15%',
+ key: 'create_time',
+ align: 'left',
+ scopedSlots: {customRender: 'create_time'}
+ },
+ {
+ dataIndex: 'info',
+ title: '监控记录',
+ width: '15%',
+ key: 'info',
+ align: 'left',
+ scopedSlots: {customRender: 'info'}
+ },
+ {
+ dataIndex: 'ptrace',
+ title: '进程追溯',
+ width: '15%',
+ key: 'ptrace',
+ align: 'left'
+ }
+ ];
+ }
+ },
mounted: function () {
const _this = this;
this.onload(function (params) {
--
2.38.1.windows.1