1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add ActiveSupport::Notifications hook to Broadcaster#broadcast

This addition of this notification hook will give users better visibility
into the messages being sent over the PubSub adapter.
This commit is contained in:
Matthew Wear 2016-05-11 16:55:17 -07:00
parent 537a342a83
commit f3ba0c1dd3
3 changed files with 58 additions and 6 deletions

View file

@ -1,2 +1,5 @@
* Add ActiveSupport::Notifications hook to Broadcaster#broadcast
*Matthew Wear*
Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/actioncable/CHANGELOG.md) for previous changes. Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/actioncable/CHANGELOG.md) for previous changes.

View file

@ -39,8 +39,12 @@ module ActionCable
def broadcast(message) def broadcast(message)
server.logger.info "[ActionCable] Broadcasting to #{broadcasting}: #{message.inspect}" server.logger.info "[ActionCable] Broadcasting to #{broadcasting}: #{message.inspect}"
encoded = coder ? coder.encode(message) : message
server.pubsub.broadcast broadcasting, encoded payload = { broadcasting: broadcasting, message: message, coder: coder }
ActiveSupport::Notifications.instrument("broadcast.action_cable", payload) do
encoded = coder ? coder.encode(message) : message
server.pubsub.broadcast broadcasting, encoded
end
end end
end end
end end

View file

@ -1,10 +1,7 @@
require "test_helper" require "test_helper"
require "stubs/test_server"
class BroadcastingTest < ActiveSupport::TestCase class BroadcastingTest < ActiveSupport::TestCase
class TestServer
include ActionCable::Server::Broadcasting
end
test "fetching a broadcaster converts the broadcasting queue to a string" do test "fetching a broadcaster converts the broadcasting queue to a string" do
broadcasting = :test_queue broadcasting = :test_queue
server = TestServer.new server = TestServer.new
@ -12,4 +9,52 @@ class BroadcastingTest < ActiveSupport::TestCase
assert_equal "test_queue", broadcaster.broadcasting assert_equal "test_queue", broadcaster.broadcasting
end end
test "broadcast generates notification" do
begin
server = TestServer.new
events = []
ActiveSupport::Notifications.subscribe "broadcast.action_cable" do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end
broadcasting = "test_queue"
message = { body: "test message" }
server.broadcast(broadcasting, message)
assert_equal 1, events.length
assert_equal "broadcast.action_cable", events[0].name
assert_equal broadcasting, events[0].payload[:broadcasting]
assert_equal message, events[0].payload[:message]
assert_equal ActiveSupport::JSON, events[0].payload[:coder]
ensure
ActiveSupport::Notifications.unsubscribe "broadcast.action_cable"
end
end
test "broadcaster from broadcaster_for generates notification" do
begin
server = TestServer.new
events = []
ActiveSupport::Notifications.subscribe "broadcast.action_cable" do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end
broadcasting = "test_queue"
message = { body: "test message" }
broadcaster = server.broadcaster_for(broadcasting)
broadcaster.broadcast(message)
assert_equal 1, events.length
assert_equal "broadcast.action_cable", events[0].name
assert_equal broadcasting, events[0].payload[:broadcasting]
assert_equal message, events[0].payload[:message]
assert_equal ActiveSupport::JSON, events[0].payload[:coder]
ensure
ActiveSupport::Notifications.unsubscribe "broadcast.action_cable"
end
end
end end