Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
dbda356
feat: LogRecord limits
yuzurihaaa Jan 16, 2025
630f2cf
feat: LogRecord
yuzurihaaa Jan 16, 2025
7119f8e
chore: fix comment
yuzurihaaa Jan 16, 2025
6fb8422
chore: log record limit test
yuzurihaaa Jan 16, 2025
69e4e18
feat: LogRecordProcessor
yuzurihaaa Jan 16, 2025
79640fb
feat: NoopLogRecordProcessor
yuzurihaaa Jan 16, 2025
8ff6c71
feat: LoggerConfig
yuzurihaaa Jan 16, 2025
d3d98e6
feat: Logger
yuzurihaaa Jan 16, 2025
f4b05aa
feat: LoggerProvider
yuzurihaaa Jan 16, 2025
ff5d1e3
feat: exports
yuzurihaaa Jan 16, 2025
1e050b4
wip: change processors initialization from `const`
yuzurihaaa Jan 16, 2025
5eed62e
wip: fix test
yuzurihaaa Jan 16, 2025
99e374f
wip: fix import arrange
yuzurihaaa Jan 20, 2025
38b2137
wip: attach copyright
yuzurihaaa Jan 20, 2025
88eb916
wip: change from `api.SpanContext?` and `api.Context?` to non-null pr…
yuzurihaaa Jan 31, 2025
014f087
wip: remove unused `includeTraceContext`
yuzurihaaa Jan 31, 2025
96938b8
wip: opentelemetry as defaultLoggerName
yuzurihaaa Jan 31, 2025
2a9a80a
wip: make log processors immutable
yuzurihaaa Jan 31, 2025
f0206c6
wip: make all variables private
yuzurihaaa Jan 31, 2025
01636f9
wip: update limit to only create if value changes.
yuzurihaaa Jan 31, 2025
aae1c3e
wip: change from sdk.Attributes to List<api.Attribute>
yuzurihaaa Jan 31, 2025
464a636
wip: change to `DateTime`
yuzurihaaa Feb 10, 2025
2ea0fcf
wip: remove DateTime initialization
yuzurihaaa Feb 10, 2025
078bd4a
wip: fix test
yuzurihaaa Feb 10, 2025
90ecfdc
wip: remove `processors`
yuzurihaaa Feb 12, 2025
4ab30a2
wip: remove `async` `await`
yuzurihaaa Feb 12, 2025
b3f744e
wip: changed to `FutureOr`
yuzurihaaa Feb 12, 2025
9978329
wip: change forceFlush and shutdown to `void`
yuzurihaaa Feb 13, 2025
849e0b0
wip: fix test
yuzurihaaa Feb 13, 2025
bebc35e
wip: change LogRecordLimits from abstract class to class
yuzurihaaa Mar 3, 2025
032fd65
wip: avoid nullable values
yuzurihaaa Mar 3, 2025
442b466
wip: mark protected
yuzurihaaa Mar 3, 2025
3fc382e
wip: remove nullable and pass processors instead of callback.
yuzurihaaa Mar 3, 2025
f0e65ab
fix: failing unit test
yuzurihaaa Mar 3, 2025
b97de95
wip: remove NoopLogRecordProcessor
yuzurihaaa Mar 4, 2025
d9c0429
wip: inline
yuzurihaaa Mar 4, 2025
37fae26
wip: limit list
yuzurihaaa Mar 4, 2025
b9598de
wip: onEmit ReadableLogRecord -> ReadWriteLogRecord
yuzurihaaa Mar 5, 2025
741ed89
wip: update DateTimeProvider
yuzurihaaa Mar 18, 2025
b397a0a
wip: remove getters
yuzurihaaa May 6, 2025
f4c216b
wip: make fields private
yuzurihaaa May 6, 2025
756b063
wip: update TimeProvider to use from review
yuzurihaaa May 6, 2025
d1d1f77
wip: remove _isReadonly check.
yuzurihaaa May 6, 2025
c541103
wip: add ExportResult
yuzurihaaa Jan 18, 2025
1951a03
wip: add LogRecordExporter
yuzurihaaa Jan 18, 2025
8a53b9a
wip: add BatchLogRecordProcessor
yuzurihaaa Jan 18, 2025
5f53e21
wip: unit test BatchLogRecordProcessor
yuzurihaaa Jan 18, 2025
1a1d156
wip: add SimpleLogRecordProcessor
yuzurihaaa Jan 18, 2025
ff03252
wip: unit test SimpleLogRecordProcessor
yuzurihaaa Jan 18, 2025
49a100b
feat: rebase from logger-provider and fix error
yuzurihaaa Mar 3, 2025
030858b
wip: add ConsoleLogRecordExporter
yuzurihaaa Jan 18, 2025
ee7828e
wip: unit test ConsoleLogRecordExporter
yuzurihaaa Jan 18, 2025
8e6e0a8
wip: add InMemoryLogRecordExporter
yuzurihaaa Jan 18, 2025
f5072cb
wip: unit test InMemoryLogRecordExporter
yuzurihaaa Jan 18, 2025
e4030c0
wip: fix test error
yuzurihaaa Mar 3, 2025
47495a7
wip: fix lint
yuzurihaaa Mar 3, 2025
f81e28e
fix: test
yuzurihaaa Mar 3, 2025
a5be455
wip: add ExportResult
yuzurihaaa Jan 18, 2025
6c37344
wip: add LogRecordExporter
yuzurihaaa Jan 18, 2025
8d65d5b
wip: add ConsoleLogRecordExporter
yuzurihaaa Jan 18, 2025
a752e1b
feat: OTLPLogExporter
yuzurihaaa Jan 20, 2025
12f266f
wip: fix import arrange
yuzurihaaa Jan 20, 2025
7c67110
wip: fix lint
yuzurihaaa Mar 3, 2025
504436f
fix: test
yuzurihaaa Mar 3, 2025
84931c5
wip: fix lint
yuzurihaaa Mar 18, 2025
56a996c
wip: move away from experimental
yuzurihaaa Jan 20, 2025
4c65438
wip: more export
yuzurihaaa Jan 20, 2025
6e9cde7
wip: update README
yuzurihaaa Jan 20, 2025
c569988
wip: fix lint
yuzurihaaa Jan 20, 2025
2576e03
wip: remove deleted file
yuzurihaaa Mar 18, 2025
e01c8e9
wip: fix package export
yuzurihaaa Mar 18, 2025
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
42 changes: 41 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ This repository is the Dart implementation of the [OpenTelemetry project](https:
| - | - |
| Traces | Beta |
| Metrics | Alpha |
| Logs | Unimplemented |
| Logs | Beta |

## Getting Started

This section will show you how to initialize the OpenTelemetry SDK, capture a span, and propagate context.

### Tacers
### Initialize the OpenTelemetry SDK

```dart
Expand Down Expand Up @@ -62,6 +63,45 @@ void main(List<String> args) {
}
```

### Logs
#### Initialize the OpenTelemetry SDK

```dart
import 'package:opentelemetry/sdk.dart'
show
BatchLogRecordProcessor,
OTLPLogExporter,
ConsoleExporter,
SimpleLogRecordProcessor,
TracerProviderBase;
import 'package:opentelemetry/api.dart'
show registerGlobalLogProvider, globalLogProvider;

void main(List<String> args) {
final logProvider = TracerProviderBase(processors: [
BatchLogRecordProcessor(
OTLPLogExporter(Uri.parse('https://my-collector.com/v1/traces'))),
SimpleLogRecordProcessor(ConsoleLogRecordExporter())
]);

registerGlobalLogProvider(logProvider);
final tracer = globalLogProvider.get('logger-name');
}
```

### Capture a Log
```dart
import 'package:opentelemetry/api.dart' show StatusCode, globalLogProvider;

void main(List<String> args) {
final logger = globalLogProvider.get('logger-name');

logger.emit(body: "Hello World!");
}
```



### Propagate Context

### Intra-process
Expand Down
22 changes: 10 additions & 12 deletions lib/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,21 @@ export 'src/api/common/attribute.dart' show Attribute;
export 'src/api/common/resource_attributes.dart' show ResourceAttributes;
export 'src/api/common/semantic_attributes.dart' show SemanticAttributes;
export 'src/api/context/context.dart'
show
Context,
ContextKey,
contextWithSpan,
contextWithSpanContext,
spanContextFromContext,
spanFromContext,
zone;
export 'src/api/context/context_manager.dart'
show globalContextManager, registerGlobalContextManager;
show Context, ContextKey, contextWithSpan, contextWithSpanContext, spanContextFromContext, spanFromContext, zone;
export 'src/api/context/context_manager.dart' show globalContextManager, registerGlobalContextManager;
export 'src/api/exporters/span_exporter.dart' show SpanExporter;
export 'src/api/instrumentation_library.dart' show InstrumentationLibrary;
export 'src/api/logs/log_record.dart' show Severity;
export 'src/api/logs/logger.dart' show Logger;
export 'src/api/logs/logger_provider.dart' show LoggerProvider;
export 'src/api/logs/noop/noop_logger.dart' show NoopLogger;
export 'src/api/logs/noop/noop_logger_provider.dart' show NoopLoggerProvider;
export 'src/api/open_telemetry.dart'
show
globalLogProvider,
globalTextMapPropagator,
globalTracerProvider,
registerGlobalLogProvider,
registerGlobalTextMapPropagator,
registerGlobalTracerProvider,
trace,
Expand All @@ -30,8 +29,7 @@ export 'src/api/open_telemetry.dart'
export 'src/api/propagation/extractors/text_map_getter.dart' show TextMapGetter;
export 'src/api/propagation/injectors/text_map_setter.dart' show TextMapSetter;
export 'src/api/propagation/text_map_propagator.dart' show TextMapPropagator;
export 'src/api/propagation/w3c_trace_context_propagator.dart'
show W3CTraceContextPropagator;
export 'src/api/propagation/w3c_trace_context_propagator.dart' show W3CTraceContextPropagator;
export 'src/api/span_processors/span_processor.dart' show SpanProcessor;
export 'src/api/trace/id_generator.dart' show IdGenerator;
export 'src/api/trace/span.dart' show Span, SpanKind;
Expand Down
35 changes: 21 additions & 14 deletions lib/sdk.dart
Original file line number Diff line number Diff line change
@@ -1,30 +1,37 @@
// 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

export 'src/sdk/instrumentation_library.dart' show InstrumentationLibrary;
export 'src/sdk/common/attributes.dart' show Attributes;
export 'src/sdk/common/instrumentation_scope.dart' show InstrumentationScope;
export 'src/sdk/instrumentation_library.dart' show InstrumentationLibrary;
export 'src/sdk/logs/export_result.dart' show ExportResult, ExportResultCode;
export 'src/sdk/logs/exporters/console_log_record_exporter.dart' show ConsoleLogRecordExporter;
export 'src/sdk/logs/exporters/inmemory_log_record_exporter.dart' show InMemoryLogRecordExporter;
export 'src/sdk/logs/exporters/log_record_exporter.dart' show LogRecordExporter;
export 'src/sdk/logs/exporters/otlp_log_exporter.dart' show OTLPLogExporter;
export 'src/sdk/logs/log_record.dart' show ReadableLogRecord, ReadWriteLogRecord, LogRecord;
export 'src/sdk/logs/log_record_limit.dart' show LogRecordLimits;
export 'src/sdk/logs/logger.dart' show Logger;
export 'src/sdk/logs/logger_provider.dart' show LoggerProvider;
export 'src/sdk/logs/processors/batch_log_record_processor.dart' show BatchLogRecordProcessor;
export 'src/sdk/logs/processors/log_record_processor.dart' show LogRecordProcessor;
export 'src/sdk/logs/processors/simple_log_record_processor.dart' show SimpleLogRecordProcessor;
export 'src/sdk/resource/resource.dart' show Resource;
export 'src/sdk/time_providers/datetime_time_provider.dart'
show DateTimeTimeProvider;
export 'src/sdk/time_providers/datetime_time_provider.dart' show DateTimeTimeProvider;
export 'src/sdk/time_providers/time_provider.dart' show TimeProvider;
export 'src/sdk/trace/exporters/span_exporter.dart' show SpanExporter;
export 'src/sdk/trace/exporters/collector_exporter.dart' show CollectorExporter;
export 'src/sdk/trace/exporters/console_exporter.dart' show ConsoleExporter;
export 'src/sdk/trace/exporters/span_exporter.dart' show SpanExporter;
export 'src/sdk/trace/id_generator.dart' show IdGenerator;
export 'src/sdk/trace/read_only_span.dart' show ReadOnlySpan;
export 'src/sdk/trace/read_write_span.dart' show ReadWriteSpan;
export 'src/sdk/trace/sampling/always_off_sampler.dart' show AlwaysOffSampler;
export 'src/sdk/trace/sampling/always_on_sampler.dart' show AlwaysOnSampler;
export 'src/sdk/trace/sampling/parent_based_sampler.dart'
show ParentBasedSampler;
export 'src/sdk/trace/sampling/parent_based_sampler.dart' show ParentBasedSampler;
export 'src/sdk/trace/sampling/sampler.dart' show Sampler;
export 'src/sdk/trace/sampling/sampling_result.dart'
show Decision, SamplingResult;
export 'src/sdk/trace/read_only_span.dart' show ReadOnlySpan;
export 'src/sdk/trace/read_write_span.dart' show ReadWriteSpan;
export 'src/sdk/trace/sampling/sampling_result.dart' show Decision, SamplingResult;
export 'src/sdk/trace/span_limits.dart' show SpanLimits;
export 'src/sdk/trace/span_processors/batch_processor.dart' show BatchSpanProcessor;
export 'src/sdk/trace/span_processors/simple_processor.dart' show SimpleSpanProcessor;
export 'src/sdk/trace/span_processors/span_processor.dart' show SpanProcessor;
export 'src/sdk/trace/span_processors/batch_processor.dart'
show BatchSpanProcessor;
export 'src/sdk/trace/span_processors/simple_processor.dart'
show SimpleSpanProcessor;
export 'src/sdk/trace/tracer_provider.dart' show TracerProviderBase;
2 changes: 1 addition & 1 deletion lib/src/api/context/context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:collection/collection.dart';
import 'package:logging/logging.dart';
import 'package:meta/meta.dart';

import '../../../api.dart';
import '../../../api.dart' hide Logger;
import '../trace/nonrecording_span.dart' show NonRecordingSpan;

final Logger _log = Logger('opentelemetry');
Expand Down
3 changes: 1 addition & 2 deletions lib/src/api/logs/logger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
// 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,
List<api.Attribute> attributes = const <api.Attribute>[],
api.Context? context,
dynamic body,
DateTime? observedTimestamp,
Expand Down
2 changes: 1 addition & 1 deletion lib/src/api/logs/logger_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ 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],
/// The logger 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.
Expand Down
4 changes: 2 additions & 2 deletions lib/src/api/logs/noop/noop_logger.dart
Original file line number Diff line number Diff line change
@@ -1,17 +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

import 'package:opentelemetry/src/api/common/attribute.dart';
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,
List<Attribute> attributes = const <Attribute>[],
Context? context,
dynamic body,
DateTime? observedTimestamp,
Expand Down
9 changes: 4 additions & 5 deletions lib/src/api/open_telemetry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,19 @@ import 'package:meta/meta.dart';

import '../../api.dart' as api;
import '../../src/sdk/trace/tracer.dart' as sdk show Tracer;
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;
final api.LoggerProvider _noopLoggerProvider = api.NoopLoggerProvider();
api.LoggerProvider _logProvider = _noopLoggerProvider;
api.TracerProvider _tracerProvider = _noopTracerProvider;
api.TextMapPropagator _textMapPropagator = _noopTextMapPropagator;

api.TracerProvider get globalTracerProvider => _tracerProvider;

LoggerProvider get globalLogProvider => _logProvider;
api.LoggerProvider get globalLogProvider => _logProvider;

api.TextMapPropagator get globalTextMapPropagator => _textMapPropagator;

Expand All @@ -34,7 +33,7 @@ void registerGlobalTracerProvider(api.TracerProvider tracerProvider) {
_tracerProvider = tracerProvider;
}

void registerGlobalLogProvider(LoggerProvider logProvider) {
void registerGlobalLogProvider(api.LoggerProvider logProvider) {
if (_logProvider != _noopLoggerProvider) {
throw StateError('A global LoggerProvider has already been created. '
'registerGlobalLoggerProvider must be called only once before any '
Expand Down
7 changes: 1 addition & 6 deletions lib/src/experimental_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@ export 'api/context/noop_context_manager.dart' show NoopContextManager;
export 'api/context/zone_context.dart' show ZoneContext;
export 'api/context/zone_context_manager.dart' show ZoneContextManager;
export 'api/metrics/counter.dart' show Counter;
export 'api/metrics/meter_provider.dart' show MeterProvider;
export 'api/metrics/meter.dart' show Meter;
export 'api/metrics/meter_provider.dart' show MeterProvider;
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;
2 changes: 1 addition & 1 deletion lib/src/experimental_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ library experimental_sdk;
import 'package:meta/meta.dart';

export 'sdk/metrics/counter.dart' show Counter;
export 'sdk/metrics/meter_provider.dart' show MeterProvider;
export 'sdk/metrics/meter.dart' show Meter;
export 'sdk/metrics/meter_provider.dart' show MeterProvider;
export 'sdk/resource/resource.dart' show Resource;
45 changes: 34 additions & 11 deletions lib/src/sdk/common/limits.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import '../../../sdk.dart' as sdk;

/// Applies given [sdk.SpanLimits] to a list of [api.SpanLink]s.
@protected
List<api.SpanLink> applyLinkLimits(
List<api.SpanLink> links, sdk.SpanLimits limits) {
List<api.SpanLink> applyLinkLimits(List<api.SpanLink> links, sdk.SpanLimits limits) {
final spanLink = <api.SpanLink>[];

for (final link in links) {
Expand All @@ -27,8 +26,7 @@ List<api.SpanLink> applyLinkLimits(
for (final attr in link.attributes) {
// if attributes num is already greater than maxNumAttributesPerLink
// and this key doesn't exist in the list, drop it.
if (attributeMap.length >= limits.maxNumAttributesPerLink &&
!attributeMap.containsKey(attr.key)) {
if (attributeMap.length >= limits.maxNumAttributesPerLink && !attributeMap.containsKey(attr.key)) {
droppedAttributes++;
continue;
}
Expand All @@ -49,8 +47,7 @@ List<api.SpanLink> applyLinkLimits(
}
}

spanLink.add(api.SpanLink(link.context,
attributes: linkAttributes, droppedAttributes: droppedAttributes));
spanLink.add(api.SpanLink(link.context, attributes: linkAttributes, droppedAttributes: droppedAttributes));
}
return spanLink;
}
Expand All @@ -63,20 +60,46 @@ api.Attribute applyAttributeLimits(api.Attribute attr, sdk.SpanLimits limits) {

if (attr.value is String) {
attr = api.Attribute.fromString(
attr.key,
applyAttributeLengthLimit(
attr.value as String, limits.maxNumAttributeLength));
attr.key, applyAttributeLengthLimit(attr.value as String, limits.maxNumAttributeLength));
} else if (attr.value is List<String>) {
final listString = attr.value as List<String>;
for (var j = 0; j < listString.length; j++) {
listString[j] = applyAttributeLengthLimit(
listString[j], limits.maxNumAttributeLength);
listString[j] = applyAttributeLengthLimit(listString[j], limits.maxNumAttributeLength);
}
attr = api.Attribute.fromStringList(attr.key, listString);
}
return attr;
}

@protected
api.Attribute applyAttributeLimitsForLog(
api.Attribute attr,
sdk.LogRecordLimits limits,
) {
// if maxNumAttributeLength is less than zero, then it has unlimited length.
if (limits.attributeValueLengthLimit < 0) return attr;

if (attr.value is String) {
return (attr.value as String).length > limits.attributeValueLengthLimit
? api.Attribute.fromString(attr.key, (attr.value as String).substring(0, limits.attributeValueLengthLimit))
: attr;
} else if (attr.value is List<String>) {
final list = (attr.value as List<String>);
List<String>? truncated;
for (int i = 0; i < list.length; i++) {
final s = list[i];
if (s.length > limits.attributeValueLengthLimit) {
truncated ??= List<String>.from(list, growable: false);
truncated[i] = s.substring(0, limits.attributeValueLengthLimit);
}
}
if (truncated != null) {
return api.Attribute.fromStringList(attr.key, truncated);
}
}
return attr;
}

/// Truncate just strings which length is longer than configuration.
/// Reference: https://github.com/open-telemetry/opentelemetry-java/blob/14ffacd1cdd22f5aa556eeda4a569c7f144eadf2/sdk/common/src/main/java/io/opentelemetry/sdk/internal/AttributeUtil.java#L80
@protected
Expand Down
15 changes: 15 additions & 0 deletions lib/src/sdk/logs/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,
}
Loading
Loading