예제 #1
0
        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");
        }
예제 #2
0
        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());
        }