Skip to content

Commit 6727391

Browse files
Metrics SDK synchronous instruments (#1108)
* WIP: Metrics SDK implementation * Extend the existing OpenTelemetry SDK * fix: remove duplicate mutex instantiation * feat: add api metrics measurement * fix: add metric install sdk tests * fix: comments Co-authored-by: Francis Bogsanyi <[email protected]> * fix: add meter provider implementation and tests * fix: ruby style * Implement SDK instrument creation * fix: handling of immutable descriptions * wip: safety commit * chore: rubocops * fix: add missing require * Synchronous instruments * chore: remove exporter work from PR * Metric Stream refactor * Remove metrics test helper * feedback fixups * Remove console exporter * Add integration test assertions * fix: broken test assert * chore: appease the cop * chore: appease the cop * fix: francis feedback Co-authored-by: Francis Bogsanyi <[email protected]>
1 parent 6bec625 commit 6727391

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1620
-17
lines changed

metrics_api/lib/opentelemetry-metrics-api.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#
1818
# The OpenTelemetry module provides global accessors for telemetry objects.
1919
module OpenTelemetry
20+
@meter_provider = Internal::ProxyMeterProvider.new
21+
2022
# Register the global meter provider.
2123
#
2224
# @param [MeterProvider] provider A meter provider to register as the

metrics_api/lib/opentelemetry/internal/proxy_meter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def delegate=(meter)
2929
@mutex.synchronize do
3030
if @delegate.nil?
3131
@delegate = meter
32-
@registry.each_value { |instrument| instrument.upgrade_with(meter) }
32+
@instrument_registry.each_value { |instrument| instrument.upgrade_with(meter) }
3333
else
3434
OpenTelemetry.logger.warn 'Attempt to reset delegate in ProxyMeter ignored.'
3535
end

metrics_api/lib/opentelemetry/metrics.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ module Metrics
1111
end
1212

1313
require 'opentelemetry/metrics/instrument'
14+
require 'opentelemetry/metrics/measurement'
1415
require 'opentelemetry/metrics/meter'
1516
require 'opentelemetry/metrics/meter_provider'
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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 Metrics
9+
Measurement = Struct.new(:value, :attributes)
10+
end
11+
end

metrics_api/lib/opentelemetry/metrics/meter.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,29 @@ class Meter
2626

2727
def initialize
2828
@mutex = Mutex.new
29-
@registry = {}
29+
@instrument_registry = {}
3030
end
3131

3232
def create_counter(name, unit: nil, description: nil)
3333
create_instrument(:counter, name, unit, description, nil) { COUNTER }
3434
end
3535

36-
def create_observable_counter(name, unit: nil, description: nil, callback:)
37-
create_instrument(:observable_counter, name, unit, description, callback) { OBSERVABLE_COUNTER }
38-
end
39-
4036
def create_histogram(name, unit: nil, description: nil)
4137
create_instrument(:histogram, name, unit, description, nil) { HISTOGRAM }
4238
end
4339

44-
def create_observable_gauge(name, unit: nil, description: nil, callback:)
45-
create_instrument(:observable_gauge, name, unit, description, callback) { OBSERVABLE_GAUGE }
46-
end
47-
4840
def create_up_down_counter(name, unit: nil, description: nil)
4941
create_instrument(:up_down_counter, name, unit, description, nil) { UP_DOWN_COUNTER }
5042
end
5143

44+
def create_observable_counter(name, unit: nil, description: nil, callback:)
45+
create_instrument(:observable_counter, name, unit, description, callback) { OBSERVABLE_COUNTER }
46+
end
47+
48+
def create_observable_gauge(name, unit: nil, description: nil, callback:)
49+
create_instrument(:observable_gauge, name, unit, description, callback) { OBSERVABLE_GAUGE }
50+
end
51+
5252
def create_observable_up_down_counter(name, unit: nil, description: nil, callback:)
5353
create_instrument(:observable_up_down_counter, name, unit, description, callback) { OBSERVABLE_UP_DOWN_COUNTER }
5454
end
@@ -60,12 +60,12 @@ def create_instrument(kind, name, unit, description, callback)
6060
raise InstrumentNameError if name.empty?
6161
raise InstrumentNameError unless NAME_REGEX.match?(name)
6262
raise InstrumentUnitError if unit && (!unit.ascii_only? || unit.size > 63)
63-
raise InstrumentDescriptionError if description && (description.size > 1023 || !utf8mb3_encoding?(description))
63+
raise InstrumentDescriptionError if description && (description.size > 1023 || !utf8mb3_encoding?(description.dup))
6464

6565
@mutex.synchronize do
66-
raise DuplicateInstrumentError if @registry.include? name
66+
OpenTelemetry.logger.warn("duplicate instrument registration occurred for instrument #{name}") if @instrument_registry.include? name
6767

68-
@registry[name] = yield
68+
@instrument_registry[name] = yield
6969
end
7070
end
7171

metrics_api/opentelemetry-metrics-api.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
3131
spec.add_development_dependency 'bundler', '>= 1.17'
3232
spec.add_development_dependency 'faraday', '~> 0.13'
3333
spec.add_development_dependency 'minitest', '~> 5.0'
34+
spec.add_development_dependency 'opentelemetry-test-helpers'
3435
spec.add_development_dependency 'rake', '~> 12.0'
3536
spec.add_development_dependency 'rubocop', '~> 0.73.0'
3637
spec.add_development_dependency 'simplecov', '~> 0.17'

metrics_api/test/opentelemetry/metrics/meter_test.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
let(:meter) { meter_provider.meter('test-meter') }
1717

1818
describe 'creating an instrument' do
19-
it 'instrument name must be unique' do
20-
meter.create_counter('a_counter')
21-
_(-> { meter.create_counter('a_counter') }).must_raise(DUPLICATE_INSTRUMENT_ERROR)
22-
_(-> { meter.create_histogram('a_counter') }).must_raise(DUPLICATE_INSTRUMENT_ERROR)
19+
it 'duplicate instrument registration logs a warning' do
20+
OpenTelemetry::TestHelpers.with_test_logger do |log_stream|
21+
meter.create_counter('a_counter')
22+
meter.create_counter('a_counter')
23+
_(log_stream.string).must_match(/duplicate instrument registration occurred for instrument a_counter/)
24+
end
2325
end
2426

2527
it 'instrument name must not be nil' do

metrics_api/test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
# # SimpleCov.start
99
# # SimpleCov.minimum_coverage 85
1010

11+
require 'opentelemetry-test-helpers'
1112
require 'opentelemetry-metrics-api'
1213
require 'minitest/autorun'
1314
require 'pry'

metrics_sdk/.rubocop.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
AllCops:
2+
TargetRubyVersion: "2.6.0"
3+
4+
Lint/UnusedMethodArgument:
5+
Enabled: false
6+
Metrics/AbcSize:
7+
Max: 30
8+
Metrics/LineLength:
9+
Enabled: false
10+
Metrics/MethodLength:
11+
Max: 50
12+
Metrics/PerceivedComplexity:
13+
Max: 30
14+
Metrics/CyclomaticComplexity:
15+
Max: 20
16+
Metrics/ParameterLists:
17+
Enabled: false
18+
Naming/FileName:
19+
Exclude:
20+
- "lib/opentelemetry-metrics-sdk.rb"
21+
Style/ModuleFunction:
22+
Enabled: false

metrics_sdk/.yardopts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
--no-private
2+
--title=OpenTelemetry Metrics SDK
3+
--markup=markdown
4+
--main=README.md
5+
./lib/opentelemetry/**/*.rb
6+
./lib/opentelemetry.rb
7+
-
8+
README.md
9+
CHANGELOG.md

0 commit comments

Comments
 (0)