Module: Sentry

Extended by:
Forwardable
Defined in:
lib/sentry/dsn.rb,
lib/sentry/hub.rb,
lib/sentry-ruby.rb,
lib/sentry/puma.rb,
lib/sentry/rake.rb,
lib/sentry/span.rb,
lib/sentry/event.rb,
lib/sentry/redis.rb,
lib/sentry/scope.rb,
lib/sentry/client.rb,
lib/sentry/logger.rb,
lib/sentry/baggage.rb,
lib/sentry/faraday.rb,
lib/sentry/metrics.rb,
lib/sentry/session.rb,
lib/sentry/version.rb,
lib/sentry/envelope.rb,
lib/sentry/net/http.rb,
lib/sentry/profiler.rb,
lib/sentry/backtrace.rb,
lib/sentry/interface.rb,
lib/sentry/linecache.rb,
lib/sentry/log_event.rb,
lib/sentry/transport.rb,
lib/sentry/attachment.rb,
lib/sentry/breadcrumb.rb,
lib/sentry/exceptions.rb,
lib/sentry/integrable.rb,
lib/sentry/error_event.rb,
lib/sentry/test_helper.rb,
lib/sentry/transaction.rb,
lib/sentry/configuration.rb,
lib/sentry/envelope/item.rb,
lib/sentry/check_in_event.rb,
lib/sentry/metrics/metric.rb,
lib/sentry/metrics/timing.rb,
lib/sentry/std_lib_logger.rb,
lib/sentry/vernier/output.rb,
lib/sentry/session_flusher.rb,
lib/sentry/excon/middleware.rb,
lib/sentry/log_event_buffer.rb,
lib/sentry/profiler/helpers.rb,
lib/sentry/release_detector.rb,
lib/sentry/vernier/profiler.rb,
lib/sentry/background_worker.rb,
lib/sentry/breadcrumb_buffer.rb,
lib/sentry/structured_logger.rb,
lib/sentry/transaction_event.rb,
lib/sentry/cron/configuration.rb,
lib/sentry/interfaces/request.rb,
lib/sentry/interfaces/threads.rb,
lib/sentry/metrics/aggregator.rb,
lib/sentry/metrics/set_metric.rb,
lib/sentry/cron/monitor_config.rb,
lib/sentry/propagation_context.rb,
lib/sentry/backpressure_monitor.rb,
lib/sentry/interfaces/exception.rb,
lib/sentry/interfaces/mechanism.rb,
lib/sentry/metrics/gauge_metric.rb,
lib/sentry/cron/monitor_schedule.rb,
lib/sentry/interfaces/stacktrace.rb,
lib/sentry/metrics/configuration.rb,
lib/sentry/cron/monitor_check_ins.rb,
lib/sentry/metrics/counter_metric.rb,
lib/sentry/debug_structured_logger.rb,
lib/sentry/rack/capture_exceptions.rb,
lib/sentry/transport/configuration.rb,
lib/sentry/breadcrumb/sentry_logger.rb,
lib/sentry/metrics/local_aggregator.rb,
lib/sentry/threaded_periodic_worker.rb,
lib/sentry/transport/http_transport.rb,
lib/sentry/transport/debug_transport.rb,
lib/sentry/transport/dummy_transport.rb,
lib/sentry/interfaces/single_exception.rb,
lib/sentry/metrics/distribution_metric.rb,
lib/sentry/interfaces/stacktrace_builder.rb,
lib/sentry/transport/spotlight_transport.rb

Defined Under Namespace

Modules: Cron, Excon, Faraday, Integrable, Metrics, Net, Puma, Rack, Rake, StdLibLogger, TestHelper, Vernier Classes: Attachment, BackgroundWorker, BackpressureMonitor, Backtrace, Baggage, Breadcrumb, BreadcrumbBuffer, CheckInEvent, Client, Configuration, DSN, DebugStructuredLogger, DebugTransport, DummyTransport, Envelope, Error, ErrorEvent, Event, ExceptionInterface, ExternalError, HTTPTransport, Hub, Interface, LineCache, LogEvent, Logger, Mechanism, Profiler, PropagationContext, Redis, ReleaseDetector, RequestInterface, Scope, Session, SessionFlusher, SingleExceptionInterface, Span, SpotlightTransport, StacktraceBuilder, StacktraceInterface, StructuredLogger, StructuredLoggingConfiguration, ThreadedPeriodicWorker, ThreadsInterface, Transaction, TransactionEvent, Transport

Constant Summary collapse

META =
{ "name" => "sentry.ruby", "version" => Sentry::VERSION }.freeze
CAPTURED_SIGNATURE =
:@__sentry_captured
LOGGER_PROGNAME =
"sentry"
SENTRY_TRACE_HEADER_NAME =
"sentry-trace"
BAGGAGE_HEADER_NAME =
"baggage"
THREAD_LOCAL =
:sentry_hub
MUTEX =
Mutex.new
GLOBALS =
i[
  main_hub
  logger
  session_flusher
  backpressure_monitor
  metrics_aggregator
  exception_locals_tp
].freeze
VERSION =
"5.28.0"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.background_workerBackgroundWorker

Returns:



86
87
88
# File 'lib/sentry-ruby.rb', line 86

def background_worker
  @background_worker
end

.backpressure_monitorObject (readonly)

Returns the value of attribute backpressure_monitor.



94
95
96
# File 'lib/sentry-ruby.rb', line 94

def backpressure_monitor
  @backpressure_monitor
end

.metrics_aggregatorObject (readonly)

Returns the value of attribute metrics_aggregator.



98
99
100
# File 'lib/sentry-ruby.rb', line 98

def metrics_aggregator
  @metrics_aggregator
end

.session_flusherObject (readonly)

Returns the value of attribute session_flusher.



90
91
92
# File 'lib/sentry-ruby.rb', line 90

def session_flusher
  @session_flusher
end

Class Method Details

.add_attachmentObject



230
231
232
233
# File 'lib/sentry-ruby.rb', line 230

def add_attachment(**opts)
  return unless initialized?
  get_current_scope.add_attachment(**opts)
end

.add_breadcrumb(breadcrumb, **options) ⇒ Breadcrumb?

Takes an instance of Sentry::Breadcrumb and stores it to the current active scope.

Returns:



331
332
333
334
# File 'lib/sentry-ruby.rb', line 331

def add_breadcrumb(breadcrumb, **options)
  return unless initialized?
  get_current_hub.add_breadcrumb(breadcrumb, **options)
end

.add_global_event_processor {|event, hint| ... } ⇒ void

This method returns an undefined value.

Add a global event processor [Proc]. These run before scope event processors.

Examples:

Sentry.add_global_event_processor do |event, hint|
  event.tags = { foo: 42 }
  event
end

Yield Parameters:

  • event (Event)
  • hint (Hash, nil)


570
571
572
# File 'lib/sentry-ruby.rb', line 570

def add_global_event_processor(&block)
  Scope.add_global_event_processor(&block)
end

.capture_check_in(slug, status, **options) ⇒ String?

Captures a check-in and sends it to Sentry via the currently active hub.

Parameters:

Options Hash (**options):

  • check_in_id (String)

    for updating the status of an existing monitor

  • duration (Integer)

    seconds elapsed since this monitor started

  • monitor_config (Cron::MonitorConfig)

    configuration for this monitor

Returns:



490
491
492
493
# File 'lib/sentry-ruby.rb', line 490

def capture_check_in(slug, status, **options)
  return unless initialized?
  get_current_hub.capture_check_in(slug, status, **options)
end

.capture_event(event) ⇒ Event?

Takes an instance of Sentry::Event and dispatches it to the currently active hub.

Returns:



474
475
476
477
# File 'lib/sentry-ruby.rb', line 474

def capture_event(event)
  return unless initialized?
  get_current_hub.capture_event(event)
end

.capture_exception(exception, **options) {|scope| ... } ⇒ Event?

Takes an exception and reports it to Sentry via the currently active hub.

Yield Parameters:

Returns:



438
439
440
441
# File 'lib/sentry-ruby.rb', line 438

def capture_exception(exception, **options, &block)
  return unless initialized?
  get_current_hub.capture_exception(exception, **options, &block)
end

.capture_log(message, **options) ⇒ LogEvent?

Captures a log event and sends it to Sentry via the currently active hub. This is the underlying method used by the StructuredLogger class.

Examples:

Direct usage (prefer using Sentry.logger instead)

Sentry.capture_log("User logged in", level: :info, user_id: 123)

Parameters:

  • message (String)

    the log message

  • options (Hash)

    Extra log event options

Options Hash (**options):

  • level (Symbol)

    The log level (:trace, :debug, :info, :warn, :error, :fatal)

  • severity (Integer)

    The severity number according to the Sentry Logs Protocol

  • origin (String)

    The origin of the log event (e.g., “auto.db.rails”, “manual”)

  • Additional (Hash)

    attributes to include with the log

Returns:

  • (LogEvent, nil)

    The created log event or nil if logging is disabled

See Also:



510
511
512
513
# File 'lib/sentry-ruby.rb', line 510

def capture_log(message, **options)
  return unless initialized?
  get_current_hub.capture_log_event(message, **options)
end

.capture_message(message, **options) {|scope| ... } ⇒ Event?

Takes a message string and reports it to Sentry via the currently active hub.

Yield Parameters:

Returns:



466
467
468
469
# File 'lib/sentry-ruby.rb', line 466

def capture_message(message, **options, &block)
  return unless initialized?
  get_current_hub.capture_message(message, **options, &block)
end

.clone_hub_to_current_threadvoid

This method returns an undefined value.

Clones the main thread’s active hub and stores it to the current thread.



368
369
370
371
# File 'lib/sentry-ruby.rb', line 368

def clone_hub_to_current_thread
  return unless initialized?
  Thread.current.thread_variable_set(THREAD_LOCAL, get_main_hub.clone)
end

.closevoid

This method returns an undefined value.

Flushes pending events and cleans up SDK state. SDK will stop sending events and all top-level APIs will be no-ops after this.



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# File 'lib/sentry-ruby.rb', line 264

def close
  if @session_flusher
    @session_flusher.flush
    @session_flusher.kill
    @session_flusher = nil
  end

  if @backpressure_monitor
    @backpressure_monitor.kill
    @backpressure_monitor = nil
  end

  if @metrics_aggregator
    @metrics_aggregator.flush(force: true)
    @metrics_aggregator.kill
    @metrics_aggregator = nil
  end

  if client = get_current_client
    client.flush

    if client.configuration.include_local_variables
      exception_locals_tp.disable
    end
  end

  @background_worker.shutdown

  MUTEX.synchronize do
    @main_hub = nil
    Thread.current.thread_variable_set(THREAD_LOCAL, nil)
  end
end

.configurationObject



170
171
172
173
# File 'lib/sentry-ruby.rb', line 170

def configuration
  return unless initialized?
  get_current_client.configuration
end

.configure_scope {|scope| ... } ⇒ void

This method returns an undefined value.

Takes a block and yields the current active scope.

Examples:

Sentry.configure_scope do |scope|
  scope.set_tags(foo: "bar")
end

Sentry.capture_message("test message") # this event will have tags { foo: "bar" }

Yield Parameters:



384
385
386
387
# File 'lib/sentry-ruby.rb', line 384

def configure_scope(&block)
  return unless initialized?
  get_current_hub.configure_scope(&block)
end

.continue_trace(env, **options) ⇒ Transaction?

Continue an incoming trace from a rack env like hash.

Parameters:

  • env (Hash)

Returns:



614
615
616
617
# File 'lib/sentry-ruby.rb', line 614

def continue_trace(env, **options)
  return nil unless initialized?
  get_current_hub.continue_trace(env, **options)
end

.csp_report_uriString?

Returns an uri for security policy reporting that’s generated from the given DSN (To learn more about security policy reporting: docs.sentry.io/product/security-policy-reporting/)

It returns nil if

  • The SDK is not initialized yet.

  • The DSN is not provided or is invalid.

Returns:

  • (String, nil)


313
314
315
316
# File 'lib/sentry-ruby.rb', line 313

def csp_report_uri
  return unless initialized?
  configuration.csp_report_uri
end

.exception_captured?(exc) ⇒ Boolean

Checks if the exception object has been captured by the SDK.

Returns:

  • (Boolean)


552
553
554
555
# File 'lib/sentry-ruby.rb', line 552

def exception_captured?(exc)
  return false unless initialized?
  !!exc.instance_variable_get(CAPTURED_SIGNATURE)
end

.get_baggageString?

Returns the baggage header for distributed tracing. Can be either from the currently active span or the propagation context.

Returns:

  • (String, nil)


587
588
589
590
# File 'lib/sentry-ruby.rb', line 587

def get_baggage
  return nil unless initialized?
  get_current_hub.get_baggage
end

.get_current_clientClient?

Returns the current active client.

Returns:



352
353
354
355
# File 'lib/sentry-ruby.rb', line 352

def get_current_client
  return unless initialized?
  get_current_hub.current_client
end

.get_current_hubHub

Returns the current active hub. If the current thread doesn’t have an active hub, it will clone the main thread’s active hub, stores it in the current thread, and then returns it.

Returns:



341
342
343
344
345
346
347
348
# File 'lib/sentry-ruby.rb', line 341

def get_current_hub
  # we need to assign a hub to the current thread if it doesn't have one yet
  #
  # ideally, we should do this proactively whenever a new thread is created
  # but it's impossible for the SDK to keep track every new thread
  # so we need to use this rather passive way to make sure the app doesn't crash
  Thread.current.thread_variable_get(THREAD_LOCAL) || clone_hub_to_current_thread
end

.get_current_scopeScope?

Returns the current active scope.

Returns:



360
361
362
363
# File 'lib/sentry-ruby.rb', line 360

def get_current_scope
  return unless initialized?
  get_current_hub.current_scope
end

.get_main_hubHub

Returns the main thread’s active hub.

Returns:



321
322
323
324
325
326
# File 'lib/sentry-ruby.rb', line 321

def get_main_hub
  MUTEX.synchronize { @main_hub }
rescue ThreadError
  # In some rare cases this may be called in a trap context so we need to handle it gracefully
  @main_hub
end

.get_trace_propagation_headersHash?

Returns the a Hash containing sentry-trace and baggage. Can be either from the currently active span or the propagation context.

Returns:

  • (Hash, nil)


596
597
598
599
# File 'lib/sentry-ruby.rb', line 596

def get_trace_propagation_headers
  return nil unless initialized?
  get_current_hub.get_trace_propagation_headers
end

.get_trace_propagation_metaString

Returns the a Hash containing sentry-trace and baggage. Can be either from the currently active span or the propagation context.

Returns:

  • (String)


605
606
607
608
# File 'lib/sentry-ruby.rb', line 605

def get_trace_propagation_meta
  return "" unless initialized?
  get_current_hub.get_trace_propagation_meta
end

.get_traceparentString?

Returns the traceparent (sentry-trace) header for distributed tracing. Can be either from the currently active span or the propagation context.

Returns:

  • (String, nil)


578
579
580
581
# File 'lib/sentry-ruby.rb', line 578

def get_traceparent
  return nil unless initialized?
  get_current_hub.get_traceparent
end

.init {|config| ... } ⇒ void

This method returns an undefined value.

Initializes the SDK with given configuration.

Yield Parameters:



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/sentry-ruby.rb', line 241

def init(&block)
  config = Configuration.new(&block)

  config.detect_release
  apply_patches(config)
  config.validate
  client = Client.new(config)
  scope = Scope.new(max_breadcrumbs: config.max_breadcrumbs)
  hub = Hub.new(client, scope)
  Thread.current.thread_variable_set(THREAD_LOCAL, hub)
  @main_hub = hub
  @background_worker = Sentry::BackgroundWorker.new(config)
  @session_flusher = config.session_tracking? ? Sentry::SessionFlusher.new(config, client) : nil
  @backpressure_monitor = config.enable_backpressure_handling ? Sentry::BackpressureMonitor.new(config, client) : nil
  @metrics_aggregator = config.metrics.enabled ? Sentry::Metrics::Aggregator.new(config, client) : nil
  exception_locals_tp.enable if config.include_local_variables
  at_exit { close }
end

.initialized?Boolean

Returns true if the SDK is initialized.

Returns:

  • (Boolean)


301
302
303
# File 'lib/sentry-ruby.rb', line 301

def initialized?
  !!get_main_hub
end

.integrationsHash{String=>Hash}

Returns a hash that contains all the integrations that have been registered to the main SDK.

Returns:

  • (Hash{String=>Hash})


134
135
136
# File 'lib/sentry-ruby.rb', line 134

def integrations
  @integrations ||= {}
end

.last_event_idString?

Returns the id of the lastly reported Sentry::Event.

Returns:

  • (String, nil)


544
545
546
547
# File 'lib/sentry-ruby.rb', line 544

def last_event_id
  return unless initialized?
  get_current_hub.last_event_id
end

.loggerStructuredLogger?

Returns the structured logger instance that implements Sentry’s SDK telemetry logs protocol.

This logger is only available when logs are enabled in the configuration.

Examples:

Enable logs in configuration

Sentry.init do |config|
  config.dsn = "YOUR_DSN"
  config.enable_logs = true
end

Basic usage

Sentry.logger.info("User logged in successfully", user_id: 123)
Sentry.logger.error("Failed to process payment",
  transaction_id: "tx_123",
  error_code: "PAYMENT_FAILED"
)

Returns:

  • (StructuredLogger, nil)

    The structured logger instance or nil if logs are disabled

See Also:



639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
# File 'lib/sentry-ruby.rb', line 639

def logger
  @logger ||=
    if configuration.enable_logs
      # Initialize the public-facing Structured Logger if logs are enabled
      # Use configured structured logger class or default to StructuredLogger
      # @see https://develop.sentry.dev/sdk/telemetry/logs/
      configuration.structured_logging.logger_class.new(configuration)
    else
      warn "        [sentry] `Sentry.logger` will no longer be used as internal SDK logger when `enable_logs` feature is turned on.\n                Use Sentry.configuration.sdk_logger for SDK-specific logging needs.\"\n\n                Caller: \#{caller.first}\n      STR\n\n      configuration.sdk_logger\n    end\nend\n"

.register_integration(name, version) ⇒ Object

Registers the SDK integration with its name and version.

Parameters:

  • name (String)

    name of the integration

  • version (String)

    version of the integration



142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/sentry-ruby.rb', line 142

def register_integration(name, version)
  if initialized?
    sdk_logger.warn(LOGGER_PROGNAME) do
      "        Integration '\#{name}' is loaded after the SDK is initialized, which can cause unexpected behavior.  Please make sure all integrations are loaded before SDK initialization.\n      MSG\n    end\n  end\n\n  meta = { name: \"sentry.ruby.\#{name}\", version: version }.freeze\n  integrations[name.to_s] = meta\nend\n"

.send_eventObject



177
178
179
180
# File 'lib/sentry-ruby.rb', line 177

def send_event(*args)
  return unless initialized?
  get_current_client.send_event(*args)
end

.set_contextObject



223
224
225
226
# File 'lib/sentry-ruby.rb', line 223

def set_context(*args)
  return unless initialized?
  get_current_scope.set_context(*args)
end

.set_extrasObject



209
210
211
212
# File 'lib/sentry-ruby.rb', line 209

def set_extras(*args)
  return unless initialized?
  get_current_scope.set_extras(*args)
end

.set_tagsObject



202
203
204
205
# File 'lib/sentry-ruby.rb', line 202

def set_tags(*args)
  return unless initialized?
  get_current_scope.set_tags(*args)
end

.set_userObject



216
217
218
219
# File 'lib/sentry-ruby.rb', line 216

def set_user(*args)
  return unless initialized?
  get_current_scope.set_user(*args)
end

.start_transaction(**options) ⇒ Transaction?

Takes or initializes a new Sentry::Transaction and makes a sampling decision for it.

Returns:



518
519
520
521
# File 'lib/sentry-ruby.rb', line 518

def start_transaction(**options)
  return unless initialized?
  get_current_hub.start_transaction(**options)
end

.with_child_span(**attributes) {|child_span| ... } ⇒ Object

Records the block’s execution as a child of the current span. If the current scope doesn’t have a span, the block would still be executed but the yield param will be nil.

Examples:

Sentry.with_child_span(op: "my operation") do |child_span|
  child_span.set_data(operation_data)
  child_span.set_description(operation_detail)
  # result will be returned
end

Parameters:

  • attributes (Hash)

    attributes for the child span.

Yield Parameters:

  • child_span (Span, nil)

Returns:

  • yield result



536
537
538
539
# File 'lib/sentry-ruby.rb', line 536

def with_child_span(**attributes, &block)
  return yield(nil) unless Sentry.initialized?
  get_current_hub.with_child_span(**attributes, &block)
end

.with_exception_captured(**options, &block) ⇒ Object

Takes a block and evaluates it. If the block raised an exception, it reports the exception to Sentry and re-raises it. If the block ran without exception, it returns the evaluation result.

Examples:

Sentry.with_exception_captured do
  1/1 #=> 1 will be returned
end

Sentry.with_exception_captured do
  1/0 #=> ZeroDivisionError will be reported and re-raised
end


455
456
457
458
459
460
# File 'lib/sentry-ruby.rb', line 455

def with_exception_captured(**options, &block)
  yield
rescue Exception => e
  capture_exception(e, **options)
  raise
end

.with_scope {|scope| ... } ⇒ void

This method returns an undefined value.

Takes a block and yields a temporary scope. The temporary scope will inherit all the attributes from the current active scope and replace it to be the active scope inside the block.

Examples:

Sentry.configure_scope do |scope|
  scope.set_tags(foo: "bar")
end

Sentry.capture_message("test message") # this event will have tags { foo: "bar" }

Sentry.with_scope do |temp_scope|
  temp_scope.set_tags(foo: "baz")
  Sentry.capture_message("test message 2") # this event will have tags { foo: "baz" }
end

Sentry.capture_message("test message 3") # this event will have tags { foo: "bar" }

Yield Parameters:



409
410
411
412
# File 'lib/sentry-ruby.rb', line 409

def with_scope(&block)
  return yield unless initialized?
  get_current_hub.with_scope(&block)
end

.with_session_tracking(&block) ⇒ void

This method returns an undefined value.

Wrap a given block with session tracking. Aggregate sessions in minutely buckets will be recorded around this block and flushed every minute.

Examples:

Sentry.with_session_tracking do
  a = 1 + 1 # new session recorded with :exited status
end

Sentry.with_session_tracking do
  1 / 0
rescue => e
  Sentry.capture_exception(e) # new session recorded with :errored status
end


429
430
431
432
# File 'lib/sentry-ruby.rb', line 429

def with_session_tracking(&block)
  return yield unless initialized?
  get_current_hub.with_session_tracking(&block)
end