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.
- 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
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "opencensus/tags/formatters/binary"
|
4
|
+
|
5
|
+
module OpenCensus
|
6
|
+
module Tags
|
7
|
+
##
|
8
|
+
# The Formatters module contains several implementations of cross-service
|
9
|
+
# context propagation. Each formatter can serialize and deserialize a
|
10
|
+
# {OpenCensus::Tags::TagMap} instance.
|
11
|
+
#
|
12
|
+
module Formatters
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenCensus
|
4
|
+
module Tags
|
5
|
+
module Formatters
|
6
|
+
##
|
7
|
+
# This formatter serializes and deserializes tags context according to
|
8
|
+
# the OpenCensus' BinaryEncoding specification. See
|
9
|
+
# [documentation](https://github.com/census-instrumentation/opencensus-specs/blob/master/encodings/BinaryEncoding.md).
|
10
|
+
#
|
11
|
+
# @example Serialize
|
12
|
+
#
|
13
|
+
# formatter = OpenCensus::Tags::Formatters::Binary.new
|
14
|
+
#
|
15
|
+
# tag_map = OpenCensus::Tags::TagMap.new({\"key1" => \"val1"})
|
16
|
+
# binary = formatter.serialize tag_map # "\x00\x00\x04key1\x04val1"
|
17
|
+
#
|
18
|
+
# @example Deserialize
|
19
|
+
#
|
20
|
+
# formatter = OpenCensus::Tags::Formatters::Binary.new
|
21
|
+
#
|
22
|
+
# binary = "\x00\x00\x04key1\x04val1"
|
23
|
+
# tag_map = formatter.deserialize binary
|
24
|
+
#
|
25
|
+
class Binary
|
26
|
+
# Binary format error for tags serialize/deserialize.
|
27
|
+
class BinaryFormatterError < StandardError; end
|
28
|
+
|
29
|
+
# @private
|
30
|
+
#
|
31
|
+
# Seralization version
|
32
|
+
VERSION_ID = 0
|
33
|
+
|
34
|
+
# @private
|
35
|
+
#
|
36
|
+
# Tag field id
|
37
|
+
TAG_FIELD_ID = 0
|
38
|
+
|
39
|
+
# @private
|
40
|
+
#
|
41
|
+
# Serialized tag context limit
|
42
|
+
TAG_MAP_SERIALIZED_SIZE_LIMIT = 8192
|
43
|
+
|
44
|
+
# Serialize TagMap object
|
45
|
+
#
|
46
|
+
# @param [TagMap] tags_context
|
47
|
+
#
|
48
|
+
def serialize tags_context
|
49
|
+
binary = [int_to_varint(VERSION_ID)]
|
50
|
+
|
51
|
+
tags_context.each do |key, value|
|
52
|
+
binary << int_to_varint(TAG_FIELD_ID)
|
53
|
+
binary << int_to_varint(key.length)
|
54
|
+
binary << key.encode(Encoding::UTF_8)
|
55
|
+
binary << int_to_varint(value ? value.length : 0)
|
56
|
+
binary << value.to_s.encode(Encoding::UTF_8)
|
57
|
+
end
|
58
|
+
|
59
|
+
binary = binary.join
|
60
|
+
binary.length > TAG_MAP_SERIALIZED_SIZE_LIMIT ? nil : binary
|
61
|
+
end
|
62
|
+
|
63
|
+
# Deserialize binary data into a TagMap object.
|
64
|
+
#
|
65
|
+
# @param [String] binary
|
66
|
+
# @return [TagMap]
|
67
|
+
# @raise [BinaryFormatterError] If deserialized version id not valid or
|
68
|
+
# tag key, value size in varint more then then unsigned int32.
|
69
|
+
#
|
70
|
+
def deserialize binary
|
71
|
+
return TagMap.new if binary.nil? || binary.empty?
|
72
|
+
|
73
|
+
io = StringIO.new binary
|
74
|
+
version_id = io.getc.unpack("C").first
|
75
|
+
unless version_id == VERSION_ID
|
76
|
+
raise BinaryFormatterError, "invalid version id"
|
77
|
+
end
|
78
|
+
|
79
|
+
tag_map = TagMap.new
|
80
|
+
|
81
|
+
loop do
|
82
|
+
break if io.eof?
|
83
|
+
tag_field_id = io.getc.unpack("C").first
|
84
|
+
break unless tag_field_id == TAG_FIELD_ID
|
85
|
+
|
86
|
+
key_length = varint_to_int io
|
87
|
+
key = io.gets key_length
|
88
|
+
value_length = varint_to_int io
|
89
|
+
value = io.gets value_length
|
90
|
+
tag_map[key] = value
|
91
|
+
end
|
92
|
+
|
93
|
+
io.close
|
94
|
+
tag_map
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
# Convert integer to Varint.
|
100
|
+
# @see https://developers.google.com/protocol-buffers/docs/encoding#varints
|
101
|
+
#
|
102
|
+
# @param [Integer] int_val
|
103
|
+
# @return [String]
|
104
|
+
def int_to_varint int_val
|
105
|
+
result = []
|
106
|
+
loop do
|
107
|
+
bits = int_val & 0x7F
|
108
|
+
int_val >>= 7
|
109
|
+
if int_val.zero?
|
110
|
+
result << bits
|
111
|
+
break
|
112
|
+
else
|
113
|
+
result << (0x80 | bits)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
result.pack "C*"
|
117
|
+
end
|
118
|
+
|
119
|
+
# Convert Varint bytes format to integer
|
120
|
+
# @see https://developers.google.com/protocol-buffers/docs/encoding#varints
|
121
|
+
#
|
122
|
+
# @param [StringIO] io
|
123
|
+
# @return [Integer]
|
124
|
+
# @raise [BinaryFormatterError] If varint size more then unsigned int32
|
125
|
+
#
|
126
|
+
def varint_to_int io
|
127
|
+
int_val = 0
|
128
|
+
shift = 0
|
129
|
+
|
130
|
+
loop do
|
131
|
+
raise BinaryFormatterError, "varint too long" if shift >= 32
|
132
|
+
byte = io.getbyte
|
133
|
+
int_val |= (byte & 0x7F) << shift
|
134
|
+
shift += 7
|
135
|
+
return int_val if (byte & 0x80).zero?
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require "forwardable"
|
5
|
+
|
6
|
+
module OpenCensus
|
7
|
+
module Tags
|
8
|
+
# # TagMap
|
9
|
+
#
|
10
|
+
# Collection of tag key and value.
|
11
|
+
# @example
|
12
|
+
#
|
13
|
+
# tag_map = OpenCensus::Tags::OpenCensus.new
|
14
|
+
#
|
15
|
+
# # Add or update
|
16
|
+
# tag_map["key1"] = "value1"
|
17
|
+
# tag_map["key2"] = "value2"
|
18
|
+
#
|
19
|
+
# # Get value
|
20
|
+
# tag_map["key1"] # value1
|
21
|
+
#
|
22
|
+
# # Delete
|
23
|
+
# tag_map.delete "key1"
|
24
|
+
#
|
25
|
+
# # Iterate
|
26
|
+
# tag_map.each do |key, value|
|
27
|
+
# p key
|
28
|
+
# p value
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # Length
|
32
|
+
# tag_map.length # 1
|
33
|
+
#
|
34
|
+
# @example Create tag map from hash
|
35
|
+
#
|
36
|
+
# tag_map = OpenCensus::Tags::OpenCensus.new({ "key1" => "value1"})
|
37
|
+
#
|
38
|
+
class TagMap
|
39
|
+
extend Forwardable
|
40
|
+
|
41
|
+
# The maximum length for a tag key and tag value
|
42
|
+
MAX_LENGTH = 255
|
43
|
+
|
44
|
+
# Create a tag map. It is a map of tags from key to value.
|
45
|
+
# @param [Hash{String=>String}] tags Tags hash with string key and value.
|
46
|
+
#
|
47
|
+
def initialize tags = {}
|
48
|
+
@tags = {}
|
49
|
+
|
50
|
+
tags.each do |key, value|
|
51
|
+
self[key] = value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Set tag key value
|
56
|
+
#
|
57
|
+
# @param [String] key Tag key
|
58
|
+
# @param [String] value Tag value
|
59
|
+
# @raise [InvalidTagError] If invalid tag key or value.
|
60
|
+
#
|
61
|
+
def []= key, value
|
62
|
+
validate_key! key
|
63
|
+
validate_value! value
|
64
|
+
|
65
|
+
@tags[key] = value
|
66
|
+
end
|
67
|
+
|
68
|
+
# Convert tag map to binary string format.
|
69
|
+
# @see [documentation](https://github.com/census-instrumentation/opencensus-specs/blob/master/encodings/BinaryEncoding.md#tag-context)
|
70
|
+
# @return [String] Binary string
|
71
|
+
#
|
72
|
+
def to_binary
|
73
|
+
Formatters::Binary.new.serialize self
|
74
|
+
end
|
75
|
+
|
76
|
+
# Create a tag map from the binary string.
|
77
|
+
# @param [String] data Binary string data
|
78
|
+
# @return [TagMap]
|
79
|
+
#
|
80
|
+
def self.from_binary data
|
81
|
+
Formatters::Binary.new.deserialize data
|
82
|
+
end
|
83
|
+
|
84
|
+
# @!method []
|
85
|
+
# @see Hash#[]
|
86
|
+
# @!method each
|
87
|
+
# @see Hash#each
|
88
|
+
# @!method delete
|
89
|
+
# @see Hash#delete
|
90
|
+
# @!method delete_if
|
91
|
+
# @see Hash#delete_if
|
92
|
+
# @!method length
|
93
|
+
# @see Hash#length
|
94
|
+
# @!method to_h
|
95
|
+
# @see Hash#to_h
|
96
|
+
# @!method empty?
|
97
|
+
# @see Hash#empty?
|
98
|
+
def_delegators :@tags, :[], :each, :delete, :delete_if, :length, \
|
99
|
+
:to_h, :empty?
|
100
|
+
|
101
|
+
# Invalid tag error.
|
102
|
+
class InvalidTagError < StandardError; end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
# Validate tag key.
|
107
|
+
# @param [String] key
|
108
|
+
# @raise [InvalidTagError] If key is empty, length grater then 255
|
109
|
+
# characters or contains non printable characters
|
110
|
+
#
|
111
|
+
def validate_key! key
|
112
|
+
if key.empty? || key.length > MAX_LENGTH || !printable_str?(key)
|
113
|
+
raise InvalidTagError, "Invalid tag key #{key}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Validate tag value.
|
118
|
+
# @param [String] value
|
119
|
+
# @raise [InvalidTagError] If value length grater then 255 characters
|
120
|
+
# or contains non printable characters
|
121
|
+
#
|
122
|
+
def validate_value! value
|
123
|
+
if (value && value.length > MAX_LENGTH) || !printable_str?(value)
|
124
|
+
raise InvalidTagError, "Invalid tag value #{value}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Check string is printable.
|
129
|
+
# @param [String] str
|
130
|
+
# @return [Boolean]
|
131
|
+
#
|
132
|
+
def printable_str? str
|
133
|
+
str.bytes.none? { |b| b < 32 || b > 126 }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -208,11 +208,11 @@ module OpenCensus
|
|
208
208
|
# the ID of the logged-in user, or any other relevant information.
|
209
209
|
#
|
210
210
|
# Keys must be strings.
|
211
|
-
# Values may be String, TruncatableString, Integer, or Boolean.
|
211
|
+
# Values may be String, TruncatableString, Integer, Float or Boolean.
|
212
212
|
# The valid integer range is 64-bit signed `(-2^63..2^63-1)`.
|
213
213
|
#
|
214
214
|
# @param [String, Symbol] key
|
215
|
-
# @param [String, TruncatableString, Integer,
|
215
|
+
# @param [String, TruncatableString, Integer, Float, Boolean] value
|
216
216
|
#
|
217
217
|
def put_attribute key, value
|
218
218
|
@attributes[key.to_s] = value
|
@@ -282,7 +282,8 @@ module OpenCensus
|
|
282
282
|
# {OpenCensus::Trace::SpanBuilder::CHILD_LINKED_SPAN},
|
283
283
|
# {OpenCensus::Trace::SpanBuilder::PARENT_LINKED_SPAN}, and
|
284
284
|
# {OpenCensus::Trace::SpanBuilder::TYPE_UNSPECIFIED}.
|
285
|
-
# @param [String
|
285
|
+
# @param [Hash<String, (TruncatableString, Integer, Float, Boolean)>]
|
286
|
+
# attributes Key-value pairs providing additional
|
286
287
|
# properties of the link. Keys must be strings, and values are
|
287
288
|
# restricted to the same types as attributes (see #put_attribute).
|
288
289
|
#
|
@@ -514,7 +515,7 @@ module OpenCensus
|
|
514
515
|
else
|
515
516
|
truncatable_string v.to_s
|
516
517
|
end
|
517
|
-
when true, false, TruncatableString
|
518
|
+
when true, false, TruncatableString, Float
|
518
519
|
v
|
519
520
|
else
|
520
521
|
truncatable_string v.to_s
|
data/lib/opencensus/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opencensus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Ching
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-10-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1.
|
20
|
+
version: '1.17'
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1.
|
27
|
+
version: '1.17'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,7 +158,32 @@ files:
|
|
158
158
|
- lib/opencensus/config.rb
|
159
159
|
- lib/opencensus/context.rb
|
160
160
|
- lib/opencensus/stats.rb
|
161
|
+
- lib/opencensus/stats/aggregation.rb
|
162
|
+
- lib/opencensus/stats/aggregation/count.rb
|
163
|
+
- lib/opencensus/stats/aggregation/distribution.rb
|
164
|
+
- lib/opencensus/stats/aggregation/last_value.rb
|
165
|
+
- lib/opencensus/stats/aggregation/sum.rb
|
166
|
+
- lib/opencensus/stats/aggregation_data.rb
|
167
|
+
- lib/opencensus/stats/aggregation_data/count.rb
|
168
|
+
- lib/opencensus/stats/aggregation_data/distribution.rb
|
169
|
+
- lib/opencensus/stats/aggregation_data/last_value.rb
|
170
|
+
- lib/opencensus/stats/aggregation_data/sum.rb
|
171
|
+
- lib/opencensus/stats/config.rb
|
172
|
+
- lib/opencensus/stats/exemplar.rb
|
173
|
+
- lib/opencensus/stats/exporters.rb
|
174
|
+
- lib/opencensus/stats/exporters/logger.rb
|
175
|
+
- lib/opencensus/stats/exporters/multi.rb
|
176
|
+
- lib/opencensus/stats/measure.rb
|
177
|
+
- lib/opencensus/stats/measure_registry.rb
|
178
|
+
- lib/opencensus/stats/measurement.rb
|
179
|
+
- lib/opencensus/stats/recorder.rb
|
180
|
+
- lib/opencensus/stats/view.rb
|
181
|
+
- lib/opencensus/stats/view_data.rb
|
161
182
|
- lib/opencensus/tags.rb
|
183
|
+
- lib/opencensus/tags/config.rb
|
184
|
+
- lib/opencensus/tags/formatters.rb
|
185
|
+
- lib/opencensus/tags/formatters/binary.rb
|
186
|
+
- lib/opencensus/tags/tag_map.rb
|
162
187
|
- lib/opencensus/trace.rb
|
163
188
|
- lib/opencensus/trace/annotation.rb
|
164
189
|
- lib/opencensus/trace/config.rb
|
@@ -207,8 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
232
|
- !ruby/object:Gem::Version
|
208
233
|
version: '0'
|
209
234
|
requirements: []
|
210
|
-
|
211
|
-
rubygems_version: 2.7.6
|
235
|
+
rubygems_version: 3.0.3
|
212
236
|
signing_key:
|
213
237
|
specification_version: 4
|
214
238
|
summary: A stats collection and distributed tracing framework
|