Class: LightStep::Reporter

Inherits:
Object
  • Object
show all
Defined in:
lib/lightstep/reporter.rb

Overview

Reporter builds up reports of spans and flushes them to a transport

Constant Summary collapse

DEFAULT_PERIOD_SECONDS =
3.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_span_records:, transport:, guid:, component_name:, tags: {}) ⇒ Reporter

Returns a new instance of Reporter.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/lightstep/reporter.rb', line 10

def initialize(max_span_records:, transport:, guid:, component_name:, tags: {})
  @max_span_records = max_span_records
  @span_records = Concurrent::Array.new
  @dropped_spans = Concurrent::AtomicFixnum.new
  @dropped_span_logs = Concurrent::AtomicFixnum.new
  @transport = transport
  @period = DEFAULT_PERIOD_SECONDS

  start_time = LightStep.micros(Time.now)
  @report_start_time = start_time

  @runtime = {
    guid: guid,
    start_micros: start_time,
    group_name: component_name,
    attrs: [
      {Key: "lightstep.tracer_platform",         Value: "ruby"},
      {Key: "lightstep.tracer_version",          Value: LightStep::VERSION},
      {Key: "lightstep.tracer_platform_version", Value: RUBY_VERSION}
    ] + tags.map{|k,v| {Key: k.to_s, Value: v.to_s}}
  }.freeze

  reset_on_fork
end

Instance Attribute Details

#max_span_recordsObject

Returns the value of attribute max_span_records.



7
8
9
# File 'lib/lightstep/reporter.rb', line 7

def max_span_records
  @max_span_records
end

#periodObject

Returns the value of attribute period.



8
9
10
# File 'lib/lightstep/reporter.rb', line 8

def period
  @period
end

Instance Method Details

#add_span(span) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/lightstep/reporter.rb', line 35

def add_span(span)
  reset_on_fork

  @span_records.push(span.to_h)
  if @span_records.size > max_span_records
    dropped = @span_records.shift
    @dropped_spans.increment
    @dropped_span_logs.increment(dropped[:log_records].size + dropped[:dropped_logs])
  end
end

#clearObject



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/lightstep/reporter.rb', line 46

def clear
  reset_on_fork

  span_records = @span_records.slice!(0, @span_records.length)
  @dropped_spans.increment(span_records.size)
  @dropped_span_logs.increment(
    span_records.reduce(0) {|memo, span|
      memo + span[:log_records].size + span[:dropped_logs]
    }
  )
end

#flushObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/lightstep/reporter.rb', line 58

def flush
  reset_on_fork

  return if @span_records.empty?

  now = LightStep.micros(Time.now)

  span_records = @span_records.slice!(0, @span_records.length)
  dropped_spans = 0
  @dropped_spans.update{|old| dropped_spans = old; 0 }

  old_dropped_span_logs = 0
  @dropped_span_logs.update{|old| old_dropped_span_logs = old; 0 }
  dropped_logs = old_dropped_span_logs
  dropped_logs = span_records.reduce(dropped_logs) do |memo, span|
    memo += span.delete :dropped_logs
  end

  report_request = {
    runtime: @runtime,
    oldest_micros: @report_start_time,
    youngest_micros: now,
    span_records: span_records,
    counters: [
      {Name: "dropped_logs",  Value: dropped_logs},
      {Name: "dropped_spans", Value: dropped_spans},
    ]
  }

  @report_start_time = now

  begin
    @transport.report(report_request)
  rescue
    # an error occurs, add the previous dropped logs to the logs
    # that were going to get reported, as well as the previous dropped
    # spans and spans that would have been recorded
    @dropped_spans.increment(dropped_spans + span_records.length)
    @dropped_span_logs.increment(old_dropped_span_logs)
  end
end