Skip to content

Commit 7d1a052

Browse files
EvenLjjliujianjun.ljj
and
liujianjun.ljj
authored
fix the triple header context transfer issue (#1467)
* fix triple header and usedId problem * Increase the extensibility of the header conversion context. * fix the triple header context transfer issue --------- Co-authored-by: liujianjun.ljj <[email protected]>
1 parent 5fc75a2 commit 7d1a052

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

remoting/remoting-triple/src/main/java/com/alipay/sofa/rpc/interceptor/ServerReqHeaderInterceptor.java

+16-7
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,8 @@ public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(final ServerCall<Re
6262
SofaResponse sofaResponse = new SofaResponse();
6363
final Throwable[] throwable = { null };
6464
SofaRequest sofaRequest = new SofaRequest();
65-
TripleTracerAdapter.serverReceived(sofaRequest, serverServiceDefinition, call, requestHeaders);
66-
SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
67-
SofaTracerSpan serverSpan = sofaTraceContext.getCurrentSpan();
6865

69-
Context ctxWithSpan = Context.current()
70-
.withValue(TracingContextKey.getKey(), serverSpan)
71-
.withValue(TracingContextKey.getSpanContextKey(), serverSpan.context())
72-
.withValue(TracingContextKey.getKeySofaRequest(), sofaRequest);
66+
Context ctxWithSpan = convertHeaderToContext(call, requestHeaders, sofaRequest, serverServiceDefinition);
7367

7468
//这里和下面不在一个线程
7569
if (RpcRunningState.isDebugMode()) {
@@ -167,4 +161,19 @@ private StatusRuntimeException fromThrowable(Throwable t) {
167161
};
168162
return result;
169163
}
164+
165+
protected <ReqT, RespT> Context convertHeaderToContext(ServerCall<ReqT, RespT> call,
166+
Metadata requestHeaders, SofaRequest sofaRequest,
167+
ServerServiceDefinition serverServiceDefinition) {
168+
TripleTracerAdapter.serverReceived(sofaRequest, serverServiceDefinition, call, requestHeaders);
169+
String userId = TripleTracerAdapter.getUserId(requestHeaders);
170+
SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
171+
SofaTracerSpan serverSpan = sofaTraceContext.getCurrentSpan();
172+
return Context.current()
173+
.withValue(TracingContextKey.getKey(), serverSpan)
174+
.withValue(TracingContextKey.getSpanContextKey(), serverSpan.context())
175+
.withValue(TracingContextKey.getKeySofaRequest(), sofaRequest)
176+
.withValue(TracingContextKey.getKeyMetadata(), requestHeaders)
177+
.withValue(TracingContextKey.getKeyUserId(), userId);
178+
}
170179
}

remoting/remoting-triple/src/main/java/com/alipay/sofa/rpc/tracer/sofatracer/TracingContextKey.java

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class TracingContextKey {
3131
public static final String KEY_SOFA_REQUEST_NAME = "io.opentracing.sofa-request";
3232
private static final Context.Key<SofaRequest> keySofaRequest = Context.key(KEY_SOFA_REQUEST_NAME);
3333
private static final Context.Key<Metadata> keyMetadata = Context.key("io.opentracing.metadata");
34+
public static final String KEY_TRIPLE_USER_ID = "io.opentracing.tri-user-id";
35+
private static final Context.Key<String> keyUserId = Context.key(KEY_TRIPLE_USER_ID);
3436

3537
/**
3638
* Retrieves the active span.
@@ -70,4 +72,8 @@ public static Context.Key<SofaRequest> getKeySofaRequest() {
7072
public static Context.Key<Metadata> getKeyMetadata() {
7173
return keyMetadata;
7274
}
75+
76+
public static Context.Key<String> getKeyUserId() {
77+
return keyUserId;
78+
}
7379
}

remoting/remoting-triple/src/main/java/com/alipay/sofa/rpc/tracer/sofatracer/TripleTracerAdapter.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package com.alipay.sofa.rpc.tracer.sofatracer;
1818

19+
import com.alibaba.fastjson.JSON;
20+
import com.alibaba.fastjson.TypeReference;
1921
import com.alipay.common.tracer.core.appender.self.SelfLog;
2022
import com.alipay.common.tracer.core.context.span.SofaTracerSpanContext;
2123
import com.alipay.common.tracer.core.context.trace.SofaTraceContext;
@@ -51,6 +53,7 @@
5153
import java.util.Set;
5254

5355
import static com.alipay.sofa.rpc.common.RemotingConstants.HEAD_APP_NAME;
56+
import static com.alipay.sofa.rpc.server.triple.TripleHeadKeys.HEAD_KEY_UNIT_INFO;
5457

5558
/**
5659
* 客户端:startRpc ——&gt; filter --&gt; beforeSend --&gt; 存入tracer信息 --&gt; clientReceived
@@ -114,7 +117,7 @@ public static void beforeSend(SofaRequest sofaRequest, ConsumerConfig consumerCo
114117
if (StringUtils.isNotBlank(route)) {
115118
Map<String, String> map = new HashMap<>();
116119
map.put(USERID_KEY, route);
117-
header.put(TripleHeadKeys.HEAD_KEY_UNIT_INFO.name(), JSONUtils.toJSONString(map));
120+
header.put(HEAD_KEY_UNIT_INFO.name(), JSONUtils.toJSONString(map));
118121
}
119122

120123
if (StringUtils.isNotEmpty(consumerConfig.getUniqueId())) {
@@ -300,4 +303,22 @@ public static void serverSend(SofaRequest request, final Metadata requestHeaders
300303
EventBus.post(new ServerSendEvent(request, response, throwable));
301304
}
302305
}
306+
307+
public static String getUserId(Metadata requestHeaders) {
308+
String unitInfo = requestHeaders.get(HEAD_KEY_UNIT_INFO);
309+
if (unitInfo == null) {
310+
return null;
311+
}
312+
try {
313+
Map<String, String> unitInfoMap = JSON.parseObject(unitInfo,
314+
new TypeReference<Map<String, String>>() {
315+
});
316+
if (unitInfoMap != null) {
317+
return unitInfoMap.get(USERID_KEY);
318+
}
319+
} catch (Exception e) {
320+
LOGGER.warn("Failed to parse tri-unit-info: " + unitInfo, e);
321+
}
322+
return null;
323+
}
303324
}

remoting/remoting-triple/src/test/java/com/alipay/sofa/rpc/tracer/sofatracer/TripleTracerAdapterTest.java

+10
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,14 @@ public void testBeforeSend() {
5353
Assert.assertEquals("value2", metadata.get(TripleHeadKeys.getKey("triple.header.object.key2")));
5454
}
5555

56+
@Test
57+
public void testGetUserId() {
58+
Metadata metadata = new Metadata();
59+
Assert.assertNull(TripleTracerAdapter.getUserId(metadata));
60+
metadata.put(TripleHeadKeys.HEAD_KEY_UNIT_INFO, "test");
61+
Assert.assertNull(TripleTracerAdapter.getUserId(metadata));
62+
metadata.put(TripleHeadKeys.HEAD_KEY_UNIT_INFO, "{\"userid\":\"99\"}");
63+
Assert.assertEquals("99", TripleTracerAdapter.getUserId(metadata));
64+
}
65+
5666
}

0 commit comments

Comments
 (0)