Skip to content

Commit 8ac895f

Browse files
committed
Add agent connection timings to the response
1 parent 8f15ca1 commit 8ac895f

File tree

10 files changed

+212
-21
lines changed

10 files changed

+212
-21
lines changed

coderd/apidoc/docs.go

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/workspacebuilds.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -984,9 +984,23 @@ func (api *API) buildTimings(ctx context.Context, build database.WorkspaceBuild)
984984
return codersdk.WorkspaceBuildTimings{}, xerrors.Errorf("fetching workspace agent script timings: %w", err)
985985
}
986986

987+
resources, err := api.Database.GetWorkspaceResourcesByJobID(ctx, build.JobID)
988+
if err != nil && !errors.Is(err, sql.ErrNoRows) {
989+
return codersdk.WorkspaceBuildTimings{}, xerrors.Errorf("fetching workspace resources: %w", err)
990+
}
991+
resourceIDs := make([]uuid.UUID, 0, len(resources))
992+
for _, resource := range resources {
993+
resourceIDs = append(resourceIDs, resource.ID)
994+
}
995+
agents, err := api.Database.GetWorkspaceAgentsByResourceIDs(ctx, resourceIDs)
996+
if err != nil && !errors.Is(err, sql.ErrNoRows) {
997+
return codersdk.WorkspaceBuildTimings{}, xerrors.Errorf("fetching workspace agents: %w", err)
998+
}
999+
9871000
res := codersdk.WorkspaceBuildTimings{
988-
ProvisionerTimings: make([]codersdk.ProvisionerTiming, 0, len(provisionerTimings)),
989-
AgentScriptTimings: make([]codersdk.AgentScriptTiming, 0, len(agentScriptTimings)),
1001+
ProvisionerTimings: make([]codersdk.ProvisionerTiming, 0, len(provisionerTimings)),
1002+
AgentScriptTimings: make([]codersdk.AgentScriptTiming, 0, len(agentScriptTimings)),
1003+
AgentConnectionTimings: make([]codersdk.AgentConnectionTiming, 0, len(agents)),
9901004
}
9911005

9921006
for _, t := range provisionerTimings {
@@ -1012,6 +1026,14 @@ func (api *API) buildTimings(ctx context.Context, build database.WorkspaceBuild)
10121026
WorkspaceAgentName: t.WorkspaceAgentName,
10131027
})
10141028
}
1029+
for _, agent := range agents {
1030+
res.AgentConnectionTimings = append(res.AgentConnectionTimings, codersdk.AgentConnectionTiming{
1031+
WorkspaceAgentID: agent.ID.String(),
1032+
WorkspaceAgentName: agent.Name,
1033+
StartedAt: agent.CreatedAt,
1034+
EndedAt: agent.FirstConnectedAt.Time,
1035+
})
1036+
}
10151037

10161038
return res, nil
10171039
}

coderd/workspacebuilds_test.go

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,8 +1239,10 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12391239

12401240
//nolint:paralleltest
12411241
t.Run("NonExistentBuild", func(t *testing.T) {
1242-
// When: fetching an inexistent build
1242+
// Given: an inexistent build
12431243
buildID := uuid.New()
1244+
1245+
// When: fetching timings for the build
12441246
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
12451247
t.Cleanup(cancel)
12461248
_, err := client.WorkspaceBuildTimings(ctx, buildID)
@@ -1252,8 +1254,10 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12521254

12531255
//nolint:paralleltest
12541256
t.Run("EmptyTimings", func(t *testing.T) {
1255-
// When: fetching timings for a build with no timings
1257+
// Given: a build with no timings
12561258
build := makeBuild()
1259+
1260+
// When: fetching timings for the build
12571261
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
12581262
t.Cleanup(cancel)
12591263
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
@@ -1266,17 +1270,18 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12661270

12671271
//nolint:paralleltest
12681272
t.Run("ProvisionerTimings", func(t *testing.T) {
1269-
// When: fetching timings for a build with provisioner timings
1273+
// Given: a build with provisioner timings
12701274
build := makeBuild()
12711275
provisionerTimings := dbgen.ProvisionerJobTimings(t, db, build, 5)
12721276

1273-
// Then: return a response with the expected timings
1277+
// When: fetching timings for the build
12741278
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
12751279
t.Cleanup(cancel)
12761280
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
12771281
require.NoError(t, err)
1278-
require.Len(t, res.ProvisionerTimings, 5)
12791282

1283+
// Then: return a response with the expected timings
1284+
require.Len(t, res.ProvisionerTimings, 5)
12801285
for i := range res.ProvisionerTimings {
12811286
timingRes := res.ProvisionerTimings[i]
12821287
genTiming := provisionerTimings[i]
@@ -1292,7 +1297,7 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12921297

12931298
//nolint:paralleltest
12941299
t.Run("AgentScriptTimings", func(t *testing.T) {
1295-
// When: fetching timings for a build with agent script timings
1300+
// Given: a build with agent script timings
12961301
build := makeBuild()
12971302
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
12981303
JobID: build.JobID,
@@ -1305,13 +1310,14 @@ func TestWorkspaceBuildTimings(t *testing.T) {
13051310
})
13061311
agentScriptTimings := dbgen.WorkspaceAgentScriptTimings(t, db, script, 5)
13071312

1308-
// Then: return a response with the expected timings
1313+
// When: fetching timings for the build
13091314
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
13101315
t.Cleanup(cancel)
13111316
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
13121317
require.NoError(t, err)
1313-
require.Len(t, res.AgentScriptTimings, 5)
13141318

1319+
// Then: return a response with the expected timings
1320+
require.Len(t, res.AgentScriptTimings, 5)
13151321
for i := range res.AgentScriptTimings {
13161322
timingRes := res.AgentScriptTimings[i]
13171323
genTiming := agentScriptTimings[i]
@@ -1327,7 +1333,7 @@ func TestWorkspaceBuildTimings(t *testing.T) {
13271333

13281334
//nolint:paralleltest
13291335
t.Run("NoAgentScripts", func(t *testing.T) {
1330-
// When: fetching timings for a build with no agent scripts
1336+
// Given: a build with no agent scripts
13311337
build := makeBuild()
13321338
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
13331339
JobID: build.JobID,
@@ -1336,29 +1342,63 @@ func TestWorkspaceBuildTimings(t *testing.T) {
13361342
ResourceID: resource.ID,
13371343
})
13381344

1339-
// Then: return a response with empty agent script timings
1345+
// When: fetching timings for the build
13401346
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
13411347
t.Cleanup(cancel)
13421348
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
13431349
require.NoError(t, err)
1350+
1351+
// Then: return a response with empty agent script timings
13441352
require.Empty(t, res.AgentScriptTimings)
13451353
})
13461354

13471355
// Some workspaces might not have agents. It is improbable, but possible.
13481356
//nolint:paralleltest
13491357
t.Run("NoAgents", func(t *testing.T) {
1350-
// When: fetching timings for a build with no agents
1358+
// Given: a build with no agents
13511359
build := makeBuild()
13521360
dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
13531361
JobID: build.JobID,
13541362
})
13551363

1356-
// Then: return a response with empty agent script timings
1357-
// trigger build
1364+
// When: fetching timings for the build
13581365
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
13591366
t.Cleanup(cancel)
13601367
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
13611368
require.NoError(t, err)
1369+
1370+
// Then: return a response with empty agent script timings
13621371
require.Empty(t, res.AgentScriptTimings)
13631372
})
1373+
1374+
//nolint:paralleltest
1375+
t.Run("AgentConnectionTimings", func(t *testing.T) {
1376+
// Given: a build with multiple agents
1377+
build := makeBuild()
1378+
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1379+
JobID: build.JobID,
1380+
})
1381+
agents := make([]database.WorkspaceAgent, 5)
1382+
for i := range agents {
1383+
agents[i] = dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{
1384+
ResourceID: resource.ID,
1385+
})
1386+
}
1387+
1388+
// When: fetching timings for the build
1389+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1390+
t.Cleanup(cancel)
1391+
res, err := client.WorkspaceBuildTimings(ctx, build.ID)
1392+
require.NoError(t, err)
1393+
1394+
// Then: return a response with the expected timings
1395+
require.Len(t, res.AgentConnectionTimings, 5)
1396+
for i := range res.ProvisionerTimings {
1397+
timingRes := res.AgentConnectionTimings[i]
1398+
require.Equal(t, agents[i].ID.String(), timingRes.WorkspaceAgentID)
1399+
require.Equal(t, agents[i].Name, timingRes.WorkspaceAgentName)
1400+
require.NotEmpty(t, timingRes.StartedAt)
1401+
require.NotEmpty(t, timingRes.EndedAt)
1402+
}
1403+
})
13641404
}

codersdk/workspacebuilds.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,17 @@ type AgentScriptTiming struct {
196196
WorkspaceAgentName string `json:"workspace_agent_name"`
197197
}
198198

199+
type AgentConnectionTiming struct {
200+
StartedAt time.Time `json:"started_at" format:"date-time"`
201+
EndedAt time.Time `json:"ended_at" format:"date-time"`
202+
WorkspaceAgentID string `json:"workspace_agent_id"`
203+
WorkspaceAgentName string `json:"workspace_agent_name"`
204+
}
205+
199206
type WorkspaceBuildTimings struct {
200-
ProvisionerTimings []ProvisionerTiming `json:"provisioner_timings"`
201-
AgentScriptTimings []AgentScriptTiming `json:"agent_script_timings"`
207+
ProvisionerTimings []ProvisionerTiming `json:"provisioner_timings"`
208+
AgentScriptTimings []AgentScriptTiming `json:"agent_script_timings"`
209+
AgentConnectionTimings []AgentConnectionTiming `json:"agent_connection_timings"`
202210
}
203211

204212
func (c *Client) WorkspaceBuildTimings(ctx context.Context, build uuid.UUID) (WorkspaceBuildTimings, error) {

docs/reference/api/builds.md

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/api/schemas.md

Lines changed: 33 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/api/workspaces.md

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/api/typesGenerated.ts

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)