Skip to content

Commit

Permalink
Merge pull request #309 from appsignal/action_cable-support-reworked
Browse files Browse the repository at this point in the history
Add ActionCable support
  • Loading branch information
thijsc authored Jun 15, 2017
2 parents 27c6e7d + ca8e55d commit b46be6b
Show file tree
Hide file tree
Showing 6 changed files with 490 additions and 1 deletion.
1 change: 1 addition & 0 deletions lib/appsignal/hooks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ def extract_value(object_or_hash, field, default_value = nil, convert_to_s = fal
end
end

require "appsignal/hooks/action_cable"
require "appsignal/hooks/active_support_notifications"
require "appsignal/hooks/celluloid"
require "appsignal/hooks/delayed_job"
Expand Down
113 changes: 113 additions & 0 deletions lib/appsignal/hooks/action_cable.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
module Appsignal
class Hooks
# @api private
class ActionCableHook < Appsignal::Hooks::Hook
register :action_cable

REQUEST_ID = "_appsignal_action_cable.request_id".freeze

def dependencies_present?
defined?(::ActiveSupport::Notifications::Instrumenter) &&
defined?(::ActionCable)
end

def install
patch_perform_action
install_callbacks
end

private

def patch_perform_action
ActionCable::Channel::Base.class_eval do
alias_method :original_perform_action, :perform_action

def perform_action(*args, &block)
# The request is only the original websocket request
env = connection.env
request = ActionDispatch::Request.new(env)
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID] ||=
request.request_id || SecureRandom.uuid

transaction = Appsignal::Transaction.create(
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID],
Appsignal::Transaction::ACTION_CABLE,
request
)

begin
original_perform_action(*args, &block)
rescue => exception
transaction.set_error(exception)
raise exception
ensure
transaction.params = args.first
transaction.set_action_if_nil("#{self.class}##{args.first["action"]}")
transaction.set_metadata("path", request.path)
transaction.set_metadata("method", "websocket")
Appsignal::Transaction.complete_current!
end
end
end
end

def install_callbacks
ActionCable::Channel::Base.set_callback :subscribe, :around, :prepend => true do |channel, inner|
# The request is only the original websocket request
env = channel.connection.env
request = ActionDispatch::Request.new(env)
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID] ||=
request.request_id || SecureRandom.uuid

transaction = Appsignal::Transaction.create(
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID],
Appsignal::Transaction::ACTION_CABLE,
request
)

begin
Appsignal.instrument "subscribed.action_cable" do
inner.call
end
rescue => exception
transaction.set_error(exception)
raise exception
ensure
transaction.set_action_if_nil("#{channel.class}#subscribed")
transaction.set_metadata("path", request.path)
transaction.set_metadata("method", "websocket")
Appsignal::Transaction.complete_current!
end
end

ActionCable::Channel::Base.set_callback :unsubscribe, :around, :prepend => true do |channel, inner|
# The request is only the original websocket request
env = channel.connection.env
request = ActionDispatch::Request.new(env)
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID] ||=
request.request_id || SecureRandom.uuid

transaction = Appsignal::Transaction.create(
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID],
Appsignal::Transaction::ACTION_CABLE,
request
)

begin
Appsignal.instrument "unsubscribed.action_cable" do
inner.call
end
rescue => exception
transaction.set_error(exception)
raise exception
ensure
transaction.set_action_if_nil("#{channel.class}#unsubscribed")
transaction.set_metadata("path", request.path)
transaction.set_metadata("method", "websocket")
Appsignal::Transaction.complete_current!
end
end
end
end
end
end
1 change: 1 addition & 0 deletions lib/appsignal/transaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module Appsignal
class Transaction
HTTP_REQUEST = "http_request".freeze
BACKGROUND_JOB = "background_job".freeze
ACTION_CABLE = "action_cable".freeze
FRONTEND = "frontend".freeze
BLANK = "".freeze

Expand Down
Loading

0 comments on commit b46be6b

Please sign in to comment.