Class: CloseYourIt::Performance::RequestProfile

Inherits:
Object
  • Object
show all
Defined in:
lib/closeyourit/performance/request_profile.rb

Overview

Accumulatore per-richiesta (vive nello Scope, resettato a fine richiesta). Conta le query, le raggruppa per [fingerprint SQL offuscato, call-site] (il pattern prosopite per l'N+1) e tiene le chiamate HTTP esterne. Puro stato in memoria: il verdetto lo calcola Performance::Rollup.

Constant Summary collapse

MAX_GROUPS =

Guard di memoria: cap ai gruppi/chiamate distinti tracciati (il conteggio totale resta esatto).

1000
MAX_EXTERNAL =
500

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRequestProfile

Returns a new instance of RequestProfile.



15
16
17
18
19
20
# File 'lib/closeyourit/performance/request_profile.rb', line 15

def initialize
  @query_count = 0
  @total_query_time_ms = 0.0
  @query_groups = {}
  @external_calls = []
end

Instance Attribute Details

#external_callsObject (readonly)

Returns the value of attribute external_calls.



13
14
15
# File 'lib/closeyourit/performance/request_profile.rb', line 13

def external_calls
  @external_calls
end

#query_countObject (readonly)

Returns the value of attribute query_count.



13
14
15
# File 'lib/closeyourit/performance/request_profile.rb', line 13

def query_count
  @query_count
end

#query_groupsObject (readonly)

Returns the value of attribute query_groups.



13
14
15
# File 'lib/closeyourit/performance/request_profile.rb', line 13

def query_groups
  @query_groups
end

#total_query_time_msObject (readonly)

Returns the value of attribute total_query_time_ms.



13
14
15
# File 'lib/closeyourit/performance/request_profile.rb', line 13

def total_query_time_ms
  @total_query_time_ms
end

Instance Method Details

#add_external(host:, path:, duration_ms:) ⇒ Object



40
41
42
43
44
# File 'lib/closeyourit/performance/request_profile.rb', line 40

def add_external(host:, path:, duration_ms:)
  return if @external_calls.size >= MAX_EXTERNAL

  @external_calls << { host: host, path: path, duration_ms: duration_ms.to_f }
end

#add_query(fingerprint:, source:, duration_ms:, cached: false) ⇒ Object

Una query non di sistema. Le query da cache non sono round-trip DB → non contano per l'N+1.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/closeyourit/performance/request_profile.rb', line 23

def add_query(fingerprint:, source:, duration_ms:, cached: false)
  return if cached

  ms = duration_ms.to_f
  @query_count += 1
  @total_query_time_ms += ms

  key = "#{fingerprint}\n#{source}"
  group = @query_groups[key]
  if group
    group[:count] += 1
    group[:duration_ms] += ms
  elsif @query_groups.size < MAX_GROUPS
    @query_groups[key] = { count: 1, duration_ms: ms, sql: fingerprint, source: source }
  end
end

#empty?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/closeyourit/performance/request_profile.rb', line 46

def empty?
  @query_count.zero? && @external_calls.empty?
end