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