23
23
import org .apache .eventmesh .common .protocol .tcp .OPStatus ;
24
24
import org .apache .eventmesh .common .protocol .tcp .Package ;
25
25
import org .apache .eventmesh .runtime .boot .EventMeshTCPServer ;
26
+ import org .apache .eventmesh .runtime .constants .EventMeshConstants ;
27
+ import org .apache .eventmesh .runtime .core .protocol .tcp .client .session .Session ;
26
28
import org .apache .eventmesh .runtime .core .protocol .tcp .client .session .SessionState ;
27
29
import org .apache .eventmesh .runtime .core .protocol .tcp .client .task .GoodbyeTask ;
28
30
import org .apache .eventmesh .runtime .core .protocol .tcp .client .task .HeartBeatTask ;
33
35
import org .apache .eventmesh .runtime .core .protocol .tcp .client .task .RecommendTask ;
34
36
import org .apache .eventmesh .runtime .core .protocol .tcp .client .task .SubscribeTask ;
35
37
import org .apache .eventmesh .runtime .core .protocol .tcp .client .task .UnSubscribeTask ;
38
+ import org .apache .eventmesh .runtime .trace .TraceUtils ;
36
39
import org .apache .eventmesh .runtime .util .EventMeshUtil ;
40
+ import org .apache .eventmesh .trace .api .common .EventMeshTraceConstants ;
41
+
42
+ import java .util .concurrent .TimeUnit ;
37
43
38
44
import org .slf4j .Logger ;
39
45
import org .slf4j .LoggerFactory ;
40
46
41
47
import io .netty .channel .ChannelHandlerContext ;
42
48
import io .netty .channel .SimpleChannelInboundHandler ;
49
+ import io .opentelemetry .api .trace .Span ;
43
50
44
51
public class EventMeshTcpMessageDispatcher extends SimpleChannelInboundHandler <Package > {
45
52
@@ -55,11 +62,27 @@ public EventMeshTcpMessageDispatcher(EventMeshTCPServer eventMeshTCPServer) {
55
62
protected void channelRead0 (ChannelHandlerContext ctx , Package pkg ) throws Exception {
56
63
long startTime = System .currentTimeMillis ();
57
64
validateMsg (pkg );
58
- eventMeshTCPServer .getEventMeshTcpMonitor ().getTcpSummaryMetrics ().getClient2eventMeshMsgNum ().incrementAndGet ();
59
- Command cmd = null ;
65
+
66
+ eventMeshTCPServer .getEventMeshTcpMonitor ().getTcpSummaryMetrics ()
67
+ .getClient2eventMeshMsgNum ().incrementAndGet ();
68
+
69
+ Command cmd = pkg .getHeader ().getCmd ();
60
70
try {
61
71
Runnable task ;
62
- cmd = pkg .getHeader ().getCmd ();
72
+
73
+ if (isNeedTrace (cmd )) {
74
+ pkg .getHeader ().getProperties ()
75
+ .put (EventMeshConstants .REQ_C2EVENTMESH_TIMESTAMP , startTime );
76
+ pkg .getHeader ().getProperties ().put (EventMeshConstants .REQ_SEND_EVENTMESH_IP ,
77
+ eventMeshTCPServer .getEventMeshTCPConfiguration ().eventMeshServerIp );
78
+ Session session = eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx );
79
+
80
+ pkg .getHeader ().getProperties ().put (EventMeshConstants .REQ_SYS , session .getClient ().getSubsystem ());
81
+ pkg .getHeader ().getProperties ().put (EventMeshConstants .REQ_IP , session .getClient ().getHost ());
82
+ pkg .getHeader ().getProperties ().put (EventMeshConstants .REQ_IDC , session .getClient ().getIdc ());
83
+ pkg .getHeader ().getProperties ().put (EventMeshConstants .REQ_GROUP , session .getClient ().getGroup ());
84
+ }
85
+
63
86
if (cmd .equals (Command .RECOMMEND_REQUEST )) {
64
87
messageLogger .info ("pkg|c2eventMesh|cmd={}|pkg={}" , cmd , pkg );
65
88
task = new RecommendTask (pkg , ctx , startTime , eventMeshTCPServer );
@@ -80,22 +103,43 @@ protected void channelRead0(ChannelHandlerContext ctx, Package pkg) throws Excep
80
103
81
104
logMessageFlow (ctx , pkg , cmd );
82
105
83
- if (eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx ).getSessionState () == SessionState .CLOSED ) {
84
- throw new Exception ("this eventMesh tcp session will be closed, may be reboot or version change!" );
106
+ if (eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx )
107
+ .getSessionState () == SessionState .CLOSED ) {
108
+ throw new Exception (
109
+ "this eventMesh tcp session will be closed, may be reboot or version change!" );
85
110
}
86
111
87
112
dispatch (ctx , pkg , startTime , cmd );
88
113
} catch (Exception e ) {
89
114
logger .error ("exception occurred while pkg|cmd={}|pkg={}" , cmd , pkg , e );
115
+
116
+ if (isNeedTrace (cmd )) {
117
+ Span span = TraceUtils .prepareServerSpan (pkg .getHeader ().getProperties (),
118
+ EventMeshTraceConstants .TRACE_UPSTREAM_EVENTMESH_SERVER_SPAN , startTime ,
119
+ TimeUnit .MILLISECONDS , false );
120
+ TraceUtils .finishSpanWithException (span , pkg .getHeader ().getProperties (),
121
+ "exception occurred while dispatch pkg" , e );
122
+ }
123
+
90
124
writeToClient (cmd , pkg , ctx , e );
91
125
}
92
126
}
93
127
128
+ private boolean isNeedTrace (Command cmd ) {
129
+ if (eventMeshTCPServer .getEventMeshTCPConfiguration ().eventMeshServerTraceEnable
130
+ && cmd != null && (Command .REQUEST_TO_SERVER == cmd
131
+ || Command .ASYNC_MESSAGE_TO_SERVER == cmd
132
+ || Command .BROADCAST_MESSAGE_TO_SERVER == cmd )) {
133
+ return true ;
134
+ }
135
+ return false ;
136
+ }
137
+
94
138
private void writeToClient (Command cmd , Package pkg , ChannelHandlerContext ctx , Exception e ) {
95
139
try {
96
140
Package res = new Package ();
97
- res .setHeader (new Header (getReplyCommand (cmd ), OPStatus .FAIL .getCode (), e .toString (), pkg . getHeader ()
98
- .getSeq ()));
141
+ res .setHeader (new Header (getReplyCommand (cmd ), OPStatus .FAIL .getCode (), e .toString (),
142
+ pkg . getHeader () .getSeq ()));
99
143
ctx .writeAndFlush (res );
100
144
} catch (Exception ex ) {
101
145
logger .warn ("writeToClient failed" , ex );
@@ -131,11 +175,12 @@ private Command getReplyCommand(Command cmd) {
131
175
132
176
private void logMessageFlow (ChannelHandlerContext ctx , Package pkg , Command cmd ) {
133
177
if (pkg .getBody () instanceof EventMeshMessage ) {
134
- messageLogger .info ("pkg|c2eventMesh|cmd={}|Msg={}|user={}" , cmd , EventMeshUtil .printMqMessage ((EventMeshMessage ) pkg
135
- .getBody ()), eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx ).getClient ());
178
+ messageLogger .info ("pkg|c2eventMesh|cmd={}|Msg={}|user={}" , cmd ,
179
+ EventMeshUtil .printMqMessage ((EventMeshMessage ) pkg .getBody ()),
180
+ eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx ).getClient ());
136
181
} else {
137
182
messageLogger .info ("pkg|c2eventMesh|cmd={}|pkg={}|user={}" , cmd , pkg ,
138
- eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx ).getClient ());
183
+ eventMeshTCPServer .getClientSessionGroupMapping ().getSession (ctx ).getClient ());
139
184
}
140
185
}
141
186
@@ -153,8 +198,8 @@ private void validateMsg(Package pkg) throws Exception {
153
198
}
154
199
}
155
200
156
- private void dispatch (ChannelHandlerContext ctx , Package pkg , long startTime , Command cmd ) throws
157
- Exception {
201
+ private void dispatch (ChannelHandlerContext ctx , Package pkg , long startTime , Command cmd )
202
+ throws Exception {
158
203
Runnable task ;
159
204
switch (cmd ) {
160
205
case HEARTBEAT_REQUEST :
0 commit comments