Skip to content

Commit 378ba54

Browse files
authored
Updating Status based on the new spec (#1313)
* Updating Status based on the new spec commenting OtlpTrace.Status.Type check fixing test undoing change to statuscanonicalcode fixing tests reiley's comments SetStatus now saves enum instead of string fixing changes after conversion fixing redis tests from http spec, if 1xx,2xx,3xx => unset, otherwise error. from rpc spec, if ok => unset, otherwise error. fixing sql tests fixing redis tests * fixing sqlclient framework tests * adding benchmark to status * changing from hashset to simple if, readding statuscode for grpc
1 parent a2e31af commit 378ba54

32 files changed

Lines changed: 151 additions & 386 deletions

File tree

examples/Console/TestRedis.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private static void DoWork(IDatabase db, ActivitySource activitySource)
9696
catch (ArgumentOutOfRangeException e)
9797
{
9898
// Set status upon error
99-
activity.SetTag(SpanAttributeConstants.StatusCodeKey, SpanHelper.GetCachedCanonicalCodeString(Status.Internal.CanonicalCode));
99+
activity.SetTag(SpanAttributeConstants.StatusCodeKey, (int)Status.Error.StatusCode);
100100
activity.SetTag(SpanAttributeConstants.StatusDescriptionKey, e.ToString());
101101
}
102102

src/OpenTelemetry.Api/Trace/ActivityExtensions.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static void SetStatus(this Activity activity, Status status)
4242
{
4343
Debug.Assert(activity != null, "Activity should not be null");
4444

45-
activity.SetTag(SpanAttributeConstants.StatusCodeKey, SpanHelper.GetCachedCanonicalCodeString(status.CanonicalCode));
45+
activity.SetTag(SpanAttributeConstants.StatusCodeKey, (int)status.StatusCode);
4646
if (!string.IsNullOrEmpty(status.Description))
4747
{
4848
activity.SetTag(SpanAttributeConstants.StatusDescriptionKey, status.Description);
@@ -66,9 +66,14 @@ public static Status GetStatus(this Activity activity)
6666

6767
ActivityTagsEnumeratorFactory<ActivityStatusTagEnumerator>.Enumerate(activity, ref state);
6868

69-
var status = SpanHelper.ResolveCanonicalCodeToStatus(state.StatusCode);
69+
if (!state.IsValid)
70+
{
71+
return default;
72+
}
7073

71-
if (status.IsValid && !string.IsNullOrEmpty(state.StatusDescription))
74+
var status = new Status(state.StatusCode);
75+
76+
if (!string.IsNullOrEmpty(state.StatusDescription))
7277
{
7378
return status.WithDescription(state.StatusDescription);
7479
}
@@ -224,7 +229,9 @@ public bool ForEach(KeyValuePair<string, object> item)
224229

225230
private struct ActivityStatusTagEnumerator : IActivityEnumerator<KeyValuePair<string, object>>
226231
{
227-
public string StatusCode { get; private set; }
232+
public bool IsValid { get; private set; }
233+
234+
public StatusCode StatusCode { get; private set; }
228235

229236
public string StatusDescription { get; private set; }
230237

@@ -233,14 +240,15 @@ public bool ForEach(KeyValuePair<string, object> item)
233240
switch (item.Key)
234241
{
235242
case SpanAttributeConstants.StatusCodeKey:
236-
this.StatusCode = item.Value as string;
243+
this.StatusCode = (StatusCode)item.Value;
244+
this.IsValid = this.StatusCode == StatusCode.Error || this.StatusCode == StatusCode.Ok || this.StatusCode == StatusCode.Unset;
237245
break;
238246
case SpanAttributeConstants.StatusDescriptionKey:
239247
this.StatusDescription = item.Value as string;
240248
break;
241249
}
242250

243-
return this.StatusCode == null || this.StatusDescription == null;
251+
return this.IsValid || this.StatusDescription == null;
244252
}
245253
}
246254

src/OpenTelemetry.Api/Trace/SpanHelper.cs

Lines changed: 10 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -14,103 +14,29 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17-
using System;
18-
using System.Collections.Generic;
19-
2017
namespace OpenTelemetry.Trace
2118
{
2219
/// <summary>
2320
/// A collection of helper methods to be used when building spans.
2421
/// </summary>
2522
public static class SpanHelper
2623
{
27-
#pragma warning disable CA1805 // Do not initialize unnecessarily
28-
private static readonly Status DefaultStatus = default;
29-
#pragma warning restore CA1805 // Do not initialize unnecessarily
30-
private static readonly Dictionary<StatusCanonicalCode, string> StatusCanonicalCodeToStringCache = new Dictionary<StatusCanonicalCode, string>()
31-
{
32-
[StatusCanonicalCode.Ok] = StatusCanonicalCode.Ok.ToString(),
33-
[StatusCanonicalCode.Cancelled] = StatusCanonicalCode.Cancelled.ToString(),
34-
[StatusCanonicalCode.Unknown] = StatusCanonicalCode.Unknown.ToString(),
35-
[StatusCanonicalCode.InvalidArgument] = StatusCanonicalCode.InvalidArgument.ToString(),
36-
[StatusCanonicalCode.DeadlineExceeded] = StatusCanonicalCode.DeadlineExceeded.ToString(),
37-
[StatusCanonicalCode.NotFound] = StatusCanonicalCode.NotFound.ToString(),
38-
[StatusCanonicalCode.AlreadyExists] = StatusCanonicalCode.AlreadyExists.ToString(),
39-
[StatusCanonicalCode.PermissionDenied] = StatusCanonicalCode.PermissionDenied.ToString(),
40-
[StatusCanonicalCode.ResourceExhausted] = StatusCanonicalCode.ResourceExhausted.ToString(),
41-
[StatusCanonicalCode.FailedPrecondition] = StatusCanonicalCode.FailedPrecondition.ToString(),
42-
[StatusCanonicalCode.Aborted] = StatusCanonicalCode.Aborted.ToString(),
43-
[StatusCanonicalCode.OutOfRange] = StatusCanonicalCode.OutOfRange.ToString(),
44-
[StatusCanonicalCode.Unimplemented] = StatusCanonicalCode.Unimplemented.ToString(),
45-
[StatusCanonicalCode.Internal] = StatusCanonicalCode.Internal.ToString(),
46-
[StatusCanonicalCode.Unavailable] = StatusCanonicalCode.Unavailable.ToString(),
47-
[StatusCanonicalCode.DataLoss] = StatusCanonicalCode.DataLoss.ToString(),
48-
[StatusCanonicalCode.Unauthenticated] = StatusCanonicalCode.Unauthenticated.ToString(),
49-
};
50-
51-
/// <summary>
52-
/// Helper method that returns the string version of a <see cref="StatusCanonicalCode"/> using a cache to save on allocations.
53-
/// </summary>
54-
/// <param name="statusCanonicalCode"><see cref="StatusCanonicalCode"/>.</param>
55-
/// <returns>String version of the supplied <see cref="StatusCanonicalCode"/>.</returns>
56-
public static string GetCachedCanonicalCodeString(StatusCanonicalCode statusCanonicalCode)
57-
{
58-
if (!StatusCanonicalCodeToStringCache.TryGetValue(statusCanonicalCode, out string canonicalCode))
59-
{
60-
return statusCanonicalCode.ToString();
61-
}
62-
63-
return canonicalCode;
64-
}
65-
6624
/// <summary>
6725
/// Helper method that populates span properties from http status code according
68-
/// to https://github.com/open-telemetry/opentelemetry-specification/blob/2316771e7e0ca3bfe9b2286d13e3a41ded6b8858/specification/data-http.md.
26+
/// to https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md#status.
6927
/// </summary>
7028
/// <param name="httpStatusCode">Http status code.</param>
7129
/// <returns>Resolved span <see cref="Status"/> for the Http status code.</returns>
7230
public static Status ResolveSpanStatusForHttpStatusCode(int httpStatusCode)
7331
{
74-
var newStatus = Status.Unknown;
32+
var status = Status.Error;
7533

7634
if (httpStatusCode >= 100 && httpStatusCode <= 399)
7735
{
78-
newStatus = Status.Ok;
79-
}
80-
else if (httpStatusCode == 400)
81-
{
82-
newStatus = Status.InvalidArgument;
83-
}
84-
else if (httpStatusCode == 401)
85-
{
86-
newStatus = Status.Unauthenticated;
87-
}
88-
else if (httpStatusCode == 403)
89-
{
90-
newStatus = Status.PermissionDenied;
91-
}
92-
else if (httpStatusCode == 404)
93-
{
94-
newStatus = Status.NotFound;
95-
}
96-
else if (httpStatusCode == 429)
97-
{
98-
newStatus = Status.ResourceExhausted;
99-
}
100-
else if (httpStatusCode == 501)
101-
{
102-
newStatus = Status.Unimplemented;
103-
}
104-
else if (httpStatusCode == 503)
105-
{
106-
newStatus = Status.Unavailable;
107-
}
108-
else if (httpStatusCode == 504)
109-
{
110-
newStatus = Status.DeadlineExceeded;
36+
status = Status.Unset;
11137
}
11238

113-
return newStatus;
39+
return status;
11440
}
11541

11642
/// <summary>
@@ -121,51 +47,17 @@ public static Status ResolveSpanStatusForHttpStatusCode(int httpStatusCode)
12147
/// <returns>Resolved span <see cref="Status"/> for the Grpc status code.</returns>
12248
public static Status ResolveSpanStatusForGrpcStatusCode(int statusCode)
12349
{
124-
var newStatus = Status.Unknown;
50+
var status = Status.Error;
12551

12652
if (typeof(StatusCanonicalCode).IsEnumDefined(statusCode))
12753
{
128-
newStatus = new Status((StatusCanonicalCode)statusCode);
54+
status = ((StatusCanonicalCode)statusCode) switch
55+
{
56+
StatusCanonicalCode.Ok => Status.Unset,
57+
_ => Status.Error,
58+
};
12959
}
13060

131-
return newStatus;
132-
}
133-
134-
/// <summary>
135-
/// Helper method that returns Status from <see cref="StatusCanonicalCode"/> to save on allocations.
136-
/// </summary>
137-
/// <param name="statusCanonicalCode"><see cref="StatusCanonicalCode"/>.</param>
138-
/// <returns>Resolved span <see cref="Status"/> for the Canonical status code.</returns>
139-
public static Status ResolveCanonicalCodeToStatus(string statusCanonicalCode)
140-
{
141-
bool success = Enum.TryParse(statusCanonicalCode, out StatusCanonicalCode canonicalCode);
142-
143-
if (!success)
144-
{
145-
return DefaultStatus;
146-
}
147-
148-
var status = canonicalCode switch
149-
{
150-
StatusCanonicalCode.Cancelled => Status.Cancelled,
151-
StatusCanonicalCode.Unknown => Status.Unknown,
152-
StatusCanonicalCode.InvalidArgument => Status.InvalidArgument,
153-
StatusCanonicalCode.DeadlineExceeded => Status.DeadlineExceeded,
154-
StatusCanonicalCode.NotFound => Status.NotFound,
155-
StatusCanonicalCode.AlreadyExists => Status.AlreadyExists,
156-
StatusCanonicalCode.PermissionDenied => Status.PermissionDenied,
157-
StatusCanonicalCode.ResourceExhausted => Status.ResourceExhausted,
158-
StatusCanonicalCode.FailedPrecondition => Status.FailedPrecondition,
159-
StatusCanonicalCode.Aborted => Status.Aborted,
160-
StatusCanonicalCode.OutOfRange => Status.OutOfRange,
161-
StatusCanonicalCode.Unimplemented => Status.Unimplemented,
162-
StatusCanonicalCode.Internal => Status.Internal,
163-
StatusCanonicalCode.Unavailable => Status.Unavailable,
164-
StatusCanonicalCode.DataLoss => Status.DataLoss,
165-
StatusCanonicalCode.Unauthenticated => Status.Unauthenticated,
166-
_ => Status.Ok,
167-
};
168-
16961
return status;
17062
}
17163
}

0 commit comments

Comments
 (0)