@@ -465,6 +465,17 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
465
465
}
466
466
return nil
467
467
})
468
+ eg .Go (func () error {
469
+ stats , err := r .options .Database .GetWorkspaceAgentStats (ctx , createdAfter )
470
+ if err != nil {
471
+ return xerrors .Errorf ("get workspace agent stats: %w" , err )
472
+ }
473
+ snapshot .WorkspaceAgentStats = make ([]WorkspaceAgentStat , 0 , len (stats ))
474
+ for _ , stat := range stats {
475
+ snapshot .WorkspaceAgentStats = append (snapshot .WorkspaceAgentStats , ConvertWorkspaceAgentStat (stat ))
476
+ }
477
+ return nil
478
+ })
468
479
469
480
err := eg .Wait ()
470
481
if err != nil {
@@ -564,6 +575,25 @@ func ConvertWorkspaceAgent(agent database.WorkspaceAgent) WorkspaceAgent {
564
575
return snapAgent
565
576
}
566
577
578
+ // ConvertWorkspaceAgentStat anonymizes a workspace agent stat.
579
+ func ConvertWorkspaceAgentStat (stat database.GetWorkspaceAgentStatsRow ) WorkspaceAgentStat {
580
+ return WorkspaceAgentStat {
581
+ UserID : stat .UserID ,
582
+ TemplateID : stat .TemplateID ,
583
+ WorkspaceID : stat .WorkspaceID ,
584
+ AgentID : stat .AgentID ,
585
+ AggregatedFrom : stat .AggregatedFrom ,
586
+ ConnectionLatency50 : stat .WorkspaceConnectionLatency50 ,
587
+ ConnectionLatency95 : stat .WorkspaceConnectionLatency95 ,
588
+ RxBytes : stat .WorkspaceRxBytes ,
589
+ TxBytes : stat .WorkspaceTxBytes ,
590
+ SessionCountVSCode : stat .SessionCountVSCode ,
591
+ SessionCountJetBrains : stat .SessionCountJetBrains ,
592
+ SessionCountReconnectingPTY : stat .SessionCountReconnectingPTY ,
593
+ SessionCountSSH : stat .SessionCountSSH ,
594
+ }
595
+ }
596
+
567
597
// ConvertWorkspaceApp anonymizes a workspace app.
568
598
func ConvertWorkspaceApp (app database.WorkspaceApp ) WorkspaceApp {
569
599
return WorkspaceApp {
@@ -666,6 +696,7 @@ type Snapshot struct {
666
696
Workspaces []Workspace `json:"workspaces"`
667
697
WorkspaceApps []WorkspaceApp `json:"workspace_apps"`
668
698
WorkspaceAgents []WorkspaceAgent `json:"workspace_agents"`
699
+ WorkspaceAgentStats []WorkspaceAgentStat `json:"workspace_agent_stats"`
669
700
WorkspaceBuilds []WorkspaceBuild `json:"workspace_build"`
670
701
WorkspaceResources []WorkspaceResource `json:"workspace_resources"`
671
702
WorkspaceResourceMetadata []WorkspaceResourceMetadata `json:"workspace_resource_metadata"`
@@ -754,6 +785,22 @@ type WorkspaceAgent struct {
754
785
ShutdownScript bool `json:"shutdown_script"`
755
786
}
756
787
788
+ type WorkspaceAgentStat struct {
789
+ UserID uuid.UUID `json:"user_id"`
790
+ TemplateID uuid.UUID `json:"template_id"`
791
+ WorkspaceID uuid.UUID `json:"workspace_id"`
792
+ AggregatedFrom time.Time `json:"aggregated_from"`
793
+ AgentID uuid.UUID `json:"agent_id"`
794
+ RxBytes int64 `json:"rx_bytes"`
795
+ TxBytes int64 `json:"tx_bytes"`
796
+ ConnectionLatency50 float64 `json:"connection_latency_50"`
797
+ ConnectionLatency95 float64 `json:"connection_latency_95"`
798
+ SessionCountVSCode int64 `json:"session_count_vscode"`
799
+ SessionCountJetBrains int64 `json:"session_count_jetbrains"`
800
+ SessionCountReconnectingPTY int64 `json:"session_count_reconnecting_pty"`
801
+ SessionCountSSH int64 `json:"session_count_ssh"`
802
+ }
803
+
757
804
type WorkspaceApp struct {
758
805
ID uuid.UUID `json:"id"`
759
806
CreatedAt time.Time `json:"created_at"`
0 commit comments