@@ -66,6 +66,7 @@ import (
66
66
"github.com/coder/coder/v2/coderd/updatecheck"
67
67
"github.com/coder/coder/v2/coderd/util/slice"
68
68
"github.com/coder/coder/v2/coderd/workspaceapps"
69
+ "github.com/coder/coder/v2/coderd/workspaceusage"
69
70
"github.com/coder/coder/v2/codersdk"
70
71
"github.com/coder/coder/v2/codersdk/drpc"
71
72
"github.com/coder/coder/v2/provisionerd/proto"
@@ -190,6 +191,9 @@ type Options struct {
190
191
191
192
// NewTicker is used for unit tests to replace "time.NewTicker".
192
193
NewTicker func (duration time.Duration ) (tick <- chan time.Time , done func ())
194
+
195
+ // WorkspaceUsageTracker tracks workspace usage by the CLI.
196
+ WorkspaceUsageTracker * workspaceusage.Tracker
193
197
}
194
198
195
199
// @title Coder API
@@ -362,6 +366,14 @@ func New(options *Options) *API {
362
366
OIDC : options .OIDCConfig ,
363
367
}
364
368
369
+ if options .WorkspaceUsageTracker == nil {
370
+ options .WorkspaceUsageTracker = workspaceusage .New (options .Database ,
371
+ workspaceusage .WithFlushInterval (workspaceusage .DefaultFlushInterval ),
372
+ workspaceusage .WithLogger (options .Logger .Named ("workspace_usage_tracker" )),
373
+ )
374
+ }
375
+ go options .WorkspaceUsageTracker .Loop ()
376
+
365
377
ctx , cancel := context .WithCancel (context .Background ())
366
378
r := chi .NewRouter ()
367
379
@@ -405,6 +417,7 @@ func New(options *Options) *API {
405
417
options .Logger .Named ("acquirer" ),
406
418
options .Database ,
407
419
options .Pubsub ),
420
+ workspaceUsageTracker : options .WorkspaceUsageTracker ,
408
421
}
409
422
410
423
api .AppearanceFetcher .Store (& appearance .DefaultFetcher )
@@ -972,6 +985,7 @@ func New(options *Options) *API {
972
985
})
973
986
r .Get ("/watch" , api .watchWorkspace )
974
987
r .Put ("/extend" , api .putExtendWorkspace )
988
+ r .Post ("/usage" , api .postWorkspaceUsage )
975
989
r .Put ("/dormant" , api .putWorkspaceDormant )
976
990
r .Put ("/favorite" , api .putFavoriteWorkspace )
977
991
r .Delete ("/favorite" , api .deleteFavoriteWorkspace )
@@ -1179,6 +1193,8 @@ type API struct {
1179
1193
statsBatcher * batchstats.Batcher
1180
1194
1181
1195
Acquirer * provisionerdserver.Acquirer
1196
+
1197
+ workspaceUsageTracker * workspaceusage.Tracker
1182
1198
}
1183
1199
1184
1200
// Close waits for all WebSocket connections to drain before returning.
@@ -1200,6 +1216,7 @@ func (api *API) Close() error {
1200
1216
_ = (* coordinator ).Close ()
1201
1217
}
1202
1218
_ = api .agentProvider .Close ()
1219
+ api .workspaceUsageTracker .Close ()
1203
1220
return nil
1204
1221
}
1205
1222
0 commit comments