Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/supervisor/frontend/src/ide/ide-metrics-service-client.ts
2501 views
1
/**
2
* Copyright (c) 2022 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 { serverUrl, workspaceUrl } from "../shared/urls";
8
const commit = require("../../config.json").commit;
9
import { v4 } from "uuid";
10
11
import { MetricsReporter } from "@gitpod/gitpod-protocol/lib/metrics";
12
13
export const metricsReporter = new MetricsReporter({
14
gitpodUrl: serverUrl.toString(),
15
clientName: "supervisor-frontend",
16
clientVersion: commit,
17
log: console,
18
commonErrorDetails: {
19
sessionId: v4(),
20
},
21
});
22
metricsReporter.startReporting();
23
24
import { FrontendDashboardServiceClient } from "../shared/frontend-dashboard-service";
25
26
// TODO(ak) migrate to MetricsReporter
27
const MetricsUrl = serverUrl.asIDEMetrics().toString();
28
29
export enum MetricsName {
30
SupervisorFrontendClientTotal = "gitpod_supervisor_frontend_client_total",
31
SupervisorFrontendErrorTotal = "gitpod_supervisor_frontend_error_total",
32
SupervisorFrontendLoadTotal = "gitpod_vscode_web_load_total",
33
}
34
35
interface AddCounterParam {
36
value?: number;
37
labels?: Record<string, string>;
38
}
39
40
interface ReportErrorParam {
41
workspaceId: string;
42
instanceId: string;
43
errorStack: string;
44
userId: string;
45
component: string;
46
version: string;
47
properties?: Record<string, string>;
48
}
49
export class IDEMetricsServiceClient {
50
static workspaceId? = workspaceUrl.workspaceId;
51
static debugWorkspace = workspaceUrl.debugWorkspace;
52
static serviceClient: FrontendDashboardServiceClient;
53
54
static get instanceId(): string {
55
return this.serviceClient.latestInfo?.instanceId ?? "";
56
}
57
static get userId(): string {
58
return this.serviceClient.latestInfo?.loggedUserId ?? "";
59
}
60
61
static async addCounter(
62
metricsName: MetricsName,
63
labels?: Record<string, string>,
64
value?: number,
65
): Promise<boolean> {
66
const url = `${MetricsUrl}/metrics/counter/add/${metricsName}`;
67
const params: AddCounterParam = { value, labels };
68
try {
69
const response = await fetch(url, {
70
method: "POST",
71
body: JSON.stringify(params),
72
credentials: "omit",
73
priority: "low",
74
});
75
if (!response.ok) {
76
const data = await response.json(); // { code: number; message: string; }
77
console.error(`Cannot report metrics with addCounter: ${response.status} ${response.statusText}`, data);
78
return false;
79
}
80
return true;
81
} catch (err) {
82
console.error("Cannot report metrics with addCounter, error:", err);
83
return false;
84
}
85
}
86
87
static async reportError(error: Error, properties?: Record<string, string>): Promise<boolean> {
88
const p = Object.assign({}, properties);
89
p.error_name = error.name;
90
p.error_message = error.message;
91
p.debug_workspace = String(this.debugWorkspace);
92
93
const url = `${MetricsUrl}/reportError`;
94
const params: ReportErrorParam = {
95
errorStack: error.stack ?? String(error),
96
component: "supervisor-frontend",
97
version: commit,
98
workspaceId: this.workspaceId ?? "",
99
instanceId: this.instanceId,
100
userId: this.userId,
101
properties: p,
102
};
103
try {
104
const response = await fetch(url, {
105
method: "POST",
106
body: JSON.stringify(params),
107
credentials: "omit",
108
});
109
if (!response.ok) {
110
const data = await response.json();
111
console.error(`Cannot report error: ${response.status} ${response.statusText}`, data);
112
return false;
113
}
114
return true;
115
} catch (err) {
116
console.error("Cannot report errorr, error:", err);
117
return false;
118
}
119
}
120
121
static loadWorkspaceInfo(serviceClient: FrontendDashboardServiceClient) {
122
this.serviceClient = serviceClient;
123
}
124
}
125
126