Skip to content

Commit

Permalink
?== instead of lazy
Browse files Browse the repository at this point in the history
  • Loading branch information
bitsandfoxes committed Oct 2, 2023
1 parent 3919e91 commit 05c432d
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 26 deletions.
27 changes: 17 additions & 10 deletions src/Sentry/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ public class Span : ISpanData, IJsonSerializable
public bool IsFinished => EndTimestamp is not null;

// Not readonly because of deserialization
private Lazy<Dictionary<string, Measurement>> _measurements;
private Dictionary<string, Measurement>? _measurements;

/// <inheritdoc />
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements.Value;
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements ??= new Dictionary<string, Measurement>();

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

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

/// <summary>
Expand All @@ -100,8 +99,17 @@ public Span(ISpan tracer)
Status = tracer.Status;
IsSampled = tracer.IsSampled;
_extra = tracer.Extra.ToDictionary();
_measurements = new Lazy<Dictionary<string, Measurement>>(() => 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();
}
}

/// <inheritdoc />
Expand All @@ -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();
}
Expand All @@ -145,8 +153,7 @@ public static Span FromJson(JsonElement json)
var status = json.GetPropertyOrNull("status")?.GetString()?.Replace("_", "").ParseEnum<SpanStatus>();
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)
Expand All @@ -160,7 +167,7 @@ public static Span FromJson(JsonElement json)
IsSampled = isSampled,
_tags = tags!,
_extra = data!,
_measurements = new Lazy<Dictionary<string, Measurement>>(() => measurements),
_measurements = measurements,
};
}

Expand Down
16 changes: 7 additions & 9 deletions src/Sentry/SpanTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ public class SpanTracer : ISpan
public bool IsFinished => EndTimestamp is not null;

// Not readonly because of deserialization
private readonly Lazy<Dictionary<string, Measurement>> _measurements = new();
internal Dictionary<string, Measurement>? InternalMeasurements { get; private set; }

/// <inheritdoc />
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements.Value;
public IReadOnlyDictionary<string, Measurement> Measurements => InternalMeasurements ??= new Dictionary<string, Measurement>();

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

/// <inheritdoc cref="ISpan.Operation" />
public string Operation { get; set; }
Expand All @@ -61,20 +61,18 @@ public void SetMeasurement(string name, Measurement measurement) =>
/// <inheritdoc />
public bool? IsSampled { get; internal set; }

private ConcurrentDictionary<string, string>? _tags;

internal ConcurrentDictionary<string, string>? InternalTags => _tags;
internal ConcurrentDictionary<string, string>? InternalTags { get; private set; }

/// <inheritdoc />
public IReadOnlyDictionary<string, string> Tags => _tags ??= new ConcurrentDictionary<string, string>();
public IReadOnlyDictionary<string, string> Tags => InternalTags ??= new ConcurrentDictionary<string, string>();

/// <inheritdoc />
public void SetTag(string key, string value) =>
(_tags ??= new ConcurrentDictionary<string, string>())[key] = value;
(InternalTags ??= new ConcurrentDictionary<string, string>())[key] = value;

/// <inheritdoc />
public void UnsetTag(string key) =>
(_tags ??= new ConcurrentDictionary<string, string>()).TryRemove(key, out _);
(InternalTags ??= new ConcurrentDictionary<string, string>()).TryRemove(key, out _);

private readonly ConcurrentDictionary<string, object?> _data = new();

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

// Not readonly because of deserialization
private Lazy<Dictionary<string, Measurement>> _measurements;
private Dictionary<string, Measurement>? _measurements;

/// <inheritdoc />
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements.Value;
public IReadOnlyDictionary<string, Measurement> Measurements => _measurements ??= new Dictionary<string, Measurement>();

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

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

0 comments on commit 05c432d

Please sign in to comment.