diff --git a/components/gitpod-db/src/typeorm/entity/db-workspace-instance-usage.ts b/components/gitpod-db/src/typeorm/entity/db-workspace-instance-usage.ts index 70d65b19ae3006..83d35b945a7c99 100644 --- a/components/gitpod-db/src/typeorm/entity/db-workspace-instance-usage.ts +++ b/components/gitpod-db/src/typeorm/entity/db-workspace-instance-usage.ts @@ -34,7 +34,7 @@ export class DBWorkspaceInstanceUsage { @Index("ind_stoppedAt") stoppedAt: string; - @Column("double") + @Column("bigint") creditsUsed: number; @Column() diff --git a/components/gitpod-db/src/typeorm/migration/1658123555591-ChangeUsageCreditsColumnType.ts b/components/gitpod-db/src/typeorm/migration/1658123555591-ChangeUsageCreditsColumnType.ts new file mode 100644 index 00000000000000..2e0509a04e4116 --- /dev/null +++ b/components/gitpod-db/src/typeorm/migration/1658123555591-ChangeUsageCreditsColumnType.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2022 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License-AGPL.txt in the project root for license information. + */ + +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class New1658123371893 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`ind_stoppedAt\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP INDEX \`ind_startedAt\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP INDEX \`ind_attributionId\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP TABLE \`d_b_workspace_instance_usage\``); + + await queryRunner.query( + `CREATE TABLE \`d_b_workspace_instance_usage\` (\`instanceId\` char(36) NOT NULL, \`attributionId\` varchar(255) NOT NULL, \`startedAt\` timestamp(6) NOT NULL, \`stoppedAt\` timestamp(6) NULL, \`creditsUsed\` bigint NOT NULL, \`generationId\` int NOT NULL, \`deleted\` tinyint NOT NULL, INDEX \`ind_attributionId\` (\`attributionId\`), INDEX \`ind_startedAt\` (\`startedAt\`), INDEX \`ind_stoppedAt\` (\`stoppedAt\`), PRIMARY KEY (\`instanceId\`)) ENGINE=InnoDB`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`ind_stoppedAt\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP INDEX \`ind_startedAt\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP INDEX \`ind_attributionId\` ON \`d_b_workspace_instance_usage\``); + await queryRunner.query(`DROP TABLE \`d_b_workspace_instance_usage\``); + } +} diff --git a/components/usage/pkg/controller/reconciler.go b/components/usage/pkg/controller/reconciler.go index a651a4098ff681..765e90b41d6386 100644 --- a/components/usage/pkg/controller/reconciler.go +++ b/components/usage/pkg/controller/reconciler.go @@ -248,7 +248,7 @@ func usageReportToUsageRecords(report UsageReport, pricer *WorkspacePricer, now AttributionID: attributionId, StartedAt: instance.CreationTime.Time(), StoppedAt: stoppedAt, - CreditsUsed: float64(pricer.CreditsUsedByInstance(&instance, now)), + CreditsUsed: pricer.CreditsUsedByInstance(&instance, now), GenerationId: 0, Deleted: false, }) diff --git a/components/usage/pkg/db/workspace_instance_usage.go b/components/usage/pkg/db/workspace_instance_usage.go index 36a51a6b2ed647..519c4098bc0135 100644 --- a/components/usage/pkg/db/workspace_instance_usage.go +++ b/components/usage/pkg/db/workspace_instance_usage.go @@ -19,7 +19,7 @@ type WorkspaceInstanceUsage struct { AttributionID AttributionID `gorm:"column:attributionId;type:varchar;size:255;" json:"attributionId"` StartedAt time.Time `gorm:"column:startedAt;type:timestamp;default:CURRENT_TIMESTAMP(6);" json:"startedAt"` StoppedAt sql.NullTime `gorm:"column:stoppedAt;type:timestamp;" json:"stoppedAt"` - CreditsUsed float64 `gorm:"column:creditsUsed;type:double;" json:"creditsUsed"` + CreditsUsed int64 `gorm:"column:creditsUsed;type:bigint;" json:"creditsUsed"` GenerationId int `gorm:"column:generationId;type:int;" json:"generationId"` Deleted bool `gorm:"column:deleted;type:tinyint;default:0;" json:"deleted"` }