opencensus 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +2 -1
- data/lib/opencensus/stats.rb +143 -1
- data/lib/opencensus/stats/aggregation.rb +27 -0
- data/lib/opencensus/stats/aggregation/count.rb +18 -0
- data/lib/opencensus/stats/aggregation/distribution.rb +41 -0
- data/lib/opencensus/stats/aggregation/last_value.rb +18 -0
- data/lib/opencensus/stats/aggregation/sum.rb +18 -0
- data/lib/opencensus/stats/aggregation_data.rb +24 -0
- data/lib/opencensus/stats/aggregation_data/count.rb +37 -0
- data/lib/opencensus/stats/aggregation_data/distribution.rb +109 -0
- data/lib/opencensus/stats/aggregation_data/last_value.rb +32 -0
- data/lib/opencensus/stats/aggregation_data/sum.rb +37 -0
- data/lib/opencensus/stats/config.rb +79 -0
- data/lib/opencensus/stats/exemplar.rb +40 -0
- data/lib/opencensus/stats/exporters.rb +31 -0
- data/lib/opencensus/stats/exporters/logger.rb +77 -0
- data/lib/opencensus/stats/exporters/multi.rb +57 -0
- data/lib/opencensus/stats/measure.rb +99 -0
- data/lib/opencensus/stats/measure_registry.rb +72 -0
- data/lib/opencensus/stats/measurement.rb +35 -0
- data/lib/opencensus/stats/recorder.rb +100 -0
- data/lib/opencensus/stats/view.rb +57 -0
- data/lib/opencensus/stats/view_data.rb +68 -0
- data/lib/opencensus/tags.rb +39 -2
- data/lib/opencensus/tags/config.rb +74 -0
- data/lib/opencensus/tags/formatters.rb +15 -0
- data/lib/opencensus/tags/formatters/binary.rb +141 -0
- data/lib/opencensus/tags/tag_map.rb +137 -0
- data/lib/opencensus/trace/annotation.rb +1 -1
- data/lib/opencensus/trace/link.rb +1 -1
- data/lib/opencensus/trace/span.rb +1 -1
- data/lib/opencensus/trace/span_builder.rb +5 -4
- data/lib/opencensus/version.rb +1 -1
- metadata +32 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91a03df4a06baad585ee01c05d653eb296bb5903e848d989fa125a32061d891c
|
4
|
+
data.tar.gz: 1b298783443b3eb906f902c3f1e8662fa2833b6845d40674c0efa251d64ae02d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bc52a99df66952372a72f157e1aace46eeaa167f31f3156639b1ad41637180e2b649352020b32a66cfcaa660c6dae59148e68bc6112491af4de89246333ad08
|
7
|
+
data.tar.gz: 21e637f7efa756f846a4ca847b673d947804aa6446821782ad60eed3bf75862170470b1e6e51f7e7475916728838b1bb2de933c9f1a894e963a56b74488773ce
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.5.0 / 2019-10-14
|
4
|
+
|
5
|
+
This update brings experimental support for the OpenCensus Stats API. Note that
|
6
|
+
Stats support is currently partial and not well-tested.
|
7
|
+
|
8
|
+
Other changes:
|
9
|
+
|
10
|
+
* Attributes in the Trace API can now be floats.
|
11
|
+
|
3
12
|
### 0.4.0 / 2018-10-22
|
4
13
|
|
5
14
|
This is an important update that includes a number of fixes and brings the
|
data/README.md
CHANGED
@@ -8,7 +8,8 @@ the core OpenCensus APIs and basic integrations with Rails, Faraday, and GRPC.
|
|
8
8
|
Additional integrations, including exporters to popular analytics services,
|
9
9
|
will be available in separate gems.
|
10
10
|
|
11
|
-
The library is in alpha stage, and the API is subject to change.
|
11
|
+
The library is in alpha stage, and the API is subject to change. In particular,
|
12
|
+
support for the Stats API is currently incomplete and experimental.
|
12
13
|
|
13
14
|
## Quick Start
|
14
15
|
|
data/lib/opencensus/stats.rb
CHANGED
@@ -13,6 +13,13 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
|
16
|
+
require "opencensus/stats/config"
|
17
|
+
require "opencensus/stats/recorder"
|
18
|
+
require "opencensus/stats/view"
|
19
|
+
require "opencensus/stats/aggregation"
|
20
|
+
require "opencensus/stats/measure_registry"
|
21
|
+
require "opencensus/stats/exporters"
|
22
|
+
|
16
23
|
module OpenCensus
|
17
24
|
##
|
18
25
|
# The Stats module contains support for OpenCensus stats collection.
|
@@ -20,8 +27,143 @@ module OpenCensus
|
|
20
27
|
# OpenCensus allows users to create typed measures, record measurements,
|
21
28
|
# aggregate the collected data, and export the aggregated data.
|
22
29
|
#
|
23
|
-
# TODO: implement stats
|
24
30
|
#
|
25
31
|
module Stats
|
32
|
+
##
|
33
|
+
# Internal key for storing the current stats recorder in the thread local
|
34
|
+
# context.
|
35
|
+
#
|
36
|
+
# @private
|
37
|
+
RECORDER_CONTEXT_KEY = :__recorder_context__
|
38
|
+
|
39
|
+
class << self
|
40
|
+
##
|
41
|
+
# Sets the current thread-local Recorder, which governs the behavior
|
42
|
+
# of the recorder creation methods of OpenCensus::Stats::Recorder.
|
43
|
+
#
|
44
|
+
# @param [Recorder] context
|
45
|
+
def recorder_context= context
|
46
|
+
OpenCensus::Context.set RECORDER_CONTEXT_KEY, context
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Unsets the current thread-local SpanContext, disabling stats recorder
|
51
|
+
# creation methods of OpenCensus::Stats::Recorder
|
52
|
+
def unset_recorder_context
|
53
|
+
OpenCensus::Context.unset RECORDER_CONTEXT_KEY
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the current thread-local stats recorder context/
|
57
|
+
# Returns `nil` if there is no current SpanContext.
|
58
|
+
#
|
59
|
+
# @return [Recorder, nil]
|
60
|
+
def recorder_context
|
61
|
+
OpenCensus::Context.get RECORDER_CONTEXT_KEY
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get recorder from the stats context. If stats context nil then create
|
65
|
+
# new recorder and set into stats context.
|
66
|
+
# @return [Recorder]
|
67
|
+
def ensure_recorder
|
68
|
+
self.recorder_context ||= Recorder.new
|
69
|
+
end
|
70
|
+
|
71
|
+
# Create and register int64 type measure into measure registry.
|
72
|
+
#
|
73
|
+
# @param [String] name Name of the measure.
|
74
|
+
# @param [String] unit Unit of the measure. i.e "kb", "s", "ms"
|
75
|
+
# @param [String] description Detail description
|
76
|
+
# @return [Measure]
|
77
|
+
def create_measure_int name:, unit:, description: nil
|
78
|
+
MeasureRegistry.register(
|
79
|
+
name: name,
|
80
|
+
unit: unit,
|
81
|
+
type: Measure::INT64_TYPE,
|
82
|
+
description: description
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Create and register double type measure into measure registry.
|
87
|
+
#
|
88
|
+
# @param [String] name Name of the measure.
|
89
|
+
# @param [String] unit Unit of the measure. i.e "kb", "s", "ms"
|
90
|
+
# @param [String] description Detail description
|
91
|
+
# @return [Measure]
|
92
|
+
def create_measure_double name:, unit:, description: nil
|
93
|
+
MeasureRegistry.register(
|
94
|
+
name: name,
|
95
|
+
unit: unit,
|
96
|
+
type: Measure::DOUBLE_TYPE,
|
97
|
+
description: description
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get list of registered measures
|
102
|
+
# @return [Array<Measure>]
|
103
|
+
def registered_measures
|
104
|
+
MeasureRegistry.measures
|
105
|
+
end
|
106
|
+
|
107
|
+
# Create measurement value for registered measure.
|
108
|
+
#
|
109
|
+
# @param [String] name Name of the registered measure
|
110
|
+
# @param [Integer, Float] value Value of the measurement
|
111
|
+
# @param [Hash<String,String>] tags Tags to which the value is recorded
|
112
|
+
# @raise [ArgumentError] if givem measure is not register
|
113
|
+
def create_measurement name:, value:, tags:
|
114
|
+
measure = MeasureRegistry.get name
|
115
|
+
return measure.create_measurement(value: value, tags: tags) if measure
|
116
|
+
raise ArgumentError, "#{name} measure is not registered"
|
117
|
+
end
|
118
|
+
|
119
|
+
# Create and register a view to current stats recorder context.
|
120
|
+
#
|
121
|
+
# @param [String] name
|
122
|
+
# @param [Measure] measure
|
123
|
+
# @param [Aggregation] aggregation
|
124
|
+
# @param [Array<String>] columns
|
125
|
+
# @param [String] description
|
126
|
+
def create_and_register_view \
|
127
|
+
name:,
|
128
|
+
measure:,
|
129
|
+
aggregation:,
|
130
|
+
columns: nil,
|
131
|
+
description: nil
|
132
|
+
view = View.new(
|
133
|
+
name: name,
|
134
|
+
measure: measure,
|
135
|
+
aggregation: aggregation,
|
136
|
+
description: description,
|
137
|
+
columns: columns
|
138
|
+
)
|
139
|
+
ensure_recorder.register_view view
|
140
|
+
end
|
141
|
+
|
142
|
+
# Create aggregation defination instance with type sum.
|
143
|
+
# @return [Aggregation]
|
144
|
+
def create_sum_aggregation
|
145
|
+
Aggregation::Sum.new
|
146
|
+
end
|
147
|
+
|
148
|
+
# Create aggregation defination instance with type count.
|
149
|
+
# @return [Aggregation]
|
150
|
+
def create_count_aggregation
|
151
|
+
Aggregation::Count.new
|
152
|
+
end
|
153
|
+
|
154
|
+
# Create aggregation defination instance with type distribution.
|
155
|
+
# @param [Array<Integer>,Array<Float>] buckets Value boundries for
|
156
|
+
# distribution.
|
157
|
+
# @return [Aggregation]
|
158
|
+
def create_distribution_aggregation buckets
|
159
|
+
Aggregation::Distribution.new buckets
|
160
|
+
end
|
161
|
+
|
162
|
+
# Create aggregation defination instance with type last value.
|
163
|
+
# @return [Aggregation]
|
164
|
+
def create_last_value_aggregation
|
165
|
+
Aggregation::LastValue.new
|
166
|
+
end
|
167
|
+
end
|
26
168
|
end
|
27
169
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require "opencensus/stats/aggregation/sum"
|
5
|
+
require "opencensus/stats/aggregation/count"
|
6
|
+
require "opencensus/stats/aggregation/last_value"
|
7
|
+
require "opencensus/stats/aggregation/distribution"
|
8
|
+
require "opencensus/stats/aggregation_data"
|
9
|
+
require "opencensus/stats/exemplar"
|
10
|
+
|
11
|
+
module OpenCensus
|
12
|
+
module Stats
|
13
|
+
# # Aggregation
|
14
|
+
#
|
15
|
+
# Aggregation types to describes how the data collected based on aggregation
|
16
|
+
# type.
|
17
|
+
# Aggregation types are.
|
18
|
+
# - Sum
|
19
|
+
# - Count
|
20
|
+
# - Last Value
|
21
|
+
# - Distribution - calcualate min, max, mean, sum, count,
|
22
|
+
# sum of squared deviation
|
23
|
+
#
|
24
|
+
module Aggregation
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module Aggregation
|
7
|
+
# Count aggregation type
|
8
|
+
class Count
|
9
|
+
# Create new aggregation data container to store count value.
|
10
|
+
# values.
|
11
|
+
# @return [AggregationData::Count]
|
12
|
+
def create_aggregation_data
|
13
|
+
AggregationData::Count.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module Aggregation
|
7
|
+
# Distribution aggregation type
|
8
|
+
class Distribution
|
9
|
+
# Invalid bucket types.
|
10
|
+
class InvalidBucketsError < StandardError; end
|
11
|
+
|
12
|
+
# @return [Array<Integer>,Array<Float>] Bucket boundries.
|
13
|
+
attr_reader :buckets
|
14
|
+
|
15
|
+
# @private
|
16
|
+
# @param [Array<Integer>,Array<Float>,] buckets Buckets boundries
|
17
|
+
# for distribution
|
18
|
+
# aggregation.
|
19
|
+
# @raise [InvalidBucketsError] If any bucket value is nil.
|
20
|
+
def initialize buckets
|
21
|
+
if buckets.nil? || buckets.empty?
|
22
|
+
raise InvalidBucketsError, "buckets should not be nil or empty"
|
23
|
+
end
|
24
|
+
|
25
|
+
if buckets.any?(&:nil?)
|
26
|
+
raise InvalidBucketsError, "buckets value should not be nil"
|
27
|
+
end
|
28
|
+
|
29
|
+
@buckets = buckets.reject { |v| v < 0 }
|
30
|
+
end
|
31
|
+
|
32
|
+
# Create new aggregation data container to store distribution values.
|
33
|
+
# values.
|
34
|
+
# @return [AggregationData::Distribution]
|
35
|
+
def create_aggregation_data
|
36
|
+
AggregationData::Distribution.new @buckets
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module Aggregation
|
7
|
+
# Last value aggregation type
|
8
|
+
class LastValue
|
9
|
+
# Create new aggregation data container to store last value.
|
10
|
+
# values.
|
11
|
+
# @return [AggregationData::LastValue]
|
12
|
+
def create_aggregation_data
|
13
|
+
AggregationData::LastValue.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module Aggregation
|
7
|
+
# Sum aggregation type
|
8
|
+
class Sum
|
9
|
+
# Create new aggregation data container to store sum value
|
10
|
+
# values.
|
11
|
+
# @return [AggregationData::Sum]
|
12
|
+
def create_aggregation_data
|
13
|
+
AggregationData::Sum.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require "opencensus/stats/aggregation_data/sum"
|
5
|
+
require "opencensus/stats/aggregation_data/count"
|
6
|
+
require "opencensus/stats/aggregation_data/last_value"
|
7
|
+
require "opencensus/stats/aggregation_data/distribution"
|
8
|
+
|
9
|
+
module OpenCensus
|
10
|
+
module Stats
|
11
|
+
# # AggregationData
|
12
|
+
#
|
13
|
+
# AggregationData to store collected stats data.
|
14
|
+
# Aggregation data container type:
|
15
|
+
# - Sum
|
16
|
+
# - Count
|
17
|
+
# - Last Value
|
18
|
+
# - Distribution - calcualate sum, count, min, max, mean,
|
19
|
+
# sum of squared deviation
|
20
|
+
#
|
21
|
+
module AggregationData
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module AggregationData
|
7
|
+
# # Count
|
8
|
+
#
|
9
|
+
# Counts number of measurements recorded.
|
10
|
+
class Count
|
11
|
+
# @return [Integer,Float] Current count value.
|
12
|
+
attr_reader :value
|
13
|
+
|
14
|
+
# @return [Time] The latest timestamp a new data point was recorded
|
15
|
+
attr_reader :time
|
16
|
+
|
17
|
+
# @private
|
18
|
+
def initialize
|
19
|
+
@value = 0
|
20
|
+
end
|
21
|
+
|
22
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
23
|
+
|
24
|
+
# Increment counter.
|
25
|
+
# @param [Value] value
|
26
|
+
# @param [Time] time Time of data point was recorded
|
27
|
+
# @param [Hash<String,String>] attachments Attachments are not in use.
|
28
|
+
def add value, time, attachments: nil
|
29
|
+
@time = time
|
30
|
+
@value += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module AggregationData
|
7
|
+
# # Distribution
|
8
|
+
#
|
9
|
+
# This AggregationData contains a histogram of the collected values
|
10
|
+
class Distribution
|
11
|
+
# @return [Array<Integer>,Array<Float>] Buckets boundries
|
12
|
+
attr_reader :buckets
|
13
|
+
|
14
|
+
# @return [Integer] Count of recorded values
|
15
|
+
attr_reader :count
|
16
|
+
|
17
|
+
# @return [Integer,Float] Sum of recorded values
|
18
|
+
attr_reader :sum
|
19
|
+
|
20
|
+
# @return [Integer,Float] Maximum recorded value
|
21
|
+
attr_reader :max
|
22
|
+
|
23
|
+
# @return [Integer,Float] Minimum recorded value
|
24
|
+
attr_reader :min
|
25
|
+
|
26
|
+
# @return [Integer,Float] Mean of recorded values
|
27
|
+
attr_reader :mean
|
28
|
+
|
29
|
+
# @return [Integer,Float] Sum of squared deviation of recorded values
|
30
|
+
attr_reader :sum_of_squared_deviation
|
31
|
+
|
32
|
+
# @return [Array<Integer>] Count of number of recorded values in buckets
|
33
|
+
attr_reader :bucket_counts
|
34
|
+
|
35
|
+
# @return [Time] Time of first recorded value
|
36
|
+
attr_reader :start_time
|
37
|
+
|
38
|
+
# @return [Time] The latest time a new value was recorded
|
39
|
+
attr_reader :time
|
40
|
+
|
41
|
+
# @return [Array<Exemplar>] Exemplars are points associated with each
|
42
|
+
# bucket in the distribution giving an example of what was aggregated
|
43
|
+
# into the bucket.
|
44
|
+
attr_reader :exemplars
|
45
|
+
|
46
|
+
# @private
|
47
|
+
# @param [Array<Integer>,Array<Float>] buckets Buckets boundries
|
48
|
+
# for distribution
|
49
|
+
def initialize buckets
|
50
|
+
@buckets = buckets
|
51
|
+
@count = 0
|
52
|
+
@sum = 0
|
53
|
+
@max = -Float::INFINITY
|
54
|
+
@min = Float::INFINITY
|
55
|
+
@mean = 0
|
56
|
+
@sum_of_squared_deviation = 0
|
57
|
+
@bucket_counts = Array.new(buckets.length + 1, 0)
|
58
|
+
@exemplars = []
|
59
|
+
@start_time = Time.now.utc
|
60
|
+
end
|
61
|
+
|
62
|
+
# @private
|
63
|
+
# Add value to distribution
|
64
|
+
# @param [Integer,Float] value
|
65
|
+
# @param [Time] time Time of data point was recorded
|
66
|
+
# @param [Hash<String,String>,nil] attachments Attachments are key-value
|
67
|
+
# pairs that describe the context in which the exemplar was recored.
|
68
|
+
def add value, time, attachments: nil
|
69
|
+
@time = time
|
70
|
+
@count += 1
|
71
|
+
@sum += value
|
72
|
+
@max = value if value > @max
|
73
|
+
@min = value if value < @min
|
74
|
+
|
75
|
+
delta_from_mean = (value - @mean).to_f
|
76
|
+
@mean += delta_from_mean / @count
|
77
|
+
@sum_of_squared_deviation += delta_from_mean * (value - @mean)
|
78
|
+
|
79
|
+
bucket_index = @buckets.find_index { |b| b > value } ||
|
80
|
+
@buckets.length
|
81
|
+
@bucket_counts[bucket_index] += 1
|
82
|
+
|
83
|
+
if attachments
|
84
|
+
@exemplars[bucket_index] = Exemplar.new(
|
85
|
+
value: value,
|
86
|
+
time: time,
|
87
|
+
attachments: attachments
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get distribution result values.
|
93
|
+
# @return [Hash]
|
94
|
+
def value
|
95
|
+
{
|
96
|
+
start_time: @start_time,
|
97
|
+
count: @count,
|
98
|
+
sum: @sum,
|
99
|
+
max: @max,
|
100
|
+
min: @min,
|
101
|
+
sum_of_squared_deviation: @sum_of_squared_deviation,
|
102
|
+
buckets: @buckets,
|
103
|
+
bucket_counts: @bucket_counts
|
104
|
+
}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|