Skip to content

Commit 1c9d5ca

Browse files
committed
Measure router performance
1 parent e8be734 commit 1c9d5ca

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package eventrouter_test
2+
3+
import (
4+
"github.com/cloudfoundry-community/splunk-firehose-nozzle/cache"
5+
"github.com/cloudfoundry-community/splunk-firehose-nozzle/eventrouter"
6+
"github.com/cloudfoundry/sonde-go/events"
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
9+
)
10+
11+
const (
12+
messagesPerRun = 100 * 1000
13+
runs = 10
14+
)
15+
16+
var _ = Describe("eventrouter", func() {
17+
var router eventrouter.Router
18+
var sink *devNullSink
19+
20+
JustBeforeEach(func() {
21+
cache := nullCache{}
22+
sink = &devNullSink{}
23+
config := &eventrouter.Config{
24+
SelectedEvents: "LogMessage,HttpStart,HttpStop,HttpStartStop,ValueMetric,CounterEvent,Error,ContainerMetric",
25+
}
26+
var err error
27+
router, err = eventrouter.New(cache, sink, config)
28+
Expect(err).NotTo(HaveOccurred())
29+
})
30+
Measure("through-put", func(b Benchmarker) {
31+
runtime := b.Time("route", func() {
32+
err := pushMessages(router, messagesPerRun)
33+
Expect(err).NotTo(HaveOccurred())
34+
Expect(sink.msgs).To(Equal(messagesPerRun))
35+
})
36+
37+
b.RecordValue("routed messages per micro second", float64(messagesPerRun)/runtime.Seconds()/float64(1000))
38+
}, runs)
39+
})
40+
41+
func pushMessages(r eventrouter.Router, nrOfMsgs int) error {
42+
events := make(chan *events.Envelope, 10)
43+
stop := make(chan struct{})
44+
45+
defer func() { close(stop) }()
46+
47+
go eventGenerator(nrOfMsgs, events, stop)
48+
49+
for msg := range events {
50+
err := r.Route(msg)
51+
if err != nil {
52+
return err
53+
}
54+
}
55+
56+
return nil
57+
}
58+
59+
func eventGenerator(count int, ch chan *events.Envelope, stop chan struct{}) {
60+
defer func() { close(ch) }()
61+
62+
for i := 0; i < count; i++ {
63+
select {
64+
case <-stop:
65+
return
66+
default:
67+
ch <- &events.Envelope{
68+
Deployment: p("some deployment"),
69+
Origin: p("some origin"),
70+
}
71+
}
72+
}
73+
}
74+
75+
func p(s string) *string {
76+
return &s
77+
}
78+
79+
type devNullSink struct {
80+
msgs int
81+
}
82+
83+
func (s *devNullSink) Open() error { return nil }
84+
func (s *devNullSink) Close() error { return nil }
85+
func (s *devNullSink) Write(fields map[string]interface{}, msg string) error {
86+
s.msgs += 1
87+
return nil
88+
}
89+
90+
type nullCache struct{}
91+
92+
func (nullCache) Open() error { return nil }
93+
func (nullCache) Close() error { return nil }
94+
func (nullCache) GetAllApps() (map[string]*cache.App, error) { return map[string]*cache.App{}, nil }
95+
func (nullCache) GetApp(string) (*cache.App, error) { return &cache.App{}, nil }

0 commit comments

Comments
 (0)