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,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module AggregationData
|
7
|
+
# # LastValue
|
8
|
+
#
|
9
|
+
# Represents the last recorded value.
|
10
|
+
class LastValue
|
11
|
+
# @return [Integer,Float] Last recorded value.
|
12
|
+
attr_reader :value
|
13
|
+
|
14
|
+
# @return [Time] The latest time at new data point was recorded
|
15
|
+
attr_reader :time
|
16
|
+
|
17
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
18
|
+
|
19
|
+
# Set last value
|
20
|
+
# @param [Integer,Float] value
|
21
|
+
# @param [Time] time Time of data point was recorded
|
22
|
+
# @param [Hash<String,String>] attachments Attachments are not in use
|
23
|
+
def add value, time, attachments: nil
|
24
|
+
@time = time
|
25
|
+
@value = value
|
26
|
+
end
|
27
|
+
|
28
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
module AggregationData
|
7
|
+
# Sum
|
8
|
+
#
|
9
|
+
# Accumulate measurement values.
|
10
|
+
class Sum
|
11
|
+
# @return [Integer,Float] The current sum value.
|
12
|
+
attr_reader :value
|
13
|
+
|
14
|
+
# @return [Time] The latest time at 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
|
+
# Add value
|
25
|
+
# @param [Integer,Float] 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 += value
|
31
|
+
end
|
32
|
+
|
33
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2017 OpenCensus Authors
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
|
18
|
+
require "opencensus/config"
|
19
|
+
require "opencensus/stats/exporters"
|
20
|
+
|
21
|
+
module OpenCensus
|
22
|
+
module Stats
|
23
|
+
# Schema of the Trace configuration. See Stats#configure for more info.
|
24
|
+
@config = Common::Config.new do |config|
|
25
|
+
exporter_logger = ::Logger.new STDOUT, ::Logger::INFO
|
26
|
+
default_exporter = Exporters::Logger.new exporter_logger
|
27
|
+
|
28
|
+
config.add_option! :exporter, default_exporter do |value|
|
29
|
+
value.respond_to? :export
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Expose the stats config as a subconfig under the main config.
|
34
|
+
OpenCensus.configure do |config|
|
35
|
+
config.add_alias! :stats, config: @config
|
36
|
+
end
|
37
|
+
|
38
|
+
class << self
|
39
|
+
##
|
40
|
+
# Configure OpenCensus Stats. These configuration fields include
|
41
|
+
# parameters governing aggregation, exporting.
|
42
|
+
#
|
43
|
+
# This configuration is also available as the `stats` subconfig under the
|
44
|
+
# main configuration `OpenCensus.configure`. If the OpenCensus Railtie is
|
45
|
+
# installed in a Rails application, the configuration object is also
|
46
|
+
# exposed as `config.opencensus.stats`.
|
47
|
+
#
|
48
|
+
# Generally, you should configure this once at process initialization,
|
49
|
+
# but it can be modified at any time.
|
50
|
+
#
|
51
|
+
# Supported fields are:
|
52
|
+
#
|
53
|
+
# * `exporter` The exporter to use. Must be an exporter, an object with
|
54
|
+
# an export method that takes an array of ViewData objects. See
|
55
|
+
# {OpenCensus::Stats::Exporters}. The initial value is a
|
56
|
+
# {OpenCensus::Stats::Exporters::Logger} that logs to STDOUT.
|
57
|
+
#
|
58
|
+
# @example:
|
59
|
+
#
|
60
|
+
# OpenCensus::Stats.configure do |config|
|
61
|
+
# config.exporter = OpenCensus::Stats::Exporters::Logger.new
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
def configure
|
65
|
+
if block_given?
|
66
|
+
yield @config
|
67
|
+
else
|
68
|
+
@config
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Get the current configuration
|
74
|
+
# @private
|
75
|
+
#
|
76
|
+
attr_reader :config
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
module OpenCensus
|
5
|
+
module Stats
|
6
|
+
##
|
7
|
+
# Exemplars are example points that may be used to annotate aggregated
|
8
|
+
# Distribution values. They are metadata that gives information about a
|
9
|
+
# particular value added to a Distribution bucket.
|
10
|
+
#
|
11
|
+
class Exemplar
|
12
|
+
# Value of the exemplar point. It determines which bucket the exemplar
|
13
|
+
# belongs to
|
14
|
+
# @return [Integer,Float]
|
15
|
+
attr_reader :value
|
16
|
+
|
17
|
+
# The observation (sampling) time of the above value
|
18
|
+
# @return [Time]
|
19
|
+
attr_reader :time
|
20
|
+
|
21
|
+
# Contextual information about the example value
|
22
|
+
# @return [Hash<String,String>]
|
23
|
+
attr_reader :attachments
|
24
|
+
|
25
|
+
# Create instance of the exemplar
|
26
|
+
# @param [Integer,Float] value
|
27
|
+
# @param [Time] time
|
28
|
+
# @param [Hash<String,String>] attachments. Attachments are key-value
|
29
|
+
# pairs that describe the context in which the exemplar was recored.
|
30
|
+
def initialize value:, time:, attachments:
|
31
|
+
@value = value
|
32
|
+
@time = time
|
33
|
+
|
34
|
+
raise ArgumentError, "attachments can not be empty" if attachments.nil?
|
35
|
+
|
36
|
+
@attachments = attachments
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "opencensus/stats/exporters/logger"
|
4
|
+
|
5
|
+
module OpenCensus
|
6
|
+
module Stats
|
7
|
+
##
|
8
|
+
# The Exporters module provides integrations for exporting collected stats
|
9
|
+
# to an external or local service. Exporter classes may be put inside
|
10
|
+
# this module, but are not required to be located here.
|
11
|
+
#
|
12
|
+
# An exporter is an object that must respond to the following method:
|
13
|
+
#
|
14
|
+
# def export(views_data)
|
15
|
+
#
|
16
|
+
# Where `views_data` is an array of {OpenCensus::Stats::ViewData} objects
|
17
|
+
# to export.
|
18
|
+
#
|
19
|
+
# The method return value is not defined.
|
20
|
+
#
|
21
|
+
# The exporter object may interpret the `export` message in whatever way it
|
22
|
+
# deems appropriate. For example, it may write the data to a log file, it
|
23
|
+
# may transmit it to a monitoring service, or it may do nothing at all.
|
24
|
+
# An exporter may also queue the request for later asynchronous processing,
|
25
|
+
# and indeed this is recommended if the export involves time consuming
|
26
|
+
# operations such as remote API calls.
|
27
|
+
#
|
28
|
+
module Exporters
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require "logger"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
module OpenCensus
|
8
|
+
module Stats
|
9
|
+
module Exporters
|
10
|
+
##
|
11
|
+
# The Logger exporter exports captured stats view data to a standard
|
12
|
+
# Ruby Logger interface.
|
13
|
+
#
|
14
|
+
class Logger
|
15
|
+
##
|
16
|
+
# Create a new Logger exporter
|
17
|
+
#
|
18
|
+
# @param [#log] logger The logger to write to.
|
19
|
+
# @param [Integer] level The log level. This should be a log level
|
20
|
+
# defined by the Logger standard library. Default is
|
21
|
+
# `::Logger::INFO`.
|
22
|
+
#
|
23
|
+
def initialize logger, level: ::Logger::INFO
|
24
|
+
@logger = logger
|
25
|
+
@level = level
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Export the captured stats to the configured logger.
|
30
|
+
#
|
31
|
+
# @param [Array<ViewData>] views_data The captured stats data.
|
32
|
+
#
|
33
|
+
def export views_data
|
34
|
+
stats_data = views_data.map { |vd| format_view_data(vd) }
|
35
|
+
@logger.log @level, stats_data.to_json
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def format_view_data view_data
|
42
|
+
{
|
43
|
+
view: format_view(view_data.view),
|
44
|
+
measure: format_measure(view_data.view.measure),
|
45
|
+
aggregation: format_aggregation(view_data)
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def format_view view
|
50
|
+
{
|
51
|
+
name: view.name,
|
52
|
+
columns: view.columns,
|
53
|
+
description: view.description
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def format_measure measure
|
58
|
+
{
|
59
|
+
name: measure.name,
|
60
|
+
unit: measure.unit,
|
61
|
+
type: measure.type,
|
62
|
+
description: measure.description
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
def format_aggregation view_data
|
67
|
+
{
|
68
|
+
type: view_data.view.aggregation.class.name.downcase,
|
69
|
+
start_time: view_data.start_time,
|
70
|
+
end_time: view_data.end_time,
|
71
|
+
data: view_data.data
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Copyright 2018 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 "delegate"
|
17
|
+
|
18
|
+
module OpenCensus
|
19
|
+
module Stats
|
20
|
+
module Exporters
|
21
|
+
##
|
22
|
+
# The Multi exporter multiplexes captured stats to a set of delegate
|
23
|
+
# exporters. It is useful if you need to export to more than one
|
24
|
+
# destination. You may also use it as a "null" exporter by providing
|
25
|
+
# no delegates.
|
26
|
+
#
|
27
|
+
# Multi delegates to an array of the exporter objects. You can manage
|
28
|
+
# the list of exporters using any method of Array. For example:
|
29
|
+
#
|
30
|
+
# multi = OpenCensus::Stats::Exporters::Multi.new
|
31
|
+
# multi.export(views_data) # Does nothing
|
32
|
+
# multi << OpenCensus::Stats::Exporters::Logger.new
|
33
|
+
# multi.export(views_data) # Exports to the logger
|
34
|
+
#
|
35
|
+
class Multi < SimpleDelegator
|
36
|
+
##
|
37
|
+
# Create a new Multi exporter
|
38
|
+
#
|
39
|
+
# @param [Array<#export>] delegates An array of exporters
|
40
|
+
#
|
41
|
+
def initialize *delegates
|
42
|
+
super(delegates.flatten)
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Pass the captured stats view data to the delegates.
|
47
|
+
#
|
48
|
+
# @param [Array<ViewData>] views_data The captured stats.
|
49
|
+
#
|
50
|
+
def export views_data
|
51
|
+
each { |delegate| delegate.export views_data }
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
|
4
|
+
require "opencensus/stats/measurement"
|
5
|
+
|
6
|
+
module OpenCensus
|
7
|
+
module Stats
|
8
|
+
# Measure
|
9
|
+
#
|
10
|
+
# The definition of the Measurement. Describes the type of the individual
|
11
|
+
# values/measurements recorded by an application. It includes information
|
12
|
+
# such as the type of measurement, the units of measurement and descriptive
|
13
|
+
# names for the data. This provides th fundamental type used for recording
|
14
|
+
# data.
|
15
|
+
class Measure
|
16
|
+
# Describes the unit used for the Measure.
|
17
|
+
# Should follows the format described by
|
18
|
+
# http://unitsofmeasure.org/ucum.html
|
19
|
+
# Unit name for general counts
|
20
|
+
# @return [String]
|
21
|
+
UNIT_NONE = "1".freeze
|
22
|
+
|
23
|
+
# Unit name for bytes
|
24
|
+
# @return [String]
|
25
|
+
BYTE = "By".freeze
|
26
|
+
|
27
|
+
# Unit name for Kilobytes
|
28
|
+
# @return [String]
|
29
|
+
KBYTE = "kb".freeze
|
30
|
+
|
31
|
+
# Unit name for Seconds
|
32
|
+
# @return [String]
|
33
|
+
SEC = "s".freeze
|
34
|
+
|
35
|
+
# Unit name for Milli seconds
|
36
|
+
# @return [String]
|
37
|
+
MS = "ms".freeze
|
38
|
+
|
39
|
+
# Unit name for Micro seconds
|
40
|
+
# @return [String]
|
41
|
+
US = "us".freeze
|
42
|
+
|
43
|
+
# Unit name for Nano seconds
|
44
|
+
# @return [String]
|
45
|
+
NS = "ns".freeze
|
46
|
+
|
47
|
+
# Measure int64 type
|
48
|
+
# @return [String]
|
49
|
+
INT64_TYPE = "INT64".freeze
|
50
|
+
|
51
|
+
# Measure double type
|
52
|
+
# @return [String]
|
53
|
+
DOUBLE_TYPE = "DOUBLE".freeze
|
54
|
+
|
55
|
+
# @return [String]
|
56
|
+
attr_reader :name
|
57
|
+
|
58
|
+
# @return [String]
|
59
|
+
attr_reader :description
|
60
|
+
|
61
|
+
# Unit type of the measurement. i.e "kb", "ms" etc
|
62
|
+
# @return [String]
|
63
|
+
attr_reader :unit
|
64
|
+
|
65
|
+
# Data type of the measure.
|
66
|
+
# @return [String] Valid types are {INT64_TYPE}, {DOUBLE_TYPE}.
|
67
|
+
attr_reader :type
|
68
|
+
|
69
|
+
# @private
|
70
|
+
# Create instance of the measure.
|
71
|
+
def initialize name:, unit:, type:, description: nil
|
72
|
+
@name = name
|
73
|
+
@unit = unit
|
74
|
+
@type = type
|
75
|
+
@description = description
|
76
|
+
end
|
77
|
+
|
78
|
+
# Create new measurement
|
79
|
+
# @param [Integer, Float] value
|
80
|
+
# @param [Hash<String,String>] tags Tags to which the value is recorded
|
81
|
+
# @return [Measurement]
|
82
|
+
def create_measurement value:, tags:
|
83
|
+
Measurement.new measure: self, value: value, tags: tags
|
84
|
+
end
|
85
|
+
|
86
|
+
# Is int64 data type
|
87
|
+
# @return [Boolean]
|
88
|
+
def int64?
|
89
|
+
type == INT64_TYPE
|
90
|
+
end
|
91
|
+
|
92
|
+
# Is float data type
|
93
|
+
# @return [Boolean]
|
94
|
+
def double?
|
95
|
+
type == DOUBLE_TYPE
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|