public ISpanContext Extract <TCarrier>(TCarrier carrier) { if (carrier is ITextMap map) { var baggage = new Dictionary <string, string>(); SpanContext context = null; foreach (var item in map) { // GRPC Metadata is case insensitive, so the case could get lost. if (item.Key.Equals(_headersConfig.TraceContextHeaderName, StringComparison.OrdinalIgnoreCase)) { var safeValue = _decodeValue(item.Value); context = SpanContext.FromString(safeValue); } else if (item.Key.StartsWith(_headersConfig.TraceBaggageHeaderPrefix, StringComparison.OrdinalIgnoreCase)) { var safeKey = RemoveBaggageKeyPrefix(item.Key); var safeValue = _decodeValue(item.Value); baggage.Add(safeKey, safeValue); } } return(context?.SetBaggageItems(baggage)); } throw new ArgumentException($"{nameof(carrier)} is not ITextMap"); }
public void SpanContext_SetBaggageItems() { var traceId = new TraceId(1, 2); var spanId = new SpanId(3); var parentId = new SpanId(4); var baggage = new Dictionary <string, string> { { "key", "value" } }; var sc = new SpanContext(traceId, spanId, parentId, baggage); Assert.Equal(baggage, sc.GetBaggageItems()); var newBaggage = new Dictionary <string, string> { { "new", "baggage" } }; sc.SetBaggageItems(newBaggage); Assert.Equal(newBaggage, sc.GetBaggageItems()); }