Skip to content

Commit d0b3df8

Browse files
committed
telmetry: show collected data under the disable option
Currently, The service ping can be disabled by going into the admin settings. Users are more likely to do that if they have no clue what is being sent. This PR tries to improve this experience, by showcasing the exact data that is being sent below the option. This is possible by creating a new TelemetryDataProvider and injecting that both in the `installation-admin-collector` controller and the `gitpod-service` (`getTelemetryData` func is added here that can be used). Signed-off-by: Tarun Pothulapati <[email protected]>
1 parent 5f6114c commit d0b3df8

File tree

7 files changed

+64
-18
lines changed

7 files changed

+64
-18
lines changed

components/dashboard/src/admin/Settings.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,45 @@
55
*/
66

77
import { useContext } from "react";
8-
import { InstallationAdminSettings } from "@gitpod/gitpod-protocol";
8+
import { Data, InstallationAdminSettings } from "@gitpod/gitpod-protocol";
99
import { AdminContext } from "../admin-context";
1010
import CheckBox from "../components/CheckBox";
1111
import { PageWithSubMenu } from "../components/PageWithSubMenu";
1212
import { getGitpodService } from "../service/service";
1313
import { adminMenu } from "./admin-menu";
14+
import { useEffect, useState } from "react";
15+
import InfoBox from "../components/InfoBox";
1416

1517
export default function Settings() {
1618
const { adminSettings, setAdminSettings } = useContext(AdminContext);
19+
const [telemetryData, setTelemetryData] = useState<Data>();
20+
1721

1822
const actuallySetTelemetryPrefs = async (value: InstallationAdminSettings) => {
1923
await getGitpodService().server.adminUpdateSettings(value);
2024
setAdminSettings(value);
2125
}
2226

27+
useEffect(() => {
28+
(async () => {
29+
const data = await getGitpodService().server.adminGetTelemetryData();
30+
setTelemetryData(data)
31+
})();
32+
});
33+
2334
return (
2435
<div>
2536
<PageWithSubMenu subMenu={adminMenu} title="Settings" subtitle="Configure settings for your Gitpod cluster.">
2637
<h3>Usage Statistics</h3>
2738
<CheckBox
2839
title="Enable Service Ping"
29-
desc={<span>This is used to provide insights on how you use your cluster so we can provide a better overall experience. <a className="gp-link" href="https://www.gitpod.io/privacy">Read our Privacy Policy</a></span>}
40+
desc={<span>This is used to provide insights on how you use your cluster so we can provide a better overall experience. <a className="gp-link" href="https://www.gitpod.io/privacy">Read our Privacy Policy</a>. The following data is sent:</span>}
3041
checked={adminSettings?.sendTelemetry ?? false}
3142
onChange={(evt) => actuallySetTelemetryPrefs({
3243
sendTelemetry: evt.target.checked,
3344
})} />
34-
</PageWithSubMenu>
45+
<InfoBox>{JSON.stringify(telemetryData, null, 2)}</InfoBox>
46+
</PageWithSubMenu >
3547
</div >
3648
)
3749
}

components/gitpod-protocol/src/gitpod-service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { GithubUpgradeURL, PlanCoupon } from './payment-protocol';
3030
import { TeamSubscription, TeamSubscriptionSlot, TeamSubscriptionSlotResolved } from './team-subscription-protocol';
3131
import { RemotePageMessage, RemoteTrackMessage, RemoteIdentifyMessage } from './analytics';
3232
import { IDEServer } from './ide-protocol';
33-
import { InstallationAdminSettings } from './installation-admin-protocol';
33+
import { InstallationAdminSettings, Data } from './installation-admin-protocol';
3434

3535
export interface GitpodClient {
3636
onInstanceUpdate(instance: WorkspaceInstance): void;
@@ -136,6 +136,7 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
136136
// Admin Settings
137137
adminGetSettings(): Promise<InstallationAdminSettings>;
138138
adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
139+
adminGetTelemetryData(): Promise<Data>;
139140

140141
// Projects
141142
getProviderRepositoriesForUser(params: GetProviderRepositoriesParams): Promise<ProviderRepository[]>;

components/server/src/auth/rate-limiter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ function getConfig(config: RateLimiterConfig): RateLimiterConfig {
148148
"adminSetLicense": { group: "default", points: 1 },
149149
"adminGetSettings": { group: "default", points: 1 },
150150
"adminUpdateSettings": { group: "default", points: 1 },
151+
"adminGetTelemetryData": {group: "default", points: 1},
151152

152153
"validateLicense": { group: "default", points: 1 },
153154
"getLicenseInfo": { group: "default", points: 1 },

components/server/src/container-module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ import { DebugApp } from './debug-app';
8181
import { LocalMessageBroker, LocalRabbitMQBackedMessageBroker } from './messaging/local-message-broker';
8282
import { contentServiceBinder } from '@gitpod/content-service/lib/sugar';
8383
import { ReferrerPrefixParser } from './workspace/referrer-prefix-context-parser';
84+
import { InstallationAdminTelemetryDataProvider } from './installation-admin/telemetry-data-provider';
8485

8586
export const productionContainerModule = new ContainerModule((bind, unbind, isBound, rebind) => {
8687
bind(Config).toConstantValue(ConfigFile.fromFile());
@@ -193,6 +194,8 @@ export const productionContainerModule = new ContainerModule((bind, unbind, isBo
193194

194195
bind(TermsProvider).toSelf().inSingletonScope();
195196

197+
bind(InstallationAdminTelemetryDataProvider).toSelf().inSingletonScope();
198+
196199
// binds all content services
197200
(contentServiceBinder((ctx) => {
198201
const config = ctx.container.get<Config>(Config);

components/server/src/installation-admin/installation-admin-controller.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,17 @@
66

77
import { injectable, inject } from 'inversify';
88
import * as express from 'express';
9-
import { InstallationAdminDB, UserDB, WorkspaceDB } from '@gitpod/gitpod-db/lib';
10-
import { Data } from '@gitpod/gitpod-protocol'
9+
import { InstallationAdminTelemetryDataProvider } from './telemetry-data-provider';
1110

1211
@injectable()
1312
export class InstallationAdminController {
14-
@inject(InstallationAdminDB) protected readonly installationAdminDb: InstallationAdminDB;
15-
@inject(UserDB) protected readonly userDb: UserDB
16-
@inject(WorkspaceDB) protected readonly workspaceDb: WorkspaceDB
13+
@inject(InstallationAdminTelemetryDataProvider) protected readonly telemetryDataProvider: InstallationAdminTelemetryDataProvider;
1714

1815
public create(): express.Application {
1916
const app = express();
2017

2118
app.get('/data', async (req: express.Request, res: express.Response) => {
22-
const data: Data = {
23-
installationAdmin: await this.installationAdminDb.getData(),
24-
totalUsers: await this.userDb.getUserCount(true),
25-
totalWorkspaces: await this.workspaceDb.getWorkspaceCount(),
26-
totalInstances: await this.workspaceDb.getInstanceCount(),
27-
} as Data;
28-
29-
res.status(200).json(data);
19+
res.status(200).json(await this.telemetryDataProvider.getTelemetryData());
3020
});
3121

3222
return app;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* Copyright (c) 2020 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 { injectable, inject } from 'inversify';
8+
9+
import { Data } from "@gitpod/gitpod-protocol"
10+
import { InstallationAdminDB, UserDB, WorkspaceDB } from '@gitpod/gitpod-db/lib';
11+
12+
@injectable()
13+
export class InstallationAdminTelemetryDataProvider {
14+
@inject(InstallationAdminDB) protected readonly installationAdminDb: InstallationAdminDB;
15+
@inject(UserDB) protected readonly userDb: UserDB
16+
@inject(WorkspaceDB) protected readonly workspaceDb: WorkspaceDB
17+
18+
async getTelemetryData(): Promise<Data> {
19+
const data: Data = {
20+
installationAdmin: await this.installationAdminDb.getData(),
21+
totalUsers: await this.userDb.getUserCount(false),
22+
totalWorkspaces: await this.workspaceDb.getWorkspaceCount(),
23+
totalInstances: await this.workspaceDb.getInstanceCount(),
24+
} as Data;
25+
26+
return data;
27+
}
28+
}

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ import { PartialProject } from '@gitpod/gitpod-protocol/src/teams-projects-proto
5757
import { ClientMetadata, traceClientMetadata } from '../websocket/websocket-connection-manager';
5858
import { ConfigurationService } from '../config/configuration-service';
5959
import { ProjectEnvVar } from '@gitpod/gitpod-protocol/src/protocol';
60-
import { InstallationAdminSettings } from '@gitpod/gitpod-protocol';
60+
import { InstallationAdminSettings, Data } from '@gitpod/gitpod-protocol';
6161
import { Deferred } from '@gitpod/gitpod-protocol/lib/util/deferred';
62+
import { InstallationAdminTelemetryDataProvider } from '../installation-admin/telemetry-data-provider';
6263

6364
// shortcut
6465
export const traceWI = (ctx: TraceContext, wi: Omit<LogContext, "userId">) => TraceContext.setOWI(ctx, wi); // userId is already taken care of in WebsocketConnectionManager
@@ -80,6 +81,8 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
8081
@inject(HostContextProvider) protected readonly hostContextProvider: HostContextProvider;
8182
@inject(GitpodFileParser) protected readonly gitpodParser: GitpodFileParser;
8283
@inject(InstallationAdminDB) protected readonly installationAdminDb: InstallationAdminDB;
84+
@inject(InstallationAdminTelemetryDataProvider) protected readonly telemetryDataProvider: InstallationAdminTelemetryDataProvider;
85+
8386

8487
@inject(WorkspaceStarter) protected readonly workspaceStarter: WorkspaceStarter;
8588
@inject(WorkspaceManagerClientProvider) protected readonly workspaceManagerClientProvider: WorkspaceManagerClientProvider;
@@ -2203,6 +2206,14 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
22032206
await this.installationAdminDb.setSettings(newSettings);
22042207
}
22052208

2209+
async adminGetTelemetryData(ctx: TraceContext): Promise<Data> {
2210+
traceAPIParams(ctx, {});
2211+
2212+
return await this.telemetryDataProvider.getTelemetryData();
2213+
}
2214+
2215+
2216+
22062217
async getLicenseInfo(): Promise<GetLicenseInfoResult> {
22072218
throw new ResponseError(ErrorCodes.EE_FEATURE, `Licensing is implemented in Gitpod's Enterprise Edition`);
22082219
}

0 commit comments

Comments
 (0)