From ba8a0e4c131054217555aae5c8a210da3a4b7c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Wed, 28 Aug 2024 18:56:15 +0200 Subject: [PATCH] [Propagators] Nullable annotations (#5767) --- .../.publicApi/Stable/PublicAPI.Shipped.txt | 36 +++++++++---------- .../Context/Propagation/B3Propagator.cs | 13 ++++--- .../Context/Propagation/BaggagePropagator.cs | 26 +++++++++----- .../Propagation/CompositeTextMapPropagator.cs | 6 ++-- .../Propagation/NoopTextMapPropagator.cs | 6 ++-- .../Context/Propagation/PropagationContext.cs | 4 ++- .../Context/Propagation/Propagators.cs | 2 ++ .../Context/Propagation/TextMapPropagator.cs | 12 ++++--- .../Propagation/TraceContextPropagator.cs | 12 ++++--- .../Context/Propagation/TraceStateUtilsNew.cs | 8 +++-- src/OpenTelemetry.Api/Trace/SpanContext.cs | 5 +-- .../.publicApi/PublicAPI.Shipped.txt | 13 +++---- .../B3Propagator.cs | 11 +++--- .../JaegerPropagator.cs | 4 +-- ...penTelemetry.Extensions.Propagators.csproj | 3 -- .../Context/Propagation/B3PropagatorTest.cs | 10 ++++-- .../Propagation/BaggagePropagatorTest.cs | 14 +++++--- .../Propagation/CompositePropagatorTest.cs | 6 ++-- .../Context/Propagation/PropagatorsTest.cs | 2 ++ .../Context/Propagation/TestPropagator.cs | 6 ++-- .../Propagation/TracestateUtilsTests.cs | 11 +++++- .../B3PropagatorTest.cs | 9 +++-- .../JaegerPropagatorTest.cs | 4 +-- ...emetry.Extensions.Propagators.Tests.csproj | 2 -- 24 files changed, 141 insertions(+), 84 deletions(-) diff --git a/src/OpenTelemetry.Api/.publicApi/Stable/PublicAPI.Shipped.txt b/src/OpenTelemetry.Api/.publicApi/Stable/PublicAPI.Shipped.txt index 94729fd41bd..46b63e18fee 100644 --- a/src/OpenTelemetry.Api/.publicApi/Stable/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry.Api/.publicApi/Stable/PublicAPI.Shipped.txt @@ -1,7 +1,4 @@ #nullable enable -~abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -~abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Fields.get -> System.Collections.Generic.ISet -~abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void ~OpenTelemetry.Baggage.GetBaggage() -> System.Collections.Generic.IReadOnlyDictionary ~OpenTelemetry.Baggage.GetBaggage(string name) -> string ~OpenTelemetry.Baggage.GetEnumerator() -> System.Collections.Generic.Dictionary.Enumerator @@ -14,26 +11,12 @@ ~OpenTelemetry.Context.AsyncLocalRuntimeContextSlot.Value.set -> void ~OpenTelemetry.Context.IRuntimeContextSlotValueAccessor.Value.get -> object ~OpenTelemetry.Context.IRuntimeContextSlotValueAccessor.Value.set -> void -~OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.CompositeTextMapPropagator(System.Collections.Generic.IEnumerable propagators) -> void ~OpenTelemetry.Context.RuntimeContextSlot.Name.get -> string ~OpenTelemetry.Context.RuntimeContextSlot.RuntimeContextSlot(string name) -> void ~OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.ThreadLocalRuntimeContextSlot(string name) -> void ~OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.Value.get -> object ~OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.Value.set -> void ~override OpenTelemetry.Baggage.Equals(object obj) -> bool -~override OpenTelemetry.Context.Propagation.B3Propagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -~override OpenTelemetry.Context.Propagation.B3Propagator.Fields.get -> System.Collections.Generic.ISet -~override OpenTelemetry.Context.Propagation.B3Propagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void -~override OpenTelemetry.Context.Propagation.BaggagePropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -~override OpenTelemetry.Context.Propagation.BaggagePropagator.Fields.get -> System.Collections.Generic.ISet -~override OpenTelemetry.Context.Propagation.BaggagePropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void -~override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -~override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Fields.get -> System.Collections.Generic.ISet -~override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void -~override OpenTelemetry.Context.Propagation.PropagationContext.Equals(object obj) -> bool -~override OpenTelemetry.Context.Propagation.TraceContextPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -~override OpenTelemetry.Context.Propagation.TraceContextPropagator.Fields.get -> System.Collections.Generic.ISet -~override OpenTelemetry.Context.Propagation.TraceContextPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void ~static OpenTelemetry.Baggage.Create(System.Collections.Generic.Dictionary baggageItems = null) -> OpenTelemetry.Baggage ~static OpenTelemetry.Baggage.GetBaggage(OpenTelemetry.Baggage baggage = default(OpenTelemetry.Baggage)) -> System.Collections.Generic.IReadOnlyDictionary ~static OpenTelemetry.Baggage.GetBaggage(string name, OpenTelemetry.Baggage baggage = default(OpenTelemetry.Baggage)) -> string @@ -41,7 +24,6 @@ ~static OpenTelemetry.Baggage.RemoveBaggage(string name, OpenTelemetry.Baggage baggage = default(OpenTelemetry.Baggage)) -> OpenTelemetry.Baggage ~static OpenTelemetry.Baggage.SetBaggage(string name, string value, OpenTelemetry.Baggage baggage = default(OpenTelemetry.Baggage)) -> OpenTelemetry.Baggage ~static OpenTelemetry.Baggage.SetBaggage(System.Collections.Generic.IEnumerable> baggageItems, OpenTelemetry.Baggage baggage = default(OpenTelemetry.Baggage)) -> OpenTelemetry.Baggage -~static OpenTelemetry.Context.Propagation.Propagators.DefaultTextMapPropagator.get -> OpenTelemetry.Context.Propagation.TextMapPropagator ~static OpenTelemetry.Context.RuntimeContext.ContextSlotType.get -> System.Type ~static OpenTelemetry.Context.RuntimeContext.ContextSlotType.set -> void ~static OpenTelemetry.Context.RuntimeContext.GetSlot(string slotName) -> OpenTelemetry.Context.RuntimeContextSlot @@ -50,6 +32,9 @@ ~static OpenTelemetry.Context.RuntimeContext.RegisterSlot(string slotName) -> OpenTelemetry.Context.RuntimeContextSlot ~static OpenTelemetry.Context.RuntimeContext.SetValue(string slotName, object value) -> void ~static OpenTelemetry.Context.RuntimeContext.SetValue(string slotName, T value) -> void +abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Fields.get -> System.Collections.Generic.ISet? +abstract OpenTelemetry.Context.Propagation.TextMapPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void abstract OpenTelemetry.Context.RuntimeContextSlot.Get() -> T abstract OpenTelemetry.Context.RuntimeContextSlot.Set(T value) -> void abstract OpenTelemetry.Logs.LoggerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! @@ -73,6 +58,7 @@ OpenTelemetry.Context.IRuntimeContextSlotValueAccessor OpenTelemetry.Context.Propagation.B3Propagator OpenTelemetry.Context.Propagation.B3Propagator.B3Propagator() -> void OpenTelemetry.Context.Propagation.B3Propagator.B3Propagator(bool singleHeader) -> void +OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.CompositeTextMapPropagator(System.Collections.Generic.IEnumerable! propagators) -> void OpenTelemetry.Context.Propagation.BaggagePropagator OpenTelemetry.Context.Propagation.BaggagePropagator.BaggagePropagator() -> void OpenTelemetry.Context.Propagation.CompositeTextMapPropagator @@ -188,7 +174,20 @@ OpenTelemetry.Trace.TracerProviderBuilder.TracerProviderBuilder() -> void override OpenTelemetry.Baggage.GetHashCode() -> int override OpenTelemetry.Context.AsyncLocalRuntimeContextSlot.Get() -> T override OpenTelemetry.Context.AsyncLocalRuntimeContextSlot.Set(T value) -> void +override OpenTelemetry.Context.Propagation.B3Propagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Context.Propagation.B3Propagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Context.Propagation.B3Propagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void +override OpenTelemetry.Context.Propagation.BaggagePropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Context.Propagation.BaggagePropagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Context.Propagation.BaggagePropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void +override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Context.Propagation.CompositeTextMapPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void override OpenTelemetry.Context.Propagation.PropagationContext.GetHashCode() -> int +override OpenTelemetry.Context.Propagation.PropagationContext.Equals(object? obj) -> bool +override OpenTelemetry.Context.Propagation.TraceContextPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Context.Propagation.TraceContextPropagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Context.Propagation.TraceContextPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void override OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.Dispose(bool disposing) -> void override OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.Get() -> T override OpenTelemetry.Context.ThreadLocalRuntimeContextSlot.Set(T value) -> void @@ -208,6 +207,7 @@ static OpenTelemetry.Baggage.operator !=(OpenTelemetry.Baggage left, OpenTelemet static OpenTelemetry.Baggage.operator ==(OpenTelemetry.Baggage left, OpenTelemetry.Baggage right) -> bool static OpenTelemetry.Context.Propagation.PropagationContext.operator !=(OpenTelemetry.Context.Propagation.PropagationContext left, OpenTelemetry.Context.Propagation.PropagationContext right) -> bool static OpenTelemetry.Context.Propagation.PropagationContext.operator ==(OpenTelemetry.Context.Propagation.PropagationContext left, OpenTelemetry.Context.Propagation.PropagationContext right) -> bool +static OpenTelemetry.Context.Propagation.Propagators.DefaultTextMapPropagator.get -> OpenTelemetry.Context.Propagation.TextMapPropagator! static OpenTelemetry.Trace.ActivityExtensions.GetStatus(this System.Diagnostics.Activity? activity) -> OpenTelemetry.Trace.Status static OpenTelemetry.Trace.ActivityExtensions.RecordException(this System.Diagnostics.Activity? activity, System.Exception? ex, in System.Diagnostics.TagList tags) -> void static OpenTelemetry.Trace.ActivityExtensions.RecordException(this System.Diagnostics.Activity? activity, System.Exception? ex) -> void diff --git a/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs b/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs index 10b4aee1d81..5969d2499c1 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; using System.Text; using OpenTelemetry.Internal; @@ -66,7 +68,7 @@ public B3Propagator(bool singleHeader) /// [Obsolete("Use B3Propagator class from OpenTelemetry.Extensions.Propagators namespace, shipped as part of OpenTelemetry.Extensions.Propagators package.")] #pragma warning disable CS0809 // Obsolete member overrides non-obsolete member - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) #pragma warning restore CS0809 // Obsolete member overrides non-obsolete member { if (context.ActivityContext.IsValid()) @@ -146,7 +148,7 @@ public override void Inject(PropagationContext context, T carrier, Action(PropagationContext context, T carrier, Func> getter) + private static PropagationContext ExtractFromMultipleHeaders(PropagationContext context, T carrier, Func?> getter) { try { @@ -179,7 +181,8 @@ private static PropagationContext ExtractFromMultipleHeaders(PropagationConte } var traceOptions = ActivityTraceFlags.None; - if (SampledValues.Contains(getter(carrier, XB3Sampled)?.FirstOrDefault()) + var xb3Sampled = getter(carrier, XB3Sampled)?.FirstOrDefault(); + if ((xb3Sampled != null && SampledValues.Contains(xb3Sampled)) || FlagsValue.Equals(getter(carrier, XB3Flags)?.FirstOrDefault(), StringComparison.Ordinal)) { traceOptions |= ActivityTraceFlags.Recorded; @@ -196,7 +199,7 @@ private static PropagationContext ExtractFromMultipleHeaders(PropagationConte } } - private static PropagationContext ExtractFromSingleHeader(PropagationContext context, T carrier, Func> getter) + private static PropagationContext ExtractFromSingleHeader(PropagationContext context, T carrier, Func?> getter) { try { @@ -206,7 +209,7 @@ private static PropagationContext ExtractFromSingleHeader(PropagationContext return context; } - var parts = header.Split(XB3CombinedDelimiter); + var parts = header!.Split(XB3CombinedDelimiter); if (parts.Length < 2 || parts.Length > 4) { return context; diff --git a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs index 57bdb453b8f..17bbf13110b 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs @@ -1,6 +1,11 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + +#if NET +using System.Diagnostics.CodeAnalysis; +#endif using System.Net; using System.Text; using OpenTelemetry.Internal; @@ -24,7 +29,7 @@ public class BaggagePropagator : TextMapPropagator public override ISet Fields => new HashSet { BaggageHeaderName }; /// - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { if (context.Baggage != default) { @@ -46,16 +51,16 @@ public override PropagationContext Extract(PropagationContext context, T carr try { - Dictionary baggage = null; var baggageCollection = getter(carrier, BaggageHeaderName); if (baggageCollection?.Any() ?? false) { - TryExtractBaggage(baggageCollection.ToArray(), out baggage); + if (TryExtractBaggage(baggageCollection.ToArray(), out var baggage)) + { + return new PropagationContext(context.ActivityContext, new Baggage(baggage)); + } } - return new PropagationContext( - context.ActivityContext, - baggage == null ? context.Baggage : new Baggage(baggage)); + return new PropagationContext(context.ActivityContext, context.Baggage); } catch (Exception ex) { @@ -102,11 +107,16 @@ public override void Inject(PropagationContext context, T carrier, Action baggage) + internal static bool TryExtractBaggage( + string[] baggageCollection, +#if NET + [NotNullWhen(true)] +#endif + out Dictionary? baggage) { int baggageLength = -1; bool done = false; - Dictionary baggageDictionary = null; + Dictionary? baggageDictionary = null; foreach (var item in baggageCollection) { diff --git a/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs index 016ef0fda4d..5b6939842b0 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using OpenTelemetry.Internal; namespace OpenTelemetry.Context.Propagation; @@ -43,7 +45,7 @@ public CompositeTextMapPropagator(IEnumerable propagators) } else { - ISet fields = this.propagators[0].Fields; + ISet? fields = this.propagators[0].Fields; var output = fields is not null ? new HashSet(fields) @@ -66,7 +68,7 @@ public CompositeTextMapPropagator(IEnumerable propagators) public override ISet Fields => this.allFields; /// - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { for (int i = 0; i < this.propagators.Count; i++) { diff --git a/src/OpenTelemetry.Api/Context/Propagation/NoopTextMapPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/NoopTextMapPropagator.cs index 03dd45785d4..6efd538e820 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/NoopTextMapPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/NoopTextMapPropagator.cs @@ -1,15 +1,17 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + namespace OpenTelemetry.Context.Propagation; internal sealed class NoopTextMapPropagator : TextMapPropagator { private static readonly PropagationContext DefaultPropagationContext = default; - public override ISet Fields => null; + public override ISet? Fields => null; - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { return DefaultPropagationContext; } diff --git a/src/OpenTelemetry.Api/Context/Propagation/PropagationContext.cs b/src/OpenTelemetry.Api/Context/Propagation/PropagationContext.cs index 77b6c71e77a..bb35c88cadc 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/PropagationContext.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/PropagationContext.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; namespace OpenTelemetry.Context.Propagation; @@ -53,7 +55,7 @@ public bool Equals(PropagationContext value) } /// - public override bool Equals(object obj) => (obj is PropagationContext context) && this.Equals(context); + public override bool Equals(object? obj) => (obj is PropagationContext context) && this.Equals(context); /// public override int GetHashCode() diff --git a/src/OpenTelemetry.Api/Context/Propagation/Propagators.cs b/src/OpenTelemetry.Api/Context/Propagation/Propagators.cs index c1dab62400d..ee9c59931f5 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/Propagators.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/Propagators.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + namespace OpenTelemetry.Context.Propagation; /// diff --git a/src/OpenTelemetry.Api/Context/Propagation/TextMapPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/TextMapPropagator.cs index 1000b317bf5..547d6a1890c 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/TextMapPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/TextMapPropagator.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + namespace OpenTelemetry.Context.Propagation; /// @@ -15,12 +17,12 @@ public abstract class TextMapPropagator /// * allow pre-allocation of fields, especially in systems like gRPC Metadata /// * allow a single-pass over an iterator (ex OpenTracing has no getter in TextMap). /// - public abstract ISet Fields { get; } + public abstract ISet? Fields { get; } /// /// Injects the context into a carrier. /// - /// Type of an object to set context on. Typically HttpRequest or similar. + /// Type of object to set context on. Typically,HttpRequest or similar. /// The default context to transmit over the wire. /// Object to set context on. Instance of this object will be passed to setter. /// Action that will set name and value pair on the object. @@ -29,10 +31,10 @@ public abstract class TextMapPropagator /// /// Extracts the context from a carrier. /// - /// Type of object to extract context from. Typically HttpRequest or similar. + /// Type of object to extract context from. Typically, HttpRequest or similar. /// The default context to be used if Extract fails. /// Object to extract context from. Instance of this object will be passed to the getter. /// Function that will return string value of a key with the specified name. - /// Context from it's text representation. - public abstract PropagationContext Extract(PropagationContext context, T carrier, Func> getter); + /// Context from its text representation. + public abstract PropagationContext Extract(PropagationContext context, T carrier, Func?> getter); } diff --git a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs index b37fb93cc08..dfa828e088b 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Buffers; using System.Diagnostics; using System.Runtime.CompilerServices; @@ -34,7 +36,7 @@ public class TraceContextPropagator : TextMapPropagator public override ISet Fields => new HashSet { TraceState, TraceParent }; /// - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { if (context.ActivityContext.IsValid()) { @@ -72,7 +74,7 @@ public override PropagationContext Extract(PropagationContext context, T carr return context; } - string tracestate = null; + string? tracestate = null; var tracestateCollection = getter(carrier, TraceState); if (tracestateCollection?.Any() ?? false) { @@ -122,7 +124,7 @@ public override void Inject(PropagationContext context, T carrier, Action 0) { setter(carrier, TraceState, tracestateStr); @@ -224,7 +226,7 @@ internal static bool TryExtractTracestate(IEnumerable tracestateCollecti { tracestateResult = string.Empty; - char[] rentedArray = null; + char[]? rentedArray = null; Span traceStateBuffer = stackalloc char[128]; // 256B Span keyLookupBuffer = stackalloc char[96]; // 192B (3x32 keys) int keys = 0; @@ -379,7 +381,7 @@ internal static bool TryExtractTracestate(IEnumerable tracestateCollecti } [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void GrowBuffer(ref char[] array, ref Span buffer) + static void GrowBuffer(ref char[]? array, ref Span buffer) { var newBuffer = ArrayPool.Shared.Rent(buffer.Length * 2); diff --git a/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtilsNew.cs b/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtilsNew.cs index 717e1a94584..e1fe192bd6d 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtilsNew.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtilsNew.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; using System.Text; using OpenTelemetry.Internal; @@ -56,7 +58,7 @@ internal static bool AppendTraceState(string traceStateString, List(keyStr, value.ToString())); + tracestate!.Add(new KeyValuePair(keyStr, value.ToString())); } else { @@ -82,7 +84,7 @@ internal static bool AppendTraceState(string traceStateString, List> traceState) + internal static string GetString(IEnumerable>? traceState) { if (traceState == null || !traceState.Any()) { diff --git a/src/OpenTelemetry.Api/Trace/SpanContext.cs b/src/OpenTelemetry.Api/Trace/SpanContext.cs index b94f50cc5f6..dff0de021c2 100644 --- a/src/OpenTelemetry.Api/Trace/SpanContext.cs +++ b/src/OpenTelemetry.Api/Trace/SpanContext.cs @@ -85,13 +85,14 @@ public IEnumerable> TraceState { get { - if (string.IsNullOrEmpty(this.ActivityContext.TraceState)) + var traceState = this.ActivityContext.TraceState; + if (string.IsNullOrEmpty(traceState)) { return Enumerable.Empty>(); } var traceStateResult = new List>(); - TraceStateUtilsNew.AppendTraceState(this.ActivityContext.TraceState, traceStateResult); + TraceStateUtilsNew.AppendTraceState(traceState!, traceStateResult); return traceStateResult; } } diff --git a/src/OpenTelemetry.Extensions.Propagators/.publicApi/PublicAPI.Shipped.txt b/src/OpenTelemetry.Extensions.Propagators/.publicApi/PublicAPI.Shipped.txt index eadd932c939..3379641fda2 100644 --- a/src/OpenTelemetry.Extensions.Propagators/.publicApi/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry.Extensions.Propagators/.publicApi/PublicAPI.Shipped.txt @@ -1,11 +1,12 @@ +#nullable enable OpenTelemetry.Extensions.Propagators.B3Propagator OpenTelemetry.Extensions.Propagators.B3Propagator.B3Propagator() -> void OpenTelemetry.Extensions.Propagators.B3Propagator.B3Propagator(bool singleHeader) -> void OpenTelemetry.Extensions.Propagators.JaegerPropagator OpenTelemetry.Extensions.Propagators.JaegerPropagator.JaegerPropagator() -> void -override OpenTelemetry.Extensions.Propagators.B3Propagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -override OpenTelemetry.Extensions.Propagators.B3Propagator.Fields.get -> System.Collections.Generic.ISet -override OpenTelemetry.Extensions.Propagators.B3Propagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void -override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func> getter) -> OpenTelemetry.Context.Propagation.PropagationContext -override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Fields.get -> System.Collections.Generic.ISet -override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action setter) -> void +override OpenTelemetry.Extensions.Propagators.B3Propagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Extensions.Propagators.B3Propagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Extensions.Propagators.B3Propagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void +override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Extract(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Func?>! getter) -> OpenTelemetry.Context.Propagation.PropagationContext +override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Fields.get -> System.Collections.Generic.ISet! +override OpenTelemetry.Extensions.Propagators.JaegerPropagator.Inject(OpenTelemetry.Context.Propagation.PropagationContext context, T carrier, System.Action! setter) -> void diff --git a/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs b/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs index 37ced1218e8..45239981f0a 100644 --- a/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs +++ b/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs @@ -62,7 +62,7 @@ public B3Propagator(bool singleHeader) public override ISet Fields => AllFields; /// - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { if (context.ActivityContext.IsValid()) { @@ -138,7 +138,7 @@ public override void Inject(PropagationContext context, T carrier, Action(PropagationContext context, T carrier, Func> getter) + private static PropagationContext ExtractFromMultipleHeaders(PropagationContext context, T carrier, Func?> getter) { try { @@ -171,7 +171,8 @@ private static PropagationContext ExtractFromMultipleHeaders(PropagationConte } var traceOptions = ActivityTraceFlags.None; - if (SampledValues.Contains(getter(carrier, XB3Sampled)?.FirstOrDefault()) + var xb3Sampled = getter(carrier, XB3Sampled)?.FirstOrDefault(); + if ((xb3Sampled != null && SampledValues.Contains(xb3Sampled)) || FlagsValue.Equals(getter(carrier, XB3Flags)?.FirstOrDefault(), StringComparison.Ordinal)) { traceOptions |= ActivityTraceFlags.Recorded; @@ -188,7 +189,7 @@ private static PropagationContext ExtractFromMultipleHeaders(PropagationConte } } - private static PropagationContext ExtractFromSingleHeader(PropagationContext context, T carrier, Func> getter) + private static PropagationContext ExtractFromSingleHeader(PropagationContext context, T carrier, Func?> getter) { try { @@ -198,7 +199,7 @@ private static PropagationContext ExtractFromSingleHeader(PropagationContext return context; } - var parts = header.Split(XB3CombinedDelimiter); + var parts = header!.Split(XB3CombinedDelimiter); if (parts.Length < 2 || parts.Length > 4) { return context; diff --git a/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs b/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs index 472b719ded0..045fd93e581 100644 --- a/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs +++ b/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs @@ -26,7 +26,7 @@ public class JaegerPropagator : TextMapPropagator public override ISet Fields => new HashSet { JaegerHeader }; /// - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { if (context.ActivityContext.IsValid()) { @@ -56,7 +56,7 @@ public override PropagationContext Extract(PropagationContext context, T carr return context; } - var jaegerHeaderParsed = TryExtractTraceContext(jaegerHeader, out var traceId, out var spanId, out var traceOptions); + var jaegerHeaderParsed = TryExtractTraceContext(jaegerHeader!, out var traceId, out var spanId, out var traceOptions); if (!jaegerHeaderParsed) { diff --git a/src/OpenTelemetry.Extensions.Propagators/OpenTelemetry.Extensions.Propagators.csproj b/src/OpenTelemetry.Extensions.Propagators/OpenTelemetry.Extensions.Propagators.csproj index c099b609a25..01ae76f4a17 100644 --- a/src/OpenTelemetry.Extensions.Propagators/OpenTelemetry.Extensions.Propagators.csproj +++ b/src/OpenTelemetry.Extensions.Propagators/OpenTelemetry.Extensions.Propagators.csproj @@ -5,9 +5,6 @@ $(PackageTags);distributed-tracing;AspNet;AspNetCore;B3 core- true - - - disable diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/B3PropagatorTest.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/B3PropagatorTest.cs index 8cc20c6ff5e..1cef6ae90e9 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/B3PropagatorTest.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/B3PropagatorTest.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; using Xunit; using Xunit.Abstractions; @@ -24,8 +26,12 @@ public class B3PropagatorTest private static readonly Func, string, IEnumerable> Getter = (d, k) => { - d.TryGetValue(k, out var v); - return new string[] { v }; + if (d.TryGetValue(k, out var v)) + { + return [v]; + } + + return []; }; private readonly B3Propagator b3propagator = new(); diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTest.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTest.cs index 097f63e039d..0f236081331 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTest.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTest.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Net; using Xunit; @@ -11,8 +13,12 @@ public class BaggagePropagatorTest private static readonly Func, string, IEnumerable> Getter = (d, k) => { - d.TryGetValue(k, out var v); - return new string[] { v }; + if (d.TryGetValue(k, out var v)) + { + return [v]; + } + + return []; }; private static readonly Func>, string, IEnumerable> GetterList = @@ -38,7 +44,7 @@ public void ValidateFieldsProperty() [Fact] public void ValidateDefaultCarrierExtraction() { - var propagationContext = this.baggage.Extract(default, null, null); + var propagationContext = this.baggage.Extract(default, null!, null!); Assert.Equal(default, propagationContext); } @@ -46,7 +52,7 @@ public void ValidateDefaultCarrierExtraction() public void ValidateDefaultGetterExtraction() { var carrier = new Dictionary(); - var propagationContext = this.baggage.Extract(default, carrier, null); + var propagationContext = this.baggage.Extract(default, carrier, null!); Assert.Equal(default, propagationContext); } diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/CompositePropagatorTest.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/CompositePropagatorTest.cs index 0fcf7a1952f..4009ed756a6 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/CompositePropagatorTest.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/CompositePropagatorTest.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; using Xunit; @@ -33,7 +35,7 @@ public class CompositePropagatorTest [Fact] public void CompositePropagator_NullTextMapPropagators() { - Assert.Throws(() => new CompositeTextMapPropagator(null)); + Assert.Throws(() => new CompositeTextMapPropagator(null!)); } [Fact] @@ -46,7 +48,7 @@ public void CompositePropagator_EmptyTextMapPropagators() [Fact] public void CompositePropagator_NullTextMapPropagator() { - var compositePropagator = new CompositeTextMapPropagator([null]); + var compositePropagator = new CompositeTextMapPropagator([null!]); Assert.Empty(compositePropagator.Fields); } diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/PropagatorsTest.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/PropagatorsTest.cs index b7993e0d848..3216baec7d7 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/PropagatorsTest.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/PropagatorsTest.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using Xunit; namespace OpenTelemetry.Context.Propagation.Tests; diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs index f07875c5d28..a2a8ab39234 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using System.Diagnostics; namespace OpenTelemetry.Context.Propagation.Tests; @@ -27,7 +29,7 @@ public TestPropagator(string idHeaderName, string stateHeaderName, bool defaultC public override ISet Fields => new HashSet() { this.idHeaderName, this.stateHeaderName }; - public override PropagationContext Extract(PropagationContext context, T carrier, Func> getter) + public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { Interlocked.Increment(ref this.extractCount); @@ -37,7 +39,7 @@ public override PropagationContext Extract(PropagationContext context, T carr } var id = getter(carrier, this.idHeaderName); - if (!id.Any()) + if (id == null || !id.Any()) { return context; } diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/TracestateUtilsTests.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/TracestateUtilsTests.cs index 499fe66cbf4..f1271938a5a 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/TracestateUtilsTests.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/TracestateUtilsTests.cs @@ -1,15 +1,24 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#nullable enable + using Xunit; namespace OpenTelemetry.Context.Propagation.Tests; public class TracestateUtilsTests { + [Fact] + public void NullTracestate() + { + var tracestateEntries = new List>(); + Assert.False(TraceStateUtilsNew.AppendTraceState(null!, tracestateEntries)); + Assert.Empty(tracestateEntries); + } + [Theory] [InlineData("")] - [InlineData(null)] [InlineData(" ")] [InlineData("\t")] public void EmptyTracestate(string tracestate) diff --git a/test/OpenTelemetry.Extensions.Propagators.Tests/B3PropagatorTest.cs b/test/OpenTelemetry.Extensions.Propagators.Tests/B3PropagatorTest.cs index 5373573ad6c..15ed68c96da 100644 --- a/test/OpenTelemetry.Extensions.Propagators.Tests/B3PropagatorTest.cs +++ b/test/OpenTelemetry.Extensions.Propagators.Tests/B3PropagatorTest.cs @@ -25,8 +25,12 @@ public class B3PropagatorTest private static readonly Func, string, IEnumerable> Getter = (d, k) => { - d.TryGetValue(k, out var v); - return new string[] { v }; + if (d.TryGetValue(k, out var v)) + { + return [v]; + } + + return []; }; private readonly B3Propagator b3propagator = new(); @@ -354,6 +358,7 @@ public void ParseMissingSpanId_SingleHeader() [Fact] public void Fields_list() { + Assert.Equivalent(this.b3propagator.Fields, new List { B3Propagator.XB3TraceId, B3Propagator.XB3SpanId, B3Propagator.XB3ParentSpanId, B3Propagator.XB3Sampled, B3Propagator.XB3Flags, B3Propagator.XB3Flags }); ContainsExactly( this.b3propagator.Fields, new List { B3Propagator.XB3TraceId, B3Propagator.XB3SpanId, B3Propagator.XB3ParentSpanId, B3Propagator.XB3Sampled, B3Propagator.XB3Flags }); diff --git a/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTest.cs b/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTest.cs index 9e040746dd3..4e2b0486f6e 100644 --- a/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTest.cs +++ b/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTest.cs @@ -77,7 +77,7 @@ public void ExtractReturnsOriginalContextIfGetterIsNull() var headers = new Dictionary(); // act - var result = new JaegerPropagator().Extract(propagationContext, headers, null); + var result = new JaegerPropagator().Extract(propagationContext, headers, null!); // assert Assert.Equal(propagationContext, result); @@ -183,7 +183,7 @@ public void InjectDoesNoopIfSetterIsNull() var headers = new Dictionary(); // act - new JaegerPropagator().Inject(propagationContext, headers, null); + new JaegerPropagator().Inject(propagationContext, headers, null!); // assert Assert.Empty(headers); diff --git a/test/OpenTelemetry.Extensions.Propagators.Tests/OpenTelemetry.Extensions.Propagators.Tests.csproj b/test/OpenTelemetry.Extensions.Propagators.Tests/OpenTelemetry.Extensions.Propagators.Tests.csproj index 77eaa8a1f68..757c1d61ec6 100644 --- a/test/OpenTelemetry.Extensions.Propagators.Tests/OpenTelemetry.Extensions.Propagators.Tests.csproj +++ b/test/OpenTelemetry.Extensions.Propagators.Tests/OpenTelemetry.Extensions.Propagators.Tests.csproj @@ -2,8 +2,6 @@ $(TargetFrameworksForTests) - - disable