-
Notifications
You must be signed in to change notification settings - Fork 45
feat: opentelemetry sdk LoggerProvider #207
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
base: master
Are you sure you want to change the base?
Changes from 39 commits
dbda356
630f2cf
7119f8e
6fb8422
69e4e18
79640fb
8ff6c71
d3d98e6
f4b05aa
ff5d1e3
1e050b4
5eed62e
99e374f
38b2137
88eb916
014f087
96938b8
2a9a80a
f0206c6
01636f9
aae1c3e
464a636
2ea0fcf
078bd4a
90ecfdc
4ab30a2
b3f744e
9978329
849e0b0
bebc35e
032fd65
442b466
3fc382e
f0e65ab
b97de95
d9c0429
37fae26
b9598de
741ed89
b397a0a
f4c216b
756b063
d1d1f77
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| // 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:meta/meta.dart'; | ||
| 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:opentelemetry/src/experimental_sdk.dart' as sdk; | ||
| import 'package:opentelemetry/src/sdk/common/limits.dart'; | ||
|
|
||
| /// https://opentelemetry.io/docs/specs/otel/logs/sdk/#readwritelogrecord | ||
| abstract class ReadableLogRecord { | ||
| DateTime get timeStamp; | ||
|
|
||
| DateTime get observedTimestamp; | ||
|
|
||
| String get severityText; | ||
|
|
||
| api.Severity get severityNumber; | ||
|
|
||
| dynamic get body; | ||
|
|
||
| sdk.Attributes get attributes; | ||
|
|
||
| api.SpanContext get spanContext; | ||
|
|
||
| sdk.Resource get resource; | ||
|
|
||
| sdk.InstrumentationScope get instrumentationScope; | ||
|
|
||
| int get droppedAttributesCount; | ||
| } | ||
|
|
||
| abstract class ReadWriteLogRecord extends ReadableLogRecord { | ||
| set body(dynamic severity); | ||
|
|
||
| set severityText(String severity); | ||
|
|
||
| set severityNumber(api.Severity severity); | ||
| } | ||
|
|
||
| class LogRecord implements ReadWriteLogRecord { | ||
| @override | ||
| final sdk.InstrumentationScope instrumentationScope; | ||
|
|
||
| final sdk.Resource _resource; | ||
|
|
||
| final sdk.TimeProvider _timeProvider; | ||
| final api.Context _context; | ||
| final sdk.LogRecordLimits logRecordLimits; | ||
| final DateTime? _timeStamp; | ||
| final DateTime? _observedTimestamp; | ||
|
|
||
| bool _isReadonly = false; | ||
blakeroberts-wk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| String _severityText; | ||
| api.Severity _severityNumber; | ||
| dynamic _body; | ||
| int _totalAttributesCount = 0; | ||
|
|
||
| final sdk.Attributes _attributes; | ||
|
|
||
| @protected | ||
| LogRecord({ | ||
blakeroberts-wk marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| required this.instrumentationScope, | ||
| required this.logRecordLimits, | ||
| api.Severity? severityNumber, | ||
| String? severityText, | ||
| List<api.Attribute> attributes = const <api.Attribute>[], | ||
| DateTime? timeStamp, | ||
| DateTime? observedTimestamp, | ||
| api.Context? context, | ||
| dynamic body, | ||
| sdk.Resource? resource, | ||
| sdk.TimeProvider? timeProvider, | ||
| }) : _severityText = severityText ?? api.Severity.unspecified.name, | ||
| _resource = resource ?? sdk.Resource([]), | ||
| _context = context ?? api.Context.current, | ||
| _body = body, | ||
| _attributes = sdk.Attributes.empty(), | ||
| _severityNumber = severityNumber ?? api.Severity.unspecified, | ||
| _timeStamp = timeStamp, | ||
| _observedTimestamp = observedTimestamp, | ||
| _timeProvider = timeProvider ?? sdk.DateTimeTimeProvider() { | ||
| if (attributes.isNotEmpty) setAttributes(attributes); | ||
| } | ||
|
|
||
|
|
||
| @override | ||
| sdk.Resource get resource => _resource; | ||
|
|
||
| @override | ||
| sdk.Attributes get attributes => _attributes; | ||
|
|
||
| @override | ||
| dynamic get body => _body; | ||
|
|
||
| @override | ||
| set body(dynamic body) { | ||
| if (_isReadonly) return; | ||
| _body = body; | ||
| } | ||
|
|
||
| @override | ||
| api.SpanContext get spanContext => api.spanContextFromContext(_context); | ||
|
|
||
| @override | ||
| int get droppedAttributesCount => _totalAttributesCount - attributes.length; | ||
|
|
||
| @override | ||
| DateTime get timeStamp => _timeStamp ?? DateTime.fromMicrosecondsSinceEpoch((_timeProvider.now ~/ 1000).toInt()); | ||
|
|
||
| @override | ||
| DateTime get observedTimestamp => | ||
| _observedTimestamp ?? DateTime.fromMicrosecondsSinceEpoch((_timeProvider.now ~/ 1000).toInt()); | ||
|
|
||
| @override | ||
| api.Severity get severityNumber => _severityNumber; | ||
|
|
||
| @override | ||
| set severityNumber(api.Severity severity) { | ||
| if (_isReadonly) return; | ||
| _severityNumber = severity; | ||
| } | ||
|
|
||
| @override | ||
| String get severityText => _severityText; | ||
|
|
||
| @override | ||
| set severityText(String severity) { | ||
| if (_isReadonly) return; | ||
| _severityText = severity; | ||
| } | ||
|
|
||
| void setAttributes(List<api.Attribute> attributes) { | ||
| attributes.forEach(setAttribute); | ||
| } | ||
|
|
||
| void setAttribute(api.Attribute attribute) { | ||
| if (_isReadonly) return; | ||
| if (attribute.key.isEmpty) return; | ||
| if (logRecordLimits.attributeCountLimit == 0) return; | ||
| _totalAttributesCount += 1; | ||
| _attributes.add(applyAttributeLimitsForLog(attribute, logRecordLimits)); | ||
| } | ||
|
|
||
| /// A LogRecordProcessor may freely modify logRecord for the duration of the OnEmit call. | ||
| /// If logRecord is needed after OnEmit returns (i.e. for asynchronous processing) only reads are permitted. | ||
| @internal | ||
| void makeReadonly() { | ||
| _isReadonly = true; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| // 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 LogRecordLimits { | ||
| final int _attributeCountLimit; | ||
| final int _attributeValueLengthLimit; | ||
blakeroberts-wk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| const LogRecordLimits({ | ||
| int attributeCountLimit = 128, | ||
| int attributeValueLengthLimit = -1, | ||
| }) : _attributeCountLimit = attributeCountLimit, | ||
| _attributeValueLengthLimit = attributeValueLengthLimit; | ||
|
|
||
| int get attributeCountLimit => _attributeCountLimit; | ||
|
|
||
| int get attributeValueLengthLimit => _attributeValueLengthLimit; | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| // 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:meta/meta.dart'; | ||
| import 'package:opentelemetry/api.dart' as api; | ||
| import 'package:opentelemetry/sdk.dart' as sdk; | ||
| import 'package:opentelemetry/src/api/context/context.dart'; | ||
| import 'package:opentelemetry/src/experimental_api.dart' as api; | ||
| import 'package:opentelemetry/src/experimental_sdk.dart' as sdk; | ||
|
|
||
| class Logger extends api.Logger { | ||
| final sdk.InstrumentationScope instrumentationScope; | ||
| final sdk.Resource _resource; | ||
| final sdk.LogRecordLimits logRecordLimits; | ||
| final sdk.TimeProvider timeProvider; | ||
| final List<sdk.LogRecordProcessor> processors; | ||
blakeroberts-wk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| @protected | ||
| Logger({ | ||
blakeroberts-wk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| required this.instrumentationScope, | ||
| required this.logRecordLimits, | ||
| required this.timeProvider, | ||
| this.processors = const <sdk.LogRecordProcessor>[], | ||
| sdk.Resource? resource, | ||
| }) : _resource = resource ?? sdk.Resource([]); | ||
|
|
||
| @override | ||
| void emit({ | ||
| List<api.Attribute> attributes = const [], | ||
| Context? context, | ||
| dynamic body, | ||
| DateTime? observedTimestamp, | ||
| api.Severity? severityNumber, | ||
| String? severityText, | ||
| DateTime? timeStamp, | ||
| }) { | ||
| final log = sdk.LogRecord( | ||
| logRecordLimits: logRecordLimits, | ||
| resource: _resource, | ||
| instrumentationScope: instrumentationScope, | ||
| context: context, | ||
| severityText: severityText, | ||
| severityNumber: severityNumber, | ||
| attributes: attributes, | ||
| body: body, | ||
| timeProvider: timeProvider, | ||
| ); | ||
| for (final processor in processors) { | ||
| processor.onEmit(log); | ||
| } | ||
| log.makeReadonly(); | ||
|
||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.