Skip to content

Commit a1757f0

Browse files
committed
fix: accumulate agentstats until reported and fix insights DAU offset
Fixes #15824
1 parent b39becb commit a1757f0

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

agent/stats.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package agent
22

33
import (
44
"context"
5+
"maps"
56
"sync"
67
"time"
78

@@ -32,7 +33,7 @@ type statsDest interface {
3233
// statsDest (agent API in prod)
3334
type statsReporter struct {
3435
*sync.Cond
35-
networkStats *map[netlogtype.Connection]netlogtype.Counts
36+
networkStats map[netlogtype.Connection]netlogtype.Counts
3637
unreported bool
3738
lastInterval time.Duration
3839

@@ -54,8 +55,18 @@ func (s *statsReporter) callback(_, _ time.Time, virtual, _ map[netlogtype.Conne
5455
s.L.Lock()
5556
defer s.L.Unlock()
5657
s.logger.Debug(context.Background(), "got stats callback")
57-
s.networkStats = &virtual
58-
s.unreported = true
58+
// Accumulate stats have until they've been reported.
59+
if s.unreported {
60+
if s.networkStats == nil && virtual != nil {
61+
s.networkStats = make(map[netlogtype.Connection]netlogtype.Counts)
62+
}
63+
for k, v := range virtual {
64+
s.networkStats[k] = s.networkStats[k].Add(v)
65+
}
66+
} else {
67+
s.networkStats = maps.Clone(virtual)
68+
s.unreported = true
69+
}
5970
s.Broadcast()
6071
}
6172

@@ -96,9 +107,8 @@ func (s *statsReporter) reportLoop(ctx context.Context, dest statsDest) error {
96107
if ctxDone {
97108
return nil
98109
}
99-
networkStats := *s.networkStats
100110
s.unreported = false
101-
if err = s.reportLocked(ctx, dest, networkStats); err != nil {
111+
if err = s.reportLocked(ctx, dest, s.networkStats); err != nil {
102112
return xerrors.Errorf("report stats: %w", err)
103113
}
104114
}

coderd/insights.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (api *API) returnDAUsInternal(rw http.ResponseWriter, r *http.Request, temp
8989
}
9090
for _, row := range rows {
9191
resp.Entries = append(resp.Entries, codersdk.DAUEntry{
92-
Date: row.StartTime.Format(time.DateOnly),
92+
Date: row.StartTime.In(loc).Format(time.DateOnly),
9393
Amount: int(row.ActiveUsers),
9494
})
9595
}

coderd/insights_test.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,26 @@ func TestDeploymentInsights(t *testing.T) {
4848
db, ps := dbtestutil.NewDB(t, dbtestutil.WithDumpOnFailure())
4949
logger := testutil.Logger(t)
5050
rollupEvents := make(chan dbrollup.Event)
51+
statsInterval := 500 * time.Millisecond
52+
batcher, closeBatcher, err := workspacestats.NewBatcher(context.Background(),
53+
workspacestats.BatcherWithLogger(logger.Named("batcher").Leveled(slog.LevelDebug)),
54+
workspacestats.BatcherWithStore(db),
55+
workspacestats.BatcherWithBatchSize(1),
56+
workspacestats.BatcherWithInterval(statsInterval),
57+
)
58+
require.NoError(t, err)
59+
defer closeBatcher()
5160
client := coderdtest.New(t, &coderdtest.Options{
5261
Database: db,
5362
Pubsub: ps,
5463
Logger: &logger,
5564
IncludeProvisionerDaemon: true,
56-
AgentStatsRefreshInterval: time.Millisecond * 100,
65+
AgentStatsRefreshInterval: statsInterval,
66+
StatsBatcher: batcher,
5767
DatabaseRolluper: dbrollup.New(
5868
logger.Named("dbrollup").Leveled(slog.LevelDebug),
5969
db,
60-
dbrollup.WithInterval(time.Millisecond*100),
70+
dbrollup.WithInterval(statsInterval/2),
6171
dbrollup.WithEventChannel(rollupEvents),
6272
),
6373
})
@@ -76,7 +86,7 @@ func TestDeploymentInsights(t *testing.T) {
7686
workspace := coderdtest.CreateWorkspace(t, client, template.ID)
7787
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
7888

79-
ctx := testutil.Context(t, testutil.WaitLong)
89+
ctx := testutil.Context(t, testutil.WaitSuperLong)
8090

8191
// Pre-check, no permission issues.
8292
daus, err := client.DeploymentDAUs(ctx, codersdk.TimezoneOffsetHour(clientTz))
@@ -108,6 +118,13 @@ func TestDeploymentInsights(t *testing.T) {
108118
err = sess.Start("cat")
109119
require.NoError(t, err)
110120

121+
select {
122+
case <-ctx.Done():
123+
require.Fail(t, "timed out waiting for initial rollup event")
124+
case ev := <-rollupEvents:
125+
require.True(t, ev.Init, "want init event")
126+
}
127+
111128
for {
112129
select {
113130
case <-ctx.Done():
@@ -120,6 +137,7 @@ func TestDeploymentInsights(t *testing.T) {
120137
if len(daus.Entries) > 0 && daus.Entries[len(daus.Entries)-1].Amount > 0 {
121138
break
122139
}
140+
t.Logf("waiting for deployment daus to update: %+v", daus)
123141
}
124142
}
125143

0 commit comments

Comments
 (0)