class StackifyRubyAPM::Spies::MysqlAdapterSpy

@api private

Constants

DEFAULT_PORT
TYPE

Public Instance Methods

check_prepared_stmt(statement, payload) click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 90
def check_prepared_stmt(statement, payload)
  if StackifyRubyAPM.agent.config.prefix_enabled
    check_prepared_stmt_by_placeholder(payload[:sql].include?('?'), statement, payload)
  end
end
exec_delete(sql, name = nil, binds = []) click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 43
def exec_delete(sql, name = nil, binds = [])
  result = nil

  unless StackifyRubyAPM.current_transaction
    exec_delete_without_apm(sql, name, binds)
  end

  payload = {sql: sql, binds: binds}
  statement = query_variables(payload)
  check_prepared_stmt(statement, payload)
  ctx = Span::Context.new(statement)

  result = exec_delete_without_apm(sql, name, binds)

  StackifyRubyAPM.span name, TYPE, context: ctx do
    return result
  end
end
exec_insert(sql, name, binds, _pk = nil, _sequence_name = nil) click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 184
def exec_insert(sql, name, binds, _pk = nil, _sequence_name = nil)
  result = nil

  unless StackifyRubyAPM.current_transaction
    exec_insert_without_apm(sql, name, binds, _pk = nil, _sequence_name = nil)
  end

  ctx = Span::Context.new(
    CATEGORY: 'Database',
    SUBCATEGORY: 'Execute',
    COMPONENT_CATEGORY: 'DB Query',
    COMPONENT_DETAIL: 'Execute SQL Query',
    SQL: sql,
    PROVIDER: 'mysql'
  )
  ctx[:URL] = get_host unless !get_host

  result = exec_insert_without_apm(sql, name, binds, _pk = nil, _sequence_name = nil)

  StackifyRubyAPM.span name, TYPE, context: ctx do
    return result
  end
end
exec_query(sql, name = 'SQL', binds = [], prepare: false) click to toggle source

rubocop:disable Lint/UnusedMethodArgument

# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 63
def exec_query(sql, name = 'SQL', binds = [], prepare: false)
  result = nil

  unless StackifyRubyAPM.current_transaction
    exec_query_without_apm(sql, name, binds)
  end

  payload = {sql: sql, binds: binds}
  statement = query_variables(payload)
  check_prepared_stmt(statement, payload)
  ctx = Span::Context.new(statement)

  result = exec_query_without_apm(sql, name, binds)
  StackifyRubyAPM.span name, TYPE, context: ctx do
    return result
  end
end
exec_update(sql, name = nil, binds = []) click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 24
def exec_update(sql, name = nil, binds = [])
  result = nil

  unless StackifyRubyAPM.current_transaction
    exec_update_without_apm(sql, name, binds)
  end

  payload = {sql: sql, binds: binds}
  statement = query_variables(payload)
  check_prepared_stmt(statement, payload)
  ctx = Span::Context.new(statement)

  result = exec_update_without_apm(sql, name, binds)

  StackifyRubyAPM.span name, TYPE, context: ctx do
    return result
  end
end
get_host() click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 96
def get_host
  query_options = self.raw_connection.query_options.to_h
  "#{query_options[:host]}:#{query_options[:port] || DEFAULT_PORT}"
rescue StandardError => error
  nil
end
install() click to toggle source
# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 18
def install
  ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements.class_eval do
    alias_method 'exec_query_without_apm', 'exec_query'
    alias_method 'exec_delete_without_apm', 'exec_delete'
    alias_method 'exec_update_without_apm', 'exec_update'

    def exec_update(sql, name = nil, binds = [])
      result = nil

      unless StackifyRubyAPM.current_transaction
        exec_update_without_apm(sql, name, binds)
      end

      payload = {sql: sql, binds: binds}
      statement = query_variables(payload)
      check_prepared_stmt(statement, payload)
      ctx = Span::Context.new(statement)

      result = exec_update_without_apm(sql, name, binds)

      StackifyRubyAPM.span name, TYPE, context: ctx do
        return result
      end
    end

    def exec_delete(sql, name = nil, binds = [])
      result = nil

      unless StackifyRubyAPM.current_transaction
        exec_delete_without_apm(sql, name, binds)
      end

      payload = {sql: sql, binds: binds}
      statement = query_variables(payload)
      check_prepared_stmt(statement, payload)
      ctx = Span::Context.new(statement)

      result = exec_delete_without_apm(sql, name, binds)

      StackifyRubyAPM.span name, TYPE, context: ctx do
        return result
      end
    end

    # rubocop:disable Lint/UnusedMethodArgument
    def exec_query(sql, name = 'SQL', binds = [], prepare: false)
      result = nil

      unless StackifyRubyAPM.current_transaction
        exec_query_without_apm(sql, name, binds)
      end

      payload = {sql: sql, binds: binds}
      statement = query_variables(payload)
      check_prepared_stmt(statement, payload)
      ctx = Span::Context.new(statement)

      result = exec_query_without_apm(sql, name, binds)
      StackifyRubyAPM.span name, TYPE, context: ctx do
        return result
      end
    end
    # rubocop:enable Lint/UnusedMethodArgument

    def query_variables(payload)
      props = get_common_db_properties
      props[:PROVIDER] = 'mysql'
      props[:SQL] = payload[:sql]
      props[:URL] = get_host unless !get_host
      props
    end

    def check_prepared_stmt(statement, payload)
      if StackifyRubyAPM.agent.config.prefix_enabled
        check_prepared_stmt_by_placeholder(payload[:sql].include?('?'), statement, payload)
      end
    end

    def get_host
      query_options = self.raw_connection.query_options.to_h
      "#{query_options[:host]}:#{query_options[:port] || DEFAULT_PORT}"
    rescue StandardError => error
      nil
    end
  end
end
query_variables(payload) click to toggle source

rubocop:enable Lint/UnusedMethodArgument

# File lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb, line 82
def query_variables(payload)
  props = get_common_db_properties
  props[:PROVIDER] = 'mysql'
  props[:SQL] = payload[:sql]
  props[:URL] = get_host unless !get_host
  props
end