Skip to content

Commit 974e96b

Browse files
authored
Activity Status support (#47506)
* Activity Status support * Apply the agreed on behavior
1 parent f638a75 commit 974e96b

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public string? Id
4646
public string? RootId { get { throw null; } }
4747
public System.Diagnostics.ActivitySpanId SpanId { get { throw null; } }
4848
public System.DateTime StartTimeUtc { get { throw null; } }
49+
public System.Diagnostics.ActivityStatusCode Status { get { throw null; } }
50+
public string? StatusDescription { get { throw null; } }
4951
public System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, string?>> Tags { get { throw null; } }
5052
public System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object?>> TagObjects { get { throw null; } }
5153
public System.Collections.Generic.IEnumerable<System.Diagnostics.ActivityEvent> Events { get { throw null; } }
@@ -65,6 +67,7 @@ public string? Id
6567
public System.Diagnostics.Activity SetParentId(System.Diagnostics.ActivityTraceId traceId, System.Diagnostics.ActivitySpanId spanId, System.Diagnostics.ActivityTraceFlags activityTraceFlags = System.Diagnostics.ActivityTraceFlags.None) { throw null; }
6668
public System.Diagnostics.Activity SetParentId(string parentId) { throw null; }
6769
public System.Diagnostics.Activity SetStartTime(System.DateTime startTimeUtc) { throw null; }
70+
public System.Diagnostics.Activity SetStatus(System.Diagnostics.ActivityStatusCode code, string? description = null) { throw null; }
6871
public System.Diagnostics.Activity Start() { throw null; }
6972
public void Stop() { throw null; }
7073
public void Dispose() { throw null; }
@@ -104,6 +107,12 @@ public struct Enumerator : System.Collections.Generic.IEnumerator<System.Collect
104107
void System.Collections.IEnumerator.Reset() { throw null; }
105108
}
106109
}
110+
public enum ActivityStatusCode
111+
{
112+
Unset = 0,
113+
Ok = 1,
114+
Error = 2
115+
}
107116
public enum ActivityIdFormat
108117
{
109118
Unknown = 0,

src/libraries/System.Diagnostics.DiagnosticSource/src/System.Diagnostics.DiagnosticSource.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.1'">
3535
<Compile Include="$(CommonPath)System\HexConverter.cs" Link="Common\System\HexConverter.cs" />
3636
<Compile Include="System\Diagnostics\Activity.cs" />
37+
<Compile Include="System\Diagnostics\ActivityStatusCode.cs" />
3738
<Compile Include="System\Diagnostics\ActivityTagsCollection.cs" />
3839
<Compile Include="System\Diagnostics\ActivityContext.cs" />
3940
<Compile Include="System\Diagnostics\ActivityCreationOptions.cs" />

src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,35 @@ public partial class Activity : IDisposable
8282
private LinkedList<ActivityEvent>? _events;
8383
private Dictionary<string, object>? _customProperties;
8484
private string? _displayName;
85+
private ActivityStatusCode _statusCode;
86+
private string? _statusDescription;
87+
88+
/// <summary>
89+
/// Gets status code of the current activity object.
90+
/// </summary>
91+
public ActivityStatusCode Status => _statusCode;
92+
93+
/// <summary>
94+
/// Gets the status descrition of the current activity object.
95+
/// </summary>
96+
public string? StatusDescription => _statusDescription;
97+
98+
/// <summary>
99+
/// Sets the status code and description on the current activity object.
100+
/// </summary>
101+
/// <param name="code">The status code</param>
102+
/// <param name="description">The error status descrition</param>
103+
/// <returns>'this' for convenient chaining</returns>
104+
/// <remarks>
105+
/// When passing code value different than ActivityStatusCode.Error, the Activity.StatusDescription will reset to null value.
106+
/// The description paramater will be respected only when passing ActivityStatusCode.Error value.
107+
/// </remarks>
108+
public Activity SetStatus(ActivityStatusCode code, string? description = null)
109+
{
110+
_statusCode = code;
111+
_statusDescription = code == ActivityStatusCode.Error ? description : null;
112+
return this;
113+
}
85114

86115
/// <summary>
87116
/// Gets the relationship between the Activity, its parents, and its children in a Trace.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace System.Diagnostics
5+
{
6+
/// <summary>
7+
/// Define the status code of the Activity which indicate the status of the instrumented operation.
8+
/// </summary>
9+
public enum ActivityStatusCode
10+
{
11+
/// <summary>
12+
/// Unset status code is the default value indicating the status code is not initialized.
13+
/// </summary>
14+
Unset = 0,
15+
16+
/// <summary>
17+
/// Status code indicating the operation has been validated and completed successfully.
18+
/// </summary>
19+
Ok = 1,
20+
21+
/// <summary>
22+
/// Status code indicating an error is encountered during the operation.
23+
/// </summary>
24+
Error = 2
25+
}
26+
}

src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,6 +1694,46 @@ public void StructEnumerator_TagsLinkedList()
16941694
Assert.True(method.ReturnType.IsValueType);
16951695
}
16961696

1697+
[Fact]
1698+
public void TestStatus()
1699+
{
1700+
Activity a = new Activity("Status");
1701+
Assert.Equal(ActivityStatusCode.Unset, a.Status);
1702+
Assert.Null(a.StatusDescription);
1703+
1704+
a.SetStatus(ActivityStatusCode.Ok); // Default description null parameter
1705+
Assert.Equal(ActivityStatusCode.Ok, a.Status);
1706+
Assert.Null(a.StatusDescription);
1707+
1708+
a.SetStatus(ActivityStatusCode.Ok, null); // explicit description null parameter
1709+
Assert.Equal(ActivityStatusCode.Ok, a.Status);
1710+
Assert.Null(a.StatusDescription);
1711+
1712+
a.SetStatus(ActivityStatusCode.Ok, "Ignored Description"); // explicit non null description
1713+
Assert.Equal(ActivityStatusCode.Ok, a.Status);
1714+
Assert.Null(a.StatusDescription);
1715+
1716+
a.SetStatus(ActivityStatusCode.Error); // Default description null parameter
1717+
Assert.Equal(ActivityStatusCode.Error, a.Status);
1718+
Assert.Null(a.StatusDescription);
1719+
1720+
a.SetStatus(ActivityStatusCode.Error, "Error Code"); // Default description null parameter
1721+
Assert.Equal(ActivityStatusCode.Error, a.Status);
1722+
Assert.Equal("Error Code", a.StatusDescription);
1723+
1724+
a.SetStatus(ActivityStatusCode.Ok, "Description will reset to null");
1725+
Assert.Equal(ActivityStatusCode.Ok, a.Status);
1726+
Assert.Null(a.StatusDescription);
1727+
1728+
a.SetStatus(ActivityStatusCode.Error, "Another Error Code Description");
1729+
Assert.Equal(ActivityStatusCode.Error, a.Status);
1730+
Assert.Equal("Another Error Code Description", a.StatusDescription);
1731+
1732+
a.SetStatus((ActivityStatusCode) 100, "Another Error Code Description");
1733+
Assert.Equal((ActivityStatusCode) 100, a.Status);
1734+
Assert.Null(a.StatusDescription);
1735+
}
1736+
16971737
[Fact]
16981738
public void StructEnumerator_GenericLinkedList()
16991739
{

0 commit comments

Comments
 (0)