From 3a4abdfd2aa63f0e9bc0872f7b675dfc78b4728a Mon Sep 17 00:00:00 2001 From: "Laurie T. Malau" Date: Thu, 2 Jun 2022 12:28:39 +0000 Subject: [PATCH] add metrics --- .../server/ee/src/workspace/workspace-factory.ts | 6 +++++- components/server/src/prometheus-metrics.ts | 10 ++++++++++ .../ws-manager-bridge/ee/src/prebuild-updater-db.ts | 5 +++++ .../src/prometheus-metrics-exporter.ts | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/components/server/ee/src/workspace/workspace-factory.ts b/components/server/ee/src/workspace/workspace-factory.ts index fb5acc2af0bc80..2afed6393258b2 100644 --- a/components/server/ee/src/workspace/workspace-factory.ts +++ b/components/server/ee/src/workspace/workspace-factory.ts @@ -30,7 +30,7 @@ import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { HostContextProvider } from "../../../src/auth/host-context-provider"; import { UserDB } from "@gitpod/gitpod-db/lib"; import { UserCounter } from "../user/user-counter"; - +import { increasePrebuildsStartedCounter } from "../../../src/prometheus-metrics"; @injectable() export class WorkspaceFactoryEE extends WorkspaceFactory { @inject(LicenseEvaluator) protected readonly licenseEvaluator: LicenseEvaluator; @@ -177,6 +177,10 @@ export class WorkspaceFactoryEE extends WorkspaceFactory { statusVersion: 0, }); + if (pws) { + increasePrebuildsStartedCounter(); + } + log.debug( { userId: user.id, workspaceId: ws.id }, `Registered workspace prebuild: ${pws.id} for ${commitContext.repository.cloneUrl}:${commitContext.revision}`, diff --git a/components/server/src/prometheus-metrics.ts b/components/server/src/prometheus-metrics.ts index b9bf4b379519d6..56141a9a550ecb 100644 --- a/components/server/src/prometheus-metrics.ts +++ b/components/server/src/prometheus-metrics.ts @@ -151,3 +151,13 @@ const instanceStartsFailedTotal = new prometheusClient.Counter({ export function increaseFailedInstanceStartCounter(reason: "clusterSelectionFailed" | "startOnClusterFailed") { instanceStartsFailedTotal.inc({ reason }); } + +const prebuildsStartedTotal = new prometheusClient.Counter({ + name: "gitpod_prebuilds_started_total", + help: "Counter of total prebuilds started.", + registers: [prometheusClient.register], +}); + +export function increasePrebuildsStartedCounter() { + prebuildsStartedTotal.inc(); +} diff --git a/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts b/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts index 3c70673df83134..5589dd92546f26 100644 --- a/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts +++ b/components/ws-manager-bridge/ee/src/prebuild-updater-db.ts @@ -70,6 +70,7 @@ export class PrebuildUpdaterDB implements PrebuildUpdater { prebuild.statusVersion = status.statusVersion; const update = this.prebuildStateMapper.mapWorkspaceStatusToPrebuild(status); + const terminatingStates = ["available", "timeout", "aborted", "failed"]; if (update) { const updatedPrebuild = { ...prebuild, @@ -79,6 +80,10 @@ export class PrebuildUpdaterDB implements PrebuildUpdater { span.setTag("updatePrebuildWorkspace.prebuild.state", updatedPrebuild.state); span.setTag("updatePrebuildWorkspace.prebuild.error", updatedPrebuild.error); + if (writeToDB && updatedPrebuild.state && terminatingStates.includes(updatedPrebuild.state)) { + this.prometheusExporter.increasePrebuildsCompletedCounter(updatedPrebuild.state); + } + if (writeToDB) { await this.workspaceDB.trace({ span }).storePrebuiltWorkspace(updatedPrebuild); } diff --git a/components/ws-manager-bridge/src/prometheus-metrics-exporter.ts b/components/ws-manager-bridge/src/prometheus-metrics-exporter.ts index d9ae85edaf42c6..9f1a9d71c439da 100644 --- a/components/ws-manager-bridge/src/prometheus-metrics-exporter.ts +++ b/components/ws-manager-bridge/src/prometheus-metrics-exporter.ts @@ -18,6 +18,7 @@ export class PrometheusMetricsExporter { protected readonly clusterCordoned: prom.Gauge; protected readonly statusUpdatesTotal: prom.Counter; protected readonly stalePrebuildEventsTotal: prom.Counter; + protected readonly prebuildsCompletedTotal: prom.Counter; protected readonly workspaceInstanceUpdateStartedTotal: prom.Counter; protected readonly workspaceInstanceUpdateCompletedSeconds: prom.Histogram; @@ -73,6 +74,12 @@ export class PrometheusMetricsExporter { labelNames: ["db_write", "workspace_cluster", "workspace_instance_type", "outcome"], buckets: prom.exponentialBuckets(2, 2, 8), }); + + this.prebuildsCompletedTotal = new prom.Counter({ + name: "gitpod_prebuilds_completed_total", + help: "Counter of total prebuilds ended.", + labelNames: ["state"], + }); } observeWorkspaceStartupTime(instance: WorkspaceInstance): void { @@ -142,4 +149,8 @@ export class PrometheusMetricsExporter { .labels(String(dbWrite), workspaceCluster, WorkspaceType[type], outcome) .observe(durationSeconds); } + + increasePrebuildsCompletedCounter(state: string) { + this.prebuildsCompletedTotal.inc({ state }); + } }