From 05c432d6ecbd050e483cc93a05aaf17ccaac6e3e Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Mon, 2 Oct 2023 15:08:20 +0200 Subject: [PATCH] ?== instead of lazy --- src/Sentry/Span.cs | 27 +++++++++++++++++---------- src/Sentry/SpanTracer.cs | 16 +++++++--------- src/Sentry/Transaction.cs | 13 ++++++------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/Sentry/Span.cs b/src/Sentry/Span.cs index 57873ad742..aaa9f7d6ab 100644 --- a/src/Sentry/Span.cs +++ b/src/Sentry/Span.cs @@ -30,14 +30,14 @@ public class Span : ISpanData, IJsonSerializable public bool IsFinished => EndTimestamp is not null; // Not readonly because of deserialization - private Lazy> _measurements; + private Dictionary? _measurements; /// - public IReadOnlyDictionary Measurements => _measurements.Value; + public IReadOnlyDictionary Measurements => _measurements ??= new Dictionary(); /// public void SetMeasurement(string name, Measurement measurement) => - _measurements.Value[name] = measurement; + (_measurements ??= new Dictionary())[name] = measurement; /// public string Operation { get; set; } @@ -83,7 +83,6 @@ public Span(SpanId? parentSpanId, string operation) ParentSpanId = parentSpanId; TraceId = SentryId.Create(); Operation = operation; - _measurements = new Lazy>(); } /// @@ -100,8 +99,17 @@ public Span(ISpan tracer) Status = tracer.Status; IsSampled = tracer.IsSampled; _extra = tracer.Extra.ToDictionary(); - _measurements = new Lazy>(() => tracer.Measurements.ToDictionary()); - _tags = tracer is SpanTracer s ? s.InternalTags?.ToDictionary() : tracer.Tags.ToDictionary(); + + if (tracer is SpanTracer spanTracer) + { + _measurements = spanTracer.InternalMeasurements?.ToDictionary(); + _tags = spanTracer.InternalTags?.ToDictionary(); + } + else + { + _measurements = tracer.Measurements.ToDictionary(); + _tags = tracer.Tags.ToDictionary(); + } } /// @@ -125,7 +133,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(); } @@ -145,8 +153,7 @@ public static Span FromJson(JsonElement json) var status = json.GetPropertyOrNull("status")?.GetString()?.Replace("_", "").ParseEnum(); var isSampled = json.GetPropertyOrNull("sampled")?.GetBoolean(); var tags = json.GetPropertyOrNull("tags")?.GetStringDictionaryOrNull()?.ToDictionary(); - var measurements = json.GetPropertyOrNull("measurements")? - .GetDictionaryOrNull(Measurement.FromJson) ?? new(); + var measurements = json.GetPropertyOrNull("measurements")?.GetDictionaryOrNull(Measurement.FromJson); var data = json.GetPropertyOrNull("data")?.GetDictionaryOrNull()?.ToDictionary(); return new Span(parentSpanId, operation) @@ -160,7 +167,7 @@ public static Span FromJson(JsonElement json) IsSampled = isSampled, _tags = tags!, _extra = data!, - _measurements = new Lazy>(() => measurements), + _measurements = measurements, }; } diff --git a/src/Sentry/SpanTracer.cs b/src/Sentry/SpanTracer.cs index 16560e4b90..b902abf888 100644 --- a/src/Sentry/SpanTracer.cs +++ b/src/Sentry/SpanTracer.cs @@ -32,14 +32,14 @@ public class SpanTracer : ISpan public bool IsFinished => EndTimestamp is not null; // Not readonly because of deserialization - private readonly Lazy> _measurements = new(); + internal Dictionary? InternalMeasurements { get; private set; } /// - public IReadOnlyDictionary Measurements => _measurements.Value; + public IReadOnlyDictionary Measurements => InternalMeasurements ??= new Dictionary(); /// public void SetMeasurement(string name, Measurement measurement) => - _measurements.Value[name] = measurement; + (InternalMeasurements ??= new Dictionary())[name] = measurement; /// public string Operation { get; set; } @@ -61,20 +61,18 @@ public void SetMeasurement(string name, Measurement measurement) => /// public bool? IsSampled { get; internal set; } - private ConcurrentDictionary? _tags; - - internal ConcurrentDictionary? InternalTags => _tags; + internal ConcurrentDictionary? InternalTags { get; private set; } /// - public IReadOnlyDictionary Tags => _tags ??= new ConcurrentDictionary(); + public IReadOnlyDictionary Tags => InternalTags ??= new ConcurrentDictionary(); /// public void SetTag(string key, string value) => - (_tags ??= new ConcurrentDictionary())[key] = value; + (InternalTags ??= new ConcurrentDictionary())[key] = value; /// public void UnsetTag(string key) => - (_tags ??= new ConcurrentDictionary()).TryRemove(key, out _); + (InternalTags ??= new ConcurrentDictionary()).TryRemove(key, out _); private readonly ConcurrentDictionary _data = new(); diff --git a/src/Sentry/Transaction.cs b/src/Sentry/Transaction.cs index 36f86690b5..d351336ce7 100644 --- a/src/Sentry/Transaction.cs +++ b/src/Sentry/Transaction.cs @@ -69,14 +69,14 @@ public SentryId TraceId public DateTimeOffset? EndTimestamp { get; internal set; } // internal for testing // Not readonly because of deserialization - private Lazy> _measurements; + private Dictionary? _measurements; /// - public IReadOnlyDictionary Measurements => _measurements.Value; + public IReadOnlyDictionary Measurements => _measurements ??= new Dictionary(); /// public void SetMeasurement(string name, Measurement measurement) => - _measurements.Value[name] = measurement; + (_measurements ??= new Dictionary())[name] = measurement; /// public string Operation @@ -209,7 +209,6 @@ private Transaction(string name, TransactionNameSource nameSource) EventId = SentryId.Create(); Name = name; NameSource = nameSource; - _measurements = new Lazy>(); } /// @@ -267,7 +266,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()); + _measurements = tracer.Measurements.ToDictionary(); // Some items are not on the interface, but we only ever pass in a TransactionTracer anyway. if (tracer is TransactionTracer transactionTracer) @@ -348,7 +347,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 +403,7 @@ public static Transaction FromJson(JsonElement json) _breadcrumbs = breadcrumbs, _extra = extra, _tags = tags, - _measurements = new Lazy>(() => measurements), + _measurements = measurements, _spans = spans }; }