opencensus 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +2 -1
  4. data/lib/opencensus/stats.rb +143 -1
  5. data/lib/opencensus/stats/aggregation.rb +27 -0
  6. data/lib/opencensus/stats/aggregation/count.rb +18 -0
  7. data/lib/opencensus/stats/aggregation/distribution.rb +41 -0
  8. data/lib/opencensus/stats/aggregation/last_value.rb +18 -0
  9. data/lib/opencensus/stats/aggregation/sum.rb +18 -0
  10. data/lib/opencensus/stats/aggregation_data.rb +24 -0
  11. data/lib/opencensus/stats/aggregation_data/count.rb +37 -0
  12. data/lib/opencensus/stats/aggregation_data/distribution.rb +109 -0
  13. data/lib/opencensus/stats/aggregation_data/last_value.rb +32 -0
  14. data/lib/opencensus/stats/aggregation_data/sum.rb +37 -0
  15. data/lib/opencensus/stats/config.rb +79 -0
  16. data/lib/opencensus/stats/exemplar.rb +40 -0
  17. data/lib/opencensus/stats/exporters.rb +31 -0
  18. data/lib/opencensus/stats/exporters/logger.rb +77 -0
  19. data/lib/opencensus/stats/exporters/multi.rb +57 -0
  20. data/lib/opencensus/stats/measure.rb +99 -0
  21. data/lib/opencensus/stats/measure_registry.rb +72 -0
  22. data/lib/opencensus/stats/measurement.rb +35 -0
  23. data/lib/opencensus/stats/recorder.rb +100 -0
  24. data/lib/opencensus/stats/view.rb +57 -0
  25. data/lib/opencensus/stats/view_data.rb +68 -0
  26. data/lib/opencensus/tags.rb +39 -2
  27. data/lib/opencensus/tags/config.rb +74 -0
  28. data/lib/opencensus/tags/formatters.rb +15 -0
  29. data/lib/opencensus/tags/formatters/binary.rb +141 -0
  30. data/lib/opencensus/tags/tag_map.rb +137 -0
  31. data/lib/opencensus/trace/annotation.rb +1 -1
  32. data/lib/opencensus/trace/link.rb +1 -1
  33. data/lib/opencensus/trace/span.rb +1 -1
  34. data/lib/opencensus/trace/span_builder.rb +5 -4
  35. data/lib/opencensus/version.rb +1 -1
  36. metadata +32 -8
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ require "singleton"
5
+ require "opencensus/stats/measure"
6
+
7
+ module OpenCensus
8
+ module Stats
9
+ # #MeasureRegistry
10
+ #
11
+ # Measure registry is a collection of uniq measures.
12
+ #
13
+ class MeasureRegistry
14
+ include Singleton
15
+
16
+ # @return [Hash<String, Measure>]
17
+ attr_reader :measures
18
+
19
+ # @private
20
+ def initialize
21
+ @measures = {}
22
+ end
23
+
24
+ class << self
25
+ # Register measure.
26
+ #
27
+ # @param [String] name Name of measure
28
+ # @param [String] unit Unit name of measure
29
+ # @param [String] type Date type unit of measure. integer or float.
30
+ # @param [String] description Description of measure
31
+ # @return [Measure, nil]
32
+ #
33
+ def register name:, unit:, type:, description: nil
34
+ return if instance.measures.key? name
35
+
36
+ measure = Measure.new(
37
+ name: name,
38
+ unit: unit,
39
+ type: type,
40
+ description: description
41
+ )
42
+
43
+ instance.measures[name] = measure
44
+ end
45
+
46
+ # Un register measure
47
+ #
48
+ # @param [String] name Name of the registered view
49
+ def unregister name
50
+ instance.measures.delete name
51
+ end
52
+
53
+ # Clear measures registry
54
+ def clear
55
+ instance.measures.clear
56
+ end
57
+
58
+ # Get registered measure
59
+ # @return [Measure]
60
+ def get name
61
+ instance.measures[name]
62
+ end
63
+
64
+ # List of registered measures
65
+ # @return [Array<Measure>]
66
+ def measures
67
+ instance.measures.values
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ module OpenCensus
5
+ module Stats
6
+ # Measurement
7
+ #
8
+ # Describes a data point to be collected for a Measure.
9
+ class Measurement
10
+ # @return [Measure] A measure to which the value is applied.
11
+ attr_reader :measure
12
+
13
+ # @return [Integer,Float] The recorded value
14
+ attr_reader :value
15
+
16
+ # @return [TagMap] The tags to which the value is applied
17
+ attr_reader :tags
18
+
19
+ # @return [Time] The time when measurement was created.
20
+ attr_reader :time
21
+
22
+ # Create a instance of measurement
23
+ #
24
+ # @param [Measure] measure A measure to which the value is applied.
25
+ # @param [Integer,Float] value Measurement value.
26
+ # @param [Hash<String,String>] tags The tags to which the value is applied
27
+ def initialize measure:, value:, tags:
28
+ @measure = measure
29
+ @value = value
30
+ @tags = Tags::TagMap.new tags
31
+ @time = Time.now.utc
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ require "opencensus/stats/view"
5
+ require "opencensus/stats/view_data"
6
+
7
+ module OpenCensus
8
+ module Stats
9
+ # Stats recorder.
10
+ #
11
+ # Recorder record measurement against measure for registered views.
12
+ class Recorder
13
+ # @private
14
+ # @return [Hash<String,View>] Hash of view name and View object.
15
+ attr_reader :views
16
+
17
+ # @private
18
+ # @return [Hash<String,Measure>] Hash of measure name and Measure object.
19
+ attr_reader :measures
20
+
21
+ # @private
22
+ # @return [Hash<String,Array<<ViewData>>]
23
+ # Hash of view name and View data objects array.
24
+ attr_reader :measure_views_data
25
+
26
+ # @private
27
+ # Create instance of the recorder.
28
+ def initialize
29
+ @views = {}
30
+ @measures = {}
31
+ @measure_views_data = {}
32
+ @time = Time.now.utc
33
+ end
34
+
35
+ # Register view
36
+ #
37
+ # @param [View] view
38
+ # @return [View]
39
+ def register_view view
40
+ return if @views.key? view.name
41
+
42
+ @views[view.name] = view
43
+ @measures[view.measure.name] = view.measure
44
+
45
+ unless @measure_views_data.key? view.measure.name
46
+ @measure_views_data[view.measure.name] = []
47
+ end
48
+
49
+ @measure_views_data[view.measure.name] << ViewData.new(
50
+ view,
51
+ start_time: @time,
52
+ end_time: @time
53
+ )
54
+ view
55
+ end
56
+
57
+ # Record measurements
58
+ #
59
+ # @param [Array<Measurement>, Measurement] measurements
60
+ # @param [Hash<String,String>] attachments
61
+ def record *measurements, attachments: nil
62
+ return if measurements.any? { |m| m.value < 0 }
63
+
64
+ measurements.each do |measurement|
65
+ views_data = @measure_views_data[measurement.measure.name]
66
+ next unless views_data
67
+
68
+ views_data.each do |view_data|
69
+ view_data.record measurement, attachments: attachments
70
+ end
71
+ end
72
+ end
73
+
74
+ # Get recorded data for given view name
75
+ #
76
+ # @param [String] view_name View name
77
+ # @return [ViewData]
78
+ def view_data view_name
79
+ view = @views[view_name]
80
+ return unless view
81
+
82
+ views_data = @measure_views_data[view.measure.name]
83
+ views_data.find { |view_data| view_data.view.name == view.name }
84
+ end
85
+
86
+ # Get all views data list
87
+ # @return [Array<ViewData>]
88
+ def views_data
89
+ @measure_views_data.values.flatten
90
+ end
91
+
92
+ # Clear recorded stats.
93
+ def clear_stats
94
+ @measure_views_data.each_value do |views_data|
95
+ views_data.each(&:clear)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ module OpenCensus
5
+ module Stats
6
+ # View
7
+ #
8
+ # A View specifies an aggregation and a set of tag keys.
9
+ # The aggregation will be broken down by the unique set of matching tag
10
+ # values for each measure.
11
+ class View
12
+ # @return [String] Name of the view
13
+ attr_reader :name
14
+
15
+ # @return [Measure] Associated measure definition instance.
16
+ attr_reader :measure
17
+
18
+ # @return [Aggregation] Associated aggregation definition instance.
19
+ attr_reader :aggregation
20
+
21
+ # Columns (a.k.a Tag Keys) to match with the
22
+ # associated Measure. Measure will be recorded in a "greedy" way.
23
+ # That is, every view aggregates every measure.
24
+ # This is similar to doing a GROUPBY on view columns. Columns must be
25
+ # unique.
26
+ # @return [Array<String>]
27
+ attr_reader :columns
28
+
29
+ # @return [String] Detailed description
30
+ attr_reader :description
31
+
32
+ # @return [Time] View creation time.
33
+ attr_reader :time
34
+
35
+ # Create instance of the view
36
+ #
37
+ # @param [String] name
38
+ # @param [Measure] measure
39
+ # @param [Aggregation] aggregation
40
+ # @param [Array<String>] columns
41
+ # @param [String] description
42
+ def initialize \
43
+ name:,
44
+ measure:,
45
+ aggregation:,
46
+ columns:,
47
+ description: nil
48
+ @name = name
49
+ @measure = measure
50
+ @aggregation = aggregation
51
+ @columns = columns
52
+ @description = description
53
+ @time = Time.now.utc
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ module OpenCensus
5
+ module Stats
6
+ # ViewData is a container to store stats.
7
+ class ViewData
8
+ # @return [View]
9
+ attr_reader :view
10
+
11
+ # @return [Time, nil]
12
+ attr_reader :start_time
13
+
14
+ # @return [Time, nil]
15
+ attr_reader :end_time
16
+
17
+ # @return [Hash<Array<String>>,AggregationData] Recorded stats data
18
+ # against view columns.
19
+ attr_reader :data
20
+
21
+ # @private
22
+ # Create instance of view
23
+ #
24
+ # @param [View] view
25
+ # @param [Time] start_time
26
+ # @param [Time] end_time
27
+ def initialize view, start_time: nil, end_time: nil
28
+ @view = view
29
+ @start_time = start_time
30
+ @end_time = end_time
31
+ @data = {}
32
+ end
33
+
34
+ # Set start time.
35
+ def start
36
+ @start_time = Time.now.utc
37
+ end
38
+
39
+ # Set stop time.
40
+ def stop
41
+ @end_time = Time.now.utc
42
+ end
43
+
44
+ # Record a measurement.
45
+ #
46
+ # @param [Measurement] measurement
47
+ # @param [Hash<String,String>] attachments
48
+ def record measurement, attachments: nil
49
+ tag_values = @view.columns.map { |column| measurement.tags[column] }
50
+
51
+ unless @data.key? tag_values
52
+ @data[tag_values] = @view.aggregation.create_aggregation_data
53
+ end
54
+
55
+ @data[tag_values].add(
56
+ measurement.value,
57
+ measurement.time,
58
+ attachments: attachments
59
+ )
60
+ end
61
+
62
+ # Clear recorded ata
63
+ def clear
64
+ data.clear
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2017 OpenCensus Authors
2
4
  #
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,14 +15,49 @@
13
15
  # limitations under the License.
14
16
 
15
17
 
18
+ require "opencensus/tags/config"
19
+ require "opencensus/tags/tag_map"
20
+ require "opencensus/tags/formatters"
21
+
16
22
  module OpenCensus
17
23
  ##
18
24
  # The Tags module contains support for OpenCensus tags. Tags are key-value
19
25
  # pairs. Tags provide additional cardinality to the OpenCensus instrumentation
20
26
  # data.
21
27
  #
22
- # TODO: implement tags
23
- #
24
28
  module Tags
29
+ ##
30
+ # Internal key for storing the current TagMap in the thread local
31
+ # Context
32
+ #
33
+ # @private
34
+ #
35
+ TAG_MAP_CONTEXT_KEY = :__tag_map_context__
36
+
37
+ class << self
38
+ ##
39
+ # Sets the current thread-local TagMap, which used in Stats data
40
+ # recording.
41
+ #
42
+ # @param [TagMap] context
43
+ #
44
+ def tag_map_context= context
45
+ OpenCensus::Context.set TAG_MAP_CONTEXT_KEY, context
46
+ end
47
+
48
+ # Unsets the current thread-local TagMap context
49
+ #
50
+ def unset_tag_map_context
51
+ OpenCensus::Context.unset TAG_MAP_CONTEXT_KEY
52
+ end
53
+
54
+ # Returns the current thread-local TagMap object.
55
+ #
56
+ # @return [TagMap, nil]
57
+ #
58
+ def tag_map_context
59
+ OpenCensus::Context.get TAG_MAP_CONTEXT_KEY
60
+ end
61
+ end
25
62
  end
26
63
  end
@@ -0,0 +1,74 @@
1
+ # Copyright 2017 OpenCensus Authors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "opencensus/config"
17
+ require "opencensus/tags/formatters"
18
+
19
+ module OpenCensus
20
+ module Tags
21
+ # Schema of the Tags configuration. See Tags#configure for more info.
22
+ @config = Common::Config.new do |config|
23
+ default_formatter = Formatters::Binary.new
24
+ config.add_option! :binary_formatter, default_formatter do |value|
25
+ value.respond_to?(:serialize) && value.respond_to?(:deserialize)
26
+ end
27
+ end
28
+
29
+ # Expose the tags config as a subconfig under the main config.
30
+ OpenCensus.configure do |config|
31
+ config.add_alias! :tags, config: @config
32
+ end
33
+
34
+ class << self
35
+ ##
36
+ # Configure OpenCensus Tags. These configuration fields include
37
+ # parameters formatter.
38
+ #
39
+ # This configuration is also available as the `tags` subconfig under the
40
+ # main configuration `OpenCensus.configure`. If the OpenCensus Railtie is
41
+ # installed in a Rails application, the configuration object is also
42
+ # exposed as `config.opencensus.tags`.
43
+ #
44
+ # Generally, you should configure this once at process initialization,
45
+ # but it can be modified at any time.
46
+ #
47
+ # Supported fields are:
48
+ #
49
+ # * `binary_formatter` The tags context propagation formatter to use.
50
+ # Must be a formatter, an object with `serialize`, `deserialize`,
51
+ # methods. See {OpenCensus::Tags::Formatters::Binary}.
52
+ #
53
+ # @example
54
+ #
55
+ # OpenCensus::Tags.configure do |config|
56
+ # config.binary_formatter = OpenCensus::Tags::Formatters::Binary.new
57
+ # end
58
+ #
59
+ def configure
60
+ if block_given?
61
+ yield @config
62
+ else
63
+ @config
64
+ end
65
+ end
66
+
67
+ ##
68
+ # Get the current configuration
69
+ # @private
70
+ #
71
+ attr_reader :config
72
+ end
73
+ end
74
+ end