Skip to content

Commit 6d63f5f

Browse files
committed
remove ResourceFetcher, now Prometheus is just another QueryExecutor
1 parent 08bbb92 commit 6d63f5f

File tree

9 files changed

+185
-214
lines changed

9 files changed

+185
-214
lines changed

wasp/benchspy/TO_DO.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ Known things to do:
22
- [ ] add logger
33
- [ ] add tests
44
- [ ] write documentation
5-
- [ ] test with Docker app (focus: resources)
6-
- [ ] test with k8s app (focus: resources)
75
- [ ] add report builder (?)
86
- [ ] add wrapper function for executing some code and then creating a report
97
- [ ] add helper method for a profile what would create a report based on all generators?

wasp/benchspy/generator.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ import (
1414
type GeneratorQueryFn = func(responses *wasp.SliceBuffer[wasp.Response]) (string, error)
1515

1616
type GeneratorQueryExecutor struct {
17-
Kind string `json:"kind"`
17+
KindName string `json:"kind"`
1818
Generator *wasp.Generator `json:"generator_config"`
1919
Queries map[string]GeneratorQueryFn `json:"queries"`
20-
QueryResults map[string][]string `json:"query_results"`
20+
QueryResults map[string]interface{} `json:"query_results"`
2121
}
2222

2323
func NewGeneratorQueryExecutor(generator *wasp.Generator) (*GeneratorQueryExecutor, error) {
2424
g := &GeneratorQueryExecutor{
25-
Kind: "generator",
25+
KindName: string(StandardQueryExecutor_Generator),
2626
Generator: generator,
2727
}
2828

@@ -32,15 +32,19 @@ func NewGeneratorQueryExecutor(generator *wasp.Generator) (*GeneratorQueryExecut
3232
}
3333

3434
g.Queries = queries
35-
g.QueryResults = make(map[string][]string)
35+
g.QueryResults = make(map[string]interface{})
3636

3737
return g, nil
3838
}
3939

40-
func (g *GeneratorQueryExecutor) Results() map[string][]string {
40+
func (g *GeneratorQueryExecutor) Results() map[string]interface{} {
4141
return g.QueryResults
4242
}
4343

44+
func (l *GeneratorQueryExecutor) Kind() string {
45+
return l.KindName
46+
}
47+
4448
func (g *GeneratorQueryExecutor) IsComparable(otherQueryExecutor QueryExecutor) error {
4549
otherType := reflect.TypeOf(otherQueryExecutor)
4650

@@ -113,7 +117,7 @@ func (g *GeneratorQueryExecutor) Execute(_ context.Context) error {
113117
return queryErr
114118
}
115119

116-
g.QueryResults[queryName] = []string{results}
120+
g.QueryResults[queryName] = results
117121
}
118122

119123
return nil
@@ -184,14 +188,14 @@ func (g *GeneratorQueryExecutor) standardQuery(standardMetric StandardLoadMetric
184188
func (g *GeneratorQueryExecutor) MarshalJSON() ([]byte, error) {
185189
// we need custom marshalling to only include query names, since the functions are not serializable
186190
type QueryExecutor struct {
187-
Kind string `json:"kind"`
188-
Generator interface{} `json:"generator_config"`
189-
Queries []string `json:"queries"`
190-
QueryResults map[string][]string `json:"query_results"`
191+
Kind string `json:"kind"`
192+
Generator interface{} `json:"generator_config"`
193+
Queries []string `json:"queries"`
194+
QueryResults map[string]interface{} `json:"query_results"`
191195
}
192196

193197
return json.Marshal(&QueryExecutor{
194-
Kind: g.Kind,
198+
Kind: g.KindName,
195199
Generator: func() interface{} {
196200
if g.Generator != nil {
197201
return g.Generator.Cfg

wasp/benchspy/generator_test.go

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func TestBenchSpy_NewGeneratorQueryExecutor(t *testing.T) {
3030
}
3131
executor, err := NewGeneratorQueryExecutor(gen)
3232
assert.NoError(t, err)
33-
assert.Equal(t, "generator", executor.Kind)
33+
assert.Equal(t, "generator", executor.KindName)
3434
assert.Equal(t, gen, executor.Generator)
3535
assert.NotEmpty(t, executor.Queries)
3636
assert.NotNil(t, executor.QueryResults)
@@ -49,8 +49,8 @@ func TestBenchSpy_NewGeneratorQueryExecutor(t *testing.T) {
4949
}
5050

5151
func TestBenchSpy_GeneratorQueryExecutor_Results(t *testing.T) {
52-
expected := map[string][]string{
53-
"test": {"result"},
52+
expected := map[string]interface{}{
53+
"test": "result",
5454
}
5555
executor := &GeneratorQueryExecutor{
5656
QueryResults: expected,
@@ -235,27 +235,24 @@ func TestBenchSpy_GeneratorQueryExecutor_Execute(t *testing.T) {
235235
// 4 responses with ~150ms latency (150ms sleep + some execution overhead)
236236
// and 2-3 responses with ~200ms latency (200ms sleep + some execution overhead)
237237
// expected median latency: (150ms, 151ms>
238-
medianLatency, exists := results[string(MedianLatency)]
239-
assert.True(t, exists)
238+
resultsAsStrings := ResultsAs("string", []QueryExecutor{executor}, StandardQueryExecutor_Generator, string(MedianLatency), string(Percentile95Latency), string(ErrorRate))
239+
require.Equal(t, 3, len(resultsAsStrings))
240240

241-
medianLatencyFloat, err := strconv.ParseFloat(medianLatency[0], 64)
241+
medianLatencyFloat, err := strconv.ParseFloat(resultsAsStrings[string(MedianLatency)], 64)
242242
assert.NoError(t, err)
243243
require.InDelta(t, 151.0, medianLatencyFloat, 1.0)
244244

245-
p95Latency, exists := results[string(Percentile95Latency)]
246-
assert.True(t, exists)
247-
248245
// since we have 2-3 responses with 200-201ms latency, the 95th percentile should be (200ms, 201ms>
249-
p95LatencyFloat, err := strconv.ParseFloat(p95Latency[0], 64)
246+
p95LatencyFloat, err := strconv.ParseFloat(resultsAsStrings[string(Percentile95Latency)], 64)
250247
assert.NoError(t, err)
251248
require.InDelta(t, 201.0, p95LatencyFloat, 1.0)
252249

253-
errorRate, exists := results[string(ErrorRate)]
250+
errorRate, exists := resultsAsStrings[string(ErrorRate)]
254251
assert.True(t, exists)
255252

256253
// error rate is the number of failures divided by the total number of responses
257254
expectedErrorRate := float64(actualFailures) / (float64(fakeGun.maxSuccesses) + float64(actualFailures))
258-
assert.Equal(t, []string{fmt.Sprintf("%.4f", expectedErrorRate)}, errorRate)
255+
assert.Equal(t, fmt.Sprintf("%.4f", expectedErrorRate), errorRate)
259256
})
260257

261258
t.Run("all responses failed", func(t *testing.T) {
@@ -345,15 +342,15 @@ func TestBenchSpy_GeneratorQueryExecutor_MarshalJSON(t *testing.T) {
345342
},
346343
}
347344
original, _ := NewGeneratorQueryExecutor(gen)
348-
original.QueryResults["test"] = []string{"result"}
349-
original.QueryResults["test2"] = []string{"1", "2", "3"}
345+
original.QueryResults["test"] = "result"
346+
original.QueryResults["test2"] = "1"
350347

351348
original.Queries = map[string]GeneratorQueryFn{
352349
"test": func(responses *wasp.SliceBuffer[wasp.Response]) (string, error) {
353350
return "result", nil
354351
},
355352
"test2": func(responses *wasp.SliceBuffer[wasp.Response]) (string, error) {
356-
return "1,2,3", nil
353+
return "1", nil
357354
},
358355
}
359356

wasp/benchspy/loki.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ import (
1616

1717
func NewLokiQueryExecutor(queries map[string]string, lokiConfig *wasp.LokiConfig) *LokiQueryExecutor {
1818
return &LokiQueryExecutor{
19-
Kind: "loki",
19+
KindName: string(StandardQueryExecutor_Loki),
2020
Queries: queries,
2121
Config: lokiConfig,
22-
QueryResults: make(map[string][]string),
22+
QueryResults: make(map[string]interface{}),
2323
}
2424
}
2525

2626
type LokiQueryExecutor struct {
27-
Kind string `json:"kind"`
27+
KindName string `json:"kind"`
2828
// Test metrics
2929
StartTime time.Time `json:"start_time"`
3030
EndTime time.Time `json:"end_time"`
@@ -34,15 +34,19 @@ type LokiQueryExecutor struct {
3434
Queries map[string]string `json:"queries"`
3535
// Performance queries results
3636
// can be anything, avg RPS, amount of errors, 95th percentile of CPU utilization, etc
37-
QueryResults map[string][]string `json:"query_results"`
37+
QueryResults map[string]interface{} `json:"query_results"`
3838

3939
Config *wasp.LokiConfig `json:"-"`
4040
}
4141

42-
func (l *LokiQueryExecutor) Results() map[string][]string {
42+
func (l *LokiQueryExecutor) Results() map[string]interface{} {
4343
return l.QueryResults
4444
}
4545

46+
func (l *LokiQueryExecutor) Kind() string {
47+
return l.KindName
48+
}
49+
4650
func (l *LokiQueryExecutor) IsComparable(otherQueryExecutor QueryExecutor) error {
4751
otherType := reflect.TypeOf(otherQueryExecutor)
4852

@@ -65,16 +69,23 @@ func (l *LokiQueryExecutor) Validate() error {
6569
}
6670

6771
func (l *LokiQueryExecutor) Execute(ctx context.Context) error {
68-
splitAuth := strings.Split(l.Config.BasicAuth, ":")
6972
var basicAuth client.LokiBasicAuth
70-
if len(splitAuth) == 2 {
71-
basicAuth = client.LokiBasicAuth{
72-
Login: splitAuth[0],
73-
Password: splitAuth[1],
73+
74+
if l.Config == nil {
75+
return errors.New("loki config is missing. Please set it and try again")
76+
}
77+
78+
if l.Config.BasicAuth != "" {
79+
splitAuth := strings.Split(l.Config.BasicAuth, ":")
80+
if len(splitAuth) == 2 {
81+
basicAuth = client.LokiBasicAuth{
82+
Login: splitAuth[0],
83+
Password: splitAuth[1],
84+
}
7485
}
7586
}
7687

77-
l.QueryResults = make(map[string][]string)
88+
l.QueryResults = make(map[string]interface{})
7889
resultCh := make(chan map[string][]string, len(l.Queries))
7990
errGroup, errCtx := errgroup.WithContext(ctx)
8091

@@ -154,9 +165,9 @@ func (l *LokiQueryExecutor) TimeRange(start, end time.Time) {
154165

155166
func NewStandardMetricsLokiExecutor(lokiConfig *wasp.LokiConfig, testName, generatorName, branch, commit string, startTime, endTime time.Time) (*LokiQueryExecutor, error) {
156167
lq := &LokiQueryExecutor{
157-
Kind: "loki",
168+
KindName: string(StandardQueryExecutor_Loki),
158169
Config: lokiConfig,
159-
QueryResults: make(map[string][]string),
170+
QueryResults: make(map[string]interface{}),
160171
}
161172

162173
standardQueries, queryErr := lq.generateStandardQueries(testName, generatorName, branch, commit, startTime, endTime)

wasp/benchspy/loki_test.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,16 +193,16 @@ func TestBenchSpy_NewLokiQueryExecutor(t *testing.T) {
193193
}
194194

195195
executor := NewLokiQueryExecutor(queries, config)
196-
assert.Equal(t, "loki", executor.Kind)
196+
assert.Equal(t, "loki", executor.KindName)
197197
assert.Equal(t, queries, executor.Queries)
198198
assert.Equal(t, config, executor.Config)
199199
assert.NotNil(t, executor.QueryResults)
200200
}
201201

202202
func TestBenchSpy_LokiQueryExecutor_Results(t *testing.T) {
203203
executor := &LokiQueryExecutor{
204-
QueryResults: map[string][]string{
205-
"test": {"result1", "result2"},
204+
QueryResults: map[string]interface{}{
205+
"test": []string{"result1", "result2"},
206206
},
207207
}
208208
results := executor.Results()
@@ -211,13 +211,17 @@ func TestBenchSpy_LokiQueryExecutor_Results(t *testing.T) {
211211

212212
type anotherQueryExecutor struct{}
213213

214+
func (a *anotherQueryExecutor) Kind() string {
215+
return "another"
216+
}
217+
214218
func (a *anotherQueryExecutor) Validate() error {
215219
return nil
216220
}
217221
func (a *anotherQueryExecutor) Execute(_ context.Context) error {
218222
return nil
219223
}
220-
func (a *anotherQueryExecutor) Results() map[string][]string {
224+
func (a *anotherQueryExecutor) Results() map[string]interface{} {
221225
return nil
222226
}
223227
func (a *anotherQueryExecutor) IsComparable(_ QueryExecutor) error {
@@ -336,7 +340,11 @@ func TestBenchSpy_LokiQueryExecutor_Execute(t *testing.T) {
336340
err := executor.Execute(context.Background())
337341
assert.NoError(t, err)
338342
assert.Contains(t, executor.QueryResults, "test_query")
339-
assert.Equal(t, "Log message 1", executor.QueryResults["test_query"][0])
343+
344+
asStringSlice, ok := executor.QueryResults["test_query"].([]string)
345+
assert.True(t, ok)
346+
347+
assert.Equal(t, "Log message 1", asStringSlice[0])
340348
}
341349

342350
func TestBenchSpy_LokiQueryExecutor_TimeRange(t *testing.T) {
@@ -365,7 +373,7 @@ func TestBenchSpy_NewStandardMetricsLokiExecutor(t *testing.T) {
365373
executor, err := NewStandardMetricsLokiExecutor(config, testName, genName, branch, commit, start, end)
366374
assert.NoError(t, err)
367375
assert.NotNil(t, executor)
368-
assert.Equal(t, "loki", executor.Kind)
376+
assert.Equal(t, "loki", executor.KindName)
369377
assert.Len(t, executor.Queries, len(standardLoadMetrics))
370378
}
371379

0 commit comments

Comments
 (0)