diff --git a/resources/js/vue/components/BuildTestsPage.vue b/resources/js/vue/components/BuildTestsPage.vue index 137453eda4..48b5c6c7c7 100644 --- a/resources/js/vue/components/BuildTestsPage.vue +++ b/resources/js/vue/components/BuildTestsPage.vue @@ -115,6 +115,7 @@ const TEST_QUERY = gql` testMeasurements(filters: $measurementFilters) { id name + type value } } @@ -137,6 +138,7 @@ const TEST_QUERY = gql` testMeasurements(filters: $measurementFilters) { id name + type value } } @@ -235,13 +237,7 @@ export default { return { buildid: this.buildId, filters: this.initialFilters, - measurementFilters: { - any: this.pinnedMeasurements.map((name) => ({ - eq: { - name: name, - }, - })), - }, + measurementFilters: this.measurementFilters, }; }, }, @@ -254,13 +250,7 @@ export default { return { buildid: this.buildId, filters: {}, - measurementFilters: { - any: this.pinnedMeasurements.map((name) => ({ - eq: { - name: name, - }, - })), - }, + measurementFilters: this.measurementFilters, }; }, }, @@ -272,13 +262,7 @@ export default { return { buildid: this.previousBuildId, filters: this.initialFilters, - measurementFilters: { - any: this.pinnedMeasurements.map((name) => ({ - eq: { - name: name, - }, - })), - }, + measurementFilters: this.measurementFilters, }; }, skip() { @@ -300,6 +284,18 @@ export default { }; }, + // Fetch the pinned measurement columns and numeric measurements used by the + // test execution timeline and its tooltips. Unpinned text and file measurements + // aren't displayed on this page. + measurementFilters() { + return { + any: [ + ...this.pinnedMeasurements.map((name) => ({ eq: { name: name } })), + { contains: { type: 'numeric/' } }, + ], + }; + }, + filteredTests() { if (!this.onlyDelta) { return this.tests; @@ -346,15 +342,24 @@ export default { return []; } - return this.executedTests.filter((test) => test.node.startTime).map((test) => ({ - id: test.node.id, - name: test.node.name, - startTime: DateTime.fromISO(test.node.startTime), - duration: Duration.fromObject({ seconds: test.node.runningTime }), - status: test.node.status, - subProject: test.subProject, - disabled: !this.visibleTestIds.has(test.node.id), - })); + return this.executedTests.filter((test) => test.node.startTime).map((test) => { + const numericMeasurements = test.node.testMeasurements + .filter((measurement) => measurement.type.startsWith('numeric')) + .map((measurement) => ({ name: measurement.name, value: parseFloat(measurement.value) })); + const maxRssMeasurement = numericMeasurements.find((measurement) => measurement.name === 'MaxRSS'); + + return { + id: test.node.id, + name: test.node.name, + startTime: DateTime.fromISO(test.node.startTime), + duration: Duration.fromObject({ seconds: test.node.runningTime }), + status: test.node.status, + subProject: test.subProject, + disabled: !this.visibleTestIds.has(test.node.id), + maxRss: maxRssMeasurement ? maxRssMeasurement.value : null, + numericMeasurements, + }; + }); }, pinnedMeasurementColumns() { diff --git a/resources/js/vue/components/shared/Charts/FlameChart.vue b/resources/js/vue/components/shared/Charts/FlameChart.vue index c90c62d5ec..e9ea11c231 100644 --- a/resources/js/vue/components/shared/Charts/FlameChart.vue +++ b/resources/js/vue/components/shared/Charts/FlameChart.vue @@ -16,6 +16,7 @@ import { GridComponent, TooltipComponent, DataZoomComponent, + VisualMapContinuousComponent, } from 'echarts/components'; import VChart from 'vue-echarts'; import Utils from '../Utils'; @@ -26,6 +27,7 @@ use([ GridComponent, TooltipComponent, DataZoomComponent, + VisualMapContinuousComponent, ]); export default { @@ -74,6 +76,12 @@ export default { required: false, default: 400, }, + /** An echarts `visualMap` config (continuous), used to color items by a data dimension. */ + visualMap: { + type: Object, + required: false, + default: null, + }, }, // eslint-disable-next-line vue/require-emit-validator @@ -82,6 +90,8 @@ export default { computed: { chartOptions() { return { + // An array lets vue-echarts remove the visual map without resetting the zoom. + visualMap: this.visualMap ? [this.visualMap] : [], tooltip: { confine: true, trigger: 'item', diff --git a/resources/js/vue/components/shared/TestFlameChart.vue b/resources/js/vue/components/shared/TestFlameChart.vue index 510d0f3fa3..7ed456bba2 100644 --- a/resources/js/vue/components/shared/TestFlameChart.vue +++ b/resources/js/vue/components/shared/TestFlameChart.vue @@ -1,8 +1,26 @@