29
29
import com .navercorp .pinpoint .grpc .trace .PCmdRequest ;
30
30
import com .navercorp .pinpoint .grpc .trace .PCmdResponse ;
31
31
import com .navercorp .pinpoint .grpc .trace .ProfilerCommandServiceGrpc ;
32
- import com .navercorp .pinpoint .realtime .collector .sink .ErrorSinkRepository ;
32
+ import com .navercorp .pinpoint .realtime .collector .sink .ActiveThreadCountPublisher ;
33
+ import com .navercorp .pinpoint .realtime .collector .sink .ActiveThreadDumpPublisher ;
34
+ import com .navercorp .pinpoint .realtime .collector .sink .ActiveThreadLightDumpPublisher ;
35
+ import com .navercorp .pinpoint .realtime .collector .sink .EchoPublisher ;
36
+ import com .navercorp .pinpoint .realtime .collector .sink .Publisher ;
33
37
import com .navercorp .pinpoint .realtime .collector .sink .SinkRepository ;
34
38
import io .grpc .Metadata ;
35
39
import io .grpc .Status ;
38
42
import io .grpc .stub .StreamObserver ;
39
43
import org .apache .logging .log4j .LogManager ;
40
44
import org .apache .logging .log4j .Logger ;
41
- import reactor .core .publisher .FluxSink ;
42
- import reactor .core .publisher .MonoSink ;
43
45
44
46
import java .net .InetSocketAddress ;
45
47
import java .util .List ;
@@ -54,22 +56,19 @@ public class GrpcCommandService extends ProfilerCommandServiceGrpc.ProfilerComma
54
56
private final Logger logger = LogManager .getLogger (this .getClass ());
55
57
56
58
private final GrpcAgentConnectionRepository agentConnectionRepository ;
57
- private final ErrorSinkRepository sinkRepository ;
58
- private final SinkRepository <FluxSink <PCmdActiveThreadCountRes >> activeThreadCountSinkRepo ;
59
- private final SinkRepository <MonoSink <PCmdActiveThreadDumpRes >> activeThreadDumpSinkRepo ;
60
- private final SinkRepository <MonoSink <PCmdActiveThreadLightDumpRes >> activeThreadLightDumpSinkRepo ;
61
- private final SinkRepository <MonoSink <PCmdEchoResponse >> echoSinkRepo ;
59
+ private final SinkRepository <ActiveThreadCountPublisher > activeThreadCountSinkRepo ;
60
+ private final SinkRepository <ActiveThreadDumpPublisher > activeThreadDumpSinkRepo ;
61
+ private final SinkRepository <ActiveThreadLightDumpPublisher > activeThreadLightDumpSinkRepo ;
62
+ private final SinkRepository <EchoPublisher > echoSinkRepo ;
62
63
63
64
public GrpcCommandService (
64
65
GrpcAgentConnectionRepository agentConnectionRepository ,
65
- ErrorSinkRepository sinkRepository ,
66
- SinkRepository <FluxSink <PCmdActiveThreadCountRes >> activeThreadCountSinkRepo ,
67
- SinkRepository <MonoSink <PCmdActiveThreadDumpRes >> activeThreadDumpSinkRepo ,
68
- SinkRepository <MonoSink <PCmdActiveThreadLightDumpRes >> activeThreadLightDumpSinkRepo ,
69
- SinkRepository <MonoSink <PCmdEchoResponse >> echoSinkRepo
66
+ SinkRepository <ActiveThreadCountPublisher > activeThreadCountSinkRepo ,
67
+ SinkRepository <ActiveThreadDumpPublisher > activeThreadDumpSinkRepo ,
68
+ SinkRepository <ActiveThreadLightDumpPublisher > activeThreadLightDumpSinkRepo ,
69
+ SinkRepository <EchoPublisher > echoSinkRepo
70
70
) {
71
71
this .agentConnectionRepository = Objects .requireNonNull (agentConnectionRepository , "clusterPointRepository" );
72
- this .sinkRepository = Objects .requireNonNull (sinkRepository , "sinkRepository" );
73
72
this .activeThreadCountSinkRepo = Objects .requireNonNull (activeThreadCountSinkRepo , "activeThreadCountSinkRepo" );
74
73
this .activeThreadDumpSinkRepo = Objects .requireNonNull (activeThreadDumpSinkRepo , "activeThreadDumpSinkRepo" );
75
74
this .activeThreadLightDumpSinkRepo = Objects .requireNonNull (activeThreadLightDumpSinkRepo , "activeThreadLightDumpSinkRepo" );
@@ -127,9 +126,7 @@ public void onNext(PCmdMessage value) {
127
126
GrpcCommandService .this .agentConnectionRepository .add (conn );
128
127
}
129
128
} else if (value .hasFailMessage ()) {
130
- PCmdResponse failMessage = value .getFailMessage ();
131
- long sinkId = failMessage .getResponseId ();
132
- sinkRepository .error (sinkId , new RuntimeException (failMessage .getMessage ().getValue ()));
129
+ handleFail (value );
133
130
}
134
131
}
135
132
@@ -199,9 +196,7 @@ public StreamObserver<PCmdMessage> handleCommandV2(StreamObserver<PCmdRequest> r
199
196
@ Override
200
197
public void onNext (PCmdMessage value ) {
201
198
if (value .hasFailMessage ()) {
202
- PCmdResponse failMessage = value .getFailMessage ();
203
- long sinkId = failMessage .getResponseId ();
204
- sinkRepository .error (sinkId , new RuntimeException (failMessage .getMessage ().getValue ()));
199
+ handleFail (value );
205
200
}
206
201
}
207
202
@@ -232,6 +227,16 @@ private GrpcAgentConnection buildAgentConnection(
232
227
);
233
228
}
234
229
230
+ private void handleFail (PCmdMessage value ) {
231
+ final PCmdResponse failMessage = value .getFailMessage ();
232
+ final long sinkId = failMessage .getResponseId ();
233
+ final Exception exception = new RuntimeException (failMessage .getMessage ().getValue ());
234
+ activeThreadCountSinkRepo .error (sinkId , exception );
235
+ activeThreadDumpSinkRepo .error (sinkId , exception );
236
+ activeThreadLightDumpSinkRepo .error (sinkId , exception );
237
+ echoSinkRepo .error (sinkId , exception );
238
+ }
239
+
235
240
private void handleOnError (Throwable t , GrpcAgentConnection conn ) {
236
241
if (conn == null ) {
237
242
logger .warn ("Command error before establishment" );
@@ -242,7 +247,7 @@ private void handleOnError(Throwable t, GrpcAgentConnection conn) {
242
247
Metadata metadata = Status .trailersFromThrowable (t );
243
248
244
249
logger .info ("Failed to command stream, {} => local, {} {}" ,
245
- conn .getClusterKey (), status , metadata );
250
+ conn .getClusterKey (), status , metadata );
246
251
247
252
}
248
253
@@ -258,33 +263,31 @@ private void handleOnCompleted(GrpcAgentConnection conn) {
258
263
@ Override
259
264
public void commandEcho (PCmdEchoResponse response , StreamObserver <Empty > responseObserver ) {
260
265
long sinkId = response .getCommonResponse ().getResponseId ();
261
- emitMono (response , responseObserver , this .echoSinkRepo .get (sinkId ));
266
+ final EchoPublisher publisher = this .echoSinkRepo .get (sinkId );
267
+ emitMono (response , responseObserver , publisher );
262
268
this .echoSinkRepo .invalidate (sinkId );
263
269
}
264
270
265
271
@ Override
266
272
public void commandActiveThreadDump (PCmdActiveThreadDumpRes response , StreamObserver <Empty > responseObserver ) {
267
273
long sinkId = response .getCommonResponse ().getResponseId ();
268
- emitMono (response , responseObserver , this .activeThreadDumpSinkRepo .get (sinkId ));
274
+ final ActiveThreadDumpPublisher publisher = this .activeThreadDumpSinkRepo .get (sinkId );
275
+ emitMono (response , responseObserver , publisher );
269
276
this .activeThreadDumpSinkRepo .invalidate (sinkId );
270
277
}
271
278
272
279
@ Override
273
- public void commandActiveThreadLightDump (
274
- PCmdActiveThreadLightDumpRes response ,
275
- StreamObserver <Empty > responseObserver
276
- ) {
280
+ public void commandActiveThreadLightDump (PCmdActiveThreadLightDumpRes response , StreamObserver <Empty > responseObserver ) {
277
281
long sinkId = response .getCommonResponse ().getResponseId ();
278
- emitMono (response , responseObserver , this .activeThreadLightDumpSinkRepo .get (sinkId ));
282
+ final ActiveThreadLightDumpPublisher publisher = this .activeThreadLightDumpSinkRepo .get (sinkId );
283
+ emitMono (response , responseObserver , publisher );
279
284
this .activeThreadLightDumpSinkRepo .invalidate (sinkId );
280
285
}
281
286
282
287
@ Override
283
- public StreamObserver <PCmdActiveThreadCountRes > commandStreamActiveThreadCount (
284
- StreamObserver <Empty > responseObserver
285
- ) {
288
+ public StreamObserver <PCmdActiveThreadCountRes > commandStreamActiveThreadCount (StreamObserver <Empty > responseObserver ) {
286
289
ServerCallStreamObserver <Empty > serverResponseObserver = (ServerCallStreamObserver <Empty >) responseObserver ;
287
- return new FluxCommandResponseObserver <> (serverResponseObserver , this .activeThreadCountSinkRepo ) {
290
+ return new ActiveThreadCountResponseStreamObserver (serverResponseObserver , this .activeThreadCountSinkRepo ) {
288
291
@ Override
289
292
protected long extractSinkId (PCmdActiveThreadCountRes response ) {
290
293
return response .getCommonStreamResponse ().getResponseId ();
@@ -297,13 +300,13 @@ protected int extractSequence(PCmdActiveThreadCountRes response) {
297
300
};
298
301
}
299
302
300
- private <T > void emitMono (T response , StreamObserver <Empty > responseObserver , MonoSink <T > sink ) {
303
+ private <T > void emitMono (T response , StreamObserver <Empty > responseObserver , Publisher <T > sink ) {
301
304
if (sink == null ) {
302
305
logger .warn ("Could not find echo sink: clusterKey = {}" , getClusterKeyFromContext ());
303
306
responseObserver .onError (new StatusException (Status .NOT_FOUND ));
304
307
return ;
305
308
}
306
- sink .success (response );
309
+ sink .publish (response );
307
310
responseObserver .onNext (Empty .getDefaultInstance ());
308
311
responseObserver .onCompleted ();
309
312
}
@@ -356,5 +359,4 @@ public void onCompleted() {
356
359
}
357
360
358
361
}
359
-
360
362
}
0 commit comments