Skip to content
Merged
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
40 changes: 16 additions & 24 deletions src/Elasticsearch.Net/Diagnostics/Diagnostic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
using System;
using System.Diagnostics;

namespace Elasticsearch.Net.Diagnostics
namespace Elasticsearch.Net.Diagnostics
{
/// <summary>
/// Internal subclass of <see cref="Activity"/> that implements <see cref="IDisposable"/> to
/// Diagnostic that creates, starts and stops <see cref="Activity"/> that implements <see cref="IDisposable"/> to
/// make it easier to use.
/// </summary>
internal class Diagnostic<TState> : Diagnostic<TState, TState>
Expand All @@ -17,48 +17,40 @@ public Diagnostic(string operationName, DiagnosticSource source, TState state)
: base(operationName, source, state) =>
EndState = state;
}
internal class Diagnostic<TState, TStateEnd> : Activity

internal class Diagnostic<TState, TStateEnd> : IDisposable
{
public static Diagnostic<TState, TStateEnd> Default { get; } = new();

private readonly DiagnosticSource _source;
private TStateEnd _endState;
private readonly bool _default;
private bool _disposed;
private readonly Activity _activity;
private TStateEnd _endState;

private Diagnostic() : base("__NOOP__") => _default = true;
private Diagnostic() => _default = true;

public Diagnostic(string operationName, DiagnosticSource source, TState state) : base(operationName)
public Diagnostic(string operationName, DiagnosticSource source, TState state)
{
_source = source;
_source.StartActivity(SetStartTime(DateTime.UtcNow), state);
_activity = new Activity(operationName);
_source.StartActivity(_activity, state);
}

public TStateEnd EndState
{
get => _endState;
internal set
{
//do not store state on default instance
//do not store state on default instance
if (_default) return;
_endState = value;
_endState = value;
}
}

protected override void Dispose(bool disposing)
{
if (_disposed) return;

if (disposing)
{
//_source can be null if Default instance
_source?.StopActivity(SetEndTime(DateTime.UtcNow), EndState);
}

_disposed = true;

base.Dispose(disposing);
public void Dispose()
{
_source?.StopActivity(_activity, EndState);
_activity?.Dispose();
}
}
}