diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx index 0210353488257..67ffdc6b4c96b 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx @@ -105,20 +105,6 @@ export const NavigateToStartStage: Story = { }, }; -// Test case for https://github.com/coder/coder/issues/15413 -export const DuplicatedScriptTiming: Story = { - args: { - agentScriptTimings: [ - WorkspaceTimingsResponse.agent_script_timings[0], - { - ...WorkspaceTimingsResponse.agent_script_timings[0], - started_at: "2021-09-01T00:00:00Z", - ended_at: "2021-09-01T00:00:00Z", - }, - ], - }, -}; - // Loading when agent script timings are empty // Test case for https://github.com/coder/coder/issues/15273 export const LoadingWhenAgentScriptTimingsAreEmpty: Story = { diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx index 63fc03ad2a3de..779c7dbd963be 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx @@ -9,8 +9,6 @@ import type { AgentScriptTiming, ProvisionerTiming, } from "api/typesGenerated"; -import sortBy from "lodash/sortBy"; -import uniqBy from "lodash/uniqBy"; import { type FC, useState } from "react"; import { type TimeRange, calcDuration, mergeTimeRanges } from "./Chart/utils"; import { ResourcesChart, isCoderResource } from "./ResourcesChart"; @@ -44,16 +42,9 @@ export const WorkspaceTimings: FC = ({ defaultIsOpen = false, }) => { const [view, setView] = useState({ name: "default" }); - // This is a workaround to deal with the BE returning multiple timings for a - // single agent script when it should return only one. Reference: - // https://github.com/coder/coder/issues/15413#issuecomment-2493663571 - const uniqScriptTimings = uniqBy( - sortBy(agentScriptTimings, (t) => new Date(t.started_at).getTime() * -1), - (t) => t.display_name, - ); const timings = [ ...provisionerTimings, - ...uniqScriptTimings, + ...agentScriptTimings, ...agentConnectionTimings, ].sort((a, b) => { return new Date(a.started_at).getTime() - new Date(b.started_at).getTime(); diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index b3f4a76cd4b3d..542a7caa514f1 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -163,6 +163,32 @@ export const WorkspaceReadyPage: FC = ({ // Fetch build timings only when the build job is completed. enabled: Boolean(workspace.latest_build.job.completed_at), + // This is a workaround to deal with the BE returning multiple timings for a + // single agent script when it should return only one. Reference: + // https://github.com/coder/coder/issues/16124 + select: (data) => { + // Select the most recent agent script timing for each script. + const fixedAgentScriptTimings = Object.values( + data.agent_script_timings.reduce( + (acc, item) => { + const existing = acc[item.display_name]; + if ( + !existing || + new Date(item.started_at) > new Date(existing.started_at) + ) { + acc[item.display_name] = item; + } + return acc; + }, + {} as Record, + ), + ); + return { + ...data, + agent_script_timings: fixedAgentScriptTimings, + }; + }, + // Sometimes, the timings can be fetched before the agent script timings are // done or saved in the database so we need to conditionally refetch the // timings. To refetch the timings, I found the best way was to compare the