Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/service/metrics.ts
2500 views
1
/**
2
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { MetricsReporter } from "@gitpod/gitpod-protocol/lib/metrics";
8
import { getExperimentsClient } from "../experiments/client";
9
import { v4 } from "uuid";
10
const commit = require("./config.json").commit;
11
12
const originalConsoleError = console.error;
13
14
const metricsReporter = new MetricsReporter({
15
gitpodUrl: window.location.href,
16
clientName: "dashboard",
17
clientVersion: commit,
18
log: {
19
error: originalConsoleError.bind(console),
20
debug: console.debug.bind(console),
21
},
22
isEnabled: () => getExperimentsClient().getValueAsync("dashboard_metrics_enabled", false, {}),
23
commonErrorDetails: {
24
sessionId: v4(),
25
},
26
});
27
metricsReporter.startReporting();
28
29
window.addEventListener("unhandledrejection", (event) => {
30
reportError("Unhandled promise rejection", event.reason);
31
});
32
window.addEventListener("error", (event) => {
33
let message = "Unhandled error";
34
if (event.message) {
35
message += ": " + event.message;
36
}
37
reportError(message, event.error);
38
});
39
40
console.error = function (...args) {
41
originalConsoleError.apply(console, args);
42
reportError(...args);
43
};
44
45
export function updateCommonErrorDetails(update: { [key: string]: string | undefined }) {
46
metricsReporter.updateCommonErrorDetails(update);
47
}
48
49
export function instrumentWebSocket(ws: WebSocket, origin: string) {
50
metricsReporter.instrumentWebSocket(ws, origin);
51
}
52
53
export function reportError(...args: any[]) {
54
let err = undefined;
55
let details = undefined;
56
let requestContext = undefined;
57
if (args[0] instanceof Error) {
58
err = args[0];
59
details = args[1];
60
requestContext = (args[0] as any)["requestContext"];
61
} else if (typeof args[0] === "string") {
62
err = new Error(args[0]);
63
if (args[1] instanceof Error) {
64
err.message += ": " + args[1].message;
65
err.name = args[1].name;
66
err.stack = args[1].stack;
67
details = args[2];
68
requestContext = (args[1] as any)["requestContext"];
69
} else if (typeof args[1] === "string") {
70
err.message += ": " + args[1];
71
details = args[2];
72
} else {
73
details = args[1];
74
}
75
}
76
77
if (!err) {
78
return;
79
}
80
81
let data = {};
82
if (details && typeof details === "object") {
83
data = Object.assign(
84
data,
85
Object.fromEntries(
86
Object.entries(details)
87
.filter(([key, value]) => {
88
return (
89
typeof value === "string" ||
90
typeof value === "number" ||
91
typeof value === "boolean" ||
92
value === null ||
93
typeof value === "undefined"
94
);
95
})
96
.map(([key, value]) => [key, String(value)]),
97
),
98
);
99
}
100
if (requestContext && typeof requestContext === "object") {
101
data = Object.assign(data, requestContext);
102
}
103
104
metricsReporter.reportError(err, data);
105
}
106
107