diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs index fd218a7dbf9df1..f82cadcde38e11 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs @@ -25,6 +25,7 @@ public string? Id } public bool IsAllDataRequested { get { throw null; } set { throw null; } } + public bool IsStopped { get { throw null; } } public System.Diagnostics.ActivityIdFormat IdFormat { get { throw null; } } public System.Diagnostics.ActivityKind Kind { get { throw null; } } public string OperationName { get { throw null; } } diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs index 72c8a20bb77453..1bffa9b98f07bf 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs @@ -684,9 +684,9 @@ public void Stop() return; } - if (!IsFinished) + if (!IsStopped) { - IsFinished = true; + IsStopped = true; if (Duration == TimeSpan.Zero) { @@ -951,7 +951,7 @@ internal static bool TryConvertIdToContext(string traceParent, string? traceStat /// public void Dispose() { - if (!IsFinished) + if (!IsStopped) { Stop(); } @@ -1232,7 +1232,7 @@ private static unsafe long GetRandomNumber() private static bool ValidateSetCurrent(Activity? activity) { - bool canSet = activity == null || (activity.Id != null && !activity.IsFinished); + bool canSet = activity == null || (activity.Id != null && !activity.IsStopped); if (!canSet) { NotifyError(new InvalidOperationException(SR.ActivityNotRunning)); @@ -1298,18 +1298,24 @@ private bool W3CIdFlagsSet get => (_w3CIdFlags & ActivityTraceFlagsIsSet) != 0; } - private bool IsFinished + /// + /// Indicates whether this object is stopped + /// + /// + /// When subscribing to stop event using , the received object in the event callback will have as true. + /// + public bool IsStopped { - get => (_state & State.IsFinished) != 0; - set + get => (_state & State.IsStopped) != 0; + private set { if (value) { - _state |= State.IsFinished; + _state |= State.IsStopped; } else { - _state &= ~State.IsFinished; + _state &= ~State.IsStopped; } } } @@ -1623,7 +1629,7 @@ private enum State : byte FormatW3C = 0b_0_00000_10, FormatFlags = 0b_0_00000_11, - IsFinished = 0b_1_00000_00, + IsStopped = 0b_1_00000_00, } } diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs index 2ac5efa2d9fad5..6b2a0c8aecf5ec 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs @@ -299,7 +299,6 @@ public void ActivityIdOverflow() Assert.Equal('#', activity.Id[activity.Id.Length - 1]); } - /// /// Tests activity start and stop /// Checks Activity.Current correctness, Id generation @@ -320,6 +319,51 @@ public void StartStop() Assert.Null(Activity.Current); } + /// + /// Tests Activity.IsStopped + /// + [Fact] + public void IsStoppedTest() + { + using var activity = new Activity("activity"); + Assert.False(activity.IsStopped); + activity.Start(); + Assert.False(activity.IsStopped); + Assert.Equal(TimeSpan.Zero, activity.Duration); + activity.Stop(); + Assert.NotEqual(TimeSpan.Zero, activity.Duration); + Assert.True(activity.IsStopped); + + using var activity1 = new Activity("activity"); + Assert.False(activity1.IsStopped); + activity1.Start(); + Assert.False(activity1.IsStopped); + activity1.SetEndTime(DateTime.UtcNow.AddMinutes(1)); // Setting end time shouldn't mark the activity as stopped + Assert.False(activity1.IsStopped); + activity1.Stop(); + Assert.True(activity1.IsStopped); + + // + // Validate when receiving Start/Stop Activity events + // + + using ActivitySource aSource = new ActivitySource("TestActivityIsStopped"); + using ActivityListener listener = new ActivityListener(); + + listener.ShouldListenTo = (activitySource) => activitySource.Name == "TestActivityIsStopped"; + listener.Sample = (ref ActivityCreationOptions activityOptions) => ActivitySamplingResult.AllData; + listener.ActivityStarted = a => Assert.False(a.IsStopped); + listener.ActivityStopped = a => Assert.True(a.IsStopped); + ActivitySource.AddActivityListener(listener); + Activity sourceActivity; + using (sourceActivity = aSource.StartActivity("a1")) + { + Assert.NotNull(sourceActivity); + Assert.False(sourceActivity.IsStopped); + } + Assert.True(sourceActivity.IsStopped); + } + /// /// Tests Id generation ///