@@ -11,10 +11,7 @@ import (
1111 "errors"
1212 "fmt"
1313 "log"
14- "math"
1514 "os"
16- "sort"
17- "strings"
1815 "time"
1916
2017 "go.mongodb.org/mongo-driver/v2/bson"
@@ -55,12 +52,14 @@ type RawData struct {
5552}
5653
5754type EnergyStats struct {
58- Benchmark string
59- PatchVersion string
60- MainlineVersion string
61- E float64
62- T float64
63- H float64
55+ Benchmark string
56+ Measurement string
57+ PatchVersion string
58+ StableRegionValues []float64
59+ PatchValues []float64
60+ E float64
61+ T float64
62+ H float64
6463}
6564
6665func main () {
@@ -83,39 +82,25 @@ func main() {
8382 }
8483 fmt .Println ("Successfully connected to MongoDB Analytics node." )
8584
86- coll := client .Database ("expanded_metrics" ). Collection ( "raw_results " )
85+ db := client .Database ("expanded_metrics" )
8786 version := os .Getenv ("VERSION_ID" )
8887 if version == "" {
8988 log .Panic ("could not retrieve version" )
9089 }
9190
92- // Get and pre-process raw data
93- patchRawData , err3 := findRawData (version , coll )
91+ // Get raw data, most recent stable region, and calculate energy stats
92+ patchRawData , err3 := findRawData (version , db . Collection ( "raw_results" ) )
9493 if err3 != nil {
9594 log .Panicf ("Error getting raw data: %v" , err3 )
9695 }
9796
98- mainlineCommits , err4 := parseMainelineCommits (patchRawData )
97+ allEnergyStats , err4 := getEnergyStatsForAllBenchMarks (patchRawData , db . Collection ( "stable_regions" ) )
9998 if err4 != nil {
100- log .Panicf ("Error parsing commits : %v" , err4 )
99+ log .Panicf ("Error getting raw data : %v" , err4 )
101100 }
102-
103- mainlineVersion := "mongo_go_driver_" + mainlineCommits [0 ]
104- mainlineRawData , err5 := findRawData (mainlineVersion , coll )
105- if err5 != nil {
106- log .Panicf ("Could not retrieve mainline raw data" )
107- }
108-
109- if len (mainlineRawData ) != len (patchRawData ) {
110- log .Panicf ("Path and mainline data length do not match." )
111- }
112-
113- // Calculate energy statistics
114- energyStats , err := getEnergyStatsForAllBenchMarks (patchRawData , mainlineRawData )
115- if err != nil {
116- log .Panicf ("Error calculating energy stats: %v" , err )
101+ for _ , es := range allEnergyStats {
102+ fmt .Printf ("%s | %s | E: %f | T: %f | H: %f\n " , es .Benchmark , es .Measurement , es .E , es .T , es .H )
117103 }
118- fmt .Printf ("Successfully retrieved %d energy stats.\n " , len (energyStats ))
119104
120105 // Disconnect client
121106 err0 := client .Disconnect (context .Background ())
@@ -162,77 +147,82 @@ func findRawData(version string, coll *mongo.Collection) ([]RawData, error) {
162147 return rawData , nil
163148}
164149
165- func parseMainelineCommits (rawData []RawData ) ([]string , error ) {
166- commits := make ([]string , 0 , len (rawData ))
167- for i , rd := range rawData {
168- taskID := rd .Info .TaskID
169- pieces := strings .Split (taskID , "_" ) // Format: mongo_go_driver_perf_perf_patch_<commit-SHA>_<version>_<timestamp>
170- for j , p := range pieces {
171- if p == "patch" {
172- if len (pieces ) < j + 2 {
173- return nil , errors .New ("task ID doesn't hold commit SHA" )
174- }
175- commits = append (commits , pieces [j + 1 ])
176- break
177- }
178- }
179- if len (commits ) < i + 1 { // didn't find SHA in task_ID
180- return nil , errors .New ("task ID doesn't hold commit SHA" )
181- }
150+ func findLastStableRegion (testname string , measurement string , coll * mongo.Collection ) ([]float64 , error ) {
151+ filter := bson.D {
152+ {"time_series_info.project" , "mongo-go-driver" },
153+ {"time_series_info.variant" , "perf" },
154+ {"time_series_info.task" , "perf" },
155+ {"time_series_info.test" , testname },
156+ {"time_series_info.measurement" , measurement },
157+ {"last" , true },
158+ {"contexts" , []string {"GoDriver perf (h-score)" }},
182159 }
183- return commits , nil
184- }
160+ projection := bson.D {
161+ {"values" , 1 },
162+ }
163+ findOptions := options .FindOne ().SetSort (bson.D {{"end" , - 1 }}).SetProjection (projection )
185164
186- func getEnergyStatsForOneBenchmark (xRaw RawData , yRaw RawData ) (* EnergyStats , error ) {
165+ findCtx , cancel := context .WithTimeout (context .Background (), 180 * time .Second )
166+ defer cancel ()
187167
188- var x []float64
189- var y []float64
190- for _ , stat := range xRaw .Rollups .Stats {
191- x = append (x , stat .Val )
192- }
193- for _ , stat := range yRaw .Rollups .Stats {
194- y = append (y , stat .Val )
168+ var result bson.M
169+ err := coll .FindOne (findCtx , filter , findOptions ).Decode (& result )
170+ if err != nil {
171+ return nil , err
195172 }
196173
197- for i := range (int )(math .Min ((float64 )(len (xRaw .Rollups .Stats )), float64 (len (yRaw .Rollups .Stats )))) {
198- if xRaw .Rollups .Stats [i ].Name != yRaw .Rollups .Stats [i ].Name {
199- return nil , errors .New ("measurements do not match" )
174+ valuesSlice , ok := result ["values" ].(bson.A )
175+ if ! ok {
176+ return nil , errors .New ("values is not of type bson.A" )
177+ }
178+ var values []float64
179+ for _ , v := range valuesSlice {
180+ number , ok := v .(float64 )
181+ if ! ok {
182+ return nil , errors .New ("value is not float64" )
200183 }
184+ values = append (values , number )
201185 }
202-
203- e , t , h := GetEnergyStatistics (mat .NewDense (len (x ), 1 , x ), mat .NewDense (len (y ), 1 , y ))
204- return & EnergyStats {
205- Benchmark : xRaw .Info .TestName ,
206- PatchVersion : xRaw .Info .Version ,
207- MainlineVersion : yRaw .Info .Version ,
208- E : e ,
209- T : t ,
210- H : h ,
211- }, nil
186+ return values , nil
212187}
213188
214- func getEnergyStatsForAllBenchMarks (patchRawData []RawData , mainlineRawData []RawData ) ([]* EnergyStats , error ) {
215-
216- sort .Slice (patchRawData , func (i , j int ) bool {
217- return patchRawData [i ].Info .TestName < patchRawData [j ].Info .TestName
218- })
219- sort .Slice (mainlineRawData , func (i , j int ) bool {
220- return mainlineRawData [i ].Info .TestName < mainlineRawData [j ].Info .TestName
221- })
222-
189+ // For a specific test and measurement
190+ func getEnergyStatsForOneBenchmark (rd RawData , coll * mongo.Collection ) ([]* EnergyStats , error ) {
191+ testname := rd .Info .TestName
223192 var energyStats []* EnergyStats
224- for i := range patchRawData {
225- if testname := patchRawData [i ].Info .TestName ; testname != mainlineRawData [i ].Info .TestName {
226- return nil , errors .New ("tests do not match" )
227- }
228193
229- es , err := getEnergyStatsForOneBenchmark (patchRawData [i ], mainlineRawData [i ])
194+ for i := range rd .Rollups .Stats {
195+ measurement := rd .Rollups .Stats [i ].Name
196+ patchVal := []float64 {rd .Rollups .Stats [i ].Val }
197+ stableRegionVals , err := findLastStableRegion (testname , measurement , coll )
230198 if err != nil {
231199 return nil , err
232200 }
233- energyStats = append (energyStats , es )
234-
235- fmt .Printf ("%s | H-score: %.4f\n " , es .Benchmark , es .H )
201+ e , t , h := GetEnergyStatistics (mat .NewDense (len (stableRegionVals ), 1 , stableRegionVals ), mat .NewDense (1 , 1 , patchVal ))
202+ es := EnergyStats {
203+ Benchmark : testname ,
204+ Measurement : measurement ,
205+ PatchVersion : rd .Info .Version ,
206+ StableRegionValues : stableRegionVals ,
207+ PatchValues : patchVal ,
208+ E : e ,
209+ T : t ,
210+ H : h ,
211+ }
212+ energyStats = append (energyStats , & es )
236213 }
214+
237215 return energyStats , nil
238216}
217+
218+ func getEnergyStatsForAllBenchMarks (patchRawData []RawData , coll * mongo.Collection ) ([]* EnergyStats , error ) {
219+ var allEnergyStats []* EnergyStats
220+ for _ , rd := range patchRawData {
221+ energyStats , err := getEnergyStatsForOneBenchmark (rd , coll )
222+ if err != nil {
223+ return nil , err
224+ }
225+ allEnergyStats = append (allEnergyStats , energyStats ... )
226+ }
227+ return allEnergyStats , nil
228+ }
0 commit comments