Skip to content

Commit d70b54d

Browse files
easyCZroboquat
authored andcommitted
[usage] Save inserted and updated records in the DB
1 parent ca7602f commit d70b54d

File tree

4 files changed

+51
-12
lines changed

4 files changed

+51
-12
lines changed

components/usage/pkg/apiv1/usage.go

+18
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,24 @@ func (s *UsageService) ReconcileUsageWithLedger(ctx context.Context, req *v1.Rec
344344
inserts, updates := reconcileUsageWithLedger(instances, usageDrafts, s.pricer, now)
345345
logger.WithField("inserts", inserts).WithField("updates", updates).Infof("Identified %d inserts and %d updates against usage records.", len(inserts), len(updates))
346346

347+
if len(inserts) > 0 {
348+
err = db.InsertUsage(ctx, s.conn, inserts...)
349+
if err != nil {
350+
logger.WithError(err).Errorf("Failed to insert %d usage records into the database.", len(inserts))
351+
return nil, status.Errorf(codes.Internal, "Failed to insert usage records into the database.")
352+
}
353+
logger.Infof("Inserted %d new Usage records into the database.", len(inserts))
354+
}
355+
356+
if len(updates) > 0 {
357+
err = db.UpdateUsage(ctx, s.conn, updates...)
358+
if err != nil {
359+
logger.WithError(err).Error("Failed to update usage records in the database.")
360+
return nil, status.Errorf(codes.Internal, "Failed to update usage records in the database.")
361+
}
362+
logger.Infof("Updated %d Usage records in the database.", len(updates))
363+
}
364+
347365
return &v1.ReconcileUsageWithLedgerResponse{}, nil
348366
}
349367

components/usage/pkg/apiv1/usage_test.go

+21-5
Original file line numberDiff line numberDiff line change
@@ -561,19 +561,26 @@ func TestUsageService_ReconcileUsageWithLedger(t *testing.T) {
561561
dbconn := dbtest.ConnectForTests(t)
562562
from := time.Date(2022, 05, 1, 0, 00, 00, 00, time.UTC)
563563
to := time.Date(2022, 05, 1, 1, 00, 00, 00, time.UTC)
564+
attributionID := db.NewTeamAttributionID(uuid.New().String())
564565

565566
// stopped instances
566-
dbtest.CreateWorkspaceInstances(t, dbconn, dbtest.NewWorkspaceInstance(t, db.WorkspaceInstance{
567-
StoppingTime: db.NewVarcharTime(from.Add(1 * time.Minute)),
568-
}))
567+
instance := dbtest.NewWorkspaceInstance(t, db.WorkspaceInstance{
568+
UsageAttributionID: attributionID,
569+
CreationTime: db.NewVarcharTime(from),
570+
StoppingTime: db.NewVarcharTime(to.Add(-1 * time.Minute)),
571+
})
572+
dbtest.CreateWorkspaceInstances(t, dbconn, instance)
569573

570574
// running instances
571575
dbtest.CreateWorkspaceInstances(t, dbconn, dbtest.NewWorkspaceInstance(t, db.WorkspaceInstance{}))
572576

573577
// usage drafts
574578
dbtest.CreateUsageRecords(t, dbconn, dbtest.NewUsage(t, db.Usage{
575-
Kind: db.WorkspaceInstanceUsageKind,
576-
Draft: true,
579+
ID: uuid.New(),
580+
AttributionID: attributionID,
581+
WorkspaceInstanceID: instance.ID,
582+
Kind: db.WorkspaceInstanceUsageKind,
583+
Draft: true,
577584
}))
578585

579586
srv := baseserver.NewForTests(t,
@@ -593,6 +600,15 @@ func TestUsageService_ReconcileUsageWithLedger(t *testing.T) {
593600
To: timestamppb.New(to),
594601
})
595602
require.NoError(t, err)
603+
604+
usage, err := db.FindUsage(context.Background(), dbconn, &db.FindUsageParams{
605+
AttributionId: attributionID,
606+
From: from,
607+
To: to,
608+
ExcludeDrafts: false,
609+
})
610+
require.NoError(t, err)
611+
require.Len(t, usage, 1)
596612
}
597613

598614
func TestReconcileWithLedger(t *testing.T) {

components/usage/pkg/db/dbtest/usage.go

-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,5 @@ func CreateUsageRecords(t *testing.T, conn *gorm.DB, entries ...db.Usage) []db.U
7373
require.NoError(t, conn.Where(ids).Delete(&db.Usage{}).Error)
7474
})
7575

76-
t.Logf("stored %d", len(entries))
77-
7876
return records
7977
}

components/usage/pkg/db/usage.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,15 @@ func InsertUsage(ctx context.Context, conn *gorm.DB, records ...Usage) error {
7575
CreateInBatches(records, 1000).Error
7676
}
7777

78-
func UpdateUsage(ctx context.Context, conn *gorm.DB, record Usage) error {
79-
return conn.WithContext(ctx).Save(record).Error
78+
func UpdateUsage(ctx context.Context, conn *gorm.DB, records ...Usage) error {
79+
for _, record := range records {
80+
err := conn.WithContext(ctx).Save(record).Error
81+
if err != nil {
82+
return fmt.Errorf("failed to update usage record ID: %s: %w", record.ID, err)
83+
}
84+
}
85+
86+
return nil
8087
}
8188

8289
func FindAllDraftUsage(ctx context.Context, conn *gorm.DB) ([]Usage, error) {
@@ -110,7 +117,7 @@ func FindUsage(ctx context.Context, conn *gorm.DB, params *FindUsageParams) ([]U
110117

111118
db := conn.WithContext(ctx).
112119
Where("attributionId = ?", params.AttributionId).
113-
Where("? <= effectiveTime AND effectiveTime < ?", params.From, params.To)
120+
Where("effectiveTime >= ? AND effectiveTime < ?", TimeToISO8601(params.From), TimeToISO8601(params.To))
114121
if params.ExcludeDrafts {
115122
db = db.Where("draft = ?", false)
116123
}
@@ -143,7 +150,7 @@ func GetUsageSummary(ctx context.Context, conn *gorm.DB, attributionId Attributi
143150
query1 := db.Table((&Usage{}).TableName()).
144151
Select("sum(creditCents) as creditCentsBalanceAtStart").
145152
Where("attributionId = ?", attributionId).
146-
Where("effectiveTime < ?", from)
153+
Where("effectiveTime < ?", TimeToISO8601(from))
147154
if excludeDrafts {
148155
query1 = query1.Where("draft = ?", false)
149156
}
@@ -156,7 +163,7 @@ func GetUsageSummary(ctx context.Context, conn *gorm.DB, attributionId Attributi
156163
query2 := db.Table((&Usage{}).TableName()).
157164
Select("sum(creditCents) as creditCentsBalanceInPeriod", "count(id) as numRecordsInRange").
158165
Where("attributionId = ?", attributionId).
159-
Where("? <= effectiveTime AND effectiveTime < ?", from, to)
166+
Where("? <= effectiveTime AND effectiveTime < ?", TimeToISO8601(from), TimeToISO8601(to))
160167
if excludeDrafts {
161168
query2 = query2.Where("draft = ?", false)
162169
}

0 commit comments

Comments
 (0)