module ElasticAPM::Spies::SNSSpy::Ext

def publish(params = {}, options = {})

def publish(params = {}, options = {})
  unless (transaction = ElasticAPM.current_transaction)
    return super(params, options)
  end
  topic = ElasticAPM::Spies::SNSSpy.get_topic(params)
  span_name = topic ? "SNS PUBLISH to #{topic}" : 'SNS PUBLISH'
  region = ElasticAPM::Spies::SNSSpy.arn_region(
    params[:topic_arn] || params[:target_arn]
  )
  context = ElasticAPM::Spies::SNSSpy.span_context(
    topic,
    region || config.region
  )
  ElasticAPM.with_span(
    span_name,
    TYPE,
    subtype: SUBTYPE,
    action: 'publish',
    context: context
  ) do |span|
    trace_context = span&.trace_context || transaction.trace_context
    trace_context.apply_headers do |key, value|
      params[:message_attributes] ||= {}
      params[:message_attributes][key] ||= {}
      params[:message_attributes][key][:string_value] = value
      params[:message_attributes][key][:data_type] = 'String'
    end
    ElasticAPM::Spies::SNSSpy.without_net_http do
      super(params, options)
    end
  end
end