Module: CloseYourIt

Defined in:
lib/closeyourit-ruby.rb,
lib/closeyourit/event.rb,
lib/closeyourit/scope.rb,
lib/closeyourit/stats.rb,
lib/closeyourit/client.rb,
lib/closeyourit/monitor.rb,
lib/closeyourit/version.rb,
lib/closeyourit/scrubber.rb,
lib/closeyourit/transport.rb,
lib/closeyourit/breadcrumb.rb,
lib/closeyourit/log_buffer.rb,
lib/closeyourit/log_device.rb,
lib/closeyourit/instrumenter.rb,
lib/closeyourit/configuration.rb,
lib/closeyourit/rails/railtie.rb,
lib/closeyourit/events/log_event.rb,
lib/closeyourit/background_worker.rb,
lib/closeyourit/breadcrumb_buffer.rb,
lib/closeyourit/events/error_event.rb,
lib/closeyourit/performance/rollup.rb,
lib/closeyourit/rails/query_source.rb,
lib/closeyourit/rails/log_broadcast.rb,
lib/closeyourit/events/message_event.rb,
lib/closeyourit/rails/net_http_patch.rb,
lib/closeyourit/rails/request_context.rb,
lib/closeyourit/sidekiq/error_handler.rb,
lib/closeyourit/rails/error_subscriber.rb,
lib/closeyourit/subscribers/slow_query.rb,
lib/closeyourit/events/slow_query_event.rb,
lib/closeyourit/events/slow_method_event.rb,
lib/closeyourit/rails/capture_exceptions.rb,
lib/closeyourit/rails/active_job_extension.rb,
lib/closeyourit/performance/request_profile.rb,
lib/closeyourit/events/performance_issue_event.rb,
lib/closeyourit/subscribers/request_performance.rb

Overview

CloseYourIt — client di telemetria (errori + statistiche di query/metodi lenti) che invia gli eventi all'endpoint di ingest di CloseYourIt.

Entry point della gemma (file con trattino come sentry-ruby): require "closeyourit-ruby" carica il modulo CloseYourIt.

Defined Under Namespace

Modules: Instrumenter, Monitor, Performance, Rails, Sidekiq, Subscribers Classes: BackgroundWorker, Breadcrumb, BreadcrumbBuffer, Client, Configuration, Error, ErrorEvent, Event, LogBuffer, LogDevice, LogEvent, MessageEvent, PerformanceIssueEvent, Scope, Scrubber, SlowMethodEvent, SlowQueryEvent, Stats, Transport

Constant Summary collapse

CAPTURED_FLAG =
:@__closeyourit_captured
VERSION =
"0.3.4"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.internal_loggerObject

Logger interno della gemma (warning/errori diagnostici su stdout). NON è il logging applicativo: per spedire log strutturati a CloseYourIt usa CloseYourIt.log / CloseYourIt.logger.



155
156
157
# File 'lib/closeyourit-ruby.rb', line 155

def internal_logger
  @internal_logger ||= default_internal_logger
end

Class Method Details

.add_breadcrumb(message: nil, category: nil, type: "default", level: "info", data: {}) ⇒ Object

Aggiunge una briciola di contesto (query, navigazione, evento custom) all'evento corrente. No-op se breadcrumbs disabilitati; data viene scrubato (denylist) prima di essere salvato.



144
145
146
147
148
149
150
151
# File 'lib/closeyourit-ruby.rb', line 144

def add_breadcrumb(message: nil, category: nil, type: "default", level: "info", data: {})
  return nil unless configuration.breadcrumbs_enabled

  scrubbed = data.nil? || data.empty? ? data : Scrubber.new(configuration).filter_params(data)
  Scope.current.add_breadcrumb(
    Breadcrumb.new(message: message, category: category, type: type, level: level, data: scrubbed)
  )
end

.capture_event(event) ⇒ Object

Spedisce un evento già costruito (slow_query/slow_method).



89
90
91
92
93
# File 'lib/closeyourit-ruby.rb', line 89

def capture_event(event)
  return nil unless enabled?

  client.capture_event(event)
end

.capture_exception(exception, handled: false, level: "error", contexts: nil) ⇒ Object

Cattura un'eccezione e la spedisce (fire-and-forget). No-op se disabilitato, se l'eccezione è esclusa o già catturata.



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/closeyourit-ruby.rb', line 74

def capture_exception(exception, handled: false, level: "error", contexts: nil)
  return nil unless enabled?
  return nil if ignored_exception?(exception)
  return nil if exception_captured?(exception)

  mark_captured(exception)
  return nil unless sampled?

  event = ErrorEvent.from_exception(
    exception, configuration: configuration, handled: handled, level: level, contexts: contexts
  )
  client.capture_event(event)
end

.capture_message(message, level: "info") ⇒ Object

Invia un messaggio diagnostico esplicito (non un'eccezione). Soggetto a sampling + scope. CloseYourIt.capture_message("cache miss storm", level: "warning")



97
98
99
100
101
102
103
# File 'lib/closeyourit-ruby.rb', line 97

def capture_message(message, level: "info")
  return nil unless enabled?
  return nil unless sampled?

  event = MessageEvent.new(message, level: level, configuration: configuration)
  client.capture_event(event)
end

.clear_scopeObject



138
139
140
# File 'lib/closeyourit-ruby.rb', line 138

def clear_scope
  Scope.reset!
end

.configurationObject



60
61
62
# File 'lib/closeyourit-ruby.rb', line 60

def configuration
  @configuration ||= Configuration.new
end

.configure_scope {|Scope.current| ... } ⇒ Object

Yields:



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

def configure_scope
  yield(Scope.current) if block_given?
end

.configured?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/closeyourit-ruby.rb', line 64

def configured?
  !@configuration.nil?
end

.enabled?Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/closeyourit-ruby.rb', line 68

def enabled?
  configuration.enabled?
end

.flush_logsObject

Forza l'invio dei log bufferizzati (chiamato anche allo shutdown del processo).



189
190
191
192
# File 'lib/closeyourit-ruby.rb', line 189

def flush_logs
  @log_buffer&.flush
  nil
end

.init {|@configuration| ... } ⇒ Object

Configura il client. Senza token/endpoint → no-op.

Yields:



50
51
52
53
54
55
56
57
58
# File 'lib/closeyourit-ruby.rb', line 50

def init
  @configuration = Configuration.new
  @client = nil
  @log_buffer = nil
  yield(@configuration) if block_given?
  @configuration.validate!
  register_shutdown_flush
  @configuration
end

.log(level, message, logger: nil, **attributes) ⇒ Object

Costruisce e bufferizza una voce di log strutturata (batch verso /logs, fire-and-forget). Il level è normalizzato ai livelli canonici (:warnwarning, downcase; ignoto→info). logger opzionale = nome della sorgente del log. CloseYourIt.log(:info, "ordine creato", order_id: 1) CloseYourIt.log(:warn, "retry", logger: "payments", attempt: 3)



172
173
174
175
176
177
178
179
180
# File 'lib/closeyourit-ruby.rb', line 172

def log(level, message, logger: nil, **attributes)
  return nil unless logs_enabled?
  return nil unless logs_sampled?

  event = LogEvent.new(message, level: level, attributes: attributes,
                                logger: logger, configuration: configuration)
  log_buffer.add(event)
  nil
end

.loggerObject

Logger applicativo Logger-compatibile: inoltra ogni messaggio a CloseYourIt.log (→ ingest /logs). CloseYourIt.logger.info("ordine creato", order_id: 1)



163
164
165
# File 'lib/closeyourit-ruby.rb', line 163

def logger
  @app_logger ||= LogDevice.new
end

.logs_active?Boolean

Vero se i log sono attivi (master switch + flag): usato da LogDevice per NON valutare i block costosi (logger.debug { dump }) quando il logging è spento.

Returns:

  • (Boolean)


184
185
186
# File 'lib/closeyourit-ruby.rb', line 184

def logs_active?
  logs_enabled?
end

.measure(label, &block) ⇒ Object

Cronometra un blocco e invia un slow_method se supera la soglia. CloseYourIt.measure("checkout.total") { ... }



107
108
109
# File 'lib/closeyourit-ruby.rb', line 107

def measure(label, &block)
  Instrumenter.measure(label, &block)
end

.set_context(key, attributes) ⇒ Object



126
127
128
# File 'lib/closeyourit-ruby.rb', line 126

def set_context(key, attributes)
  Scope.current.set_context(key, attributes)
end

.set_extra(key, value) ⇒ Object



130
131
132
# File 'lib/closeyourit-ruby.rb', line 130

def set_extra(key, value)
  Scope.current.set_extra(key, value)
end

.set_tag(key, value) ⇒ Object



118
119
120
# File 'lib/closeyourit-ruby.rb', line 118

def set_tag(key, value)
  Scope.current.set_tag(key, value)
end

.set_tags(attributes) ⇒ Object



122
123
124
# File 'lib/closeyourit-ruby.rb', line 122

def set_tags(attributes)
  Scope.current.set_tags(attributes)
end

.set_user(attributes) ⇒ Object

--- Scope per-richiesta/job (user/tags/extra/contexts) --- Arricchiscono l'evento corrente; resettati a fine richiesta/job da middleware e estensioni.



114
115
116
# File 'lib/closeyourit-ruby.rb', line 114

def set_user(attributes)
  Scope.current.set_user(attributes)
end

.statsObject

Contatori diagnostici del client (accodati/scartati/spediti/falliti). CloseYourIt.stats.to_h # => { enqueued: …, dropped: …, sent: …, failed: … }



196
197
198
# File 'lib/closeyourit-ruby.rb', line 196

def stats
  @stats ||= Stats.new
end