Skip to content

Commit cc20439

Browse files
committed
Generate formatted perf comment with dynamic Evg URLs
1 parent 3e87d2a commit cc20439

File tree

1 file changed

+122
-0
lines changed
  • internal/cmd/perfcomp/parseperfcomp

1 file changed

+122
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
// Copyright (C) MongoDB, Inc. 2025-present.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
// not use this file except in compliance with the License. You may obtain
5+
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6+
7+
package main
8+
9+
import (
10+
"bufio"
11+
"fmt"
12+
"log"
13+
"net/url"
14+
"os"
15+
"strings"
16+
)
17+
18+
const parsePerfCompDir = "./internal/cmd/perfcomp/parseperfcomp/"
19+
const perfReportFileTxt = "perf-report.txt"
20+
const perfReportFileMd = "perf-report.md"
21+
const perfVariant = "^perf$"
22+
23+
func main() {
24+
var line string
25+
26+
// open file to read
27+
fRead, err := os.Open(parsePerfCompDir + perfReportFileTxt)
28+
if err != nil {
29+
log.Fatalf("Could not open %s: %v", perfReportFileTxt, err)
30+
}
31+
defer fRead.Close()
32+
33+
// open file to write
34+
fWrite, err := os.Create(perfReportFileMd)
35+
if err != nil {
36+
log.Fatalf("Could not create %s: %v", perfReportFileMd, err)
37+
}
38+
defer fWrite.Close()
39+
40+
fmt.Fprintf(fWrite, "## 👋GoDriver Performance\n")
41+
42+
// read the file line by line using scanner
43+
scanner := bufio.NewScanner(fRead)
44+
45+
var version string
46+
var evgLink string
47+
48+
for scanner.Scan() {
49+
line = scanner.Text()
50+
if strings.Contains(line, "Version ID:") {
51+
// parse version
52+
version = strings.Split(line, " ")[2]
53+
} else if strings.Contains(line, "Commit SHA:") {
54+
// parse commit SHA and write header
55+
fmt.Fprintf(fWrite, "\n<details>\n<summary>%s</summary>\n\t<br>\n\n", line)
56+
} else if strings.Contains(line, "version "+version) {
57+
// dynamic Evergreen perf task link
58+
evgLink, err = generateEvgLink(version, perfVariant)
59+
if err != nil {
60+
log.Println(err)
61+
fmt.Fprintf(fWrite, "%s\n", line)
62+
} else {
63+
printUrlToLine(fWrite, line, evgLink, "version", -1)
64+
}
65+
} else if strings.Contains(line, "For a comprehensive view of all microbenchmark results for this PR's commit, please check out the Evergreen perf task for this patch.") {
66+
// last line of comment
67+
evgLink, err = generateEvgLink(version, "")
68+
if err != nil {
69+
log.Println(err)
70+
fmt.Fprintf(fWrite, "%s\n", line)
71+
} else {
72+
printUrlToLine(fWrite, line, evgLink, "Evergreen", 0)
73+
}
74+
} else {
75+
// all other regular lines
76+
fmt.Fprintf(fWrite, "%s\n", line)
77+
}
78+
}
79+
80+
fmt.Fprintf(fWrite, "</details>\n")
81+
}
82+
83+
func generateEvgLink(version string, variant string) (string, error) {
84+
baseUrl := "https://spruce.mongodb.com"
85+
page := "0"
86+
sorts := "STATUS:ASC;BASE_STATUS:DESC"
87+
88+
u, err := url.Parse(baseUrl)
89+
if err != nil {
90+
return "", fmt.Errorf("Error parsing URL: %v", err)
91+
}
92+
93+
u.Path = fmt.Sprintf("version/%s/tasks", version)
94+
95+
// construct query parameters
96+
queryParams := url.Values{}
97+
queryParams.Add("page", page)
98+
queryParams.Add("sorts", sorts)
99+
if variant != "" {
100+
queryParams.Add("variant", variant)
101+
}
102+
103+
u.RawQuery = queryParams.Encode()
104+
return u.String(), nil
105+
}
106+
107+
func printUrlToLine(fWrite *os.File, line string, link string, targetWord string, step int) {
108+
words := strings.Split(line, " ")
109+
for i, w := range words {
110+
if i > 0 && words[i+step] == targetWord {
111+
fmt.Fprintf(fWrite, "[%s](%s)", w, link)
112+
} else {
113+
fmt.Fprint(fWrite, w)
114+
}
115+
116+
if i < len(words)-1 {
117+
fmt.Fprint(fWrite, " ")
118+
} else {
119+
fmt.Fprint(fWrite, "\n")
120+
}
121+
}
122+
}

0 commit comments

Comments
 (0)