Skip to content

Commit

Permalink
wip: make log processors immutable
Browse files Browse the repository at this point in the history
  • Loading branch information
yuzurihaaa committed Jan 31, 2025
1 parent 562833a commit 4622316
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 23 deletions.
15 changes: 8 additions & 7 deletions lib/src/sdk/logs/logger_provider.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// 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:collection/collection.dart';
import 'package:meta/meta.dart';
import 'package:opentelemetry/api.dart' as api;
import 'package:opentelemetry/sdk.dart' as sdk;
Expand All @@ -19,7 +20,7 @@ class LoggerProvider implements api.LoggerProvider {

final LoggerConfig config;

final List<sdk.LogRecordProcessor> processors;
final List<sdk.LogRecordProcessor> _processors;

final sdk.Resource? resource;
final sdk.LogRecordLimits logRecordLimits;
Expand All @@ -32,9 +33,12 @@ class LoggerProvider implements api.LoggerProvider {
this.logRecordLimits = const LogRecordLimitsImpl(),
List<sdk.LogRecordProcessor>? processors,
sdk.TimeProvider? timeProvider,
}) : processors = processors ?? <sdk.LogRecordProcessor>[],
}) : _processors = processors ?? <sdk.LogRecordProcessor>[],
_timeProvider = timeProvider ?? sdk.DateTimeTimeProvider();

UnmodifiableListView<sdk.LogRecordProcessor> get processors =>
UnmodifiableListView(_processors);

@override
api.Logger get(
String name, {
Expand All @@ -52,7 +56,8 @@ class LoggerProvider implements api.LoggerProvider {
() => sdk.Logger(
logRecordLimits: logRecordLimits,
resource: resource,
instrumentationScope: sdk.InstrumentationScope(loggerName, version, schemaUrl, attributes),
instrumentationScope: sdk.InstrumentationScope(
loggerName, version, schemaUrl, attributes),
timeProvider: _timeProvider,
onLogEmit: (log) {
for (final processor in processors) {
Expand All @@ -63,10 +68,6 @@ class LoggerProvider implements api.LoggerProvider {
);
}

void addLogRecordProcessor(sdk.LogRecordProcessor processor) {
processors.add(processor);
}

Future<void> forceFlush() async {
await Future.forEach(processors, (e) => e.forceFlush());
}
Expand Down
45 changes: 29 additions & 16 deletions test/unit/sdk/logs/logger_provider_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import '../../mocks.dart';
void main() {
setUpAll(() {
registerFallbackValue(sdk.LogRecord(
instrumentationScope: sdk.InstrumentationScope('library_name', 'library_version', 'url://schema', []),
instrumentationScope: sdk.InstrumentationScope(
'library_name', 'library_version', 'url://schema', []),
logRecordLimits: LogRecordLimitsImpl(),
));
});
Expand All @@ -25,38 +26,47 @@ void main() {
final barTracer = provider.get('bar');
final fooWithVersionTracer = provider.get('foo', version: '1.0');

expect(fooTracer, allOf([isNot(barTracer), isNot(fooWithVersionTracer), same(provider.get('foo'))]));
expect(
fooTracer,
allOf([
isNot(barTracer),
isNot(fooWithVersionTracer),
same(provider.get('foo'))
]));

expect(provider.processors, isA<List<sdk.LogRecordProcessor>>());
});

test('tracerProvider custom span processors', () {
final mockProcessor1 = MockLogRecordProcessor();
final mockProcessor2 = MockLogRecordProcessor();
final provider = sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2]);
final provider =
sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2]);

expect(provider.processors, [mockProcessor1, mockProcessor2]);
});

test('traceProvider custom timeProvider', () {
final mockTimeProvider = FakeTimeProvider(now: Int64(123));
final mockProcessor1 = MockLogRecordProcessor();
final provider = sdk.LoggerProvider(timeProvider: mockTimeProvider, processors: [mockProcessor1]);
final provider = sdk.LoggerProvider(
timeProvider: mockTimeProvider, processors: [mockProcessor1]);
provider.get('foo').emit();
verify(() => mockProcessor1.onEmit(any(
that: predicate((a) {
if (a is! sdk.ReadWriteLogRecord) return false;
return a.timeStamp == 123 && a.observedTimestamp == 123;
}),
))).called(1);
that: predicate((a) {
if (a is! sdk.ReadWriteLogRecord) return false;
return a.timeStamp == 123 && a.observedTimestamp == 123;
}),
))).called(1);
});

test('loggerProvider force flushes all processors', () async {
final mockProcessor1 = MockLogRecordProcessor();
final mockProcessor2 = MockLogRecordProcessor();
when(mockProcessor1.forceFlush).thenAnswer((_) async => Future.value());
when(mockProcessor2.forceFlush).thenAnswer((_) async => Future.value());
await sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2]).forceFlush();
await sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2])
.forceFlush();

verify(mockProcessor1.forceFlush).called(1);
verify(mockProcessor2.forceFlush).called(1);
Expand All @@ -67,17 +77,20 @@ void main() {
final mockProcessor2 = MockLogRecordProcessor();
when(mockProcessor1.shutdown).thenAnswer((_) async => Future.value());
when(mockProcessor2.shutdown).thenAnswer((_) async => Future.value());
await sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2]).shutdown();
await sdk.LoggerProvider(processors: [mockProcessor1, mockProcessor2])
.shutdown();

verify(mockProcessor1.shutdown).called(1);
verify(mockProcessor2.shutdown).called(1);
});

test('logger provider test add processor', () {
final provider = sdk.LoggerProvider()
..addLogRecordProcessor(const sdk.NoopLogRecordProcessor())
..addLogRecordProcessor(const sdk.NoopLogRecordProcessor());
test('loggerProvider processors is immutable', () async {
final mockProcessor1 = MockLogRecordProcessor();
final mockProcessor2 = MockLogRecordProcessor();
when(mockProcessor1.shutdown).thenAnswer((_) async => Future.value());
when(mockProcessor2.shutdown).thenAnswer((_) async => Future.value());
final provider = sdk.LoggerProvider(processors: [mockProcessor1]);

expect(provider.processors.length, 2);
expect(() => provider.processors.add(mockProcessor2), throwsUnsupportedError);
});
}

0 comments on commit 4622316

Please sign in to comment.