From 3919e9149fa6cd5153b162e6138bf08a24eaec9a Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 2 Oct 2023 12:16:55 +1300 Subject: [PATCH] Use Lazy for measurments in immutable Spans/Transactions --- src/Sentry/Span.cs | 14 +++++++------- src/Sentry/Transaction.cs | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Sentry/Span.cs b/src/Sentry/Span.cs index 5abed5d210..57873ad742 100644 --- a/src/Sentry/Span.cs +++ b/src/Sentry/Span.cs @@ -30,15 +30,14 @@ public class Span : ISpanData, IJsonSerializable public bool IsFinished => EndTimestamp is not null; // Not readonly because of deserialization - private Dictionary? _measurements; - private Dictionary LazyMeasurements => _measurements ??= new(); + private Lazy> _measurements; /// - public IReadOnlyDictionary Measurements => LazyMeasurements; + public IReadOnlyDictionary Measurements => _measurements.Value; /// public void SetMeasurement(string name, Measurement measurement) => - LazyMeasurements[name] = measurement; + _measurements.Value[name] = measurement; /// public string Operation { get; set; } @@ -84,6 +83,7 @@ public Span(SpanId? parentSpanId, string operation) ParentSpanId = parentSpanId; TraceId = SentryId.Create(); Operation = operation; + _measurements = new Lazy>(); } /// @@ -100,7 +100,7 @@ public Span(ISpan tracer) Status = tracer.Status; IsSampled = tracer.IsSampled; _extra = tracer.Extra.ToDictionary(); - _measurements = tracer.Measurements.ToDictionary(); + _measurements = new Lazy>(() => tracer.Measurements.ToDictionary()); _tags = tracer is SpanTracer s ? s.InternalTags?.ToDictionary() : tracer.Tags.ToDictionary(); } @@ -125,7 +125,7 @@ public void WriteTo(Utf8JsonWriter writer, IDiagnosticLogger? logger) writer.WriteStringIfNotNull("timestamp", EndTimestamp); writer.WriteStringDictionaryIfNotEmpty("tags", _tags!); writer.WriteDictionaryIfNotEmpty("data", _extra!, logger); - writer.WriteDictionaryIfNotEmpty("measurements", _measurements, logger); + writer.WriteDictionaryIfNotEmpty("measurements", Measurements, logger); writer.WriteEndObject(); } @@ -160,7 +160,7 @@ public static Span FromJson(JsonElement json) IsSampled = isSampled, _tags = tags!, _extra = data!, - _measurements = measurements + _measurements = new Lazy>(() => measurements), }; } diff --git a/src/Sentry/Transaction.cs b/src/Sentry/Transaction.cs index 588ba13d30..36f86690b5 100644 --- a/src/Sentry/Transaction.cs +++ b/src/Sentry/Transaction.cs @@ -69,15 +69,14 @@ public SentryId TraceId public DateTimeOffset? EndTimestamp { get; internal set; } // internal for testing // Not readonly because of deserialization - private Dictionary? _measurements; - private Dictionary LazyMeasurements => _measurements ??= new(); + private Lazy> _measurements; /// - public IReadOnlyDictionary Measurements => LazyMeasurements; + public IReadOnlyDictionary Measurements => _measurements.Value; /// public void SetMeasurement(string name, Measurement measurement) => - LazyMeasurements[name] = measurement; + _measurements.Value[name] = measurement; /// public string Operation @@ -210,6 +209,7 @@ private Transaction(string name, TransactionNameSource nameSource) EventId = SentryId.Create(); Name = name; NameSource = nameSource; + _measurements = new Lazy>(); } /// @@ -267,6 +267,7 @@ public Transaction(ITransaction tracer) _spans = tracer.Spans .Where(s => s is not SpanTracer { IsSentryRequest: true }) // Filter sentry requests created by Sentry.OpenTelemetry.SentrySpanProcessor .Select(s => new Span(s)).ToArray(); + _measurements = new Lazy>(() => tracer.Measurements.ToDictionary()); // Some items are not on the interface, but we only ever pass in a TransactionTracer anyway. if (tracer is TransactionTracer transactionTracer) @@ -274,7 +275,6 @@ public Transaction(ITransaction tracer) SampleRate = transactionTracer.SampleRate; DynamicSamplingContext = transactionTracer.DynamicSamplingContext; TransactionProfiler = transactionTracer.TransactionProfiler; - _measurements = transactionTracer.Measurements.ToDictionary(); } } @@ -348,7 +348,7 @@ public void WriteTo(Utf8JsonWriter writer, IDiagnosticLogger? logger) writer.WriteDictionaryIfNotEmpty("extra", _extra, logger); writer.WriteStringDictionaryIfNotEmpty("tags", _tags!); writer.WriteArrayIfNotEmpty("spans", _spans, logger); - writer.WriteDictionaryIfNotEmpty("measurements", _measurements, logger); + writer.WriteDictionaryIfNotEmpty("measurements", Measurements, logger); writer.WriteEndObject(); } @@ -404,7 +404,7 @@ public static Transaction FromJson(JsonElement json) _breadcrumbs = breadcrumbs, _extra = extra, _tags = tags, - _measurements = measurements, + _measurements = new Lazy>(() => measurements), _spans = spans }; }