require 'sqreen/ecosystem/module_api' require 'sqreen/ecosystem/module_api/instrumentation' require 'sqreen/ecosystem/module_api/message_producer' require 'sqreen/ecosystem/module_api/tracing/consumer_data' require 'sqreen/ecosystem/module_api/tracing/producer_data' module Sqreen module Ecosystem module Messaging class Sqs include ModuleApi::Loggable include ModuleApi::Instrumentation include ModuleApi::MessageProducer def setup advice_send = wrap_for_interest(ModuleApi::Tracing::ProducerData, &method(:after_send_advice)) advice_receive = wrap_for_interest(ModuleApi::Tracing::ConsumerData, &method(:after_receive_advice)) instrument 'Aws::SQS::Client#send_message', after: advice_send instrument 'Aws::SQS::Client#send_message_batch', after: advice_send instrument 'Aws::SQS::Client#receive_message', after: advice_receive end private # @param [Sqreen::Graft::CallbackCall] call def after_send_advice(call, _ball) return if call.raised unless call.args.length > 0 && call.args[0].is_a?(Hash) logger.info "Unexpected arguments to send_message(_batch)" return end create_signal(call.args, ModuleApi::Tracing::ProducerData) end # @param [Sqreen::Graft::CallbackCall] call def after_receive_advice(call, _ball) return if call.raised unless call.args.length > 0 && call.args[0].is_a?(Hash) logger.info "Unexpected arguments to receive_message" return end create_signal(call.args, ModuleApi::Tracing::ConsumerData) end def create_signal(args, clazz) hash = args[0] queue_url = hash[:queue_url] || hash['queue_url'] return unless queue_url begin uri = URI.parse(queue_url) rescue URI::InvalidURIError logger.info { "Invalid URI: #{uri}" } return end clazz.new( message_type: :'aws-sqs', host: uri.host, topic: ($1 if uri.path =~ /\A\/queue\/(?:[^\/]+\/)?([^\/]+)\z/), ) end end end end end