Giter VIP home page Giter VIP logo

rabtap's Issues

Feature Request: Terminate after all messages are consumed from queue

I like to use rabtap to consume all messages from a DeadLetter/ParkinLot queue to inspect them and later maybe re-publish them.

Currently rabtap seem to continue to consume message from given queue without ever terminating ( unless I hit Ctrl-C ).

Would be nice if rabtap would terminate ( after a given timeout ) when no more messages where consumed from given queue.

How to escape special characters in password

Hi,

Rabtab 1.38.2 on Windows 11. I have a password with a few special characters which I am trying to pass to rabtap's --uri. Any idea how to escape it? I have tried % escape to no avail.

rabtap.exe --uri="amqps://myuser:AB(cdfeJp7z^E0..,@mydomain:5671" queue create test_queue -kv
time="2023-08-28T09:59:31+02:00" level=fatal msg="failed to parse AMQP URL: parse "amqps://myuser:AB(cdfeJp7z^E0..,@my domain:5671": net/url: invalid userinfo"

Cheers
Sébastien

Toggle console output

It would be nice if it were possible to not show any output to console windows.
If you are tapping a high frequency exchange, the console slows down the saving of the messages as json files by quite a bit.

Allow ':' in exchange name

When tapping exchanges, ':' is used as a separator. Unfortunately, I'm using a framework (MassTransit) that creates exchanges with ':' in them (it uses type URNs for bindings), and it doesn't look like there's any way to escape it, since the code just uses a split.

Is it possible to provide some way to tap exchanges that include a ':'? Perhaps allow some kind of escaping? Ideally, a different character should be used for separating exchange and key, the AQMP spec (https://www.rabbitmq.com/amqp-0-9-1-reference.html) says:

The exchange name consists of a non-empty sequence of these characters: letters, digits, hyphen, underscore, period, or colon.

So there are plenty of other options. Of course, this would break existing scripts which is far from ideal.

Thanks!

Feature Request: Terminate when all messages from file(s) where published

I like to use rabtap to publish all messages from given JSON files via selected exchange/routing-key.

Currently rabtap seem to stay connect to AMQP server after all selected messages from the selected files have been published ( unless I hit Ctrl-C ).

Would be nice if rabtap would terminate after all messages from selected files have been published.

go 1.16+ is required to build from sources

I tried to build rabtap in Astra Linux which has golang 1.15.0 in repos and failed with error:

github.com/rabbitmq/amqp091-go
/home/username/go/pkg/mod/github.com/rabbitmq/[email protected]/connection.go:919:16: undefined: os.ReadFile
note: module requires Go 1.16

So I'm suggesting to update ReadMe.md as go 1.12 requirement is listed there.

Enhancement: To allow run 'rabtap tap' as a background process (with a switch parameter). So that other commands in the same script can continue without going in the taps 'listening' mode.

Often in our system tests, there are multiple steps involved including publishing, tapping multiple exchanges, sorting, comparing etc all.

To be able to do all these steps in say a PowerShell script, without going in the 'tap mode', I have to tap the exchanges using background jobs (start-job). Later I do a (receive-job) to get the data from these jobs to say an output file.

Is it possible to give background-processing as an option in the tap command? So that when this flag is selected, we can continue with the next steps in the current script without having to create these jobs (for tap commands). This would add more readability to the code and is a day to day use case in a system test scenario with more commands in same script (doing publish, multiple exchange taps and other operations for say sort/compare etc).

P.S: I know there are workaround like (start-job and start-process) to achieve this but having this as a part of the command parameter, would be awesome!

Dont know if that is possible though?

Using wrong exchange name doesn't result in any error/warning message when publishing message

Using rabtap v1.27 to publish a message with the command like below.
The raptap output doesn't indicate whether publishing was actually successful, i.e. it states that message got published
while RabbitMQ states an error because the used exchange is unknown.

$ RABTAP_AMQPURI=amqp://guest:guest@localhost:5672/
$ RABTAP_APIURI=http://guest:guest@localhost:15672/api
$ rabtap --verbose pub --exchange non_existing_exchange --routingkey foo --format json rabtap-1628256743950000000.json
INFO[0000] waiting for new session ...
INFO[0000] sleeping for 0s
DEBUG[0000] publishing message to exchange 'non_existing_exchange' with routing key 'foo'
INFO[0000] got new amqp session ...
INFO[0000] publishing channel closed.
INFO[0000] session: shutting down factory (cancel)

While RabbitMQ server indicates an error on its console output regarding an unknown exchange:

rabbitmq              | 2021-08-06 13:39:44.940 [info] <0.2930.0> accepting AMQP connection <0.2930.0> (172.21.0.1:62628 -> 172.21.0.3:5672)
rabbitmq              | 2021-08-06 13:39:44.947 [info] <0.2930.0> connection <0.2930.0> (172.21.0.1:62628 -> 172.21.0.3:5672): user 'guest' authenticated and granted access to vhost '/'
rabbitmq              | 2021-08-06 13:39:44.951 [error] <0.2939.0> Channel error on connection <0.2930.0> (172.21.0.1:62628 -> 172.21.0.3:5672, vhost: '/', user: 'guest'), channel 1:
rabbitmq              | operation basic.publish caused a channel exception not_found: no exchange 'non_existing_exchange' in vhost '/'
rabbitmq              | 2021-08-06 13:39:44.953 [warning] <0.2930.0> closing AMQP connection <0.2930.0> (172.21.0.1:62628 -> 172.21.0.3:5672, vhost: '/', user: 'guest'):
rabbitmq              | client unexpectedly closed TCP connection

Any interest in extending rabtap to be able to use S3?

This is an awesome tool. Many thanks @jandelgado !

I've been roped into performance testing a new product which will require a ton of data in order to address all of our test scenarios. S3 would be the best solution for me for storage and playback.

I would be happy to fork and generate a PR that performs the same as the directory option works today for S3.

Go is not a core capability at my company and I can't saddle our teams with a codebase outside of their skillset, so I would only do this if there was interest in accepting the PR (assuming good quality etc). Otherwise, I'll put rabtap in a pipeline controlled by a node or python app.

How to specify a virtual host?

Hi, thanks for developing this tool.

I have a project where I'm working with multiple RabbitMQ virtual hosts and I would like to tap to a specified exchange in a virtual host other than the default '/'. Does this tool support it?

Currently trying to tap gives following errors:

ERRO[0000] Exception (404) Reason: "NOT_FOUND - no exchange 'messages' in vhost '/'"

Which is because the exchange messages is located in vhost /interface.

Feature request: Allow replay from `--saveto` directory

I'm working on a project that exchanges ProtoBuf serialized messages. By default rabtap dumps the binary to stdout and messes up my terminal. I see redirection rabtap ... > /dev/null is a workaround for this. I would be glad if the stdout can be turned off and keeps --saveto option.

EDIT:
Change the title for more clarification.

PowerShell: First publish lost and for subsequent publishes missing end brackets '}' when using PowerShell to receive output

Summary:
I am using PowerShell to create jobs to set up the taps.
Then I publish messages and receive job output.

So, If I have three files to iterate from a folder to publish messages; What I see is that:

  1. First files messages are "Lost"
  2. Second files messages are "Received" but with a missing "}" for the last JSON msg.
  3. Third (and subsequent) file, starts with "}{" and the last line misses "}"

Note that this is not an issue when I run another PowerShell instance to Set up a tap and receive the output (i.e. only happens when I use the job mechanism). Due to this, I am not sure if this is entirely a PowerShell issue or something that you can fix in rabtap? In any case, I bring this to your notice so that you can try it at your end and atleast are aware of this issue. If something can be done to fix this, that would ofcourse be awesome!

Steps:
The code that I am using is as below:

Step01: Set up tap using PowerShell jobs

$pingblockForRawMessagesTap = {
rabtap tap "Name.A.B.MyGateway:GatewayMessage:" --json
}

    Start-Job $pingblockForRawMessagesTap -Name tapGatewayMsg

Step02: Publish messages by reading JSON files.

Get-Content $inputMessages | rabtap pub Name.A.B.MyGateway:GatewayMessage --json

Step03: Receive output

Receive-Job -Name tapGatewayMsg | Out-File $outputRawMessages

#Output of the first file will be lost. Second have a missing '}' in end. and the next file starts as '}{' with each file missing '{' in the last line.

rabtap info: runtime: goroutine stack exceeds 1000000000-byte limit

Hi, it looks like on bigger cluster rabtap info crash (both variant - text in dot format)
rabtap v1.22

in our cluster is 475 exchanges and 551 queues

I tried filter command (like --filter "queue.Consumers > 30") but it doesn't help.

stacktrace example:

rabtap info --show-default -k --format dot
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x85df9a, 0xe)
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/panic.go:617 +0x72
runtime.newstack()
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/stack.go:1041 +0x6f0
runtime.morestack()
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/asm_amd64.s:429 +0x8f

goroutine 1 [running]:
runtime.heapBitsSetType(0xc01a506450, 0x10, 0x10, 0x804c60)
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/mbitmap.go:938 +0xa56 fp=0xc028000348 sp=0xc028000340 pc=0x415cd6
runtime.mallocgc(0x10, 0x804c60, 0x1, 0x0)
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/malloc.go:969 +0x51c fp=0xc0280003e8 sp=0xc028000348 pc=0x40ba1c
runtime.newobject(0x804c60, 0x0)
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/malloc.go:1068 +0x38 fp=0xc028000418 sp=0xc0280003e8 pc=0x40c078
github.com/Knetic/govaluate.EvaluableExpression.Eval(0x8665b3, 0x22, 0x1, 0xc000176d80, 0x1, 0x1, 0xc0000a9810, 0xc00002618b, 0x4, 0x8e8fc0, ...)
	/home/travis/gopath/pkg/mod/github.com/!knetic/[email protected]/EvaluableExpression.go:158 +0x10d fp=0xc0280004a8 sp=0xc028000418 pc=0x75972d
github.com/Knetic/govaluate.EvaluableExpression.Evaluate(0x8665b3, 0x22, 0x1, 0xc000176d80, 0x1, 0x1, 0xc0000a9810, 0xc00002618b, 0x4, 0xc0185bcc90, ...)
	/home/travis/gopath/pkg/mod/github.com/!knetic/[email protected]/EvaluableExpression.go:137 +0x8b fp=0xc028000530 sp=0xc0280004a8 pc=0x75953b
main.PredicateExpression.Eval(0xc0000a97c0, 0xc0185bcc90, 0xc028000690, 0xc0185b5ce0, 0xc018609e60)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/predicate.go:44 +0xb8 fp=0xc0280005f8 sp=0xc028000530 pc=0x77fa38
main.(*PredicateExpression).Eval(0xc0001a60b8, 0xc0185bcc90, 0x85c070, 0x8, 0xc018609f08)
	<autogenerated>:1 +0x46 fp=0xc028000630 sp=0xc0280005f8 pc=0x784016
main.defaultBrokerInfoTreeBuilder.shouldDisplayQueue(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:144 +0x270 fp=0xc0280008f0 sp=0xc028000630 pc=0x76faf0
main.defaultBrokerInfoTreeBuilder.createQueueNodeFromBinding(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc000248990, 0xf, 0xc000248986, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:199 +0x1e0 fp=0xc028001038 sp=0xc0280008f0 pc=0x7705b0
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:237 +0x3d1 fp=0xc0280014f8 sp=0xc028001038 pc=0x770d41
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280019b8 sp=0xc0280014f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028001e78 sp=0xc0280019b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028002338 sp=0xc028001e78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280027f8 sp=0xc028002338 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028002cb8 sp=0xc0280027f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028003178 sp=0xc028002cb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028003638 sp=0xc028003178 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028003af8 sp=0xc028003638 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028003fb8 sp=0xc028003af8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028004478 sp=0xc028003fb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028004938 sp=0xc028004478 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028004df8 sp=0xc028004938 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280052b8 sp=0xc028004df8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028005778 sp=0xc0280052b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028005c38 sp=0xc028005778 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280060f8 sp=0xc028005c38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280065b8 sp=0xc0280060f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028006a78 sp=0xc0280065b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028006f38 sp=0xc028006a78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280073f8 sp=0xc028006f38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280078b8 sp=0xc0280073f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028007d78 sp=0xc0280078b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028008238 sp=0xc028007d78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280086f8 sp=0xc028008238 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028008bb8 sp=0xc0280086f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028009078 sp=0xc028008bb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028009538 sp=0xc028009078 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280099f8 sp=0xc028009538 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028009eb8 sp=0xc0280099f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800a378 sp=0xc028009eb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800a838 sp=0xc02800a378 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800acf8 sp=0xc02800a838 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800b1b8 sp=0xc02800acf8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800b678 sp=0xc02800b1b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800bb38 sp=0xc02800b678 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800bff8 sp=0xc02800bb38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800c4b8 sp=0xc02800bff8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800c978 sp=0xc02800c4b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800ce38 sp=0xc02800c978 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800d2f8 sp=0xc02800ce38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800d7b8 sp=0xc02800d2f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800dc78 sp=0xc02800d7b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800e138 sp=0xc02800dc78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800e5f8 sp=0xc02800e138 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800eab8 sp=0xc02800e5f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800ef78 sp=0xc02800eab8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800f438 sp=0xc02800ef78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800f8f8 sp=0xc02800f438 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02800fdb8 sp=0xc02800f8f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028010278 sp=0xc02800fdb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028010738 sp=0xc028010278 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028010bf8 sp=0xc028010738 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280110b8 sp=0xc028010bf8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028011578 sp=0xc0280110b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028011a38 sp=0xc028011578 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028011ef8 sp=0xc028011a38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280123b8 sp=0xc028011ef8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028012878 sp=0xc0280123b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028012d38 sp=0xc028012878 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280131f8 sp=0xc028012d38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280136b8 sp=0xc0280131f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028013b78 sp=0xc0280136b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028014038 sp=0xc028013b78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280144f8 sp=0xc028014038 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280149b8 sp=0xc0280144f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028014e78 sp=0xc0280149b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028015338 sp=0xc028014e78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280157f8 sp=0xc028015338 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028015cb8 sp=0xc0280157f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028016178 sp=0xc028015cb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028016638 sp=0xc028016178 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028016af8 sp=0xc028016638 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028016fb8 sp=0xc028016af8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028017478 sp=0xc028016fb8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028017938 sp=0xc028017478 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028017df8 sp=0xc028017938 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280182b8 sp=0xc028017df8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028018778 sp=0xc0280182b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028018c38 sp=0xc028018778 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280190f8 sp=0xc028018c38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc0280195b8 sp=0xc0280190f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028019a78 sp=0xc0280195b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc028019f38 sp=0xc028019a78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801a3f8 sp=0xc028019f38 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801a8b8 sp=0xc02801a3f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801ad78 sp=0xc02801a8b8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801b238 sp=0xc02801ad78 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801b6f8 sp=0xc02801b238 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801bbb8 sp=0xc02801b6f8 pc=0x770eaa
main.defaultBrokerInfoTreeBuilder.createExchangeNode(0xc000024371, 0xa, 0x1, 0x8e8720, 0xc0001a60b8, 0x0, 0xc0001a0360, 0xf, 0xc0001a0350, 0x7, ...)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/broker_info_tree_builder.go:231 +0x53a fp=0xc02801c078 sp=0xc02801bbb8 pc=0x770eaa
...additional frames elided...

goroutine 5 [syscall]:
os/signal.signal_recv(0x0)
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/runtime/sigqueue.go:139 +0x9c
os/signal.loop()
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/os/signal/signal_unix.go:23 +0x22
created by os/signal.init.0
	/home/travis/.gimme/versions/go1.12.16.linux.amd64/src/os/signal/signal_unix.go:29 +0x41

goroutine 7 [select]:
main.main.func2(0xc00001f4a0, 0xc0001a2700, 0x8ef960, 0xc0001a4300)
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/main.go:219 +0xb7
created by main.main
	/home/travis/gopath/src/github.com/jandelgado/rabtap/cmd/rabtap/main.go:218 +0x3a9

Replay a directory

A feature I would find useful would be to "replay" all the messages recorded in a directory at a speed comparable to their original. I could build this on top of rabtap by using a shell script or a Python script to examine the messages and the .json metadata files, but a built-in facility would be convenient.

It could look something like the following:

rabtap replay <directoryName> [--speed=1x]

where directoryName would be a directory containing previously recorded messages and their metadata. The speed parameter would specify how fast to replay the messages and would require that the timestamp had been added when the messages were originally sent. (Or the recording could be modified to automatically add a current timestamp as an option.) If no timestamps are present the replay would always be "as fast as possible".

The default speed of 1x would replay at real time as follows. The first message would be sent immediately and its timestamp would then be matched with the current timestamp. For all subsequent messages we would compute the duration between the timestamp and the first timestamp, add that duration to our starting timestamp, and pause until that time is reached. 2x, 3x, and so on (including 0.5x and other <1 numbers) would modify the duration appropriately. A value of "max" or perhaps "99x" or something similar would be used to indicate "as fast as possible", i.e. publish as soon as read.

The exchange and routing key for each message would by default be the same as when it was recorded, but could be overridden via the command line.

The idea of this feature is to allow a significant recording over time to be replayed in a manner similar to the original. This is useful for:

  1. assisting developers to make changes for their components without having to have full end-to-end installations in place
  2. allowing recordings to be used for automated testing
  3. allowing recordings to be used for performance testing (i.e. can our new version keep up with the rates of the old version).

If this is deemed useful, our software team may be willing to perform the work.

How to specify authentication mechanism

The server is configured with tls enabled, then try to publish:

echo hello | ./rabtap pub --uri=amqps://admin:[email protected]:30047/ --exchange=amq.direct --routingkey=test \
                      --tls-ca-file=... \
                      --tls-cert-file=... \
                      --tls-key-file=...

error:

ERROR[0000] session: cannot (re-)dial: Exception (403) Reason: "SASL could not negotiate a shared mechanism": "amqps://admin:[email protected]:30047/" 
ERROR[0000] publish: session factory closed 

Is it possible to tap queue on default exchange?

When attempting to run rabtap tap -v "":<my queue name>. I receive

INFO[0000] waiting for new session ...
INFO[0000] got new session ...
INFO[0000] tap: bind to exchange  failed with Exception (403) Reason: "ACCESS_REFUSED - operation not permitted on the default exchange"
INFO[0000] delete exchange: <nil>
DEBUG[0000] subscribe: cancel
INFO[0000] session: shutting down factory (cancel)
ERROR[0000] tap failed with Exception (403) Reason: "ACCESS_REFUSED - operation not permitted on the default exchange

I believe the issue may be we are trying to bind the queue to the default exchange. Am I completely misunderstanding? I am new to rabbit so any help would be appreciated.

Also let me know if I can assist in anyway.

Timestamp is never set

Am I missing something or when I use tap mode the Timestamp is never set:

{
"ContentType": "application/json",
"ContentEncoding": "UTF-8",
"DeliveryMode": 0,
"Priority": 0,
"CorrelationID": "",
"ReplyTo": "",
"Expiration": "1296000000",
"MessageID": "",
"Timestamp": "0001-01-01T00:00:00Z",
"Type": "",
"UserID": "",
"AppID": "",
"DeliveryTag": 6,
"Redelivered": false,
"Exchange": "some_exchange",
"RoutingKey": "sdn.all"
}

Feature: push messages directly to a queue

I'd really love it if there were some type of rabtap send functionality, where we could push messages directly from a queue instead of to an exchange. Basically the reverse of the very nice rabtap sub. Apologies if this is already there, I've checked the docs but couldn't find anything.

Thanks!

Feature Request: Limit number of messages consumed

Thanks for this really useful tool!
I'd like to be able to consume n messages per invocation.
Additionally I'd like to be able to use the --delay option when consuming to limit the rate at which messages are consumed.

eg rabtap sub somequeue --limit 10 --delay 30s would consume 1 message every 30s until 10 messages had been consumed.

Is this something you might consider implementing?
Thanks!

rabtap info fails

> rabtap info --verbose --api <URL>/api

ERROR[0001] failed retrieving info from rabbitmq REST api: json: cannot unmarshal string into Go struct field RabbitConsumer.channel_details of type int
> rabtap --version

v1.24

go get: installing executables with 'go get' in module mode is deprecated.

Maybe install command should be:

go install github.com/jandelgado/rabtap/cmd/rabtap@latest

Not sure about GO111MODULE though

$ GO111MODULE=on go get github.com/jandelgado/rabtap/cmd/rabtap
go get: installing executables with 'go get' in module mode is deprecated.
	Use 'go install pkg@version' instead.
	For more information, see https://golang.org/doc/go-get-install-deprecation
	or run 'go help get' or 'go help install'.

AUR package

Hey,

FYI - I've created an AUR package for rabtap https://aur.archlinux.org/packages/rabtap-bin/
It can be installed on Arch-like systems using one of the AUR clients (eg. yay).

If you want to you can add this to the installation guides. If not, feel free to close this issue :)

Non-beautified JSON output

For automation & further processing of messages it's somewhat annoying that the JSON-formatted output is beautified. Therefore you can't parse rabtap's output line by line. You need to assemble the whole output line by line until the JSON message is completed.

It would be awesome if there would be a flag to disable beautification of the JSON-output (or to opt-in to it).

Publish a Docker image?

It would be awesome to have rabtap available as a Docker image. I don't know if it's better to run a Go build inside the Dockerfile or just to download/extract the prebuilt binary.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.