diff --git a/lib/src/api/logs/log_record.dart b/lib/src/api/logs/log_record.dart new file mode 100644 index 00000000..56cf43af --- /dev/null +++ b/lib/src/api/logs/log_record.dart @@ -0,0 +1,30 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +enum Severity { + unspecified, + trace, + trace2, + trace3, + trace4, + debug, + debug2, + debug3, + debug4, + info, + info2, + info3, + info4, + warn, + warn2, + warn3, + warn4, + error, + error2, + error3, + error4, + fatal, + fatal2, + fatal3, + fatal4, +} diff --git a/lib/src/api/logs/logger.dart b/lib/src/api/logs/logger.dart new file mode 100644 index 00000000..927338b8 --- /dev/null +++ b/lib/src/api/logs/logger.dart @@ -0,0 +1,18 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +import '../../../api.dart' as api; +import '../../../sdk.dart' as sdk; +import 'log_record.dart'; + +abstract class Logger { + void emit({ + sdk.Attributes? attributes, + api.Context? context, + dynamic body, + DateTime? observedTimestamp, + Severity? severityNumber, + String? severityText, + DateTime? timeStamp, + }); +} diff --git a/lib/src/api/logs/logger_provider.dart b/lib/src/api/logs/logger_provider.dart new file mode 100644 index 00000000..ae7be6ba --- /dev/null +++ b/lib/src/api/logs/logger_provider.dart @@ -0,0 +1,24 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +import 'package:opentelemetry/api.dart'; +import 'package:opentelemetry/src/api/logs/logger.dart'; + +abstract class LoggerProvider { + /// Gets or creates a [Logger] instance. + /// + /// The meter is identified by the combination of [name], [version], + /// [schemaUrl] and [attributes]. The [name] SHOULD uniquely identify the + /// instrumentation scope, such as the instrumentation library + /// (e.g. io.opentelemetry.contrib.mongodb), package, module or class name. + /// The [version] specifies the version of the instrumentation scope if the + /// scope has a version (e.g. a library version). The [schemaUrl] identifies + /// the schema this provider adheres to. The [attributes] specifies + /// attributes to associate with emitted telemetry. + Logger get( + String name, { + String version = '', + String schemaUrl = '', + List attributes = const [], + }); +} diff --git a/lib/src/api/logs/noop/noop_logger.dart b/lib/src/api/logs/noop/noop_logger.dart new file mode 100644 index 00000000..4c057448 --- /dev/null +++ b/lib/src/api/logs/noop/noop_logger.dart @@ -0,0 +1,22 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +import 'package:opentelemetry/src/api/context/context.dart'; +import 'package:opentelemetry/src/api/logs/log_record.dart'; +import 'package:opentelemetry/src/api/logs/logger.dart'; +import 'package:opentelemetry/src/sdk/common/attributes.dart'; + +class NoopLogger implements Logger { + const NoopLogger(); + + @override + void emit({ + Attributes? attributes, + Context? context, + dynamic body, + DateTime? observedTimestamp, + Severity? severityNumber, + String? severityText, + DateTime? timeStamp, + }) {} +} diff --git a/lib/src/api/logs/noop/noop_logger_provider.dart b/lib/src/api/logs/noop/noop_logger_provider.dart new file mode 100644 index 00000000..f24f802e --- /dev/null +++ b/lib/src/api/logs/noop/noop_logger_provider.dart @@ -0,0 +1,18 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +import 'package:opentelemetry/src/api/common/attribute.dart'; +import 'package:opentelemetry/src/api/logs/logger.dart'; +import 'package:opentelemetry/src/api/logs/logger_provider.dart'; +import 'package:opentelemetry/src/api/logs/noop/noop_logger.dart'; + +class NoopLoggerProvider implements LoggerProvider { + @override + Logger get( + String name, { + String version = '', + String schemaUrl = '', + List attributes = const [], + }) => + const NoopLogger(); +} diff --git a/lib/src/api/open_telemetry.dart b/lib/src/api/open_telemetry.dart index 488db6e5..9ffbca00 100644 --- a/lib/src/api/open_telemetry.dart +++ b/lib/src/api/open_telemetry.dart @@ -6,16 +6,21 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../../api.dart' as api; +import '../experimental_api.dart'; import 'propagation/noop_text_map_propagator.dart'; import 'trace/noop_tracer_provider.dart'; final api.TracerProvider _noopTracerProvider = NoopTracerProvider(); final api.TextMapPropagator _noopTextMapPropagator = NoopTextMapPropagator(); +final LoggerProvider _noopLoggerProvider = NoopLoggerProvider(); +LoggerProvider _logProvider = _noopLoggerProvider; api.TracerProvider _tracerProvider = _noopTracerProvider; api.TextMapPropagator _textMapPropagator = _noopTextMapPropagator; api.TracerProvider get globalTracerProvider => _tracerProvider; +LoggerProvider get globalLogProvider => _logProvider; + api.TextMapPropagator get globalTextMapPropagator => _textMapPropagator; void registerGlobalTracerProvider(api.TracerProvider tracerProvider) { @@ -28,6 +33,16 @@ void registerGlobalTracerProvider(api.TracerProvider tracerProvider) { _tracerProvider = tracerProvider; } +void registerGlobalLogProvider(LoggerProvider logProvider) { + if (_logProvider != _noopLoggerProvider) { + throw StateError('A global LoggerProvider has already been created. ' + 'registerGlobalLoggerProvider must be called only once before any ' + 'calls to the getter globalLoggerProvider.'); + } + + _logProvider = logProvider; +} + void registerGlobalTextMapPropagator(api.TextMapPropagator textMapPropagator) { if (_textMapPropagator != _noopTextMapPropagator) { throw StateError('A global TextMapPropagator has already been created. ' diff --git a/lib/src/experimental_api.dart b/lib/src/experimental_api.dart index b21932cf..f2933e07 100644 --- a/lib/src/experimental_api.dart +++ b/lib/src/experimental_api.dart @@ -15,3 +15,8 @@ export 'api/metrics/meter_provider.dart' show MeterProvider; export 'api/metrics/meter.dart' show Meter; export 'api/metrics/noop/noop_meter.dart' show NoopMeter; export 'api/trace/nonrecording_span.dart' show NonRecordingSpan; +export 'api/logs/logger.dart' show Logger; +export 'api/logs/log_record.dart' show Severity; +export 'api/logs/logger_provider.dart' show LoggerProvider; +export 'api/logs/noop/noop_logger.dart' show NoopLogger; +export 'api/logs/noop/noop_logger_provider.dart' show NoopLoggerProvider; diff --git a/test/unit/api/logs/noop/noop_logger_provider_test.dart b/test/unit/api/logs/noop/noop_logger_provider_test.dart new file mode 100644 index 00000000..942fc666 --- /dev/null +++ b/test/unit/api/logs/noop/noop_logger_provider_test.dart @@ -0,0 +1,13 @@ +// Copyright 2021-2022 Workiva. +// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information + +@TestOn('vm') +import 'package:opentelemetry/src/experimental_api.dart' as api; +import 'package:test/test.dart'; + +void main() { + test('returns noop logger', () { + final noopLoggerProvider = api.NoopLoggerProvider(); + expect(noopLoggerProvider.get('test'), const api.NoopLogger()); + }); +}