mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add prebuilt workspaces telemetry (#18084)
Adds telemetry for a _global_ account of prebuilt workspaces created, failed to build, and claimed. Partitioning this data by template/preset tuple is not currently in scope. --------- Signed-off-by: Danny Kopping <dannykopping@gmail.com>
This commit is contained in:
@@ -370,6 +370,113 @@ func TestTelemetryItem(t *testing.T) {
|
||||
require.Equal(t, item.Value, "new_value")
|
||||
}
|
||||
|
||||
func TestPrebuiltWorkspacesTelemetry(t *testing.T) {
|
||||
t.Parallel()
|
||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||
db, _ := dbtestutil.NewDB(t)
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
experimentEnabled bool
|
||||
storeFn func(store database.Store) database.Store
|
||||
expectedSnapshotEntries int
|
||||
expectedCreated int
|
||||
expectedFailed int
|
||||
expectedClaimed int
|
||||
}{
|
||||
{
|
||||
name: "experiment enabled",
|
||||
experimentEnabled: true,
|
||||
storeFn: func(store database.Store) database.Store {
|
||||
return &mockDB{Store: store}
|
||||
},
|
||||
expectedSnapshotEntries: 3,
|
||||
expectedCreated: 5,
|
||||
expectedFailed: 2,
|
||||
expectedClaimed: 3,
|
||||
},
|
||||
{
|
||||
name: "experiment enabled, prebuilds not used",
|
||||
experimentEnabled: true,
|
||||
storeFn: func(store database.Store) database.Store {
|
||||
return &emptyMockDB{Store: store}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "experiment disabled",
|
||||
experimentEnabled: false,
|
||||
storeFn: func(store database.Store) database.Store {
|
||||
return &mockDB{Store: store}
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
deployment, snapshot := collectSnapshot(ctx, t, db, func(opts telemetry.Options) telemetry.Options {
|
||||
opts.Database = tc.storeFn(db)
|
||||
if tc.experimentEnabled {
|
||||
opts.Experiments = codersdk.Experiments{
|
||||
codersdk.ExperimentWorkspacePrebuilds,
|
||||
}
|
||||
}
|
||||
return opts
|
||||
})
|
||||
|
||||
require.NotNil(t, deployment)
|
||||
require.NotNil(t, snapshot)
|
||||
|
||||
require.Len(t, snapshot.PrebuiltWorkspaces, tc.expectedSnapshotEntries)
|
||||
|
||||
eventCounts := make(map[telemetry.PrebuiltWorkspaceEventType]int)
|
||||
for _, event := range snapshot.PrebuiltWorkspaces {
|
||||
eventCounts[event.EventType] = event.Count
|
||||
require.NotEqual(t, uuid.Nil, event.ID)
|
||||
require.False(t, event.CreatedAt.IsZero())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.expectedCreated, eventCounts[telemetry.PrebuiltWorkspaceEventTypeCreated])
|
||||
require.Equal(t, tc.expectedFailed, eventCounts[telemetry.PrebuiltWorkspaceEventTypeFailed])
|
||||
require.Equal(t, tc.expectedClaimed, eventCounts[telemetry.PrebuiltWorkspaceEventTypeClaimed])
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type mockDB struct {
|
||||
database.Store
|
||||
}
|
||||
|
||||
func (*mockDB) GetPrebuildMetrics(context.Context) ([]database.GetPrebuildMetricsRow, error) {
|
||||
return []database.GetPrebuildMetricsRow{
|
||||
{
|
||||
TemplateName: "template1",
|
||||
PresetName: "preset1",
|
||||
OrganizationName: "org1",
|
||||
CreatedCount: 3,
|
||||
FailedCount: 1,
|
||||
ClaimedCount: 2,
|
||||
},
|
||||
{
|
||||
TemplateName: "template2",
|
||||
PresetName: "preset2",
|
||||
OrganizationName: "org1",
|
||||
CreatedCount: 2,
|
||||
FailedCount: 1,
|
||||
ClaimedCount: 1,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
type emptyMockDB struct {
|
||||
database.Store
|
||||
}
|
||||
|
||||
func (*emptyMockDB) GetPrebuildMetrics(context.Context) ([]database.GetPrebuildMetricsRow, error) {
|
||||
return []database.GetPrebuildMetricsRow{}, nil
|
||||
}
|
||||
|
||||
func TestShouldReportTelemetryDisabled(t *testing.T) {
|
||||
t.Parallel()
|
||||
// Description | telemetryEnabled (db) | telemetryEnabled (is) | Report Telemetry Disabled |
|
||||
|
||||
Reference in New Issue
Block a user