Skip to content

Commit b200a36

Browse files
committed
feat: logs api
1 parent 2de7840 commit b200a36

11 files changed

+242
-0
lines changed

lib/api.dart

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
33

44
export 'src/api/common/attribute.dart' show Attribute;
5+
export 'src/api/common/export_result.dart' show ExportResultCode, ExportResult;
56
export 'src/api/common/resource_attributes.dart' show ResourceAttributes;
67
export 'src/api/common/semantic_attributes.dart' show SemanticAttributes;
78
export 'src/api/context/context.dart'

lib/src/api/common/export_result.dart

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
class ExportResult {
5+
final ExportResultCode code;
6+
final Exception? error;
7+
final StackTrace? stackTrace;
8+
9+
ExportResult({required this.code, this.error, this.stackTrace});
10+
}
11+
12+
enum ExportResultCode {
13+
success,
14+
failed,
15+
}

lib/src/api/logs/log_record.dart

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
import 'package:opentelemetry/api.dart' as api;
5+
import 'package:opentelemetry/sdk.dart' as sdk;
6+
7+
enum Severity {
8+
unspecified,
9+
trace,
10+
trace2,
11+
trace3,
12+
trace4,
13+
debug,
14+
debug2,
15+
debug3,
16+
debug4,
17+
info,
18+
info2,
19+
info3,
20+
info4,
21+
warn,
22+
warn2,
23+
warn3,
24+
warn4,
25+
error,
26+
error2,
27+
error3,
28+
error4,
29+
fatal,
30+
fatal2,
31+
fatal3,
32+
fatal4,
33+
}
34+
35+
abstract class LogRecord {
36+
factory LogRecord({
37+
sdk.Attributes? attributes,
38+
api.Context? context,
39+
dynamic body,
40+
DateTime? observedTimestamp,
41+
Severity? severityNumber,
42+
String? severityText,
43+
DateTime? timeStamp,
44+
}) =>
45+
_LogRecord(
46+
attributes: attributes,
47+
severityText: severityText,
48+
context: context,
49+
body: body,
50+
observedTimestamp: observedTimestamp,
51+
severityNumber: severityNumber,
52+
timeStamp: timeStamp,
53+
);
54+
55+
DateTime? get timeStamp;
56+
57+
DateTime? get observedTimestamp;
58+
59+
Severity? get severityNumber;
60+
61+
String? get severityText;
62+
63+
dynamic get body;
64+
65+
sdk.Attributes get attributes;
66+
67+
api.Context get context;
68+
}
69+
70+
class _LogRecord implements LogRecord {
71+
@override
72+
final sdk.Attributes attributes;
73+
74+
@override
75+
final api.Context context;
76+
77+
@override
78+
final dynamic body;
79+
80+
@override
81+
final DateTime? observedTimestamp;
82+
83+
@override
84+
final Severity? severityNumber;
85+
86+
@override
87+
final String? severityText;
88+
89+
@override
90+
final DateTime? timeStamp;
91+
92+
_LogRecord({
93+
this.severityText,
94+
this.body,
95+
this.observedTimestamp,
96+
this.severityNumber,
97+
this.timeStamp,
98+
sdk.Attributes? attributes,
99+
api.Context? context,
100+
}) : attributes = attributes ?? sdk.Attributes.empty(),
101+
context = context ?? api.Context.current;
102+
}

lib/src/api/logs/logger.dart

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
import 'log_record.dart';
5+
6+
abstract class Logger {
7+
void emit(LogRecord logRecord);
8+
}

lib/src/api/logs/logger_provider.dart

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
import 'package:opentelemetry/api.dart';
5+
import 'package:opentelemetry/src/api/logs/logger.dart';
6+
7+
abstract class LoggerProvider {
8+
/// Gets or creates a [Logger] instance.
9+
///
10+
/// The meter is identified by the combination of [name], [version],
11+
/// [schemaUrl] and [attributes]. The [name] SHOULD uniquely identify the
12+
/// instrumentation scope, such as the instrumentation library
13+
/// (e.g. io.opentelemetry.contrib.mongodb), package, module or class name.
14+
/// The [version] specifies the version of the instrumentation scope if the
15+
/// scope has a version (e.g. a library version). The [schemaUrl] identifies
16+
/// the schema this provider adheres to. The [attributes] specifies
17+
/// attributes to associate with emitted telemetry.
18+
Logger get(
19+
String name, {
20+
String version = '',
21+
String schemaUrl = '',
22+
List<Attribute> attributes = const [],
23+
bool? includeTraceContext,
24+
});
25+
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
import 'package:opentelemetry/src/api/logs/logger.dart';
5+
import 'package:opentelemetry/src/api/logs/log_record.dart';
6+
7+
class NoopLogger implements Logger {
8+
const NoopLogger();
9+
@override
10+
void emit(LogRecord logRecord) {}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
import 'package:opentelemetry/src/api/common/attribute.dart';
5+
import 'package:opentelemetry/src/api/logs/logger.dart';
6+
import 'package:opentelemetry/src/api/logs/logger_provider.dart';
7+
import 'package:opentelemetry/src/api/logs/noop/noop_logger.dart';
8+
9+
class NoopLoggerProvider implements LoggerProvider {
10+
@override
11+
Logger get(
12+
String name, {
13+
String version = '',
14+
String schemaUrl = '',
15+
List<Attribute> attributes = const [],
16+
bool? includeTraceContext,
17+
}) =>
18+
const NoopLogger();
19+
}

lib/src/api/open_telemetry.dart

+14
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import 'dart:async';
55

66
import 'package:meta/meta.dart';
7+
import 'package:opentelemetry/src/api/logs/noop/noop_logger_provider.dart';
8+
import 'package:opentelemetry/src/experimental_api.dart';
79

810
import '../../api.dart' as api;
911
import 'propagation/noop_text_map_propagator.dart';
1012
import 'trace/noop_tracer_provider.dart';
1113

1214
final api.TracerProvider _noopTracerProvider = NoopTracerProvider();
1315
final api.TextMapPropagator _noopTextMapPropagator = NoopTextMapPropagator();
16+
final LoggerProvider _noopLoggerProvider = NoopLoggerProvider();
17+
LoggerProvider _logProvider = _noopLoggerProvider;
1418
api.TracerProvider _tracerProvider = _noopTracerProvider;
1519
api.TextMapPropagator _textMapPropagator = _noopTextMapPropagator;
1620

@@ -28,6 +32,16 @@ void registerGlobalTracerProvider(api.TracerProvider tracerProvider) {
2832
_tracerProvider = tracerProvider;
2933
}
3034

35+
void registerGlobalLogProvider(LoggerProvider logProvider) {
36+
if (_logProvider != _noopLoggerProvider) {
37+
throw StateError('A global LoggerProvider has already been created. '
38+
'registerGlobalLoggerProvider must be called only once before any '
39+
'calls to the getter globalLoggerProvider.');
40+
}
41+
42+
_logProvider = logProvider;
43+
}
44+
3145
void registerGlobalTextMapPropagator(api.TextMapPropagator textMapPropagator) {
3246
if (_textMapPropagator != _noopTextMapPropagator) {
3347
throw StateError('A global TextMapPropagator has already been created. '

lib/src/experimental_api.dart

+6
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,9 @@ export 'api/metrics/meter_provider.dart' show MeterProvider;
1515
export 'api/metrics/meter.dart' show Meter;
1616
export 'api/metrics/noop/noop_meter.dart' show NoopMeter;
1717
export 'api/trace/nonrecording_span.dart' show NonRecordingSpan;
18+
export 'api/logs/logger.dart' show Logger;
19+
export 'api/logs/log_record.dart' show Severity, LogRecord;
20+
export 'api/logs/logger_provider.dart' show LoggerProvider;
21+
export 'api/logs/log_record.dart' show LogRecord;
22+
export 'api/logs/noop/noop_logger.dart' show NoopLogger;
23+
export 'api/logs/noop/noop_logger_provider.dart' show NoopLoggerProvider;
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
@TestOn('vm')
5+
import 'package:opentelemetry/api.dart' as api;
6+
import 'package:opentelemetry/sdk.dart' as sdk;
7+
import 'package:opentelemetry/src/experimental_api.dart' as api;
8+
import 'package:test/test.dart';
9+
10+
void main() {
11+
test('Verify context create root by default', () {
12+
final logRecord = api.LogRecord();
13+
expect(logRecord.context, api.Context.root);
14+
});
15+
16+
test('Verify context from span', () {
17+
final tracer = sdk.TracerProviderBase().getTracer('test');
18+
final parent = tracer.startSpan('parent');
19+
final context = api.contextWithSpan(api.Context.current, parent);
20+
final logRecord = api.LogRecord(context: context);
21+
expect(logRecord.context, context);
22+
});
23+
24+
test('Verify attribute null create attribute empty', () {
25+
final logRecord = api.LogRecord();
26+
expect(logRecord.attributes.keys, sdk.Attributes.empty().keys);
27+
});
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright 2021-2022 Workiva.
2+
// Licensed under the Apache License, Version 2.0. Please see https://github.com/Workiva/opentelemetry-dart/blob/master/LICENSE for more information
3+
4+
@TestOn('vm')
5+
import 'package:opentelemetry/src/experimental_api.dart' as api;
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
test('returns noop logger', () {
10+
final noopLoggerProvider = api.NoopLoggerProvider();
11+
expect(noopLoggerProvider.get('test'), const api.NoopLogger());
12+
});
13+
}

0 commit comments

Comments
 (0)