Skip to content

Commit 229a21d

Browse files
authored
Fixes #74 (#75)
* Fixes #74 * add time parameter send nano time in the body * run finished after x seconds * run finished after x seconds
1 parent 46356f0 commit 229a21d

File tree

3 files changed

+63
-29
lines changed

3 files changed

+63
-29
lines changed

perfTest/cmd/commands.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var (
3232
maxLengthBytes string
3333
maxAge int
3434
maxSegmentSizeBytes string
35-
consumerOffest string
35+
consumerOffset string
3636
printStatsV bool
3737
rate int
3838
variableRate int
@@ -41,6 +41,7 @@ var (
4141
batchSize int
4242
exitOnError bool
4343
debugLogs bool
44+
runDuration int
4445
)
4546

4647
func init() {
@@ -58,14 +59,15 @@ func setupCli(baseCmd *cobra.Command) {
5859
baseCmd.PersistentFlags().IntVarP(&variableRate, "variable-rate", "", 0, "Variable rate to value")
5960
baseCmd.PersistentFlags().IntVarP(&variableBody, "variable-body", "", 0, "Variable body size")
6061
baseCmd.PersistentFlags().IntVarP(&fixedBody, "fixed-body", "", 0, "Body size")
62+
baseCmd.PersistentFlags().IntVarP(&runDuration, "time", "", 0, "Run Duration in seconds ( stop the test)")
6163
baseCmd.PersistentFlags().BoolVarP(&exitOnError, "exit-on-error", "", true, "Close the app in case of error")
6264
baseCmd.PersistentFlags().BoolVarP(&printStatsV, "print-stats", "", true, "Print stats")
6365
baseCmd.PersistentFlags().BoolVarP(&debugLogs, "debug-logs", "", false, "Enable debug logs")
6466
baseCmd.PersistentFlags().StringSliceVarP(&streams, "streams", "", []string{"perf-test-go"}, "Stream names")
6567
baseCmd.PersistentFlags().StringVarP(&maxLengthBytes, "max-length-bytes", "", "0", "Stream max length bytes, e.g. 10MB, 50GB, etc.")
6668
baseCmd.PersistentFlags().IntVarP(&maxAge, "max-age", "", 0, "Stream Age in hours, e.g. 1,2.. 24 , etc.")
6769
baseCmd.PersistentFlags().StringVarP(&maxSegmentSizeBytes, "stream-max-segment-size-bytes", "", "500MB", "Stream segment size bytes, e.g. 10MB, 1GB, etc.")
68-
baseCmd.PersistentFlags().StringVarP(&consumerOffest, "consumer-offset", "", "first", "Staring consuming, ex: first,last,next of number")
70+
baseCmd.PersistentFlags().StringVarP(&consumerOffset, "consumer-offset", "", "first", "Staring consuming, ex: first,last,next or random")
6971
baseCmd.AddCommand(versionCmd)
7072
baseCmd.AddCommand(newSilent())
7173
}

perfTest/cmd/silent.go

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"encoding/binary"
45
"fmt"
56
"github.com/rabbitmq/rabbitmq-stream-go-client/pkg/amqp"
67
"github.com/rabbitmq/rabbitmq-stream-go-client/pkg/ha"
@@ -45,6 +46,25 @@ var (
4546
simulEnvironment *stream.Environment
4647
)
4748

49+
func checkRunDuration() {
50+
if runDuration > 0 {
51+
start := time.Now()
52+
ticker := time.NewTicker(10 * time.Second)
53+
go func() {
54+
for {
55+
select {
56+
case _ = <-ticker.C:
57+
v := time.Now().Sub(start).Seconds()
58+
if v >= float64(runDuration) {
59+
logInfo("Stopping after %s seconds", runDuration)
60+
os.Exit(0)
61+
}
62+
}
63+
}
64+
}()
65+
}
66+
}
67+
4868
func printStats() {
4969
if printStatsV {
5070
start := time.Now()
@@ -54,20 +74,24 @@ func printStats() {
5474
select {
5575
case _ = <-ticker.C:
5676
v := time.Now().Sub(start).Milliseconds()
57-
start = time.Now()
5877

5978
PMessagesPerSecond := float64(atomic.LoadInt32(&publisherMessageCount)) / float64(v) * 1000
6079
CMessagesPerSecond := float64(atomic.LoadInt32(&consumerMessageCount)) / float64(v) * 1000
6180
ConfirmedMessagesPerSecond := float64(atomic.LoadInt32(&confirmedMessageCount)) / float64(v) * 1000
6281

63-
//if PMessagesPerSecond > 0 ||
64-
// ConfirmedMessagesPerSecond > 0 ||
65-
// CMessagesPerSecond > 0 ||
66-
// consumersCloseCount > 0 ||
67-
// publishErrors > 0 {
6882
logInfo("Published %8.2f msg/s | Confirmed %8.2f msg/s | Consumed %8.2f msg/s | Cons. closed %3v | Pub errors %3v | %3v | %3v | msg sent: %3v |",
6983
PMessagesPerSecond, ConfirmedMessagesPerSecond, CMessagesPerSecond, consumersCloseCount, publishErrors, decodeRate(), decodeBody(), atomic.LoadInt64(&messagesSent))
70-
//}
84+
}
85+
}
86+
87+
}()
88+
tickerReset := time.NewTicker(1 * time.Minute)
89+
go func() {
90+
for {
91+
select {
92+
case _ = <-tickerReset.C:
93+
start = time.Now()
94+
7195
atomic.SwapInt32(&publisherMessageCount, 0)
7296
atomic.SwapInt32(&consumerMessageCount, 0)
7397
atomic.SwapInt32(&confirmedMessageCount, 0)
@@ -141,12 +165,14 @@ func startSimulation() error {
141165
checkErr(err)
142166
}
143167
printStats()
168+
checkRunDuration()
144169

145170
return err
146171
}
147172

148173
func checkErr(err error) {
149174
if err != nil {
175+
logError("error: %s", err)
150176
if exitOnError {
151177
os.Exit(1)
152178
}
@@ -172,10 +198,6 @@ func initStreams() error {
172198
}
173199

174200
for _, streamName := range streams {
175-
streamMetadata, err := env.StreamMetaData(streamName)
176-
checkErr(err)
177-
logInfo("stream %s, meta data: %s", streamName, streamMetadata)
178-
179201
err = env.DeclareStream(
180202
streamName,
181203
stream.NewStreamOptions().
@@ -195,6 +217,11 @@ func initStreams() error {
195217
return err
196218
}
197219
}
220+
221+
streamMetadata, err := env.StreamMetaData(streamName)
222+
checkErr(err)
223+
logInfo("stream %s, meta data: %s", streamName, streamMetadata)
224+
198225
}
199226
logInfo("End Init streams :%s\n", streams)
200227
return env.Close()
@@ -240,27 +267,22 @@ func startPublisher(streamName string) error {
240267
handlePublishError(chPublishError)
241268

242269
var arr []message.StreamMessage
243-
var body string
270+
var body []byte
244271
for z := 0; z < batchSize; z++ {
245-
body = fmt.Sprintf("simul_message")
246272

247273
if fixedBody > 0 {
248-
body = ""
249-
for i := 0; i < fixedBody; i++ {
250-
body += "s"
251-
}
274+
body = make([]byte, fixedBody)
252275
} else {
253276
if variableBody > 0 {
254-
body = ""
255277
rand.Seed(time.Now().UnixNano())
256-
n := rand.Intn(variableBody)
257-
for i := 0; i < n; i++ {
258-
body += "s"
259-
}
278+
body = make([]byte, rand.Intn(variableBody))
260279
}
261280
}
262-
263-
arr = append(arr, amqp.NewMessage([]byte(body)))
281+
n := time.Now().UnixNano()
282+
var buff = make([]byte, 8)
283+
binary.BigEndian.PutUint64(buff, uint64(n))
284+
msg := amqp.NewMessage(append(buff, body...))
285+
arr = append(arr, msg)
264286
}
265287

266288
go func(prod *ha.ReliableProducer, messages []message.StreamMessage) {
@@ -335,18 +357,28 @@ func handleConsumerClose(channelClose stream.ChannelClose) {
335357
func startConsumer(consumerName string, streamName string) error {
336358

337359
handleMessages := func(consumerContext stream.ConsumerContext, message *amqp.Message) {
338-
//logError("consumerMessageCount StoreOffset: %s", consumerMessageCount)
339360
atomic.AddInt32(&consumerMessageCount, 1)
340361

341362
}
342363
offsetSpec := stream.OffsetSpecification{}.Last()
343-
switch consumerOffest {
364+
switch consumerOffset {
344365
case "last":
345366
offsetSpec = stream.OffsetSpecification{}.Last()
346367
case "first":
347368
offsetSpec = stream.OffsetSpecification{}.First()
348369
case "next":
349370
offsetSpec = stream.OffsetSpecification{}.Next()
371+
case "random":
372+
rand.Seed(time.Now().UnixNano())
373+
n := rand.Intn(3)
374+
switch n {
375+
case 0:
376+
offsetSpec = stream.OffsetSpecification{}.First()
377+
case 1:
378+
offsetSpec = stream.OffsetSpecification{}.Next()
379+
case 2:
380+
offsetSpec = stream.OffsetSpecification{}.Last()
381+
}
350382
}
351383

352384
logInfo("Starting consumer number: %s, form %s", consumerName, offsetSpec)

pkg/stream/brokers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ type StreamMetadata struct {
138138
func (sm StreamMetadata) String() string {
139139
replicas := ""
140140
for _, replica := range sm.Replicas {
141-
replicas += fmt.Sprintf("%s:%s", replica.Host, replica.Port)
141+
replicas += fmt.Sprintf(" - %s:%s", replica.Host, replica.Port)
142142
}
143143
return fmt.Sprintf("leader %s:%s, followers %s ", sm.Leader.Host, sm.Leader.Port, replicas)
144144
}

0 commit comments

Comments
 (0)