Skip to content

Commit 33b8fbc

Browse files
committed
feat(ui): add some error tracking
1 parent b963a82 commit 33b8fbc

File tree

11 files changed

+101
-8
lines changed

11 files changed

+101
-8
lines changed

Diff for: core/src/main/java/io/kestra/core/services/CollectorService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public void report() {
116116
);
117117
this.handleResponse(result);
118118
} catch (HttpClientResponseException t) {
119-
log.warn("Unable to report anonymous usage with body '{}'", t.getResponse().getBody(String.class), t);
119+
log.debug("Unable to report anonymous usage with body '{}'", t.getResponse().getBody(String.class), t);
120120
} catch (Exception t) {
121121
log.error("Unable to handle anonymous usage", t);
122122
}

Diff for: ui/src/App.vue

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import Errors from "./components/errors/Errors.vue";
2020
import {mapState} from "vuex";
2121
import Utils from "./utils/utils";
22+
import {pageFromRoute} from "./utils/eventsRouter";
2223
2324
export default {
2425
name: "App",
@@ -66,6 +67,11 @@
6667
this.$store.dispatch("plugin/icons")
6768
this.$store.dispatch("misc/loadConfigs")
6869
.then(value => {
70+
this.$store.dispatch("api/events", {
71+
type: "PAGE",
72+
page: pageFromRoute(this.$router.currentRoute.value)
73+
});
74+
6975
this.$store.dispatch("api/loadFeeds", {
7076
version: value.version,
7177
iid: value.uuid,

Diff for: ui/src/components/ErrorToast.vue

+24
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<script>
22
import {ElNotification, ElTable, ElTableColumn} from "element-plus";
3+
import {pageFromRoute} from "../utils/eventsRouter";
34
import {h} from "vue"
45
56
export default {
@@ -43,6 +44,29 @@
4344
this.$nextTick(() => {
4445
this.close();
4546
47+
const error = {
48+
type: "ERROR",
49+
error: {
50+
message: this.text,
51+
errors: this.items,
52+
},
53+
page: pageFromRoute(this.$route)
54+
};
55+
56+
if (this.message.response) {
57+
error.error.response = {};
58+
error.error.request = {};
59+
60+
if (this.message.response.status) {
61+
error.error.response.status = this.message.response.status;
62+
}
63+
64+
error.error.request.url = this.message.response.config.url;
65+
error.error.request.method = this.message.response.config.method;
66+
}
67+
68+
this.$store.dispatch("api/events", error);
69+
4670
const children = [
4771
h("span", {innerHTML: this.text})
4872
];

Diff for: ui/src/components/Tabs.vue

-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
:label="tab.title"
88
:name="tab.name || 'default'"
99
:disabled="tab.disabled"
10-
@tab-change="tabChanged"
1110
>
1211
<template #label>
1312
<router-link :to="to(tab)">
@@ -75,9 +74,6 @@
7574
return {name: this.routeName, params: {...this.$route.params, ...{tab: tab.name}}};
7675
}
7776
},
78-
tabChanged() {
79-
console.log(arguments);
80-
}
8177
},
8278
computed: {
8379
activeTab() {

Diff for: ui/src/components/inputs/Editor.vue

-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@
246246
247247
if (!this.fullHeight) {
248248
editor.onDidContentSizeChange(e => {
249-
console.log()
250249
this.$refs.container.style.height = (e.contentHeight + 7) + "px";
251250
});
252251
}

Diff for: ui/src/stores/api.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import axios from "axios";
2+
3+
let counter = 0;
4+
const API_URL = "https://api.kestra.io";
15

26
export default {
37
namespaced: true,
@@ -7,7 +11,7 @@ export default {
711

812
actions: {
913
loadFeeds({commit}, options) {
10-
return this.$http.get("https://api.kestra.io/v1/feeds/latest", {
14+
return axios.get(API_URL + "/v1/feeds/latest", {
1115
params: {
1216
iid: options.iid,
1317
uid: options.uid,
@@ -18,6 +22,24 @@ export default {
1822

1923
return response.data;
2024
})
25+
},
26+
events({rootGetters}, data) {
27+
let configs = rootGetters["misc/configs"];
28+
let uid = localStorage.getItem("uid");
29+
30+
if (configs === undefined || uid === null || configs["isAnonymousUsageEnabled"] === false) {
31+
return;
32+
}
33+
34+
return axios.post(API_URL + "/v1/reports/events", {
35+
...data,
36+
...{
37+
iid: configs.uuid,
38+
uid: uid,
39+
date: new Date().toISOString(),
40+
counter: counter++,
41+
}
42+
});
2143
}
2244
},
2345
mutations: {

Diff for: ui/src/stores/miscs.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,9 @@ export default {
1818
state.configs = configs
1919
}
2020
},
21-
getters: {}
21+
getters: {
22+
configs(state) {
23+
return state.configs;
24+
}
25+
}
2226
}

Diff for: ui/src/utils/axios.js

+2
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export default (callback, store, router) => {
7979
}, errorResponse => {
8080
if (errorResponse.code && errorResponse.code === "ECONNABORTED") {
8181
store.dispatch("core/showMessage", {
82+
response: errorResponse,
8283
content: errorResponse,
8384
variant: "error"
8485
})
@@ -114,6 +115,7 @@ export default (callback, store, router) => {
114115

115116
if (errorResponse.response.data) {
116117
store.dispatch("core/showMessage", {
118+
response: errorResponse.response,
117119
content: errorResponse.response.data,
118120
variant: "error"
119121
})

Diff for: ui/src/utils/eventsRouter.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {nextTick} from "vue";
2+
3+
export const pageFromRoute = (route) => {
4+
return {
5+
origin: window.location.origin,
6+
path: route.path,
7+
params: Object.keys(route.params)
8+
.map((key) => ({key: key, value: route.params[key]})),
9+
queries: Object.keys(route.query)
10+
.map((key) => {
11+
return {key: key, values: (route.query[key] instanceof Array ? route.query[key] : [route.query[key]] )}
12+
}),
13+
name: route.name,
14+
hash: route.hash !== "" ? route.hash: undefined,
15+
}
16+
}
17+
18+
export default (app, store, router) => {
19+
router.afterEach((to) => {
20+
nextTick().then(() => {
21+
store.dispatch("api/events", {
22+
type: "PAGE",
23+
page: pageFromRoute(to)
24+
});
25+
});
26+
});
27+
}

Diff for: ui/src/utils/init.js

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Toast from "./toast";
1313
import filters from "./filters";
1414
import ElementPlus from "element-plus";
1515
import createUnsavedChanged from "./unsavedChange";
16+
import createEventsRouter from "./eventsRouter";
1617
import "./global"
1718

1819
export default (app, routes, stores, translations) => {
@@ -83,6 +84,7 @@ export default (app, routes, stores, translations) => {
8384

8485
// navigation guard
8586
createUnsavedChanged(app, store, router);
87+
createEventsRouter(app, store, router);
8688

8789
return {store, router};
8890
}

Diff for: webserver/src/main/java/io/kestra/webserver/controllers/MiscController.java

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.kestra.webserver.controllers;
22

3+
import com.fasterxml.jackson.annotation.JsonInclude;
34
import io.kestra.core.repositories.ExecutionRepositoryInterface;
45
import io.kestra.core.services.InstanceService;
56
import io.kestra.core.utils.VersionProvider;
@@ -27,6 +28,9 @@ public class MiscController {
2728
@Inject
2829
InstanceService instanceService;
2930

31+
@io.micronaut.context.annotation.Value("${kestra.anonymous-usage-report.enabled}")
32+
protected Boolean isAnonymousUsageEnabled;
33+
3034
@Get("/ping")
3135
@Hidden
3236
public HttpResponse<?> ping() {
@@ -42,14 +46,21 @@ public Configuration configuration() {
4246
.uuid(instanceService.fetch())
4347
.version(versionProvider.getVersion())
4448
.isTaskRunEnabled(executionRepository.isTaskRunEnabled())
49+
.isAnonymousUsageEnabled(this.isAnonymousUsageEnabled)
4550
.build();
4651
}
4752

4853
@Value
4954
@Builder
5055
public static class Configuration {
5156
String uuid;
57+
5258
String version;
59+
60+
@JsonInclude
5361
Boolean isTaskRunEnabled;
62+
63+
@JsonInclude
64+
Boolean isAnonymousUsageEnabled;
5465
}
5566
}

0 commit comments

Comments
 (0)