Monitor.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <div>
  3. <div v-if="hadMonitor">
  4. <dashboard-cards ref="dashboardCards" useLocalPanels :extraParams="extraParams" :localPanels="localPanels" />
  5. </div>
  6. <a-alert
  7. v-else
  8. :message="$t('db.text_183')"
  9. :description="$t('db.text_184')"
  10. type="warning" />
  11. </div>
  12. </template>
  13. <script>
  14. import * as R from 'ramda'
  15. import { REDIS_MONITOR_ALL_OPTS } from '@DB/constants'
  16. import DashboardCards from '@Monitor/components/MonitorCard/DashboardCards'
  17. import WindowsMixin from '@/mixins/windows'
  18. import { HYPERVISORS_MAP } from '@/constants'
  19. export default {
  20. name: 'RedisMonitorSidepage',
  21. components: {
  22. DashboardCards,
  23. },
  24. mixins: [WindowsMixin],
  25. props: {
  26. data: { // listItemData
  27. type: Object,
  28. required: true,
  29. },
  30. },
  31. data () {
  32. return {
  33. }
  34. },
  35. computed: {
  36. hadMonitor () {
  37. const brand = this.data.brand.toLowerCase()
  38. const surportBrand = [HYPERVISORS_MAP.aliyun.key, HYPERVISORS_MAP.huawei.key, HYPERVISORS_MAP.qcloud.key, HYPERVISORS_MAP.azure.key, HYPERVISORS_MAP.apsara.key, HYPERVISORS_MAP.aws.key]
  39. return surportBrand.includes(brand)
  40. },
  41. monitorConstants () {
  42. if (this.data.brand) {
  43. const brand = this.data.brand.toLowerCase()
  44. return REDIS_MONITOR_ALL_OPTS.filter(item => {
  45. return item.supportBrands.includes(brand)
  46. })
  47. }
  48. return []
  49. },
  50. dbId () {
  51. return this.data.id
  52. },
  53. localPanels () {
  54. return this.monitorConstants.map(item => {
  55. return {
  56. panel_name: `${item.label}${item.metric ? `(${item.metric})` : `(${item.fromItem}.${item.seleteItem})`}`,
  57. constants: item,
  58. queryData: this.genQueryData(item),
  59. }
  60. })
  61. },
  62. },
  63. created () {
  64. },
  65. methods: {
  66. genQueryData (val) {
  67. const opt = val
  68. let select = []
  69. if (val.as) {
  70. const asItems = val.as.split(',')
  71. select = val.seleteItem.split(',').map((val, i) => {
  72. return [
  73. {
  74. type: 'field',
  75. params: [val],
  76. },
  77. { // 对应 mean(val.seleteItem)
  78. type: opt.groupFunc || 'mean',
  79. params: [],
  80. },
  81. { // 确保后端返回columns有 val.label 的别名
  82. type: 'alias',
  83. params: [asItems[i]],
  84. },
  85. ]
  86. })
  87. } else {
  88. select = val.seleteItem.split(',').map((val, i) => {
  89. return [
  90. {
  91. type: 'field',
  92. params: [val],
  93. },
  94. { // 对应 mean(val.seleteItem)
  95. type: opt.groupFunc || 'mean',
  96. params: [],
  97. },
  98. { // 确保后端返回columns有 val.label 的别名
  99. type: 'alias',
  100. params: [val],
  101. },
  102. ]
  103. })
  104. }
  105. const tags = [
  106. {
  107. key: 'redis_id',
  108. value: this.dbId,
  109. operator: '=',
  110. },
  111. ]
  112. if (R.is(Object, val.tags)) {
  113. R.forEachObjIndexed((value, key) => {
  114. tags.push({
  115. condition: 'AND',
  116. key,
  117. value,
  118. operator: '=',
  119. })
  120. }, val.tags)
  121. }
  122. const data = {
  123. metric_query: [
  124. {
  125. model: {
  126. measurement: val.fromItem,
  127. select,
  128. tags,
  129. },
  130. },
  131. ],
  132. scope: this.$store.getters.scope,
  133. unit: true,
  134. }
  135. return data
  136. },
  137. },
  138. }
  139. </script>