Skip to content

Commit 4c1e0b2

Browse files
committed
Add a hermetic e2e test with fake backend pods
The test spins up an ext proc server locally with fake backend pods, sends requests, and then inspects the response headers to check the expected backend pod is selected. It tests the code e2e except for the model server specific metric scraping code.
1 parent d122a6c commit 4c1e0b2

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)