opentelemetry-metrics-sdk 0.1.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 +7 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE +201 -0
- data/README.md +110 -0
- data/lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb +100 -0
- data/lib/opentelemetry/sdk/metrics/aggregation/histogram_data_point.rb +27 -0
- data/lib/opentelemetry/sdk/metrics/aggregation/number_data_point.rb +19 -0
- data/lib/opentelemetry/sdk/metrics/aggregation/sum.rb +58 -0
- data/lib/opentelemetry/sdk/metrics/aggregation.rb +21 -0
- data/lib/opentelemetry/sdk/metrics/configuration_patch.rb +25 -0
- data/lib/opentelemetry/sdk/metrics/export/console_metric_pull_exporter.rb +44 -0
- data/lib/opentelemetry/sdk/metrics/export/in_memory_metric_pull_exporter.rb +46 -0
- data/lib/opentelemetry/sdk/metrics/export/metric_reader.rb +36 -0
- data/lib/opentelemetry/sdk/metrics/export.rb +28 -0
- data/lib/opentelemetry/sdk/metrics/instrument/counter.rb +51 -0
- data/lib/opentelemetry/sdk/metrics/instrument/histogram.rb +44 -0
- data/lib/opentelemetry/sdk/metrics/instrument/observable_counter.rb +26 -0
- data/lib/opentelemetry/sdk/metrics/instrument/observable_gauge.rb +26 -0
- data/lib/opentelemetry/sdk/metrics/instrument/observable_up_down_counter.rb +26 -0
- data/lib/opentelemetry/sdk/metrics/instrument/synchronous_instrument.rb +49 -0
- data/lib/opentelemetry/sdk/metrics/instrument/up_down_counter.rb +44 -0
- data/lib/opentelemetry/sdk/metrics/instrument.rb +22 -0
- data/lib/opentelemetry/sdk/metrics/meter.rb +51 -0
- data/lib/opentelemetry/sdk/metrics/meter_provider.rb +139 -0
- data/lib/opentelemetry/sdk/metrics/state/metric_data.rb +25 -0
- data/lib/opentelemetry/sdk/metrics/state/metric_store.rb +48 -0
- data/lib/opentelemetry/sdk/metrics/state/metric_stream.rb +76 -0
- data/lib/opentelemetry/sdk/metrics/state.rb +22 -0
- data/lib/opentelemetry/sdk/metrics/version.rb +14 -0
- data/lib/opentelemetry/sdk/metrics.rb +22 -0
- data/lib/opentelemetry-metrics-sdk.rb +9 -0
- metadata +260 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Export
|
11
|
+
# The InMemoryMetricPullExporter behaves as a Metric Reader and Exporter.
|
12
|
+
# To be used for testing purposes, not production.
|
13
|
+
class InMemoryMetricPullExporter < MetricReader
|
14
|
+
attr_reader :metric_snapshots
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
super
|
18
|
+
@metric_snapshots = []
|
19
|
+
@mutex = Mutex.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def pull
|
23
|
+
export(collect)
|
24
|
+
end
|
25
|
+
|
26
|
+
def export(metrics)
|
27
|
+
@mutex.synchronize do
|
28
|
+
@metric_snapshots << metrics
|
29
|
+
end
|
30
|
+
SUCCESS
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset
|
34
|
+
@mutex.synchronize do
|
35
|
+
@metric_snapshots.clear
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def shutdown
|
40
|
+
SUCCESS
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Export
|
11
|
+
# MetricReader provides a minimal example implementation.
|
12
|
+
# It is not required to subclass this class to provide an implementation
|
13
|
+
# of MetricReader, provided the interface is satisfied.
|
14
|
+
class MetricReader
|
15
|
+
attr_reader :metric_store
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@metric_store = OpenTelemetry::SDK::Metrics::State::MetricStore.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def collect
|
22
|
+
@metric_store.collect
|
23
|
+
end
|
24
|
+
|
25
|
+
def shutdown(timeout: nil)
|
26
|
+
Export::SUCCESS
|
27
|
+
end
|
28
|
+
|
29
|
+
def force_flush(timeout: nil)
|
30
|
+
Export::SUCCESS
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Export
|
11
|
+
ExportError = Class.new(OpenTelemetry::Error)
|
12
|
+
|
13
|
+
# The operation finished successfully.
|
14
|
+
SUCCESS = 0
|
15
|
+
|
16
|
+
# The operation finished with an error.
|
17
|
+
FAILURE = 1
|
18
|
+
|
19
|
+
# The operation timed out.
|
20
|
+
TIMEOUT = 2
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'opentelemetry/sdk/metrics/export/metric_reader'
|
27
|
+
require 'opentelemetry/sdk/metrics/export/in_memory_metric_pull_exporter'
|
28
|
+
require 'opentelemetry/sdk/metrics/export/console_metric_pull_exporter'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {Counter} is the SDK implementation of {OpenTelemetry::Metrics::Counter}.
|
12
|
+
class Counter < OpenTelemetry::SDK::Metrics::Instrument::SynchronousInstrument
|
13
|
+
# Returns the instrument kind as a Symbol
|
14
|
+
#
|
15
|
+
# @return [Symbol]
|
16
|
+
def instrument_kind
|
17
|
+
:counter
|
18
|
+
end
|
19
|
+
|
20
|
+
# Increment the Counter by a fixed amount.
|
21
|
+
#
|
22
|
+
# @param [numeric] increment The increment amount, which MUST be a non-negative numeric value.
|
23
|
+
# @param [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
|
24
|
+
# Values must be non-nil and (array of) string, boolean or numeric type.
|
25
|
+
# Array values must not contain nil elements and all elements must be of
|
26
|
+
# the same basic type (string, numeric, boolean).
|
27
|
+
def add(increment, attributes: {})
|
28
|
+
# TODO: When the metrics SDK stabilizes and is merged into the main SDK,
|
29
|
+
# we can leverage the SDK Internal validation classes to enforce this:
|
30
|
+
# https://github.com/open-telemetry/opentelemetry-ruby/blob/6bec625ef49004f364457c26263df421526b60d6/sdk/lib/opentelemetry/sdk/internal.rb#L47
|
31
|
+
if increment.negative?
|
32
|
+
OpenTelemetry.logger.warn("#{@name} received a negative value")
|
33
|
+
else
|
34
|
+
update(increment, attributes)
|
35
|
+
end
|
36
|
+
nil
|
37
|
+
rescue StandardError => e
|
38
|
+
OpenTelemetry.handle_error(exception: e)
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def default_aggregation
|
45
|
+
OpenTelemetry::SDK::Metrics::Aggregation::Sum.new
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {Histogram} is the SDK implementation of {OpenTelemetry::Metrics::Histogram}.
|
12
|
+
class Histogram < OpenTelemetry::SDK::Metrics::Instrument::SynchronousInstrument
|
13
|
+
# Returns the instrument kind as a Symbol
|
14
|
+
#
|
15
|
+
# @return [Symbol]
|
16
|
+
def instrument_kind
|
17
|
+
:histogram
|
18
|
+
end
|
19
|
+
|
20
|
+
# Updates the statistics with the specified amount.
|
21
|
+
#
|
22
|
+
# @param [numeric] amount The amount of the Measurement, which MUST be a non-negative numeric value.
|
23
|
+
# @param [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
|
24
|
+
# Values must be non-nil and (array of) string, boolean or numeric type.
|
25
|
+
# Array values must not contain nil elements and all elements must be of
|
26
|
+
# the same basic type (string, numeric, boolean).
|
27
|
+
def record(amount, attributes: nil)
|
28
|
+
update(amount, attributes)
|
29
|
+
nil
|
30
|
+
rescue StandardError => e
|
31
|
+
OpenTelemetry.handle_error(exception: e)
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def default_aggregation
|
38
|
+
OpenTelemetry::SDK::Metrics::Aggregation::ExplicitBucketHistogram.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {ObservableCounter} is the SDK implementation of {OpenTelemetry::Metrics::ObservableCounter}.
|
12
|
+
class ObservableCounter < OpenTelemetry::Metrics::Instrument::ObservableCounter
|
13
|
+
attr_reader :name, :unit, :description
|
14
|
+
|
15
|
+
def initialize(name, unit, description, callback, meter)
|
16
|
+
@name = name
|
17
|
+
@unit = unit
|
18
|
+
@description = description
|
19
|
+
@callback = callback
|
20
|
+
@meter = meter
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {ObservableGauge} is the SDK implementation of {OpenTelemetry::Metrics::ObservableGauge}.
|
12
|
+
class ObservableGauge < OpenTelemetry::Metrics::Instrument::ObservableGauge
|
13
|
+
attr_reader :name, :unit, :description
|
14
|
+
|
15
|
+
def initialize(name, unit, description, callback, meter)
|
16
|
+
@name = name
|
17
|
+
@unit = unit
|
18
|
+
@description = description
|
19
|
+
@callback = callback
|
20
|
+
@meter = meter
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {ObservableUpDownCounter} is the SDK implementation of {OpenTelemetry::Metrics::ObservableUpDownCounter}.
|
12
|
+
class ObservableUpDownCounter < OpenTelemetry::Metrics::Instrument::ObservableUpDownCounter
|
13
|
+
attr_reader :name, :unit, :description
|
14
|
+
|
15
|
+
def initialize(name, unit, description, callback, meter)
|
16
|
+
@name = name
|
17
|
+
@unit = unit
|
18
|
+
@description = description
|
19
|
+
@callback = callback
|
20
|
+
@meter = meter
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {SynchronousInstrument} contains the common functionality shared across
|
12
|
+
# the synchronous instruments SDK instruments.
|
13
|
+
class SynchronousInstrument
|
14
|
+
def initialize(name, unit, description, instrumentation_scope, meter_provider)
|
15
|
+
@name = name
|
16
|
+
@unit = unit
|
17
|
+
@description = description
|
18
|
+
@instrumentation_scope = instrumentation_scope
|
19
|
+
@meter_provider = meter_provider
|
20
|
+
@metric_streams = []
|
21
|
+
|
22
|
+
meter_provider.register_synchronous_instrument(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def register_with_new_metric_store(metric_store, aggregation: default_aggregation)
|
27
|
+
ms = OpenTelemetry::SDK::Metrics::State::MetricStream.new(
|
28
|
+
@name,
|
29
|
+
@description,
|
30
|
+
@unit,
|
31
|
+
instrument_kind,
|
32
|
+
@meter_provider,
|
33
|
+
@instrumentation_scope,
|
34
|
+
aggregation
|
35
|
+
)
|
36
|
+
@metric_streams << ms
|
37
|
+
metric_store.add_metric_stream(ms)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def update(value, attributes)
|
43
|
+
@metric_streams.each { |ms| ms.update(value, attributes) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module Instrument
|
11
|
+
# {UpDownCounter} is the SDK implementation of {OpenTelemetry::Metrics::UpDownCounter}.
|
12
|
+
class UpDownCounter < OpenTelemetry::SDK::Metrics::Instrument::SynchronousInstrument
|
13
|
+
# Returns the instrument kind as a Symbol
|
14
|
+
#
|
15
|
+
# @return [Symbol]
|
16
|
+
def instrument_kind
|
17
|
+
:up_down_counter
|
18
|
+
end
|
19
|
+
|
20
|
+
# Increment or decrement the UpDownCounter by a fixed amount.
|
21
|
+
#
|
22
|
+
# @param [Numeric] amount The amount to be added, can be positive, negative or zero.
|
23
|
+
# @param [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
|
24
|
+
# Values must be non-nil and (array of) string, boolean or numeric type.
|
25
|
+
# Array values must not contain nil elements and all elements must be of
|
26
|
+
# the same basic type (string, numeric, boolean).
|
27
|
+
def add(amount, attributes: nil)
|
28
|
+
update(amount, attributes)
|
29
|
+
nil
|
30
|
+
rescue StandardError => e
|
31
|
+
OpenTelemetry.handle_error(exception: e)
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def default_aggregation
|
38
|
+
OpenTelemetry::SDK::Metrics::Aggregation::Sum.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# The Instrument module contains the OpenTelemetry instruments reference
|
10
|
+
# implementation.
|
11
|
+
module Instrument
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'opentelemetry/sdk/metrics/instrument/synchronous_instrument'
|
17
|
+
require 'opentelemetry/sdk/metrics/instrument/counter'
|
18
|
+
require 'opentelemetry/sdk/metrics/instrument/histogram'
|
19
|
+
require 'opentelemetry/sdk/metrics/instrument/observable_counter'
|
20
|
+
require 'opentelemetry/sdk/metrics/instrument/observable_gauge'
|
21
|
+
require 'opentelemetry/sdk/metrics/instrument/observable_up_down_counter'
|
22
|
+
require 'opentelemetry/sdk/metrics/instrument/up_down_counter'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# The Metrics module contains the OpenTelemetry metrics reference
|
10
|
+
# implementation.
|
11
|
+
module Metrics
|
12
|
+
# {Meter} is the SDK implementation of {OpenTelemetry::Metrics::Meter}.
|
13
|
+
class Meter < OpenTelemetry::Metrics::Meter
|
14
|
+
# @api private
|
15
|
+
#
|
16
|
+
# Returns a new {Meter} instance.
|
17
|
+
#
|
18
|
+
# @param [String] name Instrumentation package name
|
19
|
+
# @param [String] version Instrumentation package version
|
20
|
+
#
|
21
|
+
# @return [Meter]
|
22
|
+
def initialize(name, version, meter_provider)
|
23
|
+
@mutex = Mutex.new
|
24
|
+
@instrument_registry = {}
|
25
|
+
@instrumentation_scope = InstrumentationScope.new(name, version)
|
26
|
+
@meter_provider = meter_provider
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
def add_metric_reader(metric_reader)
|
31
|
+
@instrument_registry.each do |_n, instrument|
|
32
|
+
instrument.register_with_new_metric_store(metric_reader.metric_store)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_instrument(kind, name, unit, description, callback)
|
37
|
+
super do
|
38
|
+
case kind
|
39
|
+
when :counter then OpenTelemetry::SDK::Metrics::Instrument::Counter.new(name, unit, description, @instrumentation_scope, @meter_provider)
|
40
|
+
when :observable_counter then OpenTelemetry::SDK::Metrics::Instrument::ObservableCounter.new(name, unit, description, callback, @instrumentation_scope, @meter_provider)
|
41
|
+
when :histogram then OpenTelemetry::SDK::Metrics::Instrument::Histogram.new(name, unit, description, @instrumentation_scope, @meter_provider)
|
42
|
+
when :observable_gauge then OpenTelemetry::SDK::Metrics::Instrument::ObservableGauge.new(name, unit, description, callback, @instrumentation_scope, @meter_provider)
|
43
|
+
when :up_down_counter then OpenTelemetry::SDK::Metrics::Instrument::UpDownCounter.new(name, unit, description, @instrumentation_scope, @meter_provider)
|
44
|
+
when :observable_up_down_counter then OpenTelemetry::SDK::Metrics::Instrument::ObservableUpDownCounter.new(name, unit, description, callback, @instrumentation_scope, @meter_provider)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
# The Metrics module contains the OpenTelemetry metrics reference
|
10
|
+
# implementation.
|
11
|
+
module Metrics
|
12
|
+
# {MeterProvider} is the SDK implementation of {OpenTelemetry::Metrics::MeterProvider}.
|
13
|
+
class MeterProvider < OpenTelemetry::Metrics::MeterProvider
|
14
|
+
Key = Struct.new(:name, :version)
|
15
|
+
private_constant(:Key)
|
16
|
+
|
17
|
+
attr_reader :resource, :metric_readers
|
18
|
+
|
19
|
+
def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create)
|
20
|
+
@mutex = Mutex.new
|
21
|
+
@meter_registry = {}
|
22
|
+
@stopped = false
|
23
|
+
@metric_readers = []
|
24
|
+
@resource = resource
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a {Meter} instance.
|
28
|
+
#
|
29
|
+
# @param [String] name Instrumentation package name
|
30
|
+
# @param [optional String] version Instrumentation package version
|
31
|
+
#
|
32
|
+
# @return [Meter]
|
33
|
+
def meter(name, version: nil)
|
34
|
+
version ||= ''
|
35
|
+
if @stopped
|
36
|
+
OpenTelemetry.logger.warn 'calling MeterProvider#meter after shutdown, a noop meter will be returned.'
|
37
|
+
OpenTelemetry::Metrics::Meter.new
|
38
|
+
else
|
39
|
+
@mutex.synchronize { @meter_registry[Key.new(name, version)] ||= Meter.new(name, version, self) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Attempts to stop all the activity for this {MeterProvider}.
|
44
|
+
#
|
45
|
+
# Calls MetricReader#shutdown for all registered MetricReaders.
|
46
|
+
#
|
47
|
+
# After this is called all the newly created {Meter}s will be no-op.
|
48
|
+
#
|
49
|
+
# @param [optional Numeric] timeout An optional timeout in seconds.
|
50
|
+
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if
|
51
|
+
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred.
|
52
|
+
def shutdown(timeout: nil)
|
53
|
+
@mutex.synchronize do
|
54
|
+
if @stopped
|
55
|
+
OpenTelemetry.logger.warn('calling MetricProvider#shutdown multiple times.')
|
56
|
+
Export::FAILURE
|
57
|
+
else
|
58
|
+
start_time = OpenTelemetry::Common::Utilities.timeout_timestamp
|
59
|
+
results = @metric_readers.map do |metric_reader|
|
60
|
+
remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time)
|
61
|
+
if remaining_timeout&.zero?
|
62
|
+
Export::TIMEOUT
|
63
|
+
else
|
64
|
+
metric_reader.shutdown(timeout: remaining_timeout)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
@stopped = true
|
69
|
+
results.max || Export::SUCCESS
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# This method provides a way for provider to notify the registered
|
75
|
+
# {MetricReader} instances, so they can do as much as they could to consume
|
76
|
+
# or send the metrics. Note: unlike Push Metric Exporter which can send data on
|
77
|
+
# its own schedule, Pull Metric Exporter can only send the data when it is
|
78
|
+
# being asked by the scraper, so ForceFlush would not make much sense.
|
79
|
+
#
|
80
|
+
# @param [optional Numeric] timeout An optional timeout in seconds.
|
81
|
+
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if
|
82
|
+
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred.
|
83
|
+
def force_flush(timeout: nil)
|
84
|
+
@mutex.synchronize do
|
85
|
+
if @stopped
|
86
|
+
Export::SUCCESS
|
87
|
+
else
|
88
|
+
start_time = OpenTelemetry::Common::Utilities.timeout_timestamp
|
89
|
+
results = @metric_readers.map do |metric_reader|
|
90
|
+
remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time)
|
91
|
+
if remaining_timeout&.zero?
|
92
|
+
Export::TIMEOUT
|
93
|
+
else
|
94
|
+
metric_reader.force_flush(timeout: remaining_timeout)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
results.max || Export::SUCCESS
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Adds a new MetricReader to this {MeterProvider}.
|
104
|
+
#
|
105
|
+
# @param metric_reader the new MetricReader to be added.
|
106
|
+
def add_metric_reader(metric_reader)
|
107
|
+
@mutex.synchronize do
|
108
|
+
if @stopped
|
109
|
+
OpenTelemetry.logger.warn('calling MetricProvider#add_metric_reader after shutdown.')
|
110
|
+
else
|
111
|
+
@metric_readers.push(metric_reader)
|
112
|
+
@meter_registry.each_value { |meter| meter.add_metric_reader(metric_reader) }
|
113
|
+
end
|
114
|
+
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# @api private
|
120
|
+
def register_synchronous_instrument(instrument)
|
121
|
+
@mutex.synchronize do
|
122
|
+
@metric_readers.each do |mr|
|
123
|
+
instrument.register_with_new_metric_store(mr.metric_store)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# The type of the Instrument(s) (optional).
|
129
|
+
# The name of the Instrument(s). OpenTelemetry SDK authors MAY choose to support wildcard characters, with the question mark (?) matching exactly one character and the asterisk character (*) matching zero or more characters.
|
130
|
+
# The name of the Meter (optional).
|
131
|
+
# The version of the Meter (optional).
|
132
|
+
# The schema_url of the Meter (optional).
|
133
|
+
def add_view
|
134
|
+
# TODO: For each meter add this view to all applicable instruments
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module State
|
11
|
+
# MetricData is a Struct containing {MetricStream} data for export.
|
12
|
+
MetricData = Struct.new(:name, # String
|
13
|
+
:description, # String
|
14
|
+
:unit, # String
|
15
|
+
:instrument_kind, # Symbol
|
16
|
+
:resource, # OpenTelemetry::SDK::Resources::Resource
|
17
|
+
:instrumentation_scope, # OpenTelemetry::SDK::InstrumentationScope
|
18
|
+
:data_points, # Hash{Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>} => Numeric}
|
19
|
+
:aggregation_temporality, # Symbol
|
20
|
+
:start_time_unix_nano, # Integer nanoseconds since Epoch
|
21
|
+
:time_unix_nano) # Integer nanoseconds since Epoch
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Metrics
|
10
|
+
module State
|
11
|
+
# @api private
|
12
|
+
#
|
13
|
+
# The MetricStore module provides SDK internal functionality that is not a part of the
|
14
|
+
# public API.
|
15
|
+
class MetricStore
|
16
|
+
def initialize
|
17
|
+
@mutex = Mutex.new
|
18
|
+
@epoch_start_time = now_in_nano
|
19
|
+
@epoch_end_time = nil
|
20
|
+
@metric_streams = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def collect
|
24
|
+
@mutex.synchronize do
|
25
|
+
@epoch_end_time = now_in_nano
|
26
|
+
snapshot = @metric_streams.map { |ms| ms.collect(@epoch_start_time, @epoch_end_time) }
|
27
|
+
@epoch_start_time = @epoch_end_time
|
28
|
+
snapshot
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_metric_stream(metric_stream)
|
33
|
+
@mutex.synchronize do
|
34
|
+
@metric_streams = @metric_streams.dup.push(metric_stream)
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def now_in_nano
|
42
|
+
(Time.now.to_r * 1_000_000_000).to_i
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|