1
1
import 'dart:async' ;
2
2
3
3
import '../hub.dart' ;
4
+ import '../metrics/local_metrics_aggregator.dart' ;
4
5
import '../protocol.dart' ;
5
6
6
7
import '../sentry_tracer.dart' ;
@@ -12,6 +13,7 @@ typedef OnFinishedCallback = Future<void> Function({DateTime? endTimestamp});
12
13
class SentrySpan extends ISentrySpan {
13
14
final SentrySpanContext _context;
14
15
DateTime ? _endTimestamp;
16
+ Map <String , List <MetricSummary >>? _metricSummaries;
15
17
late final DateTime _startTimestamp;
16
18
final Hub _hub;
17
19
@@ -22,6 +24,7 @@ class SentrySpan extends ISentrySpan {
22
24
SpanStatus ? _status;
23
25
final Map <String , String > _tags = {};
24
26
OnFinishedCallback ? _finishedCallback;
27
+ late final LocalMetricsAggregator ? _localMetricsAggregator;
25
28
26
29
@override
27
30
final SentryTracesSamplingDecision ? samplingDecision;
@@ -37,6 +40,9 @@ class SentrySpan extends ISentrySpan {
37
40
_startTimestamp = startTimestamp? .toUtc () ?? _hub.options.clock ();
38
41
_finishedCallback = finishedCallback;
39
42
_origin = _context.origin;
43
+ _localMetricsAggregator = _hub.options.enableSpanLocalMetricAggregation
44
+ ? LocalMetricsAggregator ()
45
+ : null ;
40
46
}
41
47
42
48
@override
@@ -65,6 +71,7 @@ class SentrySpan extends ISentrySpan {
65
71
if (_throwable != null ) {
66
72
_hub.setSpanContext (_throwable, this , _tracer.name);
67
73
}
74
+ _metricSummaries = _localMetricsAggregator? .getSummaries ();
68
75
await _finishedCallback? .call (endTimestamp: _endTimestamp);
69
76
return super .finish (status: status, endTimestamp: _endTimestamp);
70
77
}
@@ -154,6 +161,9 @@ class SentrySpan extends ISentrySpan {
154
161
@override
155
162
set origin (String ? origin) => _origin = origin;
156
163
164
+ @override
165
+ LocalMetricsAggregator ? get localMetricsAggregator => _localMetricsAggregator;
166
+
157
167
Map <String , dynamic > toJson () {
158
168
final json = _context.toJson ();
159
169
json['start_timestamp' ] =
@@ -174,6 +184,16 @@ class SentrySpan extends ISentrySpan {
174
184
if (_origin != null ) {
175
185
json['origin' ] = _origin;
176
186
}
187
+
188
+ final metricSummariesMap = _metricSummaries? .entries ?? Iterable .empty ();
189
+ if (metricSummariesMap.isNotEmpty) {
190
+ final map = < String , dynamic > {};
191
+ for (final entry in metricSummariesMap) {
192
+ final summary = entry.value.map ((e) => e.toJson ());
193
+ map[entry.key] = summary.toList (growable: false );
194
+ }
195
+ json['_metrics_summary' ] = map;
196
+ }
177
197
return json;
178
198
}
179
199
0 commit comments