Skip to content
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: logs api #203

Merged
merged 9 commits into from
Jan 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions lib/src/api/logs/log_record.dart
Original file line number Diff line number Diff line change
@@ -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,
}
18 changes: 18 additions & 0 deletions lib/src/api/logs/logger.dart
Original file line number Diff line number Diff line change
@@ -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,
});
}
24 changes: 24 additions & 0 deletions lib/src/api/logs/logger_provider.dart
Original file line number Diff line number Diff line change
@@ -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<Attribute> attributes = const [],
});
}
22 changes: 22 additions & 0 deletions lib/src/api/logs/noop/noop_logger.dart
Original file line number Diff line number Diff line change
@@ -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,
}) {}
}
18 changes: 18 additions & 0 deletions lib/src/api/logs/noop/noop_logger_provider.dart
Original file line number Diff line number Diff line change
@@ -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<Attribute> attributes = const [],
}) =>
const NoopLogger();
}
15 changes: 15 additions & 0 deletions lib/src/api/open_telemetry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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. '
Expand Down
5 changes: 5 additions & 0 deletions lib/src/experimental_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
13 changes: 13 additions & 0 deletions test/unit/api/logs/noop/noop_logger_provider_test.dart
Original file line number Diff line number Diff line change
@@ -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());
});
}
Loading