Skip to content

Commit

Permalink
feat: Implement Logs Bridge API
Browse files Browse the repository at this point in the history
This provides an interface for:
* LoggerProvider
* Logger
* LogRecord

This API will be consumed by the forthcoming Logs SDK.
Follows specification v 1.23.0.
  • Loading branch information
kaylareopelle committed Aug 2, 2023
1 parent 557baa1 commit 0880044
Show file tree
Hide file tree
Showing 11 changed files with 177 additions and 10 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
gem:
- opentelemetry-api
- opentelemetry-common
- opentelemetry-logs-api
- opentelemetry-metrics-api
- opentelemetry-registry
- opentelemetry-sdk
Expand Down
15 changes: 13 additions & 2 deletions logs_api/lib/opentelemetry/logs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,21 @@
#
# SPDX-License-Identifier: Apache-2.0

require 'opentelemetry'
require_relative 'logs/log_record'
require_relative 'logs/logger_provider'
require_relative 'logs/logger'

module OpenTelemetry
# OpenTelemetry Logs API
# The Logs API records a timestamped text record with metadata.
# In OpenTelemetry, any data that is not part of a distributed trace or a
# metric is a log. For example, events are a specific type of log.
module Logs
extend self

# Sets a global {LoggerProvider}
# @api public
def logger_provider
@logger_provider ||= LoggerProvider.new
end
end
end
12 changes: 12 additions & 0 deletions logs_api/lib/opentelemetry/logs/log_record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

module OpenTelemetry
module Logs
# No-op implementation of an emitted log and its associated attributes
class LogRecord; end
end
end
46 changes: 46 additions & 0 deletions logs_api/lib/opentelemetry/logs/logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

module OpenTelemetry
module Logs
# No-op implementation of logger.
class Logger
# Create a {LogRecord}
#
# @param timestamp [optional Float] Time when the event occurred measured
# by the origin clock, i.e. the time at the source.
# @param observed_timestamp [optional Float] Time when the event was
# observed by the collection system.
# @param context [optional Context] The Context to associate with the
# LogRecord.
# @param severity_number [optional Integer] Numerical value of the
# severity. Smaller numerical values correspond to less severe events
# (such as debug events), larger numerical values correspond to more
# severe events (such as errors and critical events).
# @param severity_text [optional String] Original string representation of
# the severity as it is known at the source. Also known as log level.
# @param body [optional String, Numeric, Boolean, Array<String, Numeric,
# Boolean>, Hash{String => String, Numeric, Boolean, Array<String,
# Numeric, Boolean>}] A value containing the body of the log record.
# @param attributes [optional Hash{String => String, Numeric, Boolean,
# Array<String, Numeric, Boolean>}] Additional information about the
# event.
#
# @api public
def create_log_record(
timestamp: nil,
observed_timestamp: nil,
context: nil,
severity_number: nil,
severity_text: nil,
body: nil,
attributes: nil
)
LogRecord.new
end
end
end
end
27 changes: 27 additions & 0 deletions logs_api/lib/opentelemetry/logs/logger_provider.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

module OpenTelemetry
module Logs
# No-op implementation of a logger provider
class LoggerProvider
# Returns a {Logger} instance.
#
# @param name [optional String] Instrumentation package name
# @param version [optional String] Instrumentation package version
# @param schema_url [optional String] Schema URL recorded in the emitted telemetry.
# @param attributes [optional Hash] Specifies the instrumentation scope
# attributes to associate with emitted telemetry.
#
# @return [OpenTelemetry::Logs::Logger]
#
# @api public
def logger(name: nil, version: nil, schema_url: nil, attributes: {})
@logger ||= OpenTelemetry::Logs::Logger.new
end
end
end
end
2 changes: 0 additions & 2 deletions logs_api/opentelemetry-logs-api.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ Gem::Specification.new do |spec|
spec.require_paths = ['lib']
spec.required_ruby_version = '>= 3.0'

spec.add_dependency 'opentelemetry-api', '~> 1.0'

spec.add_development_dependency 'bundler', '>= 1.17'
spec.add_development_dependency 'minitest', '~> 5.0'
spec.add_development_dependency 'rake', '~> 12.0'
Expand Down
8 changes: 8 additions & 0 deletions logs_api/test/.rubocop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
inherit_from: ../.rubocop.yml

Metrics/BlockLength:
Enabled: false
Metrics/LineLength:
Enabled: false
Metrics/AbcSize:
Enabled: false
30 changes: 30 additions & 0 deletions logs_api/test/opentelemetry/logs/logger_provider_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

require 'test_helper'

describe OpenTelemetry::Logs::LoggerProvider do
let(:logger_provider) { OpenTelemetry::Logs.logger_provider }

describe '#logger' do
it 'returns the same logger for the same arguments' do
logger1 = logger_provider.logger(
name: 'component',
version: '1.0',
schema_url: 'example.com',
attributes: { a: 1 }
)

logger2 = logger_provider.logger(
name: 'component',
version: '1.0',
schema_url: 'example.com',
attributes: { a: 1 }
)
assert_same(logger1, logger2)
end
end
end
17 changes: 17 additions & 0 deletions logs_api/test/opentelemetry/logs/logger_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

require 'test_helper'

describe OpenTelemetry::Logs::Logger do
let(:logger) { OpenTelemetry::Logs::Logger.new }

describe '#create_log_record' do
it 'creates a new LogRecord' do
assert_instance_of(OpenTelemetry::Logs::LogRecord, logger.create_log_record)
end
end
end
21 changes: 21 additions & 0 deletions logs_api/test/opentelemetry/logs_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

require 'test_helper'

describe OpenTelemetry::Logs do
describe '#logger_provider' do
it 'returns an instance of LoggerProvider' do
assert_equal(OpenTelemetry::Logs::LoggerProvider, OpenTelemetry::Logs.logger_provider.class)
end

it 'always uses the same LoggerProvider' do
first_call = OpenTelemetry::Logs.logger_provider
second_call = OpenTelemetry::Logs.logger_provider
assert_same(first_call, second_call)
end
end
end
8 changes: 2 additions & 6 deletions logs_api/test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,8 @@
# SPDX-License-Identifier: Apache-2.0

require 'simplecov'
SimpleCov.start
SimpleCov.start { enable_coverage :branch }
SimpleCov.minimum_coverage 85

require 'opentelemetry-test-helpers'
require 'opentelemetry-metrics-api'
require 'opentelemetry-logs-api'
require 'minitest/autorun'
require 'pry'

OpenTelemetry.logger = Logger.new(File::NULL)

0 comments on commit 0880044

Please sign in to comment.