@windwalker-io/core 4.0.8 → 4.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gulp.json +7 -7
- package/LICENSE +19 -19
- package/dist/debugger/114.js.map +1 -0
- package/dist/debugger/338.js.map +1 -0
- package/dist/debugger/358.js.map +1 -0
- package/dist/debugger/500.js.map +1 -0
- package/dist/debugger/548.js.map +1 -0
- package/dist/debugger/694.js.map +1 -0
- package/dist/debugger/798.js.map +1 -0
- package/dist/debugger/851.js.map +1 -0
- package/dist/debugger/864.js.map +1 -0
- package/dist/debugger/chunk-vendor-114.js +3 -0
- package/dist/debugger/chunk-vendor-114.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-338.js +3 -0
- package/dist/debugger/chunk-vendor-338.js.LICENSE.txt +15 -0
- package/dist/debugger/chunk-vendor-358.js +2 -0
- package/dist/debugger/chunk-vendor-500.js +3 -0
- package/dist/debugger/chunk-vendor-500.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-548.js +3 -0
- package/dist/debugger/chunk-vendor-548.js.LICENSE.txt +15 -0
- package/dist/debugger/chunk-vendor-694.js +3 -0
- package/dist/debugger/chunk-vendor-694.js.LICENSE.txt +1 -0
- package/dist/debugger/chunk-vendor-798.js +3 -0
- package/dist/debugger/chunk-vendor-798.js.LICENSE.txt +1 -0
- package/dist/debugger/chunk-vendor-851.js +3 -0
- package/dist/debugger/chunk-vendor-851.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-864.js +3 -0
- package/dist/debugger/chunk-vendor-864.js.LICENSE.txt +1 -0
- package/dist/debugger/debugger.js +1 -1
- package/dist/debugger/debugger.js.LICENSE.txt +11 -2
- package/dist/debugger/debugger.js.map +1 -1
- package/dist/debugger/dev/chunk-vendor-scss_debugger_scss.js +219 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_layouts_DefaultLayout_vue.js +77 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Dashboard_vue.js +81 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Database_vue.js +187 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Events_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Request_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Routing_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_System_vue.js +67 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Timeline_vue.js +132 -0
- package/dist/debugger/dev/chunk-vendor-vendors-node_modules_bootstrap_js_src_modal_js-node_modules_sql-formatter_lib_index_js.js +923 -0
- package/dist/debugger/dev/chunk-vendor-vendors-node_modules_sql-formatter_lib_index_js-node_modules_bootstrap_js_src_modal_js.js +923 -0
- package/fusionfile.mjs +26 -10
- package/package.json +11 -5
- package/scss/_variables.scss +1 -0
- package/scss/base/_typography.scss +9 -0
- package/scss/debugger.scss +47 -1
- package/src/debugger/App.vue +40 -16
- package/src/debugger/Store.vue +1 -1
- package/src/debugger/components/BsModal.vue +128 -0
- package/src/debugger/components/KeyValueTable.vue +51 -0
- package/src/debugger/components/db/{query-info.vue → QueryInfo.vue} +55 -27
- package/src/debugger/components/events/EventListenersTable.vue +75 -0
- package/src/debugger/components/timeline/TimelineTable.vue +107 -0
- package/src/debugger/debugger.js +4 -1
- package/src/debugger/font-awesome.js +23 -0
- package/src/debugger/layouts/DefaultLayout.vue +17 -2
- package/src/debugger/routes.js +5 -2
- package/src/debugger/services/utilities.js +18 -0
- package/src/debugger/views/Dashboard.vue +20 -10
- package/src/debugger/views/Database.vue +113 -26
- package/src/debugger/views/Events.vue +113 -0
- package/src/debugger/views/Request.vue +133 -1
- package/src/debugger/views/Routing.vue +210 -0
- package/src/debugger/views/System.vue +37 -8
- package/src/debugger/views/Timeline.vue +92 -0
- package/src/{webpack.config.js → debugger/webpack.config.js} +1 -1
- package/src/index.mjs +9 -9
- package/src/install-vendors.mjs +10 -3
- package/src/utils.mjs +1 -2
- package/dist/debugger/1.js +0 -2
- package/dist/debugger/1.js.map +0 -1
- package/dist/debugger/144.js +0 -2
- package/dist/debugger/144.js.map +0 -1
- package/dist/debugger/2.js +0 -8
- package/dist/debugger/2.js.map +0 -1
- package/dist/debugger/3.js +0 -2
- package/dist/debugger/3.js.map +0 -1
- package/dist/debugger/4.js +0 -2
- package/dist/debugger/4.js.map +0 -1
- package/dist/debugger/5.js +0 -2
- package/dist/debugger/5.js.map +0 -1
- package/dist/debugger/523.js +0 -2
- package/dist/debugger/523.js.map +0 -1
- package/dist/debugger/659.js +0 -3
- package/dist/debugger/659.js.LICENSE.txt +0 -6
- package/dist/debugger/659.js.map +0 -1
- package/dist/debugger/689.js +0 -2
- package/dist/debugger/689.js.map +0 -1
- package/dist/debugger/715.js +0 -2
- package/dist/debugger/715.js.map +0 -1
- package/dist/debugger/727.js +0 -3
- package/dist/debugger/727.js.LICENSE.txt +0 -6
- package/dist/debugger/727.js.map +0 -1
- package/dist/debugger/src_debugger_views_Dashboard_vue.js +0 -67
- package/dist/debugger/src_debugger_views_Database_vue.js +0 -187
- package/dist/debugger/src_debugger_views_Request_vue.js +0 -67
- package/dist/debugger/src_debugger_views_System_vue.js +0 -122
- package/dist/debugger/vendors-node_modules_sql-formatter_lib_sqlFormatter_js.js +0 -212
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<table class="table table-bordered">
|
|
4
|
+
<thead>
|
|
5
|
+
<tr>
|
|
6
|
+
<th>Label</th>
|
|
7
|
+
<th class="text-end">Total Time</th>
|
|
8
|
+
<th class="text-end">Time</th>
|
|
9
|
+
<th class="text-end">Total Memory</th>
|
|
10
|
+
<th class="text-end">Memory</th>
|
|
11
|
+
</tr>
|
|
12
|
+
</thead>
|
|
13
|
+
|
|
14
|
+
<tbody>
|
|
15
|
+
<tr v-for="item of items">
|
|
16
|
+
<td>
|
|
17
|
+
{{ item.label }}
|
|
18
|
+
</td>
|
|
19
|
+
<td class="text-end">
|
|
20
|
+
<span class="badge bg-secondary">
|
|
21
|
+
{{ round(item.endTime) }}ms
|
|
22
|
+
</span>
|
|
23
|
+
</td>
|
|
24
|
+
<td class="text-end" v-if="getTimeOffset(item.endTime) || true">
|
|
25
|
+
<span class="badge" :class="'bg-' + stateColor(getCurrentTimeOffset(), 50)">
|
|
26
|
+
{{ round(getCurrentTimeOffset()) }}ms
|
|
27
|
+
</span>
|
|
28
|
+
</td>
|
|
29
|
+
<td class="text-end">
|
|
30
|
+
<span class="badge bg-secondary">
|
|
31
|
+
{{ round(bytesToMB(item.memory)) }}MB
|
|
32
|
+
</span>
|
|
33
|
+
</td>
|
|
34
|
+
<td class="text-end" v-if="getMemoryOffset(item.memory) || true">
|
|
35
|
+
<span class="badge" :class="'bg-' + stateColor(bytesToMB(getCurrentMemoryOffset()), 2)">
|
|
36
|
+
{{ round(bytesToMB(getCurrentMemoryOffset())) }}MB
|
|
37
|
+
</span>
|
|
38
|
+
</td>
|
|
39
|
+
</tr>
|
|
40
|
+
</tbody>
|
|
41
|
+
</table>
|
|
42
|
+
</div>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<script>
|
|
46
|
+
import { stateColor } from '../../services/utilities.js';
|
|
47
|
+
|
|
48
|
+
export default {
|
|
49
|
+
name: 'TimelineTable',
|
|
50
|
+
props: {
|
|
51
|
+
items: Array
|
|
52
|
+
},
|
|
53
|
+
setup() {
|
|
54
|
+
let lastTime = 0;
|
|
55
|
+
let timeOffset = 0;
|
|
56
|
+
|
|
57
|
+
function getTimeOffset(time) {
|
|
58
|
+
timeOffset = time - lastTime;
|
|
59
|
+
|
|
60
|
+
lastTime = time;
|
|
61
|
+
|
|
62
|
+
return timeOffset;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function getCurrentTimeOffset() {
|
|
66
|
+
return timeOffset;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let lastMemory = 0;
|
|
70
|
+
let memoryOffset = 0;
|
|
71
|
+
|
|
72
|
+
function getMemoryOffset(memory) {
|
|
73
|
+
memoryOffset = memory - lastMemory;
|
|
74
|
+
|
|
75
|
+
lastMemory = memory;
|
|
76
|
+
|
|
77
|
+
return memoryOffset;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function getCurrentMemoryOffset() {
|
|
81
|
+
return memoryOffset;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function bytesToMB(value) {
|
|
85
|
+
return value / 1024 / 1024;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function round(num) {
|
|
89
|
+
return Math.round(num * 10000) / 10000;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
getTimeOffset,
|
|
94
|
+
getCurrentTimeOffset,
|
|
95
|
+
getMemoryOffset,
|
|
96
|
+
getCurrentMemoryOffset,
|
|
97
|
+
stateColor,
|
|
98
|
+
bytesToMB,
|
|
99
|
+
round
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<style scoped>
|
|
106
|
+
|
|
107
|
+
</style>
|
package/src/debugger/debugger.js
CHANGED
|
@@ -9,10 +9,13 @@ import 'regenerator-runtime';
|
|
|
9
9
|
import App from '@/App.vue';
|
|
10
10
|
import { createApp } from 'vue';
|
|
11
11
|
import router from './routes.js';
|
|
12
|
+
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
|
13
|
+
import './font-awesome.js';
|
|
12
14
|
|
|
13
15
|
import '../../scss/debugger.scss';
|
|
14
16
|
|
|
15
17
|
const app = createApp(App)
|
|
16
|
-
.use(router)
|
|
18
|
+
.use(router)
|
|
19
|
+
.component('fa-icon', FontAwesomeIcon);
|
|
17
20
|
|
|
18
21
|
app.mount('app');
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Part of earth project.
|
|
3
|
+
*
|
|
4
|
+
* @copyright Copyright (C) 2022 __ORGANIZATION__.
|
|
5
|
+
* @license __LICENSE__
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/* import the fontawesome core */
|
|
9
|
+
import { library } from '@fortawesome/fontawesome-svg-core'
|
|
10
|
+
|
|
11
|
+
/* import specific icons */
|
|
12
|
+
import { faList } from '@fortawesome/free-solid-svg-icons/faList'
|
|
13
|
+
import { faArrowsRotate } from '@fortawesome/free-solid-svg-icons/faArrowsRotate'
|
|
14
|
+
import { faEye } from '@fortawesome/free-solid-svg-icons/faEye'
|
|
15
|
+
import { faExternalLink } from '@fortawesome/free-solid-svg-icons/faExternalLink'
|
|
16
|
+
|
|
17
|
+
/* add icons to the library */
|
|
18
|
+
library.add(
|
|
19
|
+
faEye,
|
|
20
|
+
faExternalLink,
|
|
21
|
+
faList,
|
|
22
|
+
faArrowsRotate,
|
|
23
|
+
);
|
|
@@ -5,7 +5,15 @@
|
|
|
5
5
|
<slot name="title"></slot>
|
|
6
6
|
</h1>
|
|
7
7
|
<div class="text-muted">
|
|
8
|
-
|
|
8
|
+
<router-link to="/" class="btn btn-sm btn-primary">
|
|
9
|
+
<fa-icon icon="fa-solid fa-list"></fa-icon>
|
|
10
|
+
</router-link>
|
|
11
|
+
<button type="button" @click="goToLast('/' + route.name)" class="btn btn-sm btn-success">
|
|
12
|
+
<fa-icon icon="fa-solid fa-arrows-rotate"></fa-icon>
|
|
13
|
+
</button>
|
|
14
|
+
/
|
|
15
|
+
{{ currentId }}
|
|
16
|
+
/ <a target="_blank" class="text-gray-600" :href="currentData.url">{{ currentData.url }}</a>
|
|
9
17
|
</div>
|
|
10
18
|
</div>
|
|
11
19
|
|
|
@@ -14,14 +22,21 @@
|
|
|
14
22
|
</template>
|
|
15
23
|
|
|
16
24
|
<script>
|
|
25
|
+
import { useRoute } from 'vue-router';
|
|
26
|
+
import { goToLast } from '../services/nav.js';
|
|
17
27
|
import { currentData, currentId } from '../services/store.js';
|
|
18
28
|
|
|
19
29
|
export default {
|
|
20
30
|
name: 'DefaultLayout',
|
|
21
31
|
setup() {
|
|
32
|
+
const route = useRoute();
|
|
33
|
+
|
|
22
34
|
return {
|
|
23
35
|
currentId,
|
|
24
|
-
currentData
|
|
36
|
+
currentData,
|
|
37
|
+
route,
|
|
38
|
+
|
|
39
|
+
goToLast
|
|
25
40
|
};
|
|
26
41
|
}
|
|
27
42
|
};
|
package/src/debugger/routes.js
CHANGED
|
@@ -13,6 +13,9 @@ const routes = [
|
|
|
13
13
|
{ name: 'dashboard', path: '/', component: () => import('./views/Dashboard.vue') },
|
|
14
14
|
{ name: 'system', path: '/system/:id?', component: () => import('./views/System.vue') },
|
|
15
15
|
{ name: 'request', path: '/request/:id?', component: () => import('./views/Request.vue') },
|
|
16
|
+
{ name: 'routing', path: '/routing/:id?', component: () => import('./views/Routing.vue') },
|
|
17
|
+
{ name: 'timeline', path: '/timeline/:id?', component: () => import('./views/Timeline.vue') },
|
|
18
|
+
{ name: 'events', path: '/events/:id?', component: () => import('./views/Events.vue') },
|
|
16
19
|
{ name: 'db', path: '/db/:id?', component: () => import('./views/Database.vue') },
|
|
17
20
|
];
|
|
18
21
|
|
|
@@ -36,8 +39,8 @@ router.beforeEach(async (to, from) => {
|
|
|
36
39
|
currentId.value = to.params.id;
|
|
37
40
|
|
|
38
41
|
const params = new URLSearchParams({
|
|
39
|
-
'path[url]': 'http
|
|
40
|
-
'path[status]': 'http
|
|
42
|
+
'path[url]': 'http::systemUri.full',
|
|
43
|
+
'path[status]': 'http::response.status',
|
|
41
44
|
});
|
|
42
45
|
const res = await $http.get('ajax/data?' + params.toString());
|
|
43
46
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Part of earth project.
|
|
3
|
+
*
|
|
4
|
+
* @copyright Copyright (C) 2022 __ORGANIZATION__.
|
|
5
|
+
* @license __LICENSE__
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function stateColor(value, avg) {
|
|
9
|
+
if (value > (avg * 2)) {
|
|
10
|
+
return 'danger';
|
|
11
|
+
} else if (value > (avg * 1.5)) {
|
|
12
|
+
return 'warning';
|
|
13
|
+
} else if (value < (avg / 2)) {
|
|
14
|
+
return 'success';
|
|
15
|
+
} else {
|
|
16
|
+
return 'info';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="p-4">
|
|
3
|
-
<table class="table table-
|
|
4
|
-
<thead>
|
|
3
|
+
<table class="table table-striped table-bordered">
|
|
4
|
+
<thead class="table-dark">
|
|
5
5
|
<tr>
|
|
6
6
|
<th>
|
|
7
7
|
ID
|
|
@@ -30,13 +30,15 @@
|
|
|
30
30
|
<tbody>
|
|
31
31
|
<tr v-for="item of items">
|
|
32
32
|
<td>
|
|
33
|
-
|
|
33
|
+
<a href="#" @click.prevent="selectId(item.id)" class="link-secondary">
|
|
34
|
+
{{ item.id }}
|
|
35
|
+
</a>
|
|
34
36
|
</td>
|
|
35
37
|
<td>
|
|
36
|
-
<button class="
|
|
38
|
+
<button class="btn btn-primary btn-sm"
|
|
37
39
|
type="button"
|
|
38
40
|
@click="selectId(item.id)">
|
|
39
|
-
<
|
|
41
|
+
<fa-icon icon="fa-solid fa-eye"></fa-icon>
|
|
40
42
|
</button>
|
|
41
43
|
</td>
|
|
42
44
|
<td>
|
|
@@ -46,16 +48,18 @@
|
|
|
46
48
|
{{ item.method }}
|
|
47
49
|
</td>
|
|
48
50
|
<td>
|
|
49
|
-
<a href="
|
|
50
|
-
|
|
51
|
+
<a :href="item.url"
|
|
52
|
+
target="_blank"
|
|
53
|
+
class="link-secondary">
|
|
51
54
|
{{ item.url }}
|
|
55
|
+
<fa-icon class="small" icon="fa-solid fa-external-link"></fa-icon>
|
|
52
56
|
</a>
|
|
53
57
|
</td>
|
|
54
58
|
<td>
|
|
55
|
-
{{ item.time }}
|
|
59
|
+
{{ dateFormat(item.time) }}
|
|
56
60
|
</td>
|
|
57
61
|
<td>
|
|
58
|
-
{{ item.status }}
|
|
62
|
+
{{ item.response?.status }}
|
|
59
63
|
</td>
|
|
60
64
|
</tr>
|
|
61
65
|
</tbody>
|
|
@@ -64,6 +68,7 @@
|
|
|
64
68
|
</template>
|
|
65
69
|
|
|
66
70
|
<script>
|
|
71
|
+
import * as dayjs from 'dayjs';
|
|
67
72
|
import { onMounted, reactive, toRefs } from 'vue';
|
|
68
73
|
import router from '@/routes.js';
|
|
69
74
|
import $http from '@/services/http.js';
|
|
@@ -88,9 +93,14 @@ export default {
|
|
|
88
93
|
router.push('/system/' + id);
|
|
89
94
|
}
|
|
90
95
|
|
|
96
|
+
function dateFormat(ts) {
|
|
97
|
+
return dayjs.unix(ts).format('YYYY-MM-DD HH:mm:ssZ');
|
|
98
|
+
}
|
|
99
|
+
|
|
91
100
|
return {
|
|
92
101
|
...toRefs(state),
|
|
93
|
-
selectId
|
|
102
|
+
selectId,
|
|
103
|
+
dateFormat,
|
|
94
104
|
};
|
|
95
105
|
}
|
|
96
106
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<defaultLayout>
|
|
3
3
|
<template #title>
|
|
4
4
|
Database
|
|
5
5
|
</template>
|
|
@@ -7,37 +7,91 @@
|
|
|
7
7
|
<div v-if="data" class="p-4">
|
|
8
8
|
<!-- DB info -->
|
|
9
9
|
|
|
10
|
-
<
|
|
11
|
-
<
|
|
10
|
+
<ul class="nav nav-pills" id="profilers-tab" role="tablist">
|
|
11
|
+
<li class="nav-item" role="presentation"
|
|
12
|
+
v-for="(instance, i) of instances">
|
|
13
|
+
<button class="nav-link active" id="home-tab" data-bs-toggle="tab"
|
|
14
|
+
:data-bs-target="`tab-${instance}`"
|
|
15
|
+
type="button"
|
|
16
|
+
role="tab"
|
|
17
|
+
aria-selected="true">
|
|
18
|
+
{{ instance }}
|
|
19
|
+
</button>
|
|
20
|
+
</li>
|
|
21
|
+
</ul>
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
<div class="tab-content mt-4" id="myTabContent">
|
|
24
|
+
<div class="tab-pane fade "
|
|
25
|
+
v-for="(instance, i) of instances"
|
|
26
|
+
:class="[ i === 0 ? 'show active' : '' ]"
|
|
27
|
+
:id="`tab-${instance}`"
|
|
28
|
+
role="tabpanel"
|
|
29
|
+
tabindex="0">
|
|
30
|
+
|
|
31
|
+
<div>
|
|
32
|
+
<h4>Queries</h4>
|
|
33
|
+
|
|
34
|
+
<div class="my-3">
|
|
35
|
+
Count: <span class="badge bg-info">{{ data?.queries[instance]?.length || 0 }}</span>
|
|
36
|
+
-
|
|
37
|
+
Time:
|
|
38
|
+
<span class="badge" :class="`bg-${stateColor(totalTime(instance), 15 * (data?.queries[instance]?.length || 0))}`">
|
|
39
|
+
{{ round(totalTime(instance)) }}ms
|
|
40
|
+
</span>
|
|
41
|
+
-
|
|
42
|
+
Memory:
|
|
43
|
+
<span class="badge" :class="`bg-${stateColor(totalMemory(instance), 0.05 * (data?.queries[instance]?.length || 0))}`">
|
|
44
|
+
{{ round(totalMemory(instance)) }}MB
|
|
45
|
+
</span>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="mt-5">
|
|
50
|
+
<div class="mb-4" v-for="(query, i) of data.queries[instance]">
|
|
51
|
+
<QueryInfo :item="query" :i="i + 1"
|
|
52
|
+
:total-count="data?.queries[instance]?.length || 0"
|
|
53
|
+
:total-time="totalTime(instance)"
|
|
54
|
+
:total-memory="totalMemory(instance)"
|
|
55
|
+
@open-backtrace="openBacktrace"
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
21
59
|
|
|
22
|
-
<div class="mt-5">
|
|
23
|
-
<div class="mb-4" v-for="(query, i) of data.queries">
|
|
24
|
-
<query-info :item="query" :i="i + 1" />
|
|
25
60
|
</div>
|
|
26
61
|
</div>
|
|
27
62
|
|
|
63
|
+
<BsModal :open="showBacktraceModal" @hidden="showBacktraceModal = false"
|
|
64
|
+
:title="`Query ${backtraceIndex}: Backtrace`" size="xl">
|
|
65
|
+
<table class="table table-striped table-bordered">
|
|
66
|
+
<tbody>
|
|
67
|
+
<tr v-for="traceItem of backtrace" style="font-family: monospace; font-size: 13px; word-break: break-all;">
|
|
68
|
+
<td>
|
|
69
|
+
{{ traceItem.function }}
|
|
70
|
+
</td>
|
|
71
|
+
<td>
|
|
72
|
+
<a :href="getEditorLink(traceItem)">
|
|
73
|
+
{{ replaceRoot(traceItem.pathname) }}
|
|
74
|
+
</a>
|
|
75
|
+
</td>
|
|
76
|
+
</tr>
|
|
77
|
+
</tbody>
|
|
78
|
+
</table>
|
|
79
|
+
</BsModal>
|
|
28
80
|
</div>
|
|
29
|
-
</
|
|
81
|
+
</defaultLayout>
|
|
30
82
|
</template>
|
|
31
83
|
|
|
32
84
|
<script>
|
|
33
85
|
import { computed, ref } from 'vue';
|
|
34
|
-
import
|
|
35
|
-
import
|
|
36
|
-
import
|
|
86
|
+
import BsModal from '@/components/BsModal.vue';
|
|
87
|
+
import QueryInfo from '@/components/db/QueryInfo.vue';
|
|
88
|
+
import DefaultLayout from '@/layouts/DefaultLayout.vue';
|
|
89
|
+
import $http from '@/services/http.js';
|
|
90
|
+
import { stateColor } from '../services/utilities.js';
|
|
37
91
|
|
|
38
92
|
export default {
|
|
39
93
|
name: 'Database',
|
|
40
|
-
components: {
|
|
94
|
+
components: { BsModal, QueryInfo, DefaultLayout },
|
|
41
95
|
async beforeRouteEnter(to, from ,next) {
|
|
42
96
|
next(async (vm) => {
|
|
43
97
|
const res = await $http.get('ajax/data?path=db');
|
|
@@ -51,23 +105,56 @@ export default {
|
|
|
51
105
|
setup() {
|
|
52
106
|
const data = ref(null);
|
|
53
107
|
|
|
54
|
-
|
|
55
|
-
return data.value?.queries?.reduce((sum, query) => {
|
|
108
|
+
function totalTime(instance) {
|
|
109
|
+
return data.value?.queries[instance]?.reduce((sum, query) => {
|
|
56
110
|
return sum + query.time;
|
|
57
111
|
}, 0) * 1000;
|
|
58
|
-
}
|
|
112
|
+
}
|
|
59
113
|
|
|
60
|
-
|
|
61
|
-
return data.value?.queries?.reduce((sum, query) => {
|
|
114
|
+
function totalMemory(instance) {
|
|
115
|
+
return data.value?.queries[instance]?.reduce((sum, query) => {
|
|
62
116
|
return sum + query.memory;
|
|
63
117
|
}, 0) / 1024 / 1024;
|
|
64
|
-
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const showBacktraceModal = ref(false);
|
|
121
|
+
const backtrace = ref([]);
|
|
122
|
+
const backtraceIndex = ref(0);
|
|
123
|
+
|
|
124
|
+
function openBacktrace(trace, i) {
|
|
125
|
+
backtrace.value = trace;
|
|
126
|
+
backtraceIndex.value = i;
|
|
127
|
+
showBacktraceModal.value = true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const editor = document.__data.editor;
|
|
131
|
+
const sysPath = document.__data.systemPath;
|
|
132
|
+
|
|
133
|
+
function getEditorLink(trace) {
|
|
134
|
+
return `${editor}://open?file=${trace.pathname}&line=${trace.line}`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function replaceRoot(path) {
|
|
138
|
+
return path.replace(sysPath, 'ROOT');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const instances = computed(() => data.value.connections.map((conn) => conn.name));
|
|
65
142
|
|
|
66
143
|
return {
|
|
67
144
|
data,
|
|
68
145
|
totalTime,
|
|
69
146
|
totalMemory,
|
|
70
|
-
|
|
147
|
+
showBacktraceModal,
|
|
148
|
+
backtrace,
|
|
149
|
+
backtraceIndex,
|
|
150
|
+
instances,
|
|
151
|
+
|
|
152
|
+
openBacktrace,
|
|
153
|
+
getEditorLink,
|
|
154
|
+
|
|
155
|
+
stateColor,
|
|
156
|
+
round,
|
|
157
|
+
replaceRoot,
|
|
71
158
|
}
|
|
72
159
|
}
|
|
73
160
|
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<DefaultLayout>
|
|
3
|
+
<template #title>
|
|
4
|
+
Events
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<div class="p-4" v-if="data">
|
|
8
|
+
|
|
9
|
+
<section class="l-section l-section--triggered">
|
|
10
|
+
<h3>Event Triggered</h3>
|
|
11
|
+
|
|
12
|
+
<EventListenersTable :events="data.invoked" />
|
|
13
|
+
</section>
|
|
14
|
+
|
|
15
|
+
<section class="l-section l-section--untriggered mt-5">
|
|
16
|
+
<h3>Event Not Triggered (But has Listeners)</h3>
|
|
17
|
+
|
|
18
|
+
<EventListenersTable :events="data.uninvoked" />
|
|
19
|
+
</section>
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
</DefaultLayout>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script>
|
|
26
|
+
import { computed, ref } from 'vue';
|
|
27
|
+
import EventListenersTable from '../components/events/EventListenersTable.vue';
|
|
28
|
+
import DefaultLayout from '../layouts/DefaultLayout.vue';
|
|
29
|
+
import $http from '../services/http.js';
|
|
30
|
+
export default {
|
|
31
|
+
name: 'Events',
|
|
32
|
+
components: { EventListenersTable, DefaultLayout },
|
|
33
|
+
async beforeRouteEnter(to, from ,next) {
|
|
34
|
+
next(async (vm) => {
|
|
35
|
+
const res = await $http.get('ajax/data?path=events');
|
|
36
|
+
vm.data = res.data.data;
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
async beforeRouteUpdate(to, from ,next) {
|
|
40
|
+
const res = await $http.get('ajax/data?path=events');
|
|
41
|
+
this.data = res.data.data;
|
|
42
|
+
},
|
|
43
|
+
setup() {
|
|
44
|
+
const data = ref(null);
|
|
45
|
+
|
|
46
|
+
// const events = computed(() => {
|
|
47
|
+
// const items = [];
|
|
48
|
+
//
|
|
49
|
+
// for (const eventName in data.value) {
|
|
50
|
+
// const listeners = data.value[eventName] || {};
|
|
51
|
+
//
|
|
52
|
+
// for (const listenerName in listeners) {
|
|
53
|
+
// const count = listeners[listenerName] || 0;
|
|
54
|
+
//
|
|
55
|
+
// items.push({
|
|
56
|
+
// event: eventName,
|
|
57
|
+
// listener: listenerName,
|
|
58
|
+
// count
|
|
59
|
+
// });
|
|
60
|
+
// }
|
|
61
|
+
// }
|
|
62
|
+
//
|
|
63
|
+
// return items;
|
|
64
|
+
// });
|
|
65
|
+
|
|
66
|
+
// const triggeredEvents = computed(() => {
|
|
67
|
+
// const items = {};
|
|
68
|
+
//
|
|
69
|
+
// for (const eventName in data.value) {
|
|
70
|
+
// const listeners = data.value[eventName] || {};
|
|
71
|
+
//
|
|
72
|
+
// for (const listenerName in listeners) {
|
|
73
|
+
// const count = listeners[listenerName] || 0;
|
|
74
|
+
//
|
|
75
|
+
// if (count > 0) {
|
|
76
|
+
// items[eventName] = items[eventName] || {};
|
|
77
|
+
// items[eventName][listenerName] = count;
|
|
78
|
+
// }
|
|
79
|
+
// }
|
|
80
|
+
// }
|
|
81
|
+
//
|
|
82
|
+
// return items;
|
|
83
|
+
// });
|
|
84
|
+
//
|
|
85
|
+
// const untriggeredEvents = computed(() => {
|
|
86
|
+
// const items = {};
|
|
87
|
+
//
|
|
88
|
+
// for (const eventName in data.value) {
|
|
89
|
+
// const listeners = data.value[eventName] || {};
|
|
90
|
+
//
|
|
91
|
+
// for (const listenerName in listeners) {
|
|
92
|
+
// const count = listeners[listenerName] || 0;
|
|
93
|
+
//
|
|
94
|
+
// if (count <= 0) {
|
|
95
|
+
// items[eventName] = items[eventName] || {};
|
|
96
|
+
// items[eventName][listenerName] = count;
|
|
97
|
+
// }
|
|
98
|
+
// }
|
|
99
|
+
// }
|
|
100
|
+
//
|
|
101
|
+
// return items;
|
|
102
|
+
// });
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
data,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
</script>
|
|
110
|
+
|
|
111
|
+
<style scoped>
|
|
112
|
+
|
|
113
|
+
</style>
|