Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions pkg/eventfilter/benchmarks/attributes_benchmark_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
Copyright 2020 The Knative Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package benchmarks

import (
"testing"

cetest "github.com/cloudevents/sdk-go/v2/test"

"knative.dev/eventing/pkg/eventfilter"
"knative.dev/eventing/pkg/eventfilter/attributes"
)

func BenchmarkAttributesFilter(b *testing.B) {
event := cetest.FullEvent()

RunFilterBenchmarks(b,
func(i interface{}) eventfilter.Filter {
return attributes.NewAttributesFilter(i.(map[string]string))
},
FilterBenchmark{
name: "Pass with exact match of id",
arg: map[string]string{"id": event.ID()},
event: event,
},
FilterBenchmark{
// We don't test time because the exact match on the string apparently doesn't work well,
// which might cause the filter to fail.
name: "Pass with exact match of all context attributes (except time)",
arg: map[string]string{
"id": event.ID(),
"source": event.Source(),
"type": event.Type(),
"dataschema": event.DataSchema(),
"datacontenttype": event.DataContentType(),
"subject": event.Subject(),
},
event: event,
},
FilterBenchmark{
name: "No pass with exact match of id and source",
arg: map[string]string{
"id": "qwertyuiopasdfghjklzxcvbnm",
"source": "qwertyuiopasdfghjklzxcvbnm",
},
event: event,
},
)
}
56 changes: 56 additions & 0 deletions pkg/eventfilter/benchmarks/common_benchmark_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
Copyright 2020 The Knative Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package benchmarks

import (
"context"
"testing"

cloudevents "github.com/cloudevents/sdk-go/v2"

"knative.dev/eventing/pkg/eventfilter"
)

type FilterBenchmark struct {
name string
arg interface{}
event cloudevents.Event
}

// Avoid DCE
var Filter eventfilter.Filter
var Result eventfilter.FilterResult
Comment on lines +35 to +36
Copy link
Copy Markdown
Member

@pierDipi pierDipi Nov 12, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should rename those types, the usage it's unreadable, too many filter.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which names do you propose?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIUC, these are just to avoid DCE. So the variables are really not designed to be used. I would suggest to use lower case if I want to be picky. Also sth like filterForNoDCE.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be 100% you exclude DCE, you need variables to be exported

Copy link
Copy Markdown
Member

@pierDipi pierDipi Nov 12, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant package.type not variable names.

trigger.Filter
trigger.FilterResult

wdyt?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or filter.Interface and filter.Result

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And where should this trigger module should live? Under eventing/pkg/trigger? Not sure, to me eventfilter, although it's repeated a couple of times, sounds like a good name (and note, this code is not specific at all to trigger, in fact at some point it was even discussed to implement filters at source level)


// RunFilterBenchmarks executes 2 benchmark runs for each of the provided bench cases:
// 1. "Creation: ..." benchmark measures the time/mem to create the filter, given the filter constructor and the argument
// 2. "Run: ..." benchmark measures the time/mem to execute the filter, given a pre-built filter instance and the provided event
func RunFilterBenchmarks(b *testing.B, filterCtor func(interface{}) eventfilter.Filter, filterBenchmarks ...FilterBenchmark) {
for _, fb := range filterBenchmarks {
b.Run("Creation: "+fb.name, func(b *testing.B) {
for i := 0; i < b.N; i++ {
Filter = filterCtor(fb.arg)
}
})
// Filter to use for the run
f := filterCtor(fb.arg)
b.Run("Run: "+fb.name, func(b *testing.B) {
for i := 0; i < b.N; i++ {
Result = f.Filter(context.TODO(), fb.event)
}
})
}
}