-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathopen_telemetry.dart
83 lines (66 loc) · 2.66 KB
/
open_telemetry.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 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 'dart:async';
import '../../api.dart' as api;
import '../../sdk.dart' as sdk;
final api.TracerProvider _noopTracerProvider = sdk.TracerProviderBase();
api.TracerProvider _tracerProvider = _noopTracerProvider;
api.TextMapPropagator _textMapPropagator;
api.TracerProvider get globalTracerProvider => _tracerProvider;
api.TextMapPropagator get globalTextMapPropagator => _textMapPropagator;
void registerGlobalTracerProvider(api.TracerProvider tracerProvider) {
if (_tracerProvider != _noopTracerProvider) {
throw StateError('A global TracerProvider has already been created. '
'registerGlobalTracerProvider must be called only once before any '
'calls to the getter globalTracerProvider.');
}
_tracerProvider = tracerProvider;
}
void registerGlobalTextMapPropagator(api.TextMapPropagator textMapPropagator) {
if (_textMapPropagator != null) {
throw StateError('A global TextMapPropagator has already been created. '
'registerGlobalTextMapPropagator must be called only once before any '
'calls to the getter globalTextMapPropagator.');
}
_textMapPropagator = textMapPropagator;
}
/// Records a span of the given [name] for the given function with a given
/// [api.Tracer] and marks the span as errored if an exception occurs.
Future<T> trace<T>(String name, Future<T> Function() fn,
{api.Context context, api.Tracer tracer}) async {
context ??= api.Context.current;
tracer ??= _tracerProvider.getTracer('opentelemetry-dart');
final span = tracer.startSpan(name, context: context);
try {
return await context.withSpan(span).execute(fn);
} catch (e, s) {
span
..setStatus(api.StatusCode.error, description: e.toString())
..recordException(e, stackTrace: s);
rethrow;
} finally {
span.end();
}
}
/// Use [traceSync] instead of [trace] when [fn] is not an async function.
R traceSync<R>(String name, R Function() fn,
{api.Context context, api.Tracer tracer}) {
context ??= api.Context.current;
tracer ??= _tracerProvider.getTracer('opentelemetry-dart');
final span = tracer.startSpan(name, context: context);
try {
final r = context.withSpan(span).execute(fn);
if (r is Future) {
throw ArgumentError.value(fn, 'fn',
'Use traceSync to trace functions that do not return a [Future].');
}
return r;
} catch (e, s) {
span
..setStatus(api.StatusCode.error, description: e.toString())
..recordException(e, stackTrace: s);
rethrow;
} finally {
span.end();
}
}