1
1
<template >
2
- <el-dropdown >
3
- <el-button @click =" openNodeCacheSettings" >{{ tl('nodeCacheSettings') }}</el-button >
2
+ <el-dropdown
3
+ split-button
4
+ @click =" openNodeCacheSettings"
5
+ placement =" bottom-end"
6
+ class =" node-cache-dropdown"
7
+ >
8
+ {{ tl('nodeCacheSettings') }}
4
9
<template #dropdown >
5
- <el-button @click =" openNodeCacheStatus" >{{ tl('nodeCacheStatus') }}</el-button >
10
+ <el-button size = " large " @click =" openNodeCacheStatus" >{{ tl('nodeCacheStatus') }}</el-button >
6
11
</template >
7
12
</el-dropdown >
8
13
<el-drawer
30
35
v-model =" record.max_count"
31
36
:items =" [{ type: 'number' }, { symbols: [UNLIMITED], type: 'enum' }]"
32
37
:disabled =" !record.enable"
38
+ :disabled-label =" t('Extension.unlimited')"
33
39
/>
34
40
</el-form-item >
35
41
61
67
class =" node-cache-status-drawer"
62
68
:size =" 900"
63
69
:title =" tl('nodeCacheStatus')"
64
- v-loading =" isCacheMetricsLoading"
65
70
>
66
- <div class =" metrics-header" >
67
- <h2 class =" metrics-title" >{{ tl('cacheMetrics') }}</h2 >
68
- <RefreshButton @click =" loadCacheMetrics" />
71
+ <div v-loading =" isCacheMetricsLoading" >
72
+ <div class =" metrics-header" >
73
+ <div class =" vertical-align-center" >
74
+ <el-select v-model =" selectedNode" >
75
+ <el-option
76
+ v-for =" { label, value } in nodeOpts"
77
+ :key =" value"
78
+ :label =" label"
79
+ :value =" value"
80
+ />
81
+ </el-select >
82
+ <el-tooltip :content =" t('Base.refresh')" placement =" top" >
83
+ <RefreshButton class =" icon-button" no-text @click =" loadCacheMetrics" />
84
+ </el-tooltip >
85
+ <el-tooltip :content =" tl('resetNodeCacheStatus')" placement =" top" >
86
+ <el-button class =" icon-button" :icon =" Close" @click =" resetCacheMetrics" ></el-button >
87
+ </el-tooltip >
88
+ </div >
89
+ </div >
90
+ <el-row :gutter =" 24" >
91
+ <el-col :span =" 12" >
92
+ <el-card >
93
+ <p class =" metric-label" >{{ tl('cacheMemory') }}</p >
94
+ <div class =" metric-value" >
95
+ <p class =" metric-value-num" >
96
+ {{ getSizeNum(metrics.memory) }}
97
+ <span class =" metric-unit" >{{ getSizeUnit(metrics.memory) }}</span >
98
+ </p >
99
+ </div >
100
+ </el-card >
101
+ </el-col >
102
+ <el-col :span =" 12" >
103
+ <el-card >
104
+ <p class =" metric-label" >{{ tl('cacheCount') }}</p >
105
+ <div class =" metric-value" >
106
+ <p class =" metric-value-num" >{{ formatNumber(metrics.count) }}</p >
107
+ </div >
108
+ </el-card >
109
+ </el-col >
110
+ <el-col :span =" 12" >
111
+ <el-card >
112
+ <p class =" metric-label" >{{ tl('cacheHits') }}</p >
113
+ <div class =" metric-value" >
114
+ <p class =" metric-value-num" >{{ formatNumber(metrics.hits.value) }}</p >
115
+ </div >
116
+ <div class =" metric-rate" >
117
+ <span class =" rate-item current" >
118
+ {{ getRateValueStr(metrics.hits.rate.current) }} ({{ tl('currentRate') }})
119
+ </span >
120
+ <span class =" rate-item" >
121
+ {{ getRateValueStr(metrics.hits.rate.last5m) }} ({{ tl('last5mRate') }})
122
+ </span >
123
+ <span class =" rate-item" >
124
+ {{ getRateValueStr(metrics.hits.rate.max) }} ({{ t('Dashboard.maximum') }})
125
+ </span >
126
+ </div >
127
+ </el-card >
128
+ </el-col >
129
+ <el-col :span =" 12" >
130
+ <el-card >
131
+ <p class =" metric-label" >{{ tl('cacheMisses') }}</p >
132
+ <div class =" metric-value" >
133
+ <p class =" metric-value-num" >{{ formatNumber(metrics.misses.value) }}</p >
134
+ </div >
135
+ <div class =" metric-rate" >
136
+ <span class =" rate-item current" >
137
+ {{ getRateValueStr(metrics.misses.rate.current) }} ({{ tl('currentRate') }})
138
+ </span >
139
+ <span class =" rate-item" >
140
+ {{ getRateValueStr(metrics.misses.rate.last5m) }} ({{ tl('last5mRate') }})
141
+ </span >
142
+ <span class =" rate-item" >
143
+ {{ getRateValueStr(metrics.misses.rate.max) }} ({{ t('Dashboard.maximum') }})
144
+ </span >
145
+ </div >
146
+ </el-card >
147
+ </el-col >
148
+ <el-col :span =" 12" >
149
+ <el-card >
150
+ <p class =" metric-label" >{{ tl('cacheInserts') }}</p >
151
+ <div class =" metric-value" >
152
+ <p class =" metric-value-num" >{{ formatNumber(metrics.inserts.value) }}</p >
153
+ </div >
154
+ <div class =" metric-rate" >
155
+ <span class =" rate-item current" >
156
+ {{ getRateValueStr(metrics.inserts.rate.current, 'Auth.insertUnit') }}
157
+ ({{ tl('currentRate') }})
158
+ </span >
159
+ <span class =" rate-item" >
160
+ {{ getRateValueStr(metrics.inserts.rate.last5m, 'Auth.insertUnit') }}
161
+ ({{ tl('last5mRate') }})
162
+ </span >
163
+ <span class =" rate-item" >
164
+ {{ getRateValueStr(metrics.inserts.rate.max, 'Auth.insertUnit') }}
165
+ ({{ t('Dashboard.maximum') }})
166
+ </span >
167
+ </div >
168
+ </el-card >
169
+ </el-col >
170
+ </el-row >
171
+ <el-table :data =" nodeMetrics" style =" width : 100% " >
172
+ <el-table-column prop =" node" :label =" t('Base.node')" />
173
+ <el-table-column prop =" metrics.memory" :label =" tl('cacheMemory')" >
174
+ <template #default =" { row } " >
175
+ {{ getSizeNum(row.metrics.memory) }}
176
+ <span class =" metric-unit" >{{ getSizeUnit(row.metrics.memory) }}</span >
177
+ </template >
178
+ </el-table-column >
179
+ <el-table-column prop =" metrics.count" :label =" tl('cacheCount')" />
180
+ <el-table-column prop =" metrics.hits.value" :label =" tl('cacheHits')" />
181
+ </el-table >
69
182
</div >
70
- <el-row :gutter =" 24" >
71
- <el-col :span =" 12" >
72
- <el-card >
73
- <p class =" metric-label" >{{ tl('cacheMemory') }}</p >
74
- <div class =" metric-value" >
75
- <p class =" metric-value-num" >
76
- {{ metrics.memory }} <span class =" metric-unit" >{{ tl('bytes') }}</span >
77
- </p >
78
- </div >
79
- </el-card >
80
- </el-col >
81
- <el-col :span =" 12" >
82
- <el-card >
83
- <p class =" metric-label" >{{ tl('cacheCount') }}</p >
84
- <div class =" metric-value" >
85
- <p class =" metric-value-num" >{{ metrics.count }}</p >
86
- </div >
87
- </el-card >
88
- </el-col >
89
- <el-col :span =" 12" >
90
- <el-card >
91
- <p class =" metric-label" >{{ tl('cacheHits') }}</p >
92
- <div class =" metric-value" >
93
- <p class =" metric-value-num" >{{ metrics.hits.value }}</p >
94
- </div >
95
- <div class =" metric-rate" >
96
- <span class =" rate-item current" >
97
- {{ getRateValueStr(metrics.hits.rate.current) }} {{ tl('currentRate') }}
98
- </span >
99
- <span class =" rate-item" >
100
- {{ getRateValueStr(metrics.hits.rate.last5m) }} {{ tl('last5mRate') }}
101
- </span >
102
- </div >
103
- </el-card >
104
- </el-col >
105
- <el-col :span =" 12" >
106
- <el-card >
107
- <p class =" metric-label" >{{ tl('cacheMisses') }}</p >
108
- <div class =" metric-value" >
109
- <p class =" metric-value-num" >{{ metrics.misses.value }}</p >
110
- </div >
111
- <div class =" metric-rate" >
112
- <span class =" rate-item current" >
113
- {{ getRateValueStr(metrics.misses.rate.current) }} {{ tl('currentRate') }}
114
- </span >
115
- <span class =" rate-item" >
116
- {{ getRateValueStr(metrics.misses.rate.last5m) }} {{ tl('last5mRate') }}
117
- </span >
118
- </div >
119
- </el-card >
120
- </el-col >
121
- <el-col :span =" 12" >
122
- <el-card >
123
- <p class =" metric-label" >{{ tl('cacheInserts') }}</p >
124
- <div class =" metric-value" >
125
- <p class =" metric-value-num" >{{ metrics.inserts.value }}</p >
126
- </div >
127
- <div class =" metric-rate" >
128
- <span class =" rate-item current" >
129
- {{ getRateValueStr(metrics.inserts.rate.current) }} {{ tl('currentRate') }}
130
- </span >
131
- <span class =" rate-item" >
132
- {{ getRateValueStr(metrics.inserts.rate.last5m) }} {{ tl('last5mRate') }}
133
- </span >
134
- </div >
135
- </el-card >
136
- </el-col >
137
- </el-row >
138
- <el-table :data =" nodeMetrics" style =" width : 100% " >
139
- <el-table-column prop =" node" :label =" t('Base.node')" />
140
- <el-table-column prop =" metrics.memory" :label =" tl('cacheMemory')" />
141
- <el-table-column prop =" metrics.count" :label =" tl('cacheCount')" />
142
- <el-table-column prop =" metrics.hits.value" :label =" tl('cacheHits')" />
143
- <el-table-column prop =" metrics.misses.value" :label =" tl('cacheMisses')" />
144
- <el-table-column prop =" metrics.inserts.value" :label =" tl('cacheInserts')" />
145
- </el-table >
146
183
<template #footer >
147
184
<el-button @click =" cancelSettings" >
148
185
{{ t('APIKey.close') }}
@@ -162,6 +199,8 @@ import {
162
199
updateAuthnSettings ,
163
200
updateAuthzSettings ,
164
201
} from ' @/api/auth'
202
+ import { useSizeMetric } from ' @/hooks/useMetrics'
203
+ import { Close } from ' @element-plus/icons-vue'
165
204
166
205
type NodeCacheConfig = {
167
206
enable? : boolean
@@ -253,8 +292,19 @@ const totalMetrics = ref({
253
292
node_metrics: [],
254
293
})
255
294
256
- const metrics = computed (() => totalMetrics .value .metrics )
295
+ const { CLUSTER, getNodeOpts } = useNodeOpts ()
296
+ const nodeOpts = computed (() => getNodeOpts ((nodeMetrics .value || []).map (({ node }) => node )))
297
+ const selectedNode = ref (CLUSTER )
298
+
257
299
const nodeMetrics = computed (() => totalMetrics .value .node_metrics )
300
+ const metrics = computed (() => {
301
+ if (selectedNode .value === CLUSTER ) {
302
+ return totalMetrics .value .metrics
303
+ }
304
+ return nodeMetrics .value .find (({ node }) => node === selectedNode .value )?.metrics
305
+ })
306
+
307
+ const { getSizeNum, getSizeUnit } = useSizeMetric ()
258
308
259
309
const requestCacheMetrics = () => (isAuthz .value ? loadAuthnCacheStatus () : loadAuthzCacheStatus ())
260
310
const requestResetCacheMetrics = () =>
@@ -274,39 +324,53 @@ const loadCacheMetrics = async () => {
274
324
275
325
const resetCacheMetrics = async () => {
276
326
try {
327
+ await ElMessageBox .confirm (tl (' resetNodeCacheStatusConfirm' ))
277
328
await requestResetCacheMetrics ()
329
+ ElMessage .success (t (' RuleEngine.resetSuccessfully' ))
330
+ loadCacheMetrics ()
278
331
} catch (error ) {
279
332
//
280
333
}
281
334
}
282
335
283
- const getRateValueStr = (val : number ) => ` ${val }${tl (' rateUnit' , { val })} `
336
+ const getRateValueStr = (val : number , unit = ' Auth.rateUnit' ) =>
337
+ ` ${formatNumber (val )} ${t (unit , val )} `
284
338
</script >
285
339
286
340
<style lang="scss">
341
+ .node-cache-dropdown {
342
+ .el-dropdown__caret-button {
343
+ & :hover {
344
+ border-left-width : 1px ;
345
+ border-left-style : solid ;
346
+ }
347
+ }
348
+ .el-button-group > .el-button :hover {
349
+ z-index : 10 ;
350
+ }
351
+ }
287
352
.node-cache-status-drawer {
288
353
.el-card {
289
- margin-bottom : 20px ;
290
- transition : all 0.3s ;
354
+ margin-bottom : 24px ;
355
+ }
356
+ .el-select {
357
+ width : 200px ;
358
+ margin-right : 12px ;
291
359
}
292
-
293
360
.metric-label {
294
361
margin-top : 8px ;
295
362
margin-bottom : 12px ;
296
363
color : var (--el-text-color-secondary );
297
364
}
298
-
299
365
.metric-value {
300
366
display : flex ;
301
367
align-items : baseline ;
302
- font-weight : 600 ;
303
-
368
+ font-weight : 400 ;
304
369
.metric-value-num {
305
370
font-size : 22px ;
306
371
color : var (--el-text-color-primary );
307
372
margin : 0 ;
308
373
}
309
-
310
374
.metric-unit {
311
375
font-size : 14px ;
312
376
font-weight : normal ;
@@ -319,36 +383,31 @@ const getRateValueStr = (val: number) => `${val}${tl('rateUnit', { val })}`
319
383
margin-top : 12px ;
320
384
display : flex ;
321
385
align-items : center ;
322
-
323
386
.rate-item {
387
+ position : relative ;
388
+ margin-right : 12px ;
324
389
color : var (--el-text-color-secondary );
325
-
390
+ & :not (:last-child ):after {
391
+ position : absolute ;
392
+ content : ' ' ;
393
+ width : 1px ;
394
+ height : 12px ;
395
+ background-color : var (--el-border-color );
396
+ right : -6px ;
397
+ top : 50% ;
398
+ transform : translateY (-50% );
399
+ opacity : 0.75 ;
400
+ }
326
401
& .current {
327
- margin-right : 12px ;
328
402
color : var (--el-color-primary );
329
403
}
330
404
}
331
405
}
332
406
333
- // 添加一个标题
334
407
.metrics-header {
335
408
display : flex ;
336
- align-items : center ;
337
- justify-content : space-between ;
409
+ justify-content : flex-end ;
338
410
margin-bottom : 20px ;
339
411
}
340
-
341
- .metrics-title {
342
- font-size : 20px ;
343
- font-weight : 600 ;
344
- margin : 0 ;
345
- color : var (--el-text-color-primary );
346
- }
347
-
348
- // 添加刷新按钮样式
349
- .refresh-button {
350
- margin-left : 10px ;
351
- font-size : 14px ;
352
- }
353
412
}
354
413
</style >
0 commit comments