Skip to content

Add Status field to Activity API #46689

Closed
@cijothomas

Description

@cijothomas

DiagnosticSource package was enhanced in 5.0 to achieve OpenTelemetry Tracing API scenarios. There were few areas which were required in OpenTelemetry API, but was not included in 5.0, due to timing issues/OpenTelemetry spec not being ready before .NET 5 cut off time.
This issue is about "Status" field in Activity. At the time of 5.0 , Status API in OpenTelemetry was not finalized. Now that the field and its intent is finalized in the OpenTelemetry spec, proposing to support this in Activity class.

Status spec in OpenTelemetry: https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md#set-status

(Currently, OpenTelemetry works around by storing status inside special Activity.SetTag())

The proposal is added by @tarekgh

Proposal

    public enum ActivityStatusCode
    {
        Unset = 0, // This name picked up from the OTel specs.
        Ok = 1,
        Error = 2
    }

    public readonly struct ActivityStatus : IEquatable<ActivityStatus>
    {
        public ActivityStatus(ActivityStatusCode code, string? description = null);

        public static ActivityStatus Unset => new ActivityStatus(ActivityStatusCode.Unset);
        public static ActivityStatus Ok => new ActivityStatus(ActivityStatusCode.Ok);
        public static ActivityStatus Error => new ActivityStatus(ActivityStatusCode.Error);

        public ActivityStatusCode Code { get; }
        public string? Description { get; }

        public bool Equals(ActivityStatus value) => ...;
        public override bool Equals(object? obj) => ...;
        public static bool operator ==(ActivityStatus left, ActivityStatus right) => ...;
        public static bool operator !=(ActivityStatus left, ActivityStatus right) => ...;
        public override int GetHashCode() => ...;
    }

    public class Activity : IDisposable
    {
        ...
        public ActivityStatus Status { get; set; }
        ...
    }

Alternative Proposals

Alternative 1

This option is proposed to have consistency with the other patterns in the Activity class e.g. SetParentId, SetStartTime...etc.

    public class Activity : IDisposable
    {
        ...
        public ActivityStatus Status { get; } // getter only
        public Activity SetStatus(ActivityStatus status);
        ...
    }

Alternative 2

This option is proposed to have less writing when setting the status. like doing Activty.SetStatus(ActivityStatusCode.Ok, "Success") instead of Activity.Status = new ActivityStatus(ActivityStatusCode.Ok, "Success")

    public class Activity : IDisposable
    {
        ...
        public ActivityStatus Status { get; } // getter only
        public Activity SetStatus(ActivityStatusCode code, string? description);
        ...
    }

If we go with this option, we shouldn't provide the following static properties in the ActivityStatus.

        public static ActivityStatus Unset => new ActivityStatus(ActivityStatusCode.Unset);
        public static ActivityStatus Ok => new ActivityStatus(ActivityStatusCode.Ok);
        public static ActivityStatus Error => new ActivityStatus(ActivityStatusCode.Error);

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions