| File: System\Diagnostics\ActivityContext.cs | Web Access |
| Project: src\runtime\src\libraries\System.Diagnostics.DiagnosticSource\src\System.Diagnostics.DiagnosticSource.csproj (System.Diagnostics.DiagnosticSource) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace System.Diagnostics { /// <summary> /// ActivityContext representation conforms to the w3c TraceContext specification. It contains two identifiers /// a TraceId and a SpanId - along with a set of common TraceFlags and system-specific TraceState values. /// </summary> [DebuggerDisplay("TraceId = {TraceId}, SpanId = {SpanId}, TraceFlags = {TraceFlags}")] public readonly partial struct ActivityContext : IEquatable<ActivityContext> { /// <summary> /// Construct a new object of ActivityContext. /// </summary> /// <param name="traceId">A trace identifier.</param> /// <param name="spanId">A span identifier.</param> /// <param name="traceFlags">Contain details about the trace.</param> /// <param name="traceState">Carries system-specific configuration data.</param> /// <param name="isRemote">Indicate the context is propagated from remote parent.</param> /// <remarks> /// isRemote is not a part of W3C specification. It is needed for the OpenTelemetry scenarios. /// </remarks> public ActivityContext(ActivityTraceId traceId, ActivitySpanId spanId, ActivityTraceFlags traceFlags, string? traceState = null, bool isRemote = false) { TraceId = traceId; SpanId = spanId; TraceFlags = traceFlags; TraceState = traceState; IsRemote = isRemote; } /// <summary> /// The trace identifier /// </summary> public ActivityTraceId TraceId { get; } /// <summary> /// The span identifier /// </summary> public ActivitySpanId SpanId { get; } /// <summary> /// These flags are defined by the W3C standard along with the ID for the activity. /// </summary> public ActivityTraceFlags TraceFlags { get; } /// <summary> /// Holds the W3C 'tracestate' header as a string. /// </summary> public string? TraceState { get; } /// <summary> /// IsRemote indicates if the ActivityContext was propagated from a remote parent. /// </summary> /// <remarks> /// IsRemote is not a part of W3C specification. It is needed for the OpenTelemetry scenarios. /// </remarks> public bool IsRemote { get; } /// <summary> /// Parse W3C trace context headers to ActivityContext object. /// </summary> /// <param name="traceParent">W3C trace parent header.</param> /// <param name="traceState">W3C trace state.</param> /// <param name="isRemote">Indicate the context is propagated from remote parent.</param> /// <param name="context">The ActivityContext object created from the parsing operation.</param> public static bool TryParse(string? traceParent, string? traceState, bool isRemote, out ActivityContext context) { if (traceParent is null) { context = default; return false; } return Activity.TryConvertIdToContext(traceParent, traceState, isRemote, out context); } /// <summary> /// Parse W3C trace context headers to ActivityContext object. /// </summary> /// <param name="traceParent">W3C trace parent header.</param> /// <param name="traceState">W3C trace state.</param> /// <param name="context">The ActivityContext object created from the parsing operation.</param> public static bool TryParse(string? traceParent, string? traceState, out ActivityContext context) => TryParse(traceParent, traceState, isRemote: false, out context); /// <summary> /// Parse W3C trace context headers to ActivityContext object. /// </summary> /// <param name="traceParent">W3C trace parent header.</param> /// <param name="traceState">Trace state.</param> /// <returns> /// The ActivityContext object created from the parsing operation. /// </returns> public static ActivityContext Parse(string traceParent, string? traceState) { ArgumentNullException.ThrowIfNull(traceParent); if (!Activity.TryConvertIdToContext(traceParent, traceState, isRemote: false, out ActivityContext context)) { throw new ArgumentException(SR.InvalidTraceParent); } return context; } public bool Equals(ActivityContext value) => SpanId.Equals(value.SpanId) && TraceId.Equals(value.TraceId) && TraceFlags == value.TraceFlags && TraceState == value.TraceState && IsRemote == value.IsRemote; public override bool Equals([NotNullWhen(true)] object? obj) => (obj is ActivityContext context) ? Equals(context) : false; public static bool operator ==(ActivityContext left, ActivityContext right) => left.Equals(right); public static bool operator !=(ActivityContext left, ActivityContext right) => !(left == right); } }