Skip to content

Commit 2285e94

Browse files
authored
Merge pull request #29 from liu-cong/testing
Add a hermetic e2e test with fake backend pods
2 parents ee249fb + 4c1e0b2 commit 2285e94

File tree

4 files changed

+332
-151
lines changed

4 files changed

+332
-151
lines changed

pkg/ext-proc/benchmark/benchmark.go

-151
This file was deleted.
+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"time"
8+
9+
"github.com/bojand/ghz/printer"
10+
"github.com/bojand/ghz/runner"
11+
"github.com/jhump/protoreflect/desc"
12+
"google.golang.org/protobuf/proto"
13+
klog "k8s.io/klog/v2"
14+
15+
"ext-proc/backend"
16+
"ext-proc/test"
17+
)
18+
19+
var (
20+
svrAddr = flag.String("server_address", "localhost:9002", "Address of the ext proc server")
21+
totalRequests = flag.Int("total_requests", 100000, "number of requests to be sent for load test")
22+
// Flags when running a local ext proc server.
23+
numFakePods = flag.Int("num_fake_pods", 200, "number of fake pods when running a local ext proc server")
24+
numModelsPerPod = flag.Int("num_models_per_pod", 5, "number of fake models per pod when running a local ext proc server")
25+
localServer = flag.Bool("local_server", true, "whether to start a local ext proc server")
26+
refreshPodsInterval = flag.Duration("refreshPodsInterval", 10*time.Second, "interval to refresh pods")
27+
refreshMetricsInterval = flag.Duration("refreshMetricsInterval", 50*time.Millisecond, "interval to refresh metrics")
28+
)
29+
30+
const (
31+
port = 9002
32+
)
33+
34+
func main() {
35+
klog.InitFlags(nil)
36+
flag.Parse()
37+
38+
if *localServer {
39+
test.StartExtProc(port, *refreshPodsInterval, *refreshMetricsInterval, fakePods())
40+
time.Sleep(time.Second) // wait until server is up
41+
klog.Info("Server started")
42+
}
43+
44+
report, err := runner.Run(
45+
"envoy.service.ext_proc.v3.ExternalProcessor.Process",
46+
*svrAddr,
47+
runner.WithInsecure(true),
48+
runner.WithBinaryDataFunc(generateRequest),
49+
runner.WithTotalRequests(uint(*totalRequests)),
50+
)
51+
if err != nil {
52+
klog.Fatal(err)
53+
}
54+
55+
printer := printer.ReportPrinter{
56+
Out: os.Stdout,
57+
Report: report,
58+
}
59+
60+
printer.Print("summary")
61+
}
62+
63+
func generateRequest(mtd *desc.MethodDescriptor, callData *runner.CallData) []byte {
64+
numModels := *numFakePods * (*numModelsPerPod)
65+
req := test.GenerateRequest(modelName(int(callData.RequestNumber) % numModels))
66+
data, err := proto.Marshal(req)
67+
if err != nil {
68+
klog.Fatal("marshaling error: ", err)
69+
}
70+
return data
71+
}
72+
73+
func fakePods() []*backend.PodMetrics {
74+
pms := make([]*backend.PodMetrics, 0, *numFakePods)
75+
for i := 0; i < *numFakePods; i++ {
76+
metrics := fakeMetrics(i)
77+
pod := test.FakePod(i)
78+
pms = append(pms, &backend.PodMetrics{Pod: pod, Metrics: metrics})
79+
}
80+
81+
return pms
82+
}
83+
84+
// fakeMetrics adds numModelsPerPod number of adapters to the pod metrics.
85+
func fakeMetrics(podNumber int) backend.Metrics {
86+
metrics := backend.Metrics{
87+
ActiveModels: make(map[string]int),
88+
}
89+
for i := 0; i < *numModelsPerPod; i++ {
90+
metrics.ActiveModels[modelName(podNumber*(*numModelsPerPod)+i)] = 0
91+
}
92+
return metrics
93+
}
94+
95+
func modelName(i int) string {
96+
return fmt.Sprintf("adapter-%v", i)
97+
}

0 commit comments

Comments
 (0)