|
3 | 3 |
|
4 | 4 | using System;
|
5 | 5 | using System.Collections.Concurrent;
|
| 6 | +using System.Collections.Generic; |
6 | 7 | using System.Text;
|
7 | 8 | using Confluent.Kafka;
|
8 | 9 | using NewRelic.Agent.Api;
|
@@ -65,15 +66,15 @@ public AfterWrappedMethodDelegate BeforeWrappedMethod(InstrumentedMethodCall ins
|
65 | 66 | segment.SetMessageBrokerDestination(topic);
|
66 | 67 | transaction.SetKafkaMessageBrokerTransactionName(MessageBrokerDestinationType.Topic, BrokerVendorName, topic);
|
67 | 68 |
|
68 |
| - // get the Message.Headers property and add distributed trace headers |
| 69 | + // get the Message.Headers property and process distributed trace headers |
69 | 70 | var messageAccessor = MessageAccessorDictionary.GetOrAdd(type, GetMessageAccessorFunc);
|
70 | 71 | var messageAsObject = messageAccessor(resultAsObject);
|
71 | 72 |
|
72 | 73 | var headersSize = 0L;
|
73 | 74 | if (messageAsObject is MessageMetadata messageMetaData)
|
74 | 75 | {
|
75 | 76 | headersSize = GetHeadersSize(messageMetaData.Headers);
|
76 |
| - transaction.InsertDistributedTraceHeaders(messageMetaData, DistributedTraceHeadersSetter); |
| 77 | + transaction.AcceptDistributedTraceHeaders(messageMetaData, DistributedTraceHeadersGetter, TransportType.Kafka); |
77 | 78 | }
|
78 | 79 |
|
79 | 80 | ReportSizeMetrics(agent, transaction, topic, headersSize, messageAsObject);
|
@@ -133,14 +134,22 @@ private static Func<object, object> GetKeyAccessorFunc(Type t) =>
|
133 | 134 | private static Func<object, object> GetValueAccessorFunc(Type t) =>
|
134 | 135 | VisibilityBypasser.Instance.GeneratePropertyAccessor<object>(t, "Value");
|
135 | 136 |
|
136 |
| - private static void DistributedTraceHeadersSetter(MessageMetadata carrier, string key, string value) |
| 137 | + private static IEnumerable<string> DistributedTraceHeadersGetter(MessageMetadata carrier, string key) |
137 | 138 | {
|
138 |
| - carrier.Headers ??= new Headers(); |
139 |
| - if (!string.IsNullOrEmpty(key)) |
| 139 | + if (carrier.Headers != null) |
140 | 140 | {
|
141 |
| - carrier.Headers.Remove(key); |
142 |
| - carrier.Headers.Add(key, Encoding.ASCII.GetBytes(value)); |
| 141 | + var headerValues = new List<string>(); |
| 142 | + foreach (var item in carrier.Headers) |
| 143 | + { |
| 144 | + if (item.Key.Equals(key, StringComparison.OrdinalIgnoreCase)) |
| 145 | + { |
| 146 | + var decodedHeaderValue = Encoding.UTF8.GetString(item.GetValueBytes()); |
| 147 | + headerValues.Add(decodedHeaderValue); |
| 148 | + } |
| 149 | + } |
| 150 | + return headerValues; |
143 | 151 | }
|
| 152 | + return null; |
144 | 153 | }
|
145 | 154 |
|
146 | 155 | private static long TryGetSize(object obj)
|
|
0 commit comments