Module: RerankerRuby::Logging

Defined in:
lib/reranker_ruby/logging.rb

Overview

Global logging and metrics for reranking operations.

Usage:

RerankerRuby::Logging.logger = Logger.new($stdout)
RerankerRuby::Logging.on_rerank do |event|
puts "#{event[:reranker]} took #{event[:duration_ms]}ms for #{event[:document_count]} docs"
end

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.logger ⇒ Object



18
19
20
# File 'lib/reranker_ruby/logging.rb', line 18

def logger
  @logger ||= Logger.new($stdout, level: Logger::WARN)
end

Class Method Details

.callbacks ⇒ Object



27
28
29
# File 'lib/reranker_ruby/logging.rb', line 27

def callbacks
  @callbacks ||= []
end

.clear_callbacks ⇒ Object



31
32
33
# File 'lib/reranker_ruby/logging.rb', line 31

def clear_callbacks
  @callbacks = []
end

.instrument(reranker_class:, query:, document_count:, top_k:) ⇒ Object

Wrap a rerank call with logging and metrics



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/reranker_ruby/logging.rb', line 36

def instrument(reranker_class:, query:, document_count:, top_k:)
  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  result = yield
  duration_ms = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round(2)

  event = {
    reranker: reranker_class,
    query: query,
    document_count: document_count,
    top_k: top_k,
    result_count: result.length,
    duration_ms: duration_ms,
    top_score: result.first.respond_to?(:score) ? result.first.score : nil
  }

  logger.info { "[RerankerRuby] #{reranker_class} reranked #{document_count} docs in #{duration_ms}ms" }
  callbacks.each { |cb| cb.call(event) }

  result
end

.on_rerank(&block) ⇒ Object

Register a callback for rerank events



23
24
25
# File 'lib/reranker_ruby/logging.rb', line 23

def on_rerank(&block)
  callbacks << block
end