This repository was archived by the owner on Jul 31, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathrecorder.rb
105 lines (88 loc) · 2.86 KB
/
recorder.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
99
100
101
102
103
104
105
# frozen_string_literal: true
require "opencensus/stats/view"
require "opencensus/stats/view_data"
module OpenCensus
module Stats
# Stats recorder.
#
# Recorder record measurement against measure for registered views.
class Recorder
# @private
# @return [Hash<String,View>] Hash of view name and View object.
attr_reader :views
# @private
# @return [Hash<String,Measure>] Hash of measure name and Measure object.
attr_reader :measures
# @private
# @return [Hash<String,Array<<ViewData>>]
# Hash of view name and View data objects array.
attr_reader :measure_views_data
# @private
# Create instance of the recorder.
def initialize
@views = {}
@measures = {}
@measure_views_data = {}
@time = Time.now.utc
end
# Register view
#
# @param [View] view
# @return [View]
def register_view view
return if @views.key? view.name
@views[view.name] = view
@measures[view.measure.name] = view.measure
unless @measure_views_data.key? view.measure.name
@measure_views_data[view.measure.name] = []
end
@measure_views_data[view.measure.name] << ViewData.new(
view,
start_time: @time,
end_time: @time
)
view
end
# Record measurements.
#
# @param [Array<Measurement>, Measurement] measurements
# A list of measurements to or single measurement.
# All passed measurements will be rejected If any one of the measurement
# has negative value.
# @param [Hash<String,String>] attachments The contextual information
# associated with an example value. The contextual information is
# represented as key, value string pairs.
def record *measurements, attachments: nil
return if measurements.any? { |m| m.value < 0 }
measurements.each do |measurement|
views_data = @measure_views_data[measurement.measure.name]
next unless views_data
views_data.each do |view_data|
view_data.record measurement, attachments: attachments
end
end
end
# Get recorded data for given view name
#
# @param [String] view_name View name
# @return [ViewData]
def view_data view_name
view = @views[view_name]
return unless view
views_data = @measure_views_data[view.measure.name]
views_data.find { |view_data| view_data.view.name == view.name }
end
# Get all views data list
# @return [Array<ViewData>]
def views_data
@measure_views_data.values.flatten
end
# Clear recorded stats.
def clear_stats
@measure_views_data.each_value do |views_data|
views_data.each(&:clear)
end
end
end
end
end