Skip to content

Commit 6e9020e

Browse files
committed
[api] Expose session.Metrics.InitializerMetrics
Tool: gitpod/catfood.gitpod.cloud
1 parent 05519ed commit 6e9020e

File tree

8 files changed

+3923
-463
lines changed

8 files changed

+3923
-463
lines changed

components/gitpod-db/src/typeorm/workspace-db-impl.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ import { TypeORM } from "./typeorm";
6363
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
6464
import { DBProject } from "./entity/db-project";
6565
import { PrebuiltWorkspaceWithWorkspace } from "@gitpod/gitpod-protocol/src/protocol";
66-
import { DBWorkspaceInstanceMetrics } from "./entity/db-workspace-instance-metrics-db";
66+
import { DBWorkspaceInstanceMetrics } from "./entity/db-workspace-instance-metrics";
6767

6868
type RawTo<T> = (instance: WorkspaceInstance, ws: Workspace) => T;
6969
interface OrderBy {
@@ -471,6 +471,7 @@ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl<WorkspaceDB> imp
471471
const sessions = await workspaceInstanceRepo
472472
.createQueryBuilder("wsi")
473473
.leftJoinAndMapOne("wsi.workspace", DBWorkspace, "ws", "ws.id = wsi.workspaceId")
474+
.leftJoinAndMapOne("wsi.metrics", DBWorkspaceInstanceMetrics, "wsim", "wsim.instanceId = wsi.id")
474475
.where("ws.organizationId = :organizationId", { organizationId })
475476
.andWhere("wsi.creationTime >= :periodStart", { periodStart: periodStart.toISOString() })
476477
.andWhere("wsi.creationTime <= :periodEnd", { periodEnd: periodEnd.toISOString() })
@@ -479,13 +480,19 @@ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl<WorkspaceDB> imp
479480
.take(limit)
480481
.getMany();
481482

482-
const resultSessions: { instance: WorkspaceInstance; workspace: Workspace }[] = [];
483+
const resultSessions: {
484+
instance: WorkspaceInstance;
485+
workspace: Workspace;
486+
metrics?: WorkspaceInstanceMetrics;
487+
}[] = [];
483488
for (const session of sessions) {
484489
resultSessions.push({
485490
workspace: (session as any).workspace,
486491
instance: session,
492+
metrics: (session as any).metrics,
487493
});
488494
delete (session as any).workspace;
495+
delete (session as any).metrics;
489496
}
490497
return resultSessions;
491498
}

components/gitpod-protocol/src/protocol.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { WorkspaceInstance, PortVisibility, PortProtocol } from "./workspace-instance";
7+
import { WorkspaceInstance, PortVisibility, PortProtocol, WorkspaceInstanceMetrics } from "./workspace-instance";
88
import { RoleOrPermission } from "./permission";
99
import { Project } from "./teams-projects-protocol";
1010
import { createHash } from "crypto";
@@ -1390,6 +1390,7 @@ export namespace WorkspaceInstancePortsChangedEvent {
13901390
export interface WorkspaceSession {
13911391
workspace: Workspace;
13921392
instance: WorkspaceInstance;
1393+
metrics?: WorkspaceInstanceMetrics;
13931394
}
13941395
export interface WorkspaceInfo {
13951396
workspace: Workspace;

components/gitpod-protocol/src/workspace-instance.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -332,23 +332,26 @@ export interface ImageBuildLogInfo {
332332
* Holds metrics about the workspace instance
333333
*/
334334
export interface WorkspaceInstanceMetrics {
335-
image?: Partial<{
336-
/**
337-
* the total size of the image in bytes (includes Gitpod-specific layers like IDE)
338-
*/
339-
totalSize: number;
340-
/**
341-
* the size of the workspace image in bytes
342-
*/
343-
workspaceImageSize: number;
344-
}>;
335+
image?: ImageMetrics;
345336

346337
/**
347338
* Metrics about the workspace initializer
348339
*/
349340
initializerMetrics?: InitializerMetrics;
350341
}
351342

343+
export interface ImageMetrics {
344+
/**
345+
* the total size of the image in bytes (includes Gitpod-specific layers like IDE)
346+
*/
347+
totalSize?: number;
348+
349+
/**
350+
* the size of the workspace image in bytes
351+
*/
352+
workspaceImageSize?: number;
353+
}
354+
352355
export interface InitializerMetrics {
353356
git?: InitializerMetric;
354357
fileDownload?: InitializerMetric;

components/public-api/gitpod/v1/workspace.proto

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,39 @@ message WorkspaceSession {
939939

940940
// total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
941941
int64 total_image_size = 2;
942+
943+
// initializer_metrics are all metrics exported from the content initializer on workspace start
944+
InitializerMetrics initializer_metrics = 3;
945+
}
946+
947+
// Add these new message definitions
948+
message InitializerMetric {
949+
// Duration in nanoseconds (standard protobuf duration)
950+
google.protobuf.Duration duration = 1;
951+
952+
// Size in bytes
953+
uint64 size = 2;
954+
}
955+
956+
message InitializerMetrics {
957+
// Git contains metrics for the git initializer step
958+
InitializerMetric git = 1;
959+
960+
// FileDownload contains metrics for the file download initializer step
961+
InitializerMetric file_download = 2;
962+
963+
// Snapshot contains metrics for the snapshot initializer step
964+
// This used for workspaces started from snapshots.
965+
InitializerMetric snapshot = 3;
966+
967+
// Backup contains metrics for the backup initializer step
968+
InitializerMetric backup = 4;
969+
970+
// Prebuild contains metrics for the prebuild initializer step
971+
InitializerMetric prebuild = 5;
972+
973+
// Composite contains metrics for the composite initializer step
974+
InitializerMetric composite = 6;
942975
}
943976

944977
string id = 1;

0 commit comments

Comments
 (0)