Class: Observable::Persistence::SpanRepo

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/observable/persistence/span_repo.rb

Instance Method Summary collapse

Constructor Details

#initialize(spans:) ⇒ SpanRepo

Returns a new instance of SpanRepo.



8
9
10
# File 'lib/observable/persistence/span_repo.rb', line 8

def initialize(spans:)
  @spans = spans.map { |span_or_spandata| Span.from_span_or_spandata(span_or_spandata) }
end

Instance Method Details

#aiObject



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/observable/persistence/span_repo.rb', line 87

def ai
  grouped_spans = group_by(&:trace_id)
  output = []

  grouped_spans.each do |trace_id, spans|
    output << colorize_trace_header(trace_id)
    spans.each do |span|
      output << span.ai
    end
  end

  output.join("\n")
end

#eachObject



12
13
14
# File 'lib/observable/persistence/span_repo.rb', line 12

def each(&)
  @spans.each(&)
end

#empty?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/observable/persistence/span_repo.rb', line 49

def empty?(&)
  count(&).zero?
end

#find_by!(name:) ⇒ Object



62
63
64
65
# File 'lib/observable/persistence/span_repo.rb', line 62

def find_by!(name:)
  span = find { |s| s.name == name }
  span || raise(Observable::NotFound, "No spans found with name: #{name}\n\nSpans:\n#{ai}")
end

#find_by_attrs!(attrs) ⇒ Object



67
68
69
70
# File 'lib/observable/persistence/span_repo.rb', line 67

def find_by_attrs!(attrs)
  span = find { |s| matches_criteria?(s, attrs) }
  span || raise(Observable::NotFound, "No spans found with attributes: #{attrs}\n\nSpans:\n#{ai}")
end

#find_one!(attrs: {}, &block) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/observable/persistence/span_repo.rb', line 37

def find_one!(attrs: {}, &block)
  block = to_block(attrs) if attrs.any? && !block_given?

  if one?(&block)
    find(&block)
  elsif empty?(&block)
    raise_none_found
  else
    raise_too_many_found(&block)
  end
end

#in_code_namespace(namespace) ⇒ Object



16
17
18
# File 'lib/observable/persistence/span_repo.rb', line 16

def in_code_namespace(namespace)
  select { |span| span.code_namespace == namespace }
end

#in_root_traceObject



20
21
22
23
24
25
26
27
# File 'lib/observable/persistence/span_repo.rb', line 20

def in_root_trace
  result = group_by(&:trace_id).find { |_trace_id, spans| spans.count > 1 }
  if result
    self.class.new(spans: result.last)
  else
    self.class.new(spans: [])
  end
end

#inspectObject



83
84
85
# File 'lib/observable/persistence/span_repo.rb', line 83

def inspect
  ai
end

#one_and_only!Object



29
30
31
32
33
34
35
# File 'lib/observable/persistence/span_repo.rb', line 29

def one_and_only!
  if one?
    first
  else
    raise ArgumentError, "Expected 1 span, but found #{count}: #{to_a}"
  end
end

#raise_none_foundObject

Raises:

  • (ArgumentError)


53
54
55
# File 'lib/observable/persistence/span_repo.rb', line 53

def raise_none_found
  raise ArgumentError, "No spans found"
end

#raise_too_many_foundObject

Raises:

  • (ArgumentError)


57
58
59
60
# File 'lib/observable/persistence/span_repo.rb', line 57

def raise_too_many_found(&)
  matched = select(&)
  raise ArgumentError, "Too many spans found:\n#{matched.inspect}"
end

#to_block(query) ⇒ Object



77
78
79
80
81
# File 'lib/observable/persistence/span_repo.rb', line 77

def to_block(query)
  lambda do |object|
    object.attrs.transform_keys(&:to_s).slice(*query.transform_keys(&:to_s).keys) == query.transform_keys(&:to_s)
  end
end

#where(criteria) ⇒ Object



72
73
74
75
# File 'lib/observable/persistence/span_repo.rb', line 72

def where(criteria)
  matching_spans = select { |span| matches_criteria?(span, criteria) }
  self.class.new(spans: matching_spans)
end