Skip to content

Commit

Permalink
Use Lazy<T> for measurments in immutable Spans/Transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
jamescrosswell committed Oct 1, 2023
1 parent 8000d50 commit 3919e91
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 14 deletions.
14 changes: 7 additions & 7 deletions src/Sentry/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,14 @@ public class Span : ISpanData, IJsonSerializable
public bool IsFinished => EndTimestamp is not null;

// Not readonly because of deserialization
private Dictionary<string, Measurement>? _measurements;
private Dictionary<string, Measurement> LazyMeasurements => _measurements ??= new();
private Lazy<Dictionary<string, Measurement>> _measurements;

/// <inheritdoc />
public IReadOnlyDictionary<string, Measurement> Measurements => LazyMeasurements;
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements.Value;

/// <inheritdoc />
public void SetMeasurement(string name, Measurement measurement) =>
LazyMeasurements[name] = measurement;
_measurements.Value[name] = measurement;

/// <inheritdoc />
public string Operation { get; set; }
Expand Down Expand Up @@ -84,6 +83,7 @@ public Span(SpanId? parentSpanId, string operation)
ParentSpanId = parentSpanId;
TraceId = SentryId.Create();
Operation = operation;
_measurements = new Lazy<Dictionary<string, Measurement>>();
}

/// <summary>
Expand All @@ -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<Dictionary<string, Measurement>>(() => tracer.Measurements.ToDictionary());
_tags = tracer is SpanTracer s ? s.InternalTags?.ToDictionary() : tracer.Tags.ToDictionary();
}

Expand All @@ -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();
}
Expand Down Expand Up @@ -160,7 +160,7 @@ public static Span FromJson(JsonElement json)
IsSampled = isSampled,
_tags = tags!,
_extra = data!,
_measurements = measurements
_measurements = new Lazy<Dictionary<string, Measurement>>(() => measurements),
};
}

Expand Down
14 changes: 7 additions & 7 deletions src/Sentry/Transaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,14 @@ public SentryId TraceId
public DateTimeOffset? EndTimestamp { get; internal set; } // internal for testing

// Not readonly because of deserialization
private Dictionary<string, Measurement>? _measurements;
private Dictionary<string, Measurement> LazyMeasurements => _measurements ??= new();
private Lazy<Dictionary<string, Measurement>> _measurements;

/// <inheritdoc />
public IReadOnlyDictionary<string, Measurement> Measurements => LazyMeasurements;
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements.Value;

/// <inheritdoc />
public void SetMeasurement(string name, Measurement measurement) =>
LazyMeasurements[name] = measurement;
_measurements.Value[name] = measurement;

/// <inheritdoc />
public string Operation
Expand Down Expand Up @@ -210,6 +209,7 @@ private Transaction(string name, TransactionNameSource nameSource)
EventId = SentryId.Create();
Name = name;
NameSource = nameSource;
_measurements = new Lazy<Dictionary<string, Measurement>>();
}

/// <summary>
Expand Down Expand Up @@ -267,14 +267,14 @@ 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<Dictionary<string, Measurement>>(() => tracer.Measurements.ToDictionary());

// Some items are not on the interface, but we only ever pass in a TransactionTracer anyway.
if (tracer is TransactionTracer transactionTracer)
{
SampleRate = transactionTracer.SampleRate;
DynamicSamplingContext = transactionTracer.DynamicSamplingContext;
TransactionProfiler = transactionTracer.TransactionProfiler;
_measurements = transactionTracer.Measurements.ToDictionary();
}
}

Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -404,7 +404,7 @@ public static Transaction FromJson(JsonElement json)
_breadcrumbs = breadcrumbs,
_extra = extra,
_tags = tags,
_measurements = measurements,
_measurements = new Lazy<Dictionary<string, Measurement>>(() => measurements),
_spans = spans
};
}
Expand Down

0 comments on commit 3919e91

Please sign in to comment.