Class: CloseYourIt::Subscribers::SlowQuery

Inherits:
Object
  • Object
show all
Defined in:
lib/closeyourit/subscribers/slow_query.rb

Overview

Riceve i dati di un evento sql.active_record e, se la query supera la soglia (escludendo SCHEMA/CACHE/TRANSACTION), invia un evento slow_query. Logica pura: il wiring ad ActiveSupport::Notifications vive nel Railtie.

Constant Summary collapse

IGNORED_NAMES =
%w[SCHEMA CACHE TRANSACTION].freeze

Instance Method Summary collapse

Constructor Details

#initialize(configuration = nil) ⇒ SlowQuery

Returns a new instance of SlowQuery.



15
16
17
# File 'lib/closeyourit/subscribers/slow_query.rb', line 15

def initialize(configuration = nil)
  @configuration = configuration
end

Instance Method Details

Breadcrumb per OGNI query non di sistema (non solo lente): SQL offuscato, niente bind. Dà la cronologia "quali query prima del crash" allegata all'evento d'errore.



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/closeyourit/subscribers/slow_query.rb', line 36

def breadcrumb(name:, sql:, duration_ms:, cached: false)
  config = @configuration || CloseYourIt.configuration
  return if ignored_name?(name)
  return unless config.breadcrumbs_enabled

  CloseYourIt.add_breadcrumb(
    category: "query",
    type: "query",
    message: scrubber(config).obfuscate_sql(sql),
    data: { "name" => name, "duration_ms" => duration_ms.to_f.round(2), "cached" => cached }
  )
end

#profile(name:, sql:, duration_ms:, cached: false, source: nil) ⇒ Object

Spinge OGNI query non di sistema nel RequestProfile dello Scope (per la detection N+1 a fine richiesta). Solo se detect_performance_issues: fingerprint = SQL offuscato + call-site.



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/closeyourit/subscribers/slow_query.rb', line 51

def profile(name:, sql:, duration_ms:, cached: false, source: nil)
  config = @configuration || CloseYourIt.configuration
  return unless config.detect_performance_issues
  return if ignored_name?(name)

  CloseYourIt::Scope.current.performance_profile.add_query(
    fingerprint: scrubber(config).obfuscate_sql(sql),
    source: source, duration_ms: duration_ms, cached: cached
  )
rescue StandardError
  # La telemetria non deve mai disturbare la query ospite.
  nil
end

#record(name:, duration_ms:, sql:, cached: false, connection: nil, binds: nil, type_casted_binds: nil, source: nil) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/closeyourit/subscribers/slow_query.rb', line 19

def record(name:, duration_ms:, sql:, cached: false, connection: nil,
           binds: nil, type_casted_binds: nil, source: nil)
  config = @configuration || CloseYourIt.configuration
  return if ignored_name?(name)
  return if duration_ms < config.slow_query_threshold_ms

  event = SlowQueryEvent.new(
    { name: name, sql: sql, cached: cached, connection: connection,
      binds: binds, type_casted_binds: type_casted_binds, source: source },
    duration_ms,
    config
  )
  CloseYourIt.capture_event(event)
end