Skip to content

Commit 62a865f

Browse files
committed
driver and native driver performance testing commands + refactoring
This closes #15, closes #21 Signed-off-by: lwsanty <lwsanty@gmail.com>
1 parent c610584 commit 62a865f

14 files changed

Lines changed: 944 additions & 151 deletions

File tree

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ deploy:
3333
tags: true
3434

3535
after_deploy:
36+
- cd cmd/native-driver-performance/ ; CGO_ENABLED=0 go build -o ../../build/native-driver-performance ; cd ../..
3637
- DOCKER_PUSH_MASTER=1 make docker-push-latest-release

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ FROM srcd/dind-golang:docker-18.09.7-go-1.12.7
33
RUN apk update && apk upgrade && \
44
apk add --no-cache bash git build-base
55

6+
RUN mkdir -p /root/utils
7+
68
COPY build/bin/bblfsh-performance /root/
9+
COPY build/bin/native-driver-performance /root/utils/
710
WORKDIR /root
811

912
ENTRYPOINT ["./bblfsh-performance"]

README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,99 @@ Either locally or in CI:
5151
3) save output test benchmark output to the file
5252
4) run `bblfsh-performance parse-and-store` and pass the filepath(s) as an argument
5353
54+
### driver-native
55+
```bash
56+
./bblfsh-performance driver-native --help
57+
run language driver container and perform benchmark tests over the native driver, store results into a given storage
58+
59+
Usage:
60+
bblfsh-performance driver-native [--language=<language>] [--commit=<commit-id>] [--storage=<storage>] [--filter-prefix=<filter-prefix>] [--native=<path-to-native>] <directory> [flags]
61+
62+
Aliases:
63+
driver-native, dn, native
64+
65+
Examples:
66+
WARNING! Requires native-driver-performance binary to be build
67+
WARNING! To access storage corresponding environment variables should be set.
68+
Full examples of usage scripts are following:
69+
70+
# for prometheus pushgateway
71+
export PROM_ADDRESS="localhost:9091"
72+
export PROM_JOB=pushgateway
73+
./bblfsh-performance driver-native \
74+
--language go \
75+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
76+
--native /home/lwsanty/goproj/lwsanty/performance/cmd/native-driver-performance/native-driver-performance \
77+
/var/testdata/fixtures
78+
79+
# for influx db
80+
export INFLUX_ADDRESS="http://localhost:8086"
81+
export INFLUX_USERNAME=""
82+
export INFLUX_PASSWORD=""
83+
export INFLUX_DB=mydb
84+
export INFLUX_MEASUREMENT=benchmark
85+
./bblfsh-performance driver-native \
86+
--language go \
87+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
88+
--native /home/lwsanty/goproj/lwsanty/performance/cmd/native-driver-performance/native-driver-performance \
89+
--storage=influxdb \
90+
/var/testdata/fixtures
91+
92+
93+
Flags:
94+
-c, --commit string commit id that's being tested and will be used as a tag in performance report
95+
--exclude-suffixes strings file suffixes to be excluded (default [.legacy,.native,.uast])
96+
--filter-prefix string file prefix to be filtered (default "bench_")
97+
-h, --help help for driver-native
98+
-l, --language string name of the language to be tested
99+
-n, --native string path to native driver performance util (default "/root/utils/native-driver-test")
100+
-s, --storage string storage kind to store the results(prom, influxdb, file) (default "prom")
101+
```
102+
103+
### driver
104+
```bash
105+
./bblfsh-performance driver --help
106+
run language driver container and perform benchmark tests over the driver, store results into a given storage
107+
108+
Usage:
109+
bblfsh-performance driver [--language=<language>] [--commit=<commit-id>] [--storage=<storage>] [--filter-prefix=<filter-prefix>] <directory> [flags]
110+
111+
Aliases:
112+
driver, d
113+
114+
Examples:
115+
WARNING! To access storage corresponding environment variables should be set.
116+
Full examples of usage scripts are following:
117+
118+
# for prometheus pushgateway
119+
export PROM_ADDRESS="localhost:9091"
120+
export PROM_JOB=pushgateway
121+
./bblfsh-performance driver \
122+
--language go \
123+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
124+
/var/testdata/fixtures
125+
126+
# for influx db
127+
export INFLUX_ADDRESS="http://localhost:8086"
128+
export INFLUX_USERNAME=""
129+
export INFLUX_PASSWORD=""
130+
export INFLUX_DB=mydb
131+
export INFLUX_MEASUREMENT=benchmark
132+
./bblfsh-performance driver \
133+
--language go \
134+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
135+
--storage=influxdb \
136+
/var/testdata/fixtures
137+
138+
139+
Flags:
140+
-c, --commit string commit id that's being tested and will be used as a tag in performance report
141+
--exclude-suffixes strings file suffixes to be excluded (default [.legacy,.native,.uast])
142+
--filter-prefix string file prefix to be filtered (default "bench_")
143+
-h, --help help for driver
144+
-l, --language string name of the language to be tested
145+
-s, --storage string storage kind to store the results(prom, influxdb, file) (default "prom")
146+
```
54147
55148
### end-2-end
56149
```bash
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package driver
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"os/signal"
8+
9+
"github.com/bblfsh/performance"
10+
"github.com/bblfsh/performance/docker"
11+
helper "github.com/bblfsh/performance/grpc-helper"
12+
"github.com/bblfsh/performance/storage"
13+
"github.com/bblfsh/performance/storage/file"
14+
"github.com/bblfsh/performance/storage/influxdb"
15+
prom "github.com/bblfsh/performance/storage/prom-pushgateway"
16+
17+
"github.com/spf13/cobra"
18+
"gopkg.in/src-d/go-log.v1"
19+
)
20+
21+
const fileFilterPrefix = performance.FileFilterPrefix
22+
23+
// Cmd return configured driver-native command
24+
func Cmd() *cobra.Command {
25+
cmd := &cobra.Command{
26+
Use: "driver [--language=<language>] [--commit=<commit-id>] [--storage=<storage>] [--filter-prefix=<filter-prefix>] <directory>",
27+
Aliases: []string{"d"},
28+
Args: cobra.MinimumNArgs(1),
29+
Short: "run language driver container and perform benchmark tests over the driver, store results into a given storage",
30+
Example: `WARNING! To access storage corresponding environment variables should be set.
31+
Full examples of usage scripts are following:
32+
33+
# for prometheus pushgateway
34+
export PROM_ADDRESS="localhost:9091"
35+
export PROM_JOB=pushgateway
36+
./bblfsh-performance driver \
37+
--language go \
38+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
39+
/var/testdata/fixtures
40+
41+
# for influx db
42+
export INFLUX_ADDRESS="http://localhost:8086"
43+
export INFLUX_USERNAME=""
44+
export INFLUX_PASSWORD=""
45+
export INFLUX_DB=mydb
46+
export INFLUX_MEASUREMENT=benchmark
47+
./bblfsh-performance driver \
48+
--language go \
49+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
50+
--storage=influxdb \
51+
/var/testdata/fixtures
52+
`,
53+
RunE: performance.RunESilenced(func(cmd *cobra.Command, args []string) error {
54+
language, _ := cmd.Flags().GetString("language")
55+
commit, _ := cmd.Flags().GetString("commit")
56+
excludeSubstrings, _ := cmd.Flags().GetStringSlice("exclude-suffixes")
57+
stor, _ := cmd.Flags().GetString("storage")
58+
filterPrefix, _ := cmd.Flags().GetString("filter-prefix")
59+
60+
if _, err := storage.ValidateKind(stor); err != nil {
61+
return err
62+
}
63+
64+
log.Debugf("download and build driver")
65+
image, err := docker.DownloadAndBuildDriver(language, commit)
66+
if err != nil {
67+
return err
68+
}
69+
70+
log.Debugf("run driver container")
71+
driver, err := docker.RunDriver(image)
72+
if err != nil {
73+
return err
74+
}
75+
defer driver.Close()
76+
77+
// prepare context
78+
ctx, cancel := context.WithCancel(context.Background())
79+
c := make(chan os.Signal, 1)
80+
signal.Notify(c, os.Interrupt)
81+
defer func() {
82+
signal.Stop(c)
83+
cancel()
84+
}()
85+
go func() {
86+
select {
87+
case <-c:
88+
cancel()
89+
case <-ctx.Done():
90+
}
91+
}()
92+
93+
return helper.BenchmarkGRPCAndStore(ctx, helper.BenchmarkGRPCMeta{
94+
Address: driver.Address,
95+
Commit: commit,
96+
ExcludeSubstrings: excludeSubstrings,
97+
Dirs: args,
98+
FilterPrefix: filterPrefix,
99+
Language: language,
100+
Level: performance.DriverLevel,
101+
Storage: stor,
102+
})
103+
}),
104+
}
105+
106+
flags := cmd.Flags()
107+
flags.StringP("language", "l", "", "name of the language to be tested")
108+
flags.StringP("commit", "c", "", "commit id that's being tested and will be used as a tag in performance report")
109+
flags.StringSlice("exclude-suffixes", []string{".legacy", ".native", ".uast"}, "file suffixes to be excluded")
110+
flags.String("filter-prefix", fileFilterPrefix, "file prefix to be filtered")
111+
flags.StringP("storage", "s", prom.Kind, fmt.Sprintf("storage kind to store the results(%s, %s, %s)", prom.Kind, influxdb.Kind, file.Kind))
112+
113+
return cmd
114+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package drivernative
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"os"
8+
"os/signal"
9+
"path/filepath"
10+
11+
"github.com/bblfsh/performance"
12+
"github.com/bblfsh/performance/docker"
13+
"github.com/bblfsh/performance/storage"
14+
"github.com/bblfsh/performance/storage/file"
15+
"github.com/bblfsh/performance/storage/influxdb"
16+
prom_pushgateway "github.com/bblfsh/performance/storage/prom-pushgateway"
17+
18+
"github.com/spf13/cobra"
19+
"gopkg.in/src-d/go-log.v1"
20+
)
21+
22+
const (
23+
fileFilterPrefix = performance.FileFilterPrefix
24+
containerTmp = "/tmp"
25+
containerFixtures = containerTmp + "/fixtures"
26+
results = "results.txt"
27+
)
28+
29+
// Cmd return configured driver-native command
30+
func Cmd() *cobra.Command {
31+
cmd := &cobra.Command{
32+
Use: "driver-native [--language=<language>] [--commit=<commit-id>] [--storage=<storage>] [--filter-prefix=<filter-prefix>] [--native=<path-to-native>] <directory>",
33+
Aliases: []string{"dn", "native"},
34+
Args: cobra.MinimumNArgs(1),
35+
Short: "run language driver container and perform benchmark tests over the native driver, store results into a given storage",
36+
Example: `WARNING! Requires native-driver-performance binary to be build
37+
WARNING! To access storage corresponding environment variables should be set.
38+
Full examples of usage scripts are following:
39+
40+
# for prometheus pushgateway
41+
export PROM_ADDRESS="localhost:9091"
42+
export PROM_JOB=pushgateway
43+
./bblfsh-performance driver-native \
44+
--language go \
45+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
46+
--native /home/lwsanty/goproj/lwsanty/performance/cmd/native-driver-performance/native-driver-performance \
47+
/var/testdata/fixtures
48+
49+
# for influx db
50+
export INFLUX_ADDRESS="http://localhost:8086"
51+
export INFLUX_USERNAME=""
52+
export INFLUX_PASSWORD=""
53+
export INFLUX_DB=mydb
54+
export INFLUX_MEASUREMENT=benchmark
55+
./bblfsh-performance driver-native \
56+
--language go \
57+
--commit 096361d09049c27e829fd5a6658f1914fd3b62ac \
58+
--native /home/lwsanty/goproj/lwsanty/performance/cmd/native-driver-performance/native-driver-performance \
59+
--storage=influxdb \
60+
/var/testdata/fixtures
61+
`,
62+
RunE: performance.RunESilenced(func(cmd *cobra.Command, args []string) error {
63+
language, _ := cmd.Flags().GetString("language")
64+
commit, _ := cmd.Flags().GetString("commit")
65+
stor, _ := cmd.Flags().GetString("storage")
66+
filterPrefix, _ := cmd.Flags().GetString("filter-prefix")
67+
native, _ := cmd.Flags().GetString("native")
68+
69+
fixtures := args[0]
70+
execDst := getSubTmp(filepath.Base(native))
71+
resultsPath := getSubTmp(results)
72+
73+
log.Debugf("validating storage")
74+
if _, err := storage.ValidateKind(stor); err != nil {
75+
return err
76+
}
77+
78+
log.Debugf("download and build driver")
79+
image, err := docker.DownloadAndBuildDriver(language, commit)
80+
if err != nil {
81+
return err
82+
}
83+
84+
log.Debugf("run driver container")
85+
driver, err := docker.RunDriver(image, fixtures+":"+containerFixtures)
86+
if err != nil {
87+
return err
88+
}
89+
defer driver.Close()
90+
91+
// prepare context
92+
ctx, cancel := context.WithCancel(context.Background())
93+
c := make(chan os.Signal, 1)
94+
signal.Notify(c, os.Interrupt)
95+
defer func() {
96+
signal.Stop(c)
97+
cancel()
98+
}()
99+
go func() {
100+
select {
101+
case <-c:
102+
cancel()
103+
case <-ctx.Done():
104+
}
105+
}()
106+
107+
log.Debugf("copying file %v to container's dst: %v", native, execDst)
108+
if err := driver.Upload(ctx, native, execDst); err != nil {
109+
return err
110+
}
111+
112+
log.Debugf("executing command on driver")
113+
//if err := driver.Exec(ctx, "sh", "-c", "dfgdfg"); err != nil {
114+
if err := driver.Exec(ctx,
115+
[]string{"LOG_LEVEL=debug"},
116+
execDst,
117+
"--filter-prefix="+filterPrefix,
118+
"--fixtures="+containerFixtures,
119+
"--results="+resultsPath,
120+
); err != nil {
121+
return err
122+
}
123+
124+
log.Debugf("getting results")
125+
data, err := driver.GetResults(ctx, resultsPath)
126+
if err != nil {
127+
return err
128+
}
129+
130+
var benchmarks []performance.Benchmark
131+
if err := json.Unmarshal(data, &benchmarks); err != nil {
132+
return err
133+
}
134+
135+
// store data
136+
storageClient, err := storage.NewClient(stor)
137+
if err != nil {
138+
return err
139+
}
140+
defer storageClient.Close()
141+
142+
if err := storageClient.Dump(map[string]string{
143+
"language": language,
144+
"commit": commit,
145+
"level": performance.DriverNativeLevel,
146+
}, benchmarks...); err != nil {
147+
return err
148+
}
149+
150+
return nil
151+
}),
152+
}
153+
154+
flags := cmd.Flags()
155+
flags.StringP("native", "n", "/root/utils/native-driver-test", "path to native driver performance util")
156+
flags.StringP("language", "l", "", "name of the language to be tested")
157+
flags.StringP("commit", "c", "", "commit id that's being tested and will be used as a tag in performance report")
158+
flags.StringSlice("exclude-suffixes", []string{".legacy", ".native", ".uast"}, "file suffixes to be excluded")
159+
flags.String("filter-prefix", fileFilterPrefix, "file prefix to be filtered")
160+
flags.StringP("storage", "s", prom_pushgateway.Kind, fmt.Sprintf("storage kind to store the results(%s, %s, %s)", prom_pushgateway.Kind, influxdb.Kind, file.Kind))
161+
162+
return cmd
163+
}
164+
165+
func getSubTmp(name string) string {
166+
return filepath.Join(containerTmp, name)
167+
}

0 commit comments

Comments
 (0)