|
24 | 24 | // import { displayAlert } from '$utils/alerts-utils'; |
25 | 25 | import type { DryRunMetrics, DryRun, MetricsWithTimeStamps } from '$typesdefinitions'; |
26 | 26 |
|
| 27 | + // Extended type to include carbontracker data |
| 28 | + interface ExtendedDryRunMetrics extends DryRunMetrics { |
| 29 | + carbontracker?: { |
| 30 | + fetchCarbontrackerData?: { |
| 31 | + co2eq: number; |
| 32 | + energy: number; |
| 33 | + }; |
| 34 | + }; |
| 35 | + } |
| 36 | +
|
27 | 37 | export let data; |
28 | 38 |
|
29 | 39 | let loadingFinished = false; |
|
50 | 60 | let allStepNames: string[] = []; |
51 | 61 |
|
52 | 62 | $: selectedStep = 'Total'; |
53 | | - $: reactiveStepsList = $stepsList; |
| 63 | + let reactiveStepsList: ExtendedDryRunMetrics[]; |
| 64 | + $: reactiveStepsList = ($stepsList as ExtendedDryRunMetrics[]) || []; |
54 | 65 |
|
55 | 66 | function gotoOverview(): void { |
56 | 67 | selectedStep = 'Total'; |
|
73 | 84 | let networkTotalReceived = 'N/A'; |
74 | 85 | let networkTotalTransmitted = 'N/A'; |
75 | 86 | let pipelineDuration = 'N/A'; |
| 87 | + let totalCO2 = 'N/A'; |
| 88 | + let totalEnergy = 'N/A'; |
76 | 89 |
|
77 | 90 | function formatDuration(seconds: number): string { |
78 | 91 | const hours = Math.floor(seconds / 3600); |
|
108 | 121 | pipelineDuration = formatDuration(totalDuration); |
109 | 122 | } |
110 | 123 |
|
| 124 | + function computeTotalCarbonMetrics(): void { |
| 125 | + let co2Sum = 0; |
| 126 | + let energySum = 0; |
| 127 | +
|
| 128 | + if (reactiveStepsList) { |
| 129 | + reactiveStepsList.forEach((step) => { |
| 130 | + if (step.carbontracker?.fetchCarbontrackerData) { |
| 131 | + if (step.carbontracker.fetchCarbontrackerData.co2eq) { |
| 132 | + co2Sum += step.carbontracker.fetchCarbontrackerData.co2eq; |
| 133 | + } |
| 134 | + if (step.carbontracker.fetchCarbontrackerData.energy) { |
| 135 | + energySum += step.carbontracker.fetchCarbontrackerData.energy; |
| 136 | + } |
| 137 | + } |
| 138 | + }); |
| 139 | + } |
| 140 | +
|
| 141 | + totalCO2 = co2Sum > 0 ? co2Sum.toFixed(3) : 'N/A'; |
| 142 | + totalEnergy = energySum > 0 ? energySum.toFixed(6) : 'N/A'; |
| 143 | + } |
| 144 | +
|
| 145 | + // Reactive statement to compute carbon metrics when reactiveStepsList changes |
| 146 | + $: if (reactiveStepsList && reactiveStepsList.length > 0) { |
| 147 | + computeTotalCarbonMetrics(); |
| 148 | + } |
| 149 | +
|
111 | 150 | let dryRunPhaseMessage: string | null; |
112 | 151 | // eslint-disable-next-line @typescript-eslint/explicit-function-return-type, consistent-return |
113 | | - const getMetricsResponse = async () => { |
| 152 | + const getMetricsResponse = async (): Promise<DryRunMetrics[]> => { |
114 | 153 | const dryrunVariables = { |
115 | 154 | // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment |
116 | 155 | dryRunId: data.resource |
|
125 | 164 | const body = `${(error as Error).message}`; |
126 | 165 | // await displayAlert(title, body, 10_000); |
127 | 166 | console.log(title, body); |
| 167 | + return []; |
128 | 168 | } |
129 | 169 | }; |
130 | 170 |
|
131 | | - async function getCarbontrackerDataResponse(input: any): Promise<any> { |
| 171 | + async function getCarbontrackerDataResponse(input: any): Promise<{ |
| 172 | + fetchCarbontrackerData?: { |
| 173 | + co2eq: number; |
| 174 | + energy: number; |
| 175 | + }; |
| 176 | + } | undefined> { |
132 | 177 | const inputData = { |
133 | 178 | input: { |
134 | 179 | data: { |
|
145 | 190 | console.log('inputData:', inputData); |
146 | 191 | try { |
147 | 192 | const response = await requestGraphQLClient(getCarbontrackerDataQuery, inputData); |
148 | | - return response; |
| 193 | + return response as { |
| 194 | + fetchCarbontrackerData?: { |
| 195 | + co2eq: number; |
| 196 | + energy: number; |
| 197 | + }; |
| 198 | + }; |
149 | 199 | } catch (error) { |
150 | 200 | const title = 'Internal error!'; |
151 | 201 | const body = `${(error as Error).message}`; |
|
209 | 259 | cumulativeNetworkData = result.cumulativeNetworkData; |
210 | 260 | currentNetworkData = result.currentNetworkData; |
211 | 261 | logs = result.logs; |
212 | | - //console.log('dryRunId:', $selectedDryRunName); |
213 | | - const carbontracker_data = []; |
| 262 | + const carbontrackerData: Array<{ |
| 263 | + nodeId: string; |
| 264 | + stepName: string; |
| 265 | + carbonData: { fetchCarbontrackerData?: { co2eq: number; energy: number } } | undefined; |
| 266 | + }> = []; |
214 | 267 | for (const step of metricsResponse) { |
215 | 268 | if (step.type === 'Pod') { |
216 | 269 | const carbonResponse = await getCarbontrackerDataResponse(step.metrics.cpuUsageSecondsTotal); |
217 | | - carbontracker_data.push({ |
| 270 | + carbontrackerData.push({ |
218 | 271 | nodeId: step.id, |
219 | 272 | stepName: step.displayName, |
220 | 273 | carbonData: carbonResponse |
|
225 | 278 |
|
226 | 279 | // Merge carbontracker data with stepsList |
227 | 280 | $stepsList = $stepsList.map(step => { |
228 | | - const carbonData = carbontracker_data.find(carbon => carbon.nodeId === step.id); |
| 281 | + const carbonData = carbontrackerData.find(carbon => carbon.nodeId === step.id); |
229 | 282 | return { |
230 | 283 | ...step, |
231 | | - carbontracker: carbonData ? carbonData.carbonData : null |
| 284 | + carbontracker: carbonData ? carbonData.carbonData : undefined |
232 | 285 | }; |
233 | 286 | }); |
234 | 287 |
|
|
238 | 291 | metrics: metricsResponse, |
239 | 292 | allstepnames: allStepNames, |
240 | 293 | selectedDryRunName: $selectedDryRunName, |
241 | | - carbontracker_data |
| 294 | + carbontrackerData |
242 | 295 | }; |
| 296 | +
|
243 | 297 | console.log('responses:', responses); |
244 | 298 | return responses; |
245 | 299 | }; |
|
671 | 725 | <tr> |
672 | 726 | <td>Duration</td> |
673 | 727 | <td> {pipelineDuration} </td> |
674 | | - </tr></tbody |
675 | | - > |
| 728 | + </tr> |
| 729 | + <tr> |
| 730 | + <td>Total CO2</td> |
| 731 | + <td> {totalCO2} g </td> |
| 732 | + </tr> |
| 733 | + <tr> |
| 734 | + <td>Total Energy</td> |
| 735 | + <td> {totalEnergy} kWh </td> |
| 736 | + </tr> |
| 737 | + </tbody> |
676 | 738 | </table> |
677 | 739 | </div> |
678 | 740 |
|
|
0 commit comments