Skip to content

Commit

Permalink
feat: logs api
Browse files Browse the repository at this point in the history
  • Loading branch information
yuzurihaaa committed Jan 11, 2025
1 parent 92a84a6 commit aa95d5a
Show file tree
Hide file tree
Showing 11 changed files with 242 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information

export 'src/api/common/attribute.dart' show Attribute;
export 'src/api/common/export_result.dart' show ExportResultCode, ExportResult;
export 'src/api/common/resource_attributes.dart' show ResourceAttributes;
export 'src/api/common/semantic_attributes.dart' show SemanticAttributes;
export 'src/api/context/context.dart'
Expand Down
15 changes: 15 additions & 0 deletions lib/src/api/common/export_result.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// 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

class ExportResult {
final ExportResultCode code;
final Exception? error;
final StackTrace? stackTrace;

ExportResult({required this.code, this.error, this.stackTrace});
}

enum ExportResultCode {
success,
failed,
}
102 changes: 102 additions & 0 deletions lib/src/api/logs/log_record.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// 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' as api;
import 'package:opentelemetry/sdk.dart' as sdk;

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,
}

abstract class LogRecord {
factory LogRecord({
sdk.Attributes? attributes,
api.Context? context,
dynamic body,
DateTime? observedTimestamp,
Severity? severityNumber,
String? severityText,
DateTime? timeStamp,
}) =>
_LogRecord(
attributes: attributes,
severityText: severityText,
context: context,
body: body,
observedTimestamp: observedTimestamp,
severityNumber: severityNumber,
timeStamp: timeStamp,
);

DateTime? get timeStamp;

DateTime? get observedTimestamp;

Severity? get severityNumber;

String? get severityText;

dynamic get body;

sdk.Attributes get attributes;

api.Context get context;
}

class _LogRecord implements LogRecord {
@override
final sdk.Attributes attributes;

@override
final api.Context context;

@override
final dynamic body;

@override
final DateTime? observedTimestamp;

@override
final Severity? severityNumber;

@override
final String? severityText;

@override
final DateTime? timeStamp;

_LogRecord({
this.severityText,
this.body,
this.observedTimestamp,
this.severityNumber,
this.timeStamp,
sdk.Attributes? attributes,
api.Context? context,
}) : attributes = attributes ?? sdk.Attributes.empty(),
context = context ?? api.Context.current;
}
8 changes: 8 additions & 0 deletions lib/src/api/logs/logger.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// 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 'log_record.dart';

abstract class Logger {
void emit(LogRecord logRecord);
}
25 changes: 25 additions & 0 deletions lib/src/api/logs/logger_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// 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 [],
bool? includeTraceContext,
});
}
11 changes: 11 additions & 0 deletions lib/src/api/logs/noop/noop_logger.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// 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/logs/logger.dart';
import 'package:opentelemetry/src/api/logs/log_record.dart';

class NoopLogger implements Logger {
const NoopLogger();
@override
void emit(LogRecord logRecord) {}
}
19 changes: 19 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,19 @@
// 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 [],
bool? includeTraceContext,
}) =>
const NoopLogger();
}
14 changes: 14 additions & 0 deletions lib/src/api/open_telemetry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
import 'dart:async';

import 'package:meta/meta.dart';
import 'package:opentelemetry/src/api/logs/noop/noop_logger_provider.dart';
import 'package:opentelemetry/src/experimental_api.dart';

import '../../api.dart' as api;
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;

Expand All @@ -28,6 +32,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
6 changes: 6 additions & 0 deletions lib/src/experimental_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,9 @@ 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, LogRecord;
export 'api/logs/logger_provider.dart' show LoggerProvider;
export 'api/logs/log_record.dart' show LogRecord;
export 'api/logs/noop/noop_logger.dart' show NoopLogger;
export 'api/logs/noop/noop_logger_provider.dart' show NoopLoggerProvider;
28 changes: 28 additions & 0 deletions test/unit/api/logs/log_record_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// 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/api.dart' as api;
import 'package:opentelemetry/sdk.dart' as sdk;
import 'package:opentelemetry/src/experimental_api.dart' as api;
import 'package:test/test.dart';

void main() {
test('Verify context create root by default', () {
final logRecord = api.LogRecord();
expect(logRecord.context, api.Context.root);
});

test('Verify context from span', () {
final tracer = sdk.TracerProviderBase().getTracer('test');
final parent = tracer.startSpan('parent');
final context = api.contextWithSpan(api.Context.current, parent);
final logRecord = api.LogRecord(context: context);
expect(logRecord.context, context);
});

test('Verify attribute null create attribute empty', () {
final logRecord = api.LogRecord();
expect(logRecord.attributes.keys, sdk.Attributes.empty().keys);
});
}
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());
});
}

0 comments on commit aa95d5a

Please sign in to comment.