forked from open-telemetry/opentelemetry-ruby
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Create Logs SDK LoggerProvider #2
Closed
Closed
Changes from 8 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
5cee6e4
Implement LoggerProvider#logger
kaylareopelle 1f548c9
Associate a Resource with LoggerProvider
kaylareopelle 5ff70fe
resource, processors, mutex
kaylareopelle a6c9243
Write test for add_log_record_processor
kaylareopelle 64b3829
Implement LoggerProvider#shutdown
kaylareopelle 0a7cf84
LoggerProvider#shutdown with arg on processor
kaylareopelle f458571
Temp class comment on LogRecordProcessor
kaylareopelle e87f3c1
LogRecordProcessor#force_flush
kaylareopelle 0d6935b
Cleanup
kaylareopelle 893e1b8
Bump versions
kaylareopelle 97a378b
Address feedback from fallwith
kaylareopelle a4d9197
Add more tests
kaylareopelle 1863a17
Update tests and error handling
kaylareopelle b10d32c
Docs updates
kaylareopelle 2ecac1c
Add links
kaylareopelle File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# frozen_string_literal: true | ||
|
||
# Copyright The OpenTelemetry Authors | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
module OpenTelemetry | ||
module SDK | ||
module Logs | ||
# The Export module contains the built-in exporters and log record | ||
# processors for the OpenTelemetry reference implementation. | ||
module Export | ||
# Result codes for the LogRecordExporter#export method and the LogRecordProcessor#force_flush and LogRecordProcessor#shutdown methods. | ||
|
||
# The operation finished successfully. | ||
SUCCESS = 0 | ||
|
||
# The operation finished with an error. | ||
FAILURE = 1 | ||
|
||
# Additional result code for the LogRecordProcessor#force_flush and LogRecordProcessor#shutdown methods. | ||
|
||
# The operation timed out. | ||
TIMEOUT = 2 | ||
end | ||
end | ||
end | ||
end |
22 changes: 22 additions & 0 deletions
22
logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# frozen_string_literal: true | ||
|
||
# Copyright The OpenTelemetry Authors | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
module OpenTelemetry | ||
module SDK | ||
module Logs | ||
# Presently no-op LogRecordProcessor | ||
class LogRecordProcessor | ||
def shutdown(timeout: nil) | ||
# TODO: implement | ||
end | ||
|
||
def force_flush(timeout: nil) | ||
# TODO: implement | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# frozen_string_literal: true | ||
|
||
# Copyright The OpenTelemetry Authors | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
module OpenTelemetry | ||
module SDK | ||
module Logs | ||
# {OpenTelemetry::SDK::Logs::Logger} is the SDK implementation of {OpenTelemetry::Logs::Logger} | ||
class Logger < OpenTelemetry::Logs::Logger | ||
attr_reader :instrumentation_scope | ||
|
||
# @api private | ||
# | ||
# Returns a new {OpenTelemetry::SDK::Logs::Logger} instance. | ||
# | ||
# @param [String] name Instrumentation package name | ||
# @param [String] version Instrumentation package version | ||
# @param [LoggerProvider] logger_provider LoggerProvider that initialized | ||
# the logger | ||
# | ||
# @return [OpenTelemetry::SDK::Logs::Logger] | ||
def initialize(name, version, logger_provider) | ||
@instrumentation_scope = InstrumentationScope.new(name, version) | ||
@logger_provider = logger_provider | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
# frozen_string_literal: true | ||
|
||
# Copyright The OpenTelemetry Authors | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
module OpenTelemetry | ||
module SDK | ||
module Logs | ||
# {LoggerProvider} is the SDK implementation of | ||
# {OpenTelemetry::Logs::LoggerProvider}. | ||
class LoggerProvider < OpenTelemetry::Logs::LoggerProvider | ||
attr_reader :resource | ||
|
||
EMPTY_NAME_ERROR = 'LoggerProvider#logger called without '\ | ||
'providing a logger name.' | ||
|
||
# Returns a new {LoggerProvider} instance. | ||
# | ||
# @param [optional Resource] resource The resource to associate with new | ||
# LogRecords created by Loggers created by this LoggerProvider | ||
# @param [optional Array] log_record_processors to associate with the | ||
# LoggerProvider | ||
# | ||
# @return [LoggerProvider] | ||
def initialize( | ||
resource: OpenTelemetry::SDK::Resources::Resource.create, | ||
log_record_processors: [] | ||
) | ||
@log_record_processors = log_record_processors | ||
@mutex = Mutex.new | ||
@resource = resource | ||
@stopped = false | ||
end | ||
|
||
# Returns a {OpenTelemetry::SDK::Logs::Logger} instance. | ||
# | ||
# @param [optional String] name Instrumentation package name | ||
# @param [optional String] version Instrumentation package version | ||
# | ||
# @return [OpenTelemetry::SDK::Logs::Logger] | ||
def logger(name = nil, version = nil) | ||
name ||= '' | ||
version ||= '' | ||
|
||
OpenTelemetry.logger.warn(EMPTY_NAME_ERROR) if name.empty? | ||
|
||
# Q: Why does the TracerProvider have both @mutex and @registry_mutex? | ||
@mutex.synchronize do | ||
OpenTelemetry::SDK::Logs::Logger.new(name, version, self) | ||
end | ||
end | ||
|
||
# Adds a new LogRecordProcessor to this {LoggerProvider}. | ||
# | ||
# @param log_record_processor the new LogRecordProcessor to be added | ||
def add_log_record_processor(log_record_processor) | ||
@mutex.synchronize do | ||
@log_record_processors = @log_record_processors.dup.push(log_record_processor) | ||
end | ||
end | ||
|
||
# Attempts to stop all the activity for this {LoggerProvider}. Calls | ||
# LogRecordProcessor#shutdown for all registered LogRecordProcessors. | ||
# | ||
# This operation may block until all the Log Records are processed. Must | ||
# be called before turning off the main application to ensure all data | ||
# are processed and exported. | ||
# | ||
# After this is called all the newly created {LogRecord}s will be no-op. | ||
# | ||
# @param [optional Numeric] timeout An optional timeout in seconds. | ||
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if | ||
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. | ||
def shutdown(timeout: nil) | ||
@mutex.synchronize do | ||
if @stopped | ||
OpenTelemetry.logger.warn( | ||
'calling LoggerProvider#shutdown multiple times.' | ||
) | ||
return OpenTelemetry::SDK::Logs::Export::FAILURE | ||
end | ||
|
||
start_time = OpenTelemetry::Common::Utilities.timeout_timestamp | ||
results = @log_record_processors.map do |processor| | ||
remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) | ||
break [OpenTelemetry::SDK::Logs::Export::TIMEOUT] if remaining_timeout&.zero? | ||
|
||
# this needs an argument, but I'm having trouble passing the arg to the expect | ||
# processor.shutdown(timeout: remaining_timeout) | ||
processor.shutdown | ||
end | ||
|
||
@stopped = true | ||
results.max || OpenTelemetry::SDK::Logs::Export::SUCCESS | ||
end | ||
end | ||
|
||
# Immediately export all log records that have not yet been exported | ||
# for all the registered LogRecordProcessors. | ||
# | ||
# This method should only be called in cases where it is absolutely | ||
# necessary, such as when using some FaaS providers that may suspend | ||
# the process after an invocation, but before the `Processor` exports | ||
# the completed log records. | ||
# | ||
# @param [optional Numeric] timeout An optional timeout in seconds. | ||
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if | ||
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. | ||
def force_flush(timeout: nil) | ||
@mutex.synchronize do | ||
return Export::SUCCESS if @stopped | ||
|
||
start_time = OpenTelemetry::Common::Utilities.timeout_timestamp | ||
results = @log_record_processors.map do |processor| | ||
remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) | ||
return Export::TIMEOUT if remaining_timeout&.zero? | ||
|
||
# TODO: Fix the issue with the test not accepting the arg | ||
# processor.force_flush(timeout: remaining_timeout) | ||
processor.force_flush | ||
end | ||
|
||
results.max || Export::SUCCESS | ||
end | ||
rescue StandardError | ||
Export::FAILURE | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,8 @@ | ||
# inherit_from: .rubocop_todo.yml | ||
inherit_from: ../.rubocop.yml | ||
|
||
AllCops: | ||
TargetRubyVersion: '3.0' | ||
|
||
Lint/UnusedMethodArgument: | ||
Enabled: false | ||
Metrics/AbcSize: | ||
Metrics/BlockLength: | ||
Enabled: false | ||
Metrics/LineLength: | ||
Enabled: false | ||
Metrics/MethodLength: | ||
Max: 50 | ||
Metrics/PerceivedComplexity: | ||
Max: 30 | ||
Metrics/CyclomaticComplexity: | ||
Max: 20 | ||
Metrics/ParameterLists: | ||
Enabled: false | ||
Naming/FileName: | ||
Exclude: | ||
- 'lib/opentelemetry-logs-sdk.rb' | ||
Style/ModuleFunction: | ||
Metrics/AbcSize: | ||
Enabled: false |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is copied from
TracerProvider#add_span_processor
. @fallwith and I were chatting about this LOC. He was asking about the use of.dup.push
here.Does
dup.push
provide atomicity in a way that thepush
method alone couldn't deliver? Or is there a different reasondup.push
was used?