mirror of
https://github.com/coder/coder.git
synced 2025-07-18 14:17:22 +00:00
test(coderd): enable dbrollup
service for insights tests (#12673)
This commit is contained in:
committed by
GitHub
parent
12e6fbf11e
commit
b4fd819f0d
@ -21,7 +21,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Event struct {
|
type Event struct {
|
||||||
TemplateUsageStats bool
|
Init bool `json:"-"`
|
||||||
|
TemplateUsageStats bool `json:"template_usage_stats"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Rolluper struct {
|
type Rolluper struct {
|
||||||
@ -138,6 +139,15 @@ func (r *Rolluper) start(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For testing.
|
||||||
|
if r.event != nil {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case r.event <- Event{Init: true}:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Perform do immediately and on every tick of the ticker,
|
// Perform do immediately and on every tick of the ticker,
|
||||||
// disregarding the execution time of do. This ensure that
|
// disregarding the execution time of do. This ensure that
|
||||||
// the rollup is performed every interval assuming do does
|
// the rollup is performed every interval assuming do does
|
||||||
|
@ -110,6 +110,8 @@ func TestRollup_TwoInstancesUseLocking(t *testing.T) {
|
|||||||
)
|
)
|
||||||
defer closeRolluper(rolluper2, resume2)
|
defer closeRolluper(rolluper2, resume2)
|
||||||
|
|
||||||
|
_, _ = <-events1, <-events2 // Deplete init event, resume operation.
|
||||||
|
|
||||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||||
|
|
||||||
// One of the rollup instances should roll up and the other should not.
|
// One of the rollup instances should roll up and the other should not.
|
||||||
@ -222,6 +224,8 @@ func TestRollupTemplateUsageStats(t *testing.T) {
|
|||||||
rolluper := dbrollup.New(logger, db, dbrollup.WithInterval(250*time.Millisecond), dbrollup.WithEventChannel(events))
|
rolluper := dbrollup.New(logger, db, dbrollup.WithInterval(250*time.Millisecond), dbrollup.WithEventChannel(events))
|
||||||
defer rolluper.Close()
|
defer rolluper.Close()
|
||||||
|
|
||||||
|
<-events // Deplete init event, resume operation.
|
||||||
|
|
||||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
"github.com/coder/coder/v2/coderd/database"
|
"github.com/coder/coder/v2/coderd/database"
|
||||||
"github.com/coder/coder/v2/coderd/database/dbauthz"
|
"github.com/coder/coder/v2/coderd/database/dbauthz"
|
||||||
"github.com/coder/coder/v2/coderd/database/dbgen"
|
"github.com/coder/coder/v2/coderd/database/dbgen"
|
||||||
|
"github.com/coder/coder/v2/coderd/database/dbrollup"
|
||||||
"github.com/coder/coder/v2/coderd/database/dbtestutil"
|
"github.com/coder/coder/v2/coderd/database/dbtestutil"
|
||||||
"github.com/coder/coder/v2/coderd/rbac"
|
"github.com/coder/coder/v2/coderd/rbac"
|
||||||
"github.com/coder/coder/v2/coderd/workspaceapps"
|
"github.com/coder/coder/v2/coderd/workspaceapps"
|
||||||
@ -44,10 +45,19 @@ func TestDeploymentInsights(t *testing.T) {
|
|||||||
clientTz, err := time.LoadLocation("America/Chicago")
|
clientTz, err := time.LoadLocation("America/Chicago")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
db, ps := dbtestutil.NewDB(t)
|
||||||
|
logger := slogtest.Make(t, nil)
|
||||||
client := coderdtest.New(t, &coderdtest.Options{
|
client := coderdtest.New(t, &coderdtest.Options{
|
||||||
|
Database: db,
|
||||||
|
Pubsub: ps,
|
||||||
|
Logger: &logger,
|
||||||
IncludeProvisionerDaemon: true,
|
IncludeProvisionerDaemon: true,
|
||||||
AgentStatsRefreshInterval: time.Millisecond * 100,
|
AgentStatsRefreshInterval: time.Millisecond * 50,
|
||||||
MetricsCacheRefreshInterval: time.Millisecond * 100,
|
DatabaseRolluper: dbrollup.New(
|
||||||
|
logger.Named("dbrollup"),
|
||||||
|
db,
|
||||||
|
dbrollup.WithInterval(time.Millisecond*100),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
user := coderdtest.CreateFirstUser(t, client)
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
@ -119,10 +129,19 @@ func TestDeploymentInsights(t *testing.T) {
|
|||||||
func TestUserActivityInsights_SanityCheck(t *testing.T) {
|
func TestUserActivityInsights_SanityCheck(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
db, ps := dbtestutil.NewDB(t)
|
||||||
logger := slogtest.Make(t, nil)
|
logger := slogtest.Make(t, nil)
|
||||||
client := coderdtest.New(t, &coderdtest.Options{
|
client := coderdtest.New(t, &coderdtest.Options{
|
||||||
|
Database: db,
|
||||||
|
Pubsub: ps,
|
||||||
|
Logger: &logger,
|
||||||
IncludeProvisionerDaemon: true,
|
IncludeProvisionerDaemon: true,
|
||||||
AgentStatsRefreshInterval: time.Millisecond * 100,
|
AgentStatsRefreshInterval: time.Millisecond * 50,
|
||||||
|
DatabaseRolluper: dbrollup.New(
|
||||||
|
logger.Named("dbrollup"),
|
||||||
|
db,
|
||||||
|
dbrollup.WithInterval(time.Millisecond*100),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create two users, one that will appear in the report and another that
|
// Create two users, one that will appear in the report and another that
|
||||||
@ -207,10 +226,19 @@ func TestUserActivityInsights_SanityCheck(t *testing.T) {
|
|||||||
func TestUserLatencyInsights(t *testing.T) {
|
func TestUserLatencyInsights(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
db, ps := dbtestutil.NewDB(t)
|
||||||
logger := slogtest.Make(t, nil)
|
logger := slogtest.Make(t, nil)
|
||||||
client := coderdtest.New(t, &coderdtest.Options{
|
client := coderdtest.New(t, &coderdtest.Options{
|
||||||
|
Database: db,
|
||||||
|
Pubsub: ps,
|
||||||
|
Logger: &logger,
|
||||||
IncludeProvisionerDaemon: true,
|
IncludeProvisionerDaemon: true,
|
||||||
AgentStatsRefreshInterval: time.Millisecond * 100,
|
AgentStatsRefreshInterval: time.Millisecond * 50,
|
||||||
|
DatabaseRolluper: dbrollup.New(
|
||||||
|
logger.Named("dbrollup"),
|
||||||
|
db,
|
||||||
|
dbrollup.WithInterval(time.Millisecond*100),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Create two users, one that will appear in the report and another that
|
// Create two users, one that will appear in the report and another that
|
||||||
@ -474,16 +502,24 @@ func TestTemplateInsights_Golden(t *testing.T) {
|
|||||||
return templates, users, testData
|
return templates, users, testData
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare := func(t *testing.T, templates []*testTemplate, users []*testUser, testData map[*testWorkspace]testDataGen) *codersdk.Client {
|
prepare := func(t *testing.T, templates []*testTemplate, users []*testUser, testData map[*testWorkspace]testDataGen) (*codersdk.Client, chan dbrollup.Event) {
|
||||||
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: false}).Leveled(slog.LevelDebug)
|
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: false}).Leveled(slog.LevelDebug)
|
||||||
db, pubsub := dbtestutil.NewDB(t)
|
db, ps := dbtestutil.NewDB(t)
|
||||||
|
events := make(chan dbrollup.Event)
|
||||||
client := coderdtest.New(t, &coderdtest.Options{
|
client := coderdtest.New(t, &coderdtest.Options{
|
||||||
Database: db,
|
Database: db,
|
||||||
Pubsub: pubsub,
|
Pubsub: ps,
|
||||||
Logger: &logger,
|
Logger: &logger,
|
||||||
IncludeProvisionerDaemon: true,
|
IncludeProvisionerDaemon: true,
|
||||||
AgentStatsRefreshInterval: time.Hour, // Not relevant for this test.
|
AgentStatsRefreshInterval: time.Hour, // Not relevant for this test.
|
||||||
|
DatabaseRolluper: dbrollup.New(
|
||||||
|
logger.Named("dbrollup"),
|
||||||
|
db,
|
||||||
|
dbrollup.WithInterval(time.Millisecond*50),
|
||||||
|
dbrollup.WithEventChannel(events),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
firstUser := coderdtest.CreateFirstUser(t, client)
|
firstUser := coderdtest.CreateFirstUser(t, client)
|
||||||
|
|
||||||
// Prepare all test users.
|
// Prepare all test users.
|
||||||
@ -706,7 +742,7 @@ func TestTemplateInsights_Golden(t *testing.T) {
|
|||||||
err = reporter.Report(dbauthz.AsSystemRestricted(ctx), stats)
|
err = reporter.Report(dbauthz.AsSystemRestricted(ctx), stats)
|
||||||
require.NoError(t, err, "want no error inserting app stats")
|
require.NoError(t, err, "want no error inserting app stats")
|
||||||
|
|
||||||
return client
|
return client, events
|
||||||
}
|
}
|
||||||
|
|
||||||
baseTemplateAndUserFixture := func() ([]*testTemplate, []*testUser) {
|
baseTemplateAndUserFixture := func() ([]*testTemplate, []*testUser) {
|
||||||
@ -1200,7 +1236,7 @@ func TestTemplateInsights_Golden(t *testing.T) {
|
|||||||
require.NotNil(t, tt.makeFixture, "test bug: makeFixture must be set")
|
require.NotNil(t, tt.makeFixture, "test bug: makeFixture must be set")
|
||||||
require.NotNil(t, tt.makeTestData, "test bug: makeTestData must be set")
|
require.NotNil(t, tt.makeTestData, "test bug: makeTestData must be set")
|
||||||
templates, users, testData := prepareFixtureAndTestData(t, tt.makeFixture, tt.makeTestData)
|
templates, users, testData := prepareFixtureAndTestData(t, tt.makeFixture, tt.makeTestData)
|
||||||
client := prepare(t, templates, users, testData)
|
client, events := prepare(t, templates, users, testData)
|
||||||
|
|
||||||
for _, req := range tt.requests {
|
for _, req := range tt.requests {
|
||||||
req := req
|
req := req
|
||||||
@ -1209,6 +1245,11 @@ func TestTemplateInsights_Golden(t *testing.T) {
|
|||||||
|
|
||||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||||
|
|
||||||
|
// Drain two events, the first one resumes rolluper
|
||||||
|
// operation and the second one waits for the rollup
|
||||||
|
// to complete.
|
||||||
|
_, _ = <-events, <-events
|
||||||
|
|
||||||
report, err := client.TemplateInsights(ctx, req.makeRequest(templates))
|
report, err := client.TemplateInsights(ctx, req.makeRequest(templates))
|
||||||
require.NoError(t, err, "want no error getting template insights")
|
require.NoError(t, err, "want no error getting template insights")
|
||||||
|
|
||||||
@ -1381,15 +1422,22 @@ func TestUserActivityInsights_Golden(t *testing.T) {
|
|||||||
return templates, users, testData
|
return templates, users, testData
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare := func(t *testing.T, templates []*testTemplate, users []*testUser, testData map[*testWorkspace]testDataGen) *codersdk.Client {
|
prepare := func(t *testing.T, templates []*testTemplate, users []*testUser, testData map[*testWorkspace]testDataGen) (*codersdk.Client, chan dbrollup.Event) {
|
||||||
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: false}).Leveled(slog.LevelDebug)
|
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: false}).Leveled(slog.LevelDebug)
|
||||||
db, pubsub := dbtestutil.NewDB(t)
|
db, ps := dbtestutil.NewDB(t)
|
||||||
|
events := make(chan dbrollup.Event)
|
||||||
client := coderdtest.New(t, &coderdtest.Options{
|
client := coderdtest.New(t, &coderdtest.Options{
|
||||||
Database: db,
|
Database: db,
|
||||||
Pubsub: pubsub,
|
Pubsub: ps,
|
||||||
Logger: &logger,
|
Logger: &logger,
|
||||||
IncludeProvisionerDaemon: true,
|
IncludeProvisionerDaemon: true,
|
||||||
AgentStatsRefreshInterval: time.Hour, // Not relevant for this test.
|
AgentStatsRefreshInterval: time.Hour, // Not relevant for this test.
|
||||||
|
DatabaseRolluper: dbrollup.New(
|
||||||
|
logger.Named("dbrollup"),
|
||||||
|
db,
|
||||||
|
dbrollup.WithInterval(time.Millisecond*50),
|
||||||
|
dbrollup.WithEventChannel(events),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
firstUser := coderdtest.CreateFirstUser(t, client)
|
firstUser := coderdtest.CreateFirstUser(t, client)
|
||||||
|
|
||||||
@ -1593,7 +1641,7 @@ func TestUserActivityInsights_Golden(t *testing.T) {
|
|||||||
err = reporter.Report(dbauthz.AsSystemRestricted(ctx), stats)
|
err = reporter.Report(dbauthz.AsSystemRestricted(ctx), stats)
|
||||||
require.NoError(t, err, "want no error inserting app stats")
|
require.NoError(t, err, "want no error inserting app stats")
|
||||||
|
|
||||||
return client
|
return client, events
|
||||||
}
|
}
|
||||||
|
|
||||||
baseTemplateAndUserFixture := func() ([]*testTemplate, []*testUser) {
|
baseTemplateAndUserFixture := func() ([]*testTemplate, []*testUser) {
|
||||||
@ -1974,7 +2022,7 @@ func TestUserActivityInsights_Golden(t *testing.T) {
|
|||||||
require.NotNil(t, tt.makeFixture, "test bug: makeFixture must be set")
|
require.NotNil(t, tt.makeFixture, "test bug: makeFixture must be set")
|
||||||
require.NotNil(t, tt.makeTestData, "test bug: makeTestData must be set")
|
require.NotNil(t, tt.makeTestData, "test bug: makeTestData must be set")
|
||||||
templates, users, testData := prepareFixtureAndTestData(t, tt.makeFixture, tt.makeTestData)
|
templates, users, testData := prepareFixtureAndTestData(t, tt.makeFixture, tt.makeTestData)
|
||||||
client := prepare(t, templates, users, testData)
|
client, events := prepare(t, templates, users, testData)
|
||||||
|
|
||||||
for _, req := range tt.requests {
|
for _, req := range tt.requests {
|
||||||
req := req
|
req := req
|
||||||
@ -1983,6 +2031,11 @@ func TestUserActivityInsights_Golden(t *testing.T) {
|
|||||||
|
|
||||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||||
|
|
||||||
|
// Drain two events, the first one resumes rolluper
|
||||||
|
// operation and the second one waits for the rollup
|
||||||
|
// to complete.
|
||||||
|
_, _ = <-events, <-events
|
||||||
|
|
||||||
report, err := client.UserActivityInsights(ctx, req.makeRequest(templates))
|
report, err := client.UserActivityInsights(ctx, req.makeRequest(templates))
|
||||||
require.NoError(t, err, "want no error getting template insights")
|
require.NoError(t, err, "want no error getting template insights")
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user