Module: Appsignal

Defined in:
lib/appsignal.rb,
lib/appsignal/cli.rb,
lib/appsignal/ipc.rb,
lib/appsignal/agent.rb,
lib/appsignal/config.rb,
lib/appsignal/marker.rb,
lib/appsignal/version.rb,
lib/appsignal/aggregator.rb,
lib/appsignal/auth_check.rb,
lib/appsignal/transaction.rb,
lib/appsignal/transmitter.rb,
lib/appsignal/rack/listener.rb,
lib/appsignal/params_sanitizer.rb,
lib/appsignal/integrations/rails.rb,
lib/appsignal/integrations/resque.rb,
lib/appsignal/integrations/sidekiq.rb,
lib/appsignal/rack/instrumentation.rb,
lib/appsignal/transaction/formatter.rb,
lib/appsignal/integrations/delayed_job.rb,
lib/appsignal/aggregator/post_processor.rb,
lib/appsignal/aggregator/middleware/chain.rb,
lib/appsignal/aggregator/middleware/delete_blanks.rb,
lib/appsignal/integrations/capistrano/careful_logger.rb,
lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb,
lib/appsignal/aggregator/middleware/action_view_sanitizer.rb,
lib/appsignal/aggregator/middleware/active_record_sanitizer.rb

Defined Under Namespace

Modules: CarefulLogger, Integrations, Rack Classes: Agent, Aggregator, AuthCheck, CLI, Config, Event, IPC, Marker, ParamsSanitizer, ParamsSanitizerCopy, ParamsSanitizerCopyScrub, ParamsSanitizerDestructive, ParamsSanitizerDestructiveScrub, Transaction, Transmitter

Constant Summary collapse

VERSION =
'0.11.4'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.agentObject

Returns the value of attribute agent.



14
15
16
# File 'lib/appsignal.rb', line 14

def agent
  @agent
end

.configObject

Returns the value of attribute config.



14
15
16
# File 'lib/appsignal.rb', line 14

def config
  @config
end

.in_memory_logObject

Returns the value of attribute in_memory_log.



14
15
16
# File 'lib/appsignal.rb', line 14

def in_memory_log
  @in_memory_log
end

.loggerObject

Returns the value of attribute logger.



14
15
16
# File 'lib/appsignal.rb', line 14

def logger
  @logger
end

Class Method Details

.active?Boolean

Returns:

  • (Boolean)


161
162
163
164
# File 'lib/appsignal.rb', line 161

def active?
  config && config.active? &&
    agent && agent.active?
end

.add_exception(exception) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/appsignal.rb', line 111

def add_exception(exception)
  return if !active? ||
            Appsignal::Transaction.current.nil? ||
            exception.nil? ||
            is_ignored_exception?(exception)
  Appsignal::Transaction.current.add_exception(exception)
end

.enqueue(transaction) ⇒ true

Convenience method for adding a transaction to the queue. This queue is managed and is periodically pushed to Appsignal.

Returns:

  • (true)

    True.

Since:

  • 0.5.0



71
72
73
74
# File 'lib/appsignal.rb', line 71

def enqueue(transaction)
  return unless active?
  agent.enqueue(transaction)
end

.extensionsObject



28
29
30
# File 'lib/appsignal.rb', line 28

def extensions
  @extensions ||= []
end

.initialize_extensionsObject



32
33
34
35
36
37
38
# File 'lib/appsignal.rb', line 32

def initialize_extensions
  Appsignal.logger.debug('Initializing extensions')
  extensions.each do |extension|
    Appsignal.logger.debug("Initializing #{extension}")
    extension.initializer
  end
end

.is_ignored_action?(action) ⇒ Boolean

Returns:

  • (Boolean)


170
171
172
# File 'lib/appsignal.rb', line 170

def is_ignored_action?(action)
  Appsignal.config[:ignore_actions].include?(action)
end

.is_ignored_exception?(exception) ⇒ Boolean

Returns:

  • (Boolean)


166
167
168
# File 'lib/appsignal.rb', line 166

def is_ignored_exception?(exception)
  Appsignal.config[:ignore_exceptions].include?(exception.class.name)
end

.listen_for_exception(&block) ⇒ Object



95
96
97
98
99
100
# File 'lib/appsignal.rb', line 95

def listen_for_exception(&block)
  yield
rescue Exception => exception
  send_exception(exception)
  raise exception
end

.load_instrumentationsObject



24
25
26
# File 'lib/appsignal.rb', line 24

def load_instrumentations
  require 'appsignal/instrumentations/net_http' if config[:instrument_net_http]
end

.load_integrationsObject



16
17
18
19
20
21
22
# File 'lib/appsignal.rb', line 16

def load_integrations
  require 'appsignal/integrations/delayed_job'
  require 'appsignal/integrations/passenger'
  require 'appsignal/integrations/unicorn'
  require 'appsignal/integrations/sidekiq'
  require 'appsignal/integrations/resque'
end

.monitor_transaction(name, payload = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/appsignal.rb', line 76

def monitor_transaction(name, payload={})
  unless active?
    yield
    return
  end

  begin
    Appsignal::Transaction.create(SecureRandom.uuid, ENV)
    ActiveSupport::Notifications.instrument(name, payload) do
      yield
    end
  rescue Exception => exception
    Appsignal.add_exception(exception)
    raise exception
  ensure
    Appsignal::Transaction.complete_current!
  end
end

.post_processing_middleware {|@post_processing_chain| ... } ⇒ Object

Yields:

  • (@post_processing_chain)


155
156
157
158
159
# File 'lib/appsignal.rb', line 155

def post_processing_middleware
  @post_processing_chain ||= Appsignal::Aggregator::PostProcessor.default_middleware
  yield @post_processing_chain if block_given?
  @post_processing_chain
end

.send_exception(exception, tags = nil) ⇒ Object



102
103
104
105
106
107
108
109
# File 'lib/appsignal.rb', line 102

def send_exception(exception, tags=nil)
  return if !active? || is_ignored_exception?(exception)
  transaction = Appsignal::Transaction.create(SecureRandom.uuid, ENV)
  transaction.add_exception(exception)
  transaction.set_tags(tags) if tags
  transaction.complete!
  Appsignal.agent.send_queue
end

.startObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/appsignal.rb', line 40

def start
  if config
    if config[:debug]
      logger.level = Logger::DEBUG
    else
      logger.level = Logger::INFO
    end
    if config.active?
      logger.info("Starting AppSignal #{Appsignal::VERSION} on #{RUBY_VERSION}/#{RUBY_PLATFORM}")
      load_integrations
      load_instrumentations
      initialize_extensions
      @agent = Appsignal::Agent.new
      at_exit do
        logger.debug('Running at_exit block')
        @agent.send_queue
      end
    else
      logger.info("Not starting, not active for #{config.env}")
    end
  else
    logger.error('Can\'t start, no config loaded')
  end
end

.start_logger(path) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/appsignal.rb', line 139

def start_logger(path)
  if path && File.writable?(path) &&
     !ENV['DYNO'] &&
     !ENV['SHELLYCLOUD_DEPLOYMENT']
    @logger = Logger.new(File.join(path, 'appsignal.log'))
    @logger.formatter = Logger::Formatter.new
  else
    @logger = Logger.new($stdout)
    @logger.formatter = lambda do |severity, datetime, progname, msg|
      "appsignal: #{msg}\n"
    end
  end
  @logger.level = Logger::INFO
  @logger << @in_memory_log.string if @in_memory_log
end

.tag_request(params = {}) ⇒ Object Also known as: tag_job



119
120
121
122
123
124
# File 'lib/appsignal.rb', line 119

def tag_request(params={})
  return unless active?
  transaction = Appsignal::Transaction.current
  return false unless transaction
  transaction.set_tags(params)
end

.transactionsObject



127
128
129
# File 'lib/appsignal.rb', line 127

def transactions
  @transactions ||= {}
end

.without_instrumentationObject

Convenience method for skipping instrumentations around a block of code.

Since:

  • 0.8.7



177
178
179
180
181
182
# File 'lib/appsignal.rb', line 177

def without_instrumentation
  Appsignal::Transaction.current.pause! if Appsignal::Transaction.current
  yield
ensure
  Appsignal::Transaction.current.resume! if Appsignal::Transaction.current
end