Class: Honeybadger::Agent
- Inherits:
-
Object
- Object
- Honeybadger::Agent
- Extended by:
- Forwardable
- Includes:
- Logging::Helper
- Defined in:
- lib/honeybadger/agent.rb
Overview
The Honeybadger agent contains all the methods for interacting with the Honeybadger service. It can be used to send notifications to multiple projects in large apps. The global agent instance (Agent.instance) should always be accessed through the Honeybadger singleton.
Context
Context is global by default, meaning agents created via Honeybadger::Agent.new
will share context (added via Honeybadger.context
or #context) with other agents. This also includes the Rack environment when using the Rack::ErrorNotifier middleware. To localize context for a custom agent, use the local_context: true option when initializing.
Instance Attribute Summary collapse
- #config ⇒ Object readonly private
- #events_worker ⇒ Object readonly private
- #worker ⇒ Object readonly private
Class Method Summary collapse
- .instance ⇒ Object private
- .instance=(instance) ⇒ Object private
Instance Method Summary collapse
-
#add_breadcrumb(message, metadata: {}, category: "custom") ⇒ Object
Appends a breadcrumb to the trace.
- #backend ⇒ Object private
-
#backtrace_filter {|line| ... } ⇒ Object
DEPRECATED: Callback to filter backtrace lines.
-
#breadcrumbs ⇒ Object
private
Direct access to the Breadcrumbs::Collector instance.
-
#check_in(id) ⇒ Boolean
Perform a synchronous check_in.
-
#clear! ⇒ Object
Clear all transaction scoped data.
-
#configure {|Config::Ruby| ... } ⇒ Object
Configure the Honeybadger agent via Ruby.
-
#context(context = nil) ⇒ self
Save global context for the current request.
-
#event(event_type, payload = {}) ⇒ void
Sends event to events backend.
-
#exception_filter ⇒ Object
DEPRECATED: Callback to ignore exceptions.
-
#exception_fingerprint ⇒ Object
DEPRECATED: Callback to add a custom grouping strategy for exceptions.
-
#flush { ... } ⇒ Object, Boolean
Flushes all data from workers before returning.
-
#get_context ⇒ Hash?
Get global context for the current request.
- #init!(...) ⇒ Object private
-
#initialize(opts = {}) ⇒ Agent
constructor
A new instance of Agent.
-
#notify(exception_or_opts = nil, opts = {}, **kwargs) ⇒ String, false
Sends an exception to Honeybadger.
-
#stop(force = false) ⇒ Object
Stops the Honeybadger service.
-
#track_deployment(environment: nil, revision: nil, local_username: nil, repository: nil) ⇒ Boolean
Track a new deployment.
- #with_rack_env(rack_env, &block) ⇒ Object private
Constructor Details
#initialize(opts = {}) ⇒ Agent
Returns a new instance of Agent.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/honeybadger/agent.rb', line 60 def initialize(opts = {}) if opts.kind_of?(Config) @config = opts opts = {} end @context = opts.delete(:context) local_context = opts.delete(:local_context) @config ||= Config.new(opts) if local_context @context ||= ContextManager.new @breadcrumbs = Breadcrumbs::Collector.new(config) else @breadcrumbs = nil end init_worker end |
Instance Attribute Details
#config ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
403 404 405 |
# File 'lib/honeybadger/agent.rb', line 403 def config @config end |
#events_worker ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
474 475 476 |
# File 'lib/honeybadger/agent.rb', line 474 def events_worker @events_worker end |
#worker ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
474 475 476 |
# File 'lib/honeybadger/agent.rb', line 474 def worker @worker end |
Class Method Details
.instance ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
51 52 53 |
# File 'lib/honeybadger/agent.rb', line 51 def self.instance @instance end |
.instance=(instance) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
56 57 58 |
# File 'lib/honeybadger/agent.rb', line 56 def self.instance=(instance) @instance = instance end |
Instance Method Details
#add_breadcrumb(message, metadata: {}, category: "custom") ⇒ Object
Appends a breadcrumb to the trace. Use this when you want to add some custom data to your breadcrumb trace in effort to help debugging. If a notice is reported to Honeybadger, all breadcrumbs within the execution path will be appended to the notice. You will be able to view the breadcrumb trace in the Honeybadger interface to see what events led up to the notice.
312 313 314 315 316 317 318 319 320 321 322 |
# File 'lib/honeybadger/agent.rb', line 312 def (, metadata: {}, category: "custom") params = Util::Sanitizer.new(max_depth: 2).sanitize({ category: category, message: , metadata: }) .add!(Breadcrumbs::Breadcrumb.new(**params)) self end |
#backend ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
484 |
# File 'lib/honeybadger/agent.rb', line 484 def_delegators :config, :backend |
#backtrace_filter {|line| ... } ⇒ Object
DEPRECATED: Callback to filter backtrace lines. One use for this is to make additional [PROJECT_ROOT] or [GEM_ROOT] substitutions, which are used by Honeybadger when grouping errors and displaying application traces.
463 |
# File 'lib/honeybadger/agent.rb', line 463 def_delegator :config, :backtrace_filter |
#breadcrumbs ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Direct access to the Breadcrumbs::Collector instance
286 287 288 289 290 |
# File 'lib/honeybadger/agent.rb', line 286 def return @breadcrumbs if @breadcrumbs Thread.current[:__hb_breadcrumbs] ||= Breadcrumbs::Collector.new(config) end |
#check_in(id) ⇒ Boolean
Perform a synchronous check_in.
195 196 197 198 199 200 |
# File 'lib/honeybadger/agent.rb', line 195 def check_in(id) # this is to allow check ins even if a url is passed check_in_id = id.to_s.strip.gsub(/\/$/, '').split('/').last response = backend.check_in(check_in_id) response.success? end |
#clear! ⇒ Object
Clear all transaction scoped data.
268 269 270 271 |
# File 'lib/honeybadger/agent.rb', line 268 def clear! context_manager.clear! .clear! end |
#configure {|Config::Ruby| ... } ⇒ Object
Configure the Honeybadger agent via Ruby.
415 |
# File 'lib/honeybadger/agent.rb', line 415 def_delegator :config, :configure |
#context(context = nil) ⇒ self
Save global context for the current request.
262 263 264 265 |
# File 'lib/honeybadger/agent.rb', line 262 def context(context = nil) context_manager.set_context(context) unless context.nil? self end |
#event(event_type, payload = {}) ⇒ void
This method returns an undefined value.
Sends event to events backend
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
# File 'lib/honeybadger/agent.rb', line 385 def event(event_type, payload = {}) init_events_worker ts = DateTime.now.new_offset(0).rfc3339 merged = {ts: ts} if event_type.is_a?(String) merged.merge!(event_type: event_type) else merged.merge!(Hash(event_type)) end merged.merge!(Hash(payload)) events_worker.push(merged) end |
#exception_filter ⇒ Object
DEPRECATED: Callback to ignore exceptions.
See public API documentation for Notice for available attributes.
434 |
# File 'lib/honeybadger/agent.rb', line 434 def_delegator :config, :exception_filter |
#exception_fingerprint ⇒ Object
DEPRECATED: Callback to add a custom grouping strategy for exceptions. The return value is hashed and sent to Honeybadger. Errors with the same fingerprint will be grouped.
See public API documentation for Notice for available attributes.
449 |
# File 'lib/honeybadger/agent.rb', line 449 def_delegator :config, :exception_fingerprint |
#flush { ... } ⇒ Object, Boolean
Flushes all data from workers before returning. This is most useful in tests when using the test backend, where normally the asynchronous nature of this library could create race conditions.
353 354 355 356 357 358 359 |
# File 'lib/honeybadger/agent.rb', line 353 def flush return true unless block_given? yield ensure worker.flush events_worker&.flush end |
#get_context ⇒ Hash?
Get global context for the current request.
280 281 282 |
# File 'lib/honeybadger/agent.rb', line 280 def get_context context_manager.get_context end |
#init!(...) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
479 |
# File 'lib/honeybadger/agent.rb', line 479 def_delegators :config, :init! |
#notify(exception_or_opts = nil, opts = {}, **kwargs) ⇒ String, false
Sends an exception to Honeybadger. Does not report ignored exceptions by default.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/honeybadger/agent.rb', line 123 def notify(exception_or_opts = nil, opts = {}, **kwargs) opts = opts.dup opts.merge!(kwargs) if exception_or_opts.is_a?(Exception) already_reported_notice_id = exception_or_opts.instance_variable_get(:@__hb_notice_id) return already_reported_notice_id if already_reported_notice_id opts[:exception] = exception_or_opts elsif exception_or_opts.respond_to?(:to_hash) opts.merge!(exception_or_opts.to_hash) elsif !exception_or_opts.nil? opts[:error_message] = exception_or_opts.to_s end validate_notify_opts!(opts) ( "Honeybadger Notice", metadata: opts, category: "notice" ) if config[:'breadcrumbs.enabled'] opts[:rack_env] ||= context_manager.get_rack_env opts[:global_context] ||= context_manager.get_context opts[:breadcrumbs] ||= .dup notice = Notice.new(config, opts) config.before_notify_hooks.each do |hook| break if notice.halted? with_error_handling { hook.call(notice) } end unless notice.api_key =~ NOT_BLANK error { sprintf('Unable to send error report: API key is missing. id=%s', notice.id) } return false end if !opts[:force] && notice.ignore? debug { sprintf('ignore notice feature=notices id=%s', notice.id) } return false end if notice.halted? debug { 'halted notice feature=notices' } return false end info { sprintf('Reporting error id=%s', notice.id) } if opts[:sync] || config[:sync] send_now(notice) else push(notice) end if exception_or_opts.is_a?(Exception) exception_or_opts.instance_variable_set(:@__hb_notice_id, notice.id) unless exception_or_opts.frozen? end notice.id end |
#stop(force = false) ⇒ Object
Stops the Honeybadger service.
365 366 367 368 369 |
# File 'lib/honeybadger/agent.rb', line 365 def stop(force = false) worker.shutdown(force) events_worker&.shutdown(force) true end |
#track_deployment(environment: nil, revision: nil, local_username: nil, repository: nil) ⇒ Boolean
Track a new deployment
214 215 216 217 218 219 220 221 222 223 |
# File 'lib/honeybadger/agent.rb', line 214 def track_deployment(environment: nil, revision: nil, local_username: nil, repository: nil) opts = { environment: environment || config[:env], revision: revision || config[:revision], local_username: local_username, repository: repository } response = backend.track_deployment(opts) response.success? end |
#with_rack_env(rack_env, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
466 467 468 469 470 471 |
# File 'lib/honeybadger/agent.rb', line 466 def with_rack_env(rack_env, &block) context_manager.set_rack_env(rack_env) yield ensure context_manager.set_rack_env(nil) end |