Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 23 additions & 10 deletions src/EasyTrace.Benchmarks/MemoryBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Diagnostics;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -59,13 +58,27 @@ public void Cleanup()
}

[Benchmark]
public ulong ActivitySource() => Execute(() => _activitySource!.StartActivity());
public ulong ActivitySource()
{
_activityCounter = 0;

[Benchmark]
public ulong TraceActivityRef() => Execute(() => _traceActivitySource!.Start());
Parallel.For(0,
ParallelLimit,
i =>
{
foreach (var _ in Enumerable.Repeat(0, Iterations))
{
using var activity1 = _activitySource!.StartActivity();
using var activity2 = _activitySource!.StartActivity();
using var activity3 = _activitySource!.StartActivity();
}
});

private ulong Execute<T>(Func<T> factory)
where T : IDisposable?, allows ref struct
return Interlocked.Read(ref _activityCounter);
}

[Benchmark]
public ulong TraceActivityRef()
{
_activityCounter = 0;

Expand All @@ -75,9 +88,9 @@ private ulong Execute<T>(Func<T> factory)
{
foreach (var _ in Enumerable.Repeat(0, Iterations))
{
using var activity1 = factory();
using var activity2 = factory();
using var activity3 = factory();
using var activity1 = _traceActivitySource!.Start();
using var activity2 = _traceActivitySource!.Start();
using var activity3 = _traceActivitySource!.Start();
}
});

Expand Down
14 changes: 2 additions & 12 deletions src/EasyTrace/Activity/TraceActivityRef.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

namespace EasyTrace.Activity;

public readonly ref struct TraceActivityRef(TraceActivitySource activitySource, TraceActivity activity)
: ITraceActivity, ICopiable<TraceActivity>, IDisposable
public readonly ref struct TraceActivityRef(TraceActivity activity)
: ITraceActivity, ICopiable<TraceActivity>
{
public TraceIdentifier TraceId => activity.TraceId;
public TraceIdentifier SpanId => activity.SpanId;
Expand All @@ -21,16 +21,6 @@ public readonly ref struct TraceActivityRef(TraceActivitySource activitySource,

public TimeSpan Duration => activity.Duration;

public void Dispose()
{
if (activity == TraceActivity.Empty)
{
return;
}

activitySource.Stop(this, activity);
}

void ICopiable<TraceActivity>.CopyFrom(TraceActivity source)
{
activity.CopyFrom(source);
Expand Down
14 changes: 14 additions & 0 deletions src/EasyTrace/Activity/TraceActivityScope.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace EasyTrace.Activity;

public readonly struct TraceActivityScope(TraceActivity activity) : IDisposable
{
public void Dispose()
{
if (activity == TraceActivity.Empty)
{
return;
}

activity.Source.Stop(activity);
}
}
2 changes: 1 addition & 1 deletion src/EasyTrace/Export/Batch/BatchExportWorker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ private void ExporterProc()
var activities = CircularBuffer.Next(MaxExportBatchSize);
foreach (var activity in activities)
{
_exporter.Export(new TraceActivityRef(activity.Source, activity));
_exporter.Export(new TraceActivityRef(activity));
}
}
}
Expand Down
14 changes: 8 additions & 6 deletions src/EasyTrace/TraceActivitySource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TraceActivitySource(string name, Version? version = null)
{
private static readonly ThreadLocal<TraceActivity?> ParentActivityByThreadLocal = new();

internal static TraceActivitySource Empty = new (nameof(Empty));
internal static readonly TraceActivitySource Empty = new(nameof(Empty));

internal ITraceTimeProvider TimeProvider { get; init; } = new TraceTimeProvider();
internal ITraceIdentifierGenerator IdentifierGenerator { get; init; } = new Xoshiro256PlusPlus();
Expand All @@ -28,11 +28,13 @@ private static TraceActivity? Parent

public string? Version { get; } = version?.ToString();

public TraceActivityRef Start([CallerMemberName] string operationName = "", ActivityKind kind = ActivityKind.Internal)
public TraceActivityScope? Start(
[CallerMemberName] string operationName = "",
ActivityKind kind = ActivityKind.Internal)
{
if (Exporter == null)
{
return new TraceActivityRef(this, TraceActivity.Empty);
return null;
}

var activity = TraceActivityPool.Shared.Rent();
Expand All @@ -55,17 +57,17 @@ public TraceActivityRef Start([CallerMemberName] string operationName = "", Acti

Parent ??= activity;

return new TraceActivityRef(this, activity);
return new TraceActivityScope(activity);
}

public void Stop(scoped in TraceActivityRef activityRef, TraceActivity activity)
public void Stop(TraceActivity activity)
{
if (activity.EndTime == TimeSpan.Zero)
{
activity.EndTime = TimeProvider.GetTimestamp();
}

Exporter?.Export(activityRef);
Exporter?.Export(new TraceActivityRef(activity));

if (Parent == activity)
{
Expand Down
Loading