diff --git a/nezha-fronted/src/assets/css/common.scss b/nezha-fronted/src/assets/css/common.scss index c91a19dfd..12cf1b256 100644 --- a/nezha-fronted/src/assets/css/common.scss +++ b/nezha-fronted/src/assets/css/common.scss @@ -676,3 +676,8 @@ textarea { .el-message__content{ white-space:pre-line } +.response__popper { + max-height: 500px; + overflow: hidden; + overflow-y: auto; +} diff --git a/nezha-fronted/src/assets/css/components/common/table/settings/cortexDetailTable.scss b/nezha-fronted/src/assets/css/components/common/table/settings/cortexDetailTable.scss index a7417d2d8..8f8169f59 100644 --- a/nezha-fronted/src/assets/css/components/common/table/settings/cortexDetailTable.scss +++ b/nezha-fronted/src/assets/css/components/common/table/settings/cortexDetailTable.scss @@ -1,11 +1,11 @@ -#cortexDetail { +#cortexDetail,#lokiStatus { .sub-container{ background: $--background-color-empty; .nz-table-list{ height: auto; } } - #cortexDetailTable { + #cortexDetailTable,#lokiStatusTable { display: flex; flex-direction: column; height: 100%; @@ -45,6 +45,11 @@ display: none; } } + .ring-table{ + .el-table__body-wrapper{ + border-left: 1px solid $--border-color-light; + } + } } .cortex-service, @@ -129,14 +134,5 @@ } } } - - .table-no-data { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } } } diff --git a/nezha-fronted/src/assets/css/components/page/tool/ping.scss b/nezha-fronted/src/assets/css/components/page/tool/ping.scss index 40555355a..7c57b8bba 100644 --- a/nezha-fronted/src/assets/css/components/page/tool/ping.scss +++ b/nezha-fronted/src/assets/css/components/page/tool/ping.scss @@ -422,3 +422,13 @@ td.el-table__expanded-cell:hover { padding: 0 0 0 60px; background-color: $--background-color-base !important; } +#pingTable{ + th.el-table__expand-column{ + .arrow-expand{ + i.nz-icon{ + cursor: pointer; + padding-left: 2px; + } + } + } +} diff --git a/nezha-fronted/src/assets/css/components/page/tool/trace.scss b/nezha-fronted/src/assets/css/components/page/tool/trace.scss index 47d4c27be..78bc2b3de 100644 --- a/nezha-fronted/src/assets/css/components/page/tool/trace.scss +++ b/nezha-fronted/src/assets/css/components/page/tool/trace.scss @@ -160,6 +160,14 @@ .el-table__body-wrapper{ height: calc(100% - 42px) !important; } + th.el-table__expand-column{ + .arrow-expand{ + i.nz-icon{ + cursor: pointer; + padding-left: 2px; + } + } + } } } } diff --git a/nezha-fronted/src/assets/css/font/iconfont.js b/nezha-fronted/src/assets/css/font/iconfont.js index 3cc1b196c..a5a410a30 100644 --- a/nezha-fronted/src/assets/css/font/iconfont.js +++ b/nezha-fronted/src/assets/css/font/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_2030432='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var c,z,o,i,v,m=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}c=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_2030432,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(z=function(){document.removeEventListener("DOMContentLoaded",z,!1),c()},document.addEventListener("DOMContentLoaded",z,!1)):document.attachEvent&&(o=c,i=h.document,v=!1,p(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,t())})}function t(){v||(v=!0,o())}function p(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}t()}}(window); \ No newline at end of file +window._iconfont_svg_string_2030432='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var c,z,o,i,v,m=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}c=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_2030432,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(z=function(){document.removeEventListener("DOMContentLoaded",z,!1),c()},document.addEventListener("DOMContentLoaded",z,!1)):document.attachEvent&&(o=c,i=h.document,v=!1,p(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,t())})}function t(){v||(v=!0,o())}function p(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}t()}}(window); diff --git a/nezha-fronted/src/assets/css/font/iconfont.json b/nezha-fronted/src/assets/css/font/iconfont.json index 53146f997..d7dad6c0f 100644 --- a/nezha-fronted/src/assets/css/font/iconfont.json +++ b/nezha-fronted/src/assets/css/font/iconfont.json @@ -6,6 +6,7 @@ "description": "", "glyphs": [ { +<<<<<<< HEAD "icon_id": "33998082", "name": "右纵轴", "font_class": "youzongzhou", @@ -20,6 +21,8 @@ "unicode_decimal": 59343 }, { +======= +>>>>>>> 61106c08d5bd1c9b7263e6b915880385934c3c7d "icon_id": "33991102", "name": "全部收起", "font_class": "quanbushouqi", diff --git a/nezha-fronted/src/components/chart/chartList.vue b/nezha-fronted/src/components/chart/chartList.vue index f743c67cb..a79faedcb 100644 --- a/nezha-fronted/src/components/chart/chartList.vue +++ b/nezha-fronted/src/components/chart/chartList.vue @@ -557,6 +557,7 @@ export default { if (!this.panelLock) { return false } + this.copyDataList = JSON.parse(JSON.stringify(this.tempList)) for (let i = 0; i < this.copyDataList.length; i++) { const item = this.copyDataList[i] if ((this.$loadsh.get(this.showHidden[item.id], 'visibility') && this.$loadsh.get(this.showHidden[item.id], 'visibility') === 'hidden') && item.id !== -2) { @@ -564,11 +565,11 @@ export default { i-- } } - this.tempList.forEach(item => { - if ((!this.$loadsh.get(this.showHidden[item.id], 'visibility') || this.$loadsh.get(this.showHidden[item.id], 'visibility') === 'show') && item.id !== -2 && !this.copyDataList.find(chart => chart.id === item.id)) { - this.copyDataList.push(item) - } - }) + // this.tempList.forEach(item => { + // if ((!this.$loadsh.get(this.showHidden[item.id], 'visibility') || this.$loadsh.get(this.showHidden[item.id], 'visibility') === 'show') && item.id !== -2 && !this.copyDataList.find(chart => chart.id === item.id)) { + // this.copyDataList.push(item) + // } + // }) this.onScroll(this.scrollTop) }, @@ -606,10 +607,12 @@ export default { for (let index = 0; index < arr.length; index++) { // 遍历找出所有需要 repeat的group 按照 name进行多次的分组 const item = arr[index] const repeatVariable = this.$loadsh.get(item.param.repeat, 'variable') - if (item.type === 'group' && repeatVariable && this.$loadsh.get(this.showHidden[item.id], 'visibility') !== 'hidden') { + const repeatEnable = this.$loadsh.get(item.param.enable, 'repeat') + if (item.type === 'group' && repeatVariable && this.$loadsh.get(this.showHidden[item.id], 'visibility') !== 'hidden' && repeatEnable) { const itemPrev = arr[index - 1] const repeatPrevVariable = this.$loadsh.get(itemPrev.param.repeat, 'variable') - if (itemPrev && itemPrev.type === 'group' && repeatPrevVariable === repeatVariable) { + const repeatPrevEnable = this.$loadsh.get(item.param.enable, 'repeat') + if (itemPrev && itemPrev.type === 'group' && repeatPrevVariable === repeatVariable && repeatPrevEnable) { const arr = variablesRepeat[repeatVariable] arr[arr.length - 1].repeatArr.push(item) arr[arr.length - 1].lastGroup = item @@ -800,8 +803,8 @@ export default { }) } this.$nextTick(() => { - this.tempList = JSON.parse(JSON.stringify(tempList)) this.copyDataList = JSON.parse(JSON.stringify(tempList)) + this.tempList = JSON.parse(JSON.stringify(this.copyDataList)) // 比较变量 图表是否显示/隐藏 this.compareVariables() diff --git a/nezha-fronted/src/components/common/alert/nzTooltip.vue b/nezha-fronted/src/components/common/alert/nzTooltip.vue index 6f299dab1..b4f875e41 100644 --- a/nezha-fronted/src/components/common/alert/nzTooltip.vue +++ b/nezha-fronted/src/components/common/alert/nzTooltip.vue @@ -1,7 +1,11 @@ @@ -16,7 +20,11 @@ export default { that: {}, detailList: Boolean, alertTableDialog: Boolean, - isTopoInfo: Boolean + isTopoInfo: Boolean, + width: { + type: Number, + default: 150 + } }, data () { return { @@ -28,31 +36,62 @@ export default { computed: { calcPosition () { return function (position) { - const clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight - const leftOffSetView = this.detailList ? -80 : 10 - const leftOffSet = this.detailList ? -80 : 10 - const topOffSet = this.detailList ? 60 : 22 - const topoOffset = this.isTopoInfo ? 155 : 0 - if (position.top + this.heightList > clientHeight) { - return { - left: `${position.left + position.width + leftOffSet - topoOffset}px`, - top: `${position.top - this.heightList + topOffSet}px` + if (this.$refs.alertLabels) { + this.heightList = this.$refs.alertLabels.getBoundingClientRect().height + this.boxWidth = this.$refs.alertLabels.getBoundingClientRect().width + } else { + this.heightList = 0 + this.boxWidth = 0 + } + const clientHeight = + document.body.clientHeight < document.documentElement.clientHeight + ? document.body.clientHeight + : document.documentElement.clientHeight + const clientWidth = + document.body.clientWidth < document.documentElement.clientWidth + ? document.body.clientWidth + : document.documentElement.clientWidth + let leftOffSetView = 0 + let leftOffSet = this.detailList ? -80 : 10 + let topOffSet = this.detailList ? 60 : 22 + let topOffSetView = 0 + let labelPosition = { + top: 0, + left: 0, + right: 0, + } + if (this.alertTableDialog) { + let dialog = document.querySelector( + '#dialog-alert-massage .el-dialog' + ) + if (!dialog) { + dialog = document.querySelector('#viewGraphDialog .el-dialog') } - } else if (this.alertTableDialog) { - const dialog = document.querySelector('#dialog-alert-massage .el-dialog') const dialogHeight = dialog.getBoundingClientRect() - if (dialogHeight) { - return { - left: `${position.left + position.width + 10 - dialogHeight.x}px`, - top: `${position.top - dialogHeight.y}px` - } + leftOffSet = leftOffSet - 3 * dialogHeight.x + leftOffSetView = dialogHeight.x + topOffSet = topOffSet - dialogHeight.y + topOffSetView = topOffSet + } + if (position.top > clientHeight / 2) { + labelPosition = { + left: `${position.left + position.width + leftOffSet}px`, + top: this.that.type === 'chartTopology' ? `${position.top - this.heightList - topOffSetView}px` : `${position.top - this.heightList - topOffSetView + position.height / 2}px` } } else { - return { - left: `${position.left + position.width + leftOffSet - topoOffset}px`, - top: `${position.top}px` + labelPosition = { + left: `${position.left + position.width + leftOffSet}px`, + top: this.that.type === 'chartTopology' ? `${position.top + topOffSet}px` : `${position.top + position.height / 2}px` } } + if (position.left > clientWidth / 2) { + delete labelPosition.left + + labelPosition.right = + clientWidth - position.left - leftOffSetView + 'px' + } + labelPosition.width = this.width + 'px' + return labelPosition } }, calcHeight () { @@ -69,13 +108,23 @@ export default { } }, methods: { - tooltipHover (show) { - if (show) { - clearTimeout(this.that.timeout) - this.that.timeout = null - } else { - this.that.loading = false + tooltipHover (item, flag, e) { + if (e) { + const dom = e.currentTarget + const position = dom.getBoundingClientRect() + this.position.left = position.left + this.$set(this.position, 'left', position.left) + if (position.top > window.innerHeight / 2) { + this.$set(this.position, 'top', position.top - 55) + } else { + this.$set(this.position, 'top', position.top + 30) + } + // this.$set(item, 'alertNumtooltipShow', flag) + this.alertNumtooltipShow = flag } + }, + tipHover (tipLoading) { + this.$emit('tipHover', tipLoading) } }, mounted () { diff --git a/nezha-fronted/src/components/common/bottomBox/bottomBox.vue b/nezha-fronted/src/components/common/bottomBox/bottomBox.vue index 2434caf9d..5db71b662 100644 --- a/nezha-fronted/src/components/common/bottomBox/bottomBox.vue +++ b/nezha-fronted/src/components/common/bottomBox/bottomBox.vue @@ -68,6 +68,7 @@ + @@ -109,6 +110,7 @@ import processBottomTab from '@/components/common/bottomBox/tabs/processBottomTa import networkBottomTab from '@/components/common/bottomBox/tabs/networkBottomTab' import scrapeEndpoint from '@/components/common/bottomBox/tabs/scrapeEndpoint' import cortexDetail from '@/components/common/bottomBox/tabs/cortexDetail' +import lokiStatus from '@/components/common/bottomBox/tabs/lokiStatus' import IpDetails from '@/components/common/bottomBox/tabs/IpDetails' import recordRuleEvalLog from '@/components/common/bottomBox/tabs/recordRuleEvalLog' import routerPathParams from '@/components/common/mixin/routerPathParams' @@ -119,6 +121,7 @@ export default { components: { scrapeEndpoint, cortexDetail, + lokiStatus, LogBottomTab, processBottomTab, networkBottomTab, @@ -251,11 +254,18 @@ export default { agent: { scrapeEndpoint: [ { prop: 'scrapeEndpoint', name: this.$t('config.agent.scrapeEndpoint'), active: true }, - { prop: 'cortexDetail', name: this.$t('config.agent.cortexDetail'), active: false } + { prop: 'cortexDetail', name: this.$t('config.agent.cortexDetail'), active: false }, + { prop: 'lokiStatus', name: this.$t('config.agent.lokiStatus'), active: false } ], cortexDetail: [ { prop: 'scrapeEndpoint', name: this.$t('config.agent.scrapeEndpoint'), active: false }, - { prop: 'cortexDetail', name: this.$t('config.agent.cortexDetail'), active: true } + { prop: 'cortexDetail', name: this.$t('config.agent.cortexDetail'), active: true }, + { prop: 'lokiStatus', name: this.$t('config.agent.lokiStatus'), active: false } + ], + lokiStatus: [ + { prop: 'scrapeEndpoint', name: this.$t('config.agent.scrapeEndpoint'), active: false }, + { prop: 'cortexDetail', name: this.$t('config.agent.cortexDetail'), active: false }, + { prop: 'lokiStatus', name: this.$t('config.agent.lokiStatus'), active: true } ] }, ipam: [ diff --git a/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue b/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue index ffff26698..6968894f3 100644 --- a/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue +++ b/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue @@ -52,6 +52,7 @@ export default { await this.getReadyTableData() await this.getIngesterTableData() await this.getStoreGatewayTableData() + await this.getCompactorTableData() await this.getConfigTableData() this.getservicesTableData() } @@ -86,6 +87,12 @@ export default { this.ringTableData.push(response.data.list) } }, + async getCompactorTableData () { + const response = await this.$get('agent/' + this.obj.id + '/cortex/compactor/ring') + if (response.code === 200) { + this.ringTableData.push(response.data.list) + } + }, async getConfigTableData () { const response = await this.$get('agent/' + this.obj.id + '/cortex/config?mode=' + this.configMode) if (response.code === 200) { diff --git a/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue b/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue new file mode 100644 index 000000000..6112fcade --- /dev/null +++ b/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue @@ -0,0 +1,108 @@ + + + diff --git a/nezha-fronted/src/components/common/mixin/alertLabelMixin.js b/nezha-fronted/src/components/common/mixin/alertLabelMixin.js index 73a46d1ef..f89311fff 100644 --- a/nezha-fronted/src/components/common/mixin/alertLabelMixin.js +++ b/nezha-fronted/src/components/common/mixin/alertLabelMixin.js @@ -62,6 +62,8 @@ export default { case 'dc': case 'user': case 'recordRule': + case 'response': + case 'params': return false default: return true } diff --git a/nezha-fronted/src/components/common/mixin/table.js b/nezha-fronted/src/components/common/mixin/table.js index 92337c906..2fa3427cc 100644 --- a/nezha-fronted/src/components/common/mixin/table.js +++ b/nezha-fronted/src/components/common/mixin/table.js @@ -1,8 +1,9 @@ import alertDaysInfo from '@/components/common/alert/alertDaysInfo' -import { requestsArr } from '@/http' +import nzTooltip from '@/components/common/alert/nzTooltip' export default { components: { - alertDaysInfo + alertDaysInfo, + nzTooltip }, props: { tableData: { diff --git a/nezha-fronted/src/components/common/table/settings/cortexDetailTable.vue b/nezha-fronted/src/components/common/table/settings/cortexDetailTable.vue index 73916e65e..636e95e73 100644 --- a/nezha-fronted/src/components/common/table/settings/cortexDetailTable.vue +++ b/nezha-fronted/src/components/common/table/settings/cortexDetailTable.vue @@ -1,6 +1,5 @@ -
-
- -
No results found
-
-
 
-
+ + diff --git a/nezha-fronted/src/components/common/table/settings/operationLogTable.vue b/nezha-fronted/src/components/common/table/settings/operationLogTable.vue index a45c5b8b4..c6af0539c 100644 --- a/nezha-fronted/src/components/common/table/settings/operationLogTable.vue +++ b/nezha-fronted/src/components/common/table/settings/operationLogTable.vue @@ -1,68 +1,94 @@