Skip to content

Commit 11ec25b

Browse files
committed
[#9595] Improve async state propagation in NonSampling state
1 parent 6e8fdb7 commit 11ec25b

18 files changed

+461
-82
lines changed

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/AsyncContextFactory.java

+2
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ public interface AsyncContextFactory {
3333
AsyncContext newAsyncContext(TraceRoot traceRoot, AsyncId asyncId, boolean canSampled, AsyncState asyncState);
3434

3535
AsyncContext newDisableAsyncContext(LocalTraceRoot traceRoot);
36+
37+
AsyncContext newDisableAsyncContext(LocalTraceRoot traceRoot, AsyncState asyncState);
3638
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2014 NAVER Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.navercorp.pinpoint.profiler.context;
18+
19+
import com.navercorp.pinpoint.bootstrap.context.AsyncState;
20+
import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder;
21+
import com.navercorp.pinpoint.bootstrap.context.SpanRecorder;
22+
import com.navercorp.pinpoint.profiler.context.id.LocalTraceRoot;
23+
24+
import java.util.Objects;
25+
26+
27+
/**
28+
* @author emeroad
29+
* @author jaehong.kim
30+
*/
31+
public class AsyncDisableTrace extends DisableTrace {
32+
33+
private final AsyncState asyncState;
34+
35+
public AsyncDisableTrace(LocalTraceRoot traceRoot,
36+
SpanRecorder spanRecorder, SpanEventRecorder spanEventRecorder,
37+
AsyncState asyncState) {
38+
super(traceRoot, spanRecorder, spanEventRecorder, CloseListener.EMPTY);
39+
this.asyncState = Objects.requireNonNull(asyncState, "asyncState");
40+
}
41+
42+
@Override
43+
public void close() {
44+
if (asyncState.await()) {
45+
// flush.
46+
if (isDebug) {
47+
logger.debug("Await trace={}, asyncState={}", this, this.asyncState);
48+
}
49+
} else {
50+
// close.
51+
super.close();
52+
if (isDebug) {
53+
logger.debug("Close trace={}. asyncState={}", this, this.asyncState);
54+
}
55+
}
56+
}
57+
58+
@Override
59+
public String toString() {
60+
return "AsyncDisableTrace{" +
61+
"asyncState=" + asyncState +
62+
"} " + super.toString();
63+
}
64+
}

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/CloseListener.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.navercorp.pinpoint.profiler.context;
22

33
public interface CloseListener {
4-
void close(Span span);
4+
void close(long endTime);
55

66
CloseListener EMPTY = new CloseListener() {
77
@Override
8-
public void close(Span span) {
8+
public void close(long endTime) {
99
}
1010
};
1111

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DefaultAsyncContextFactory.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public AsyncContext newAsyncContext(TraceRoot traceRoot, AsyncId asyncId, boolea
8383
return new StatefulAsyncContext(asyncTraceContext, binder, traceRoot, asyncId, asyncMethodApiId, asyncState);
8484
} else {
8585
// TODO
86-
return new StatefulDisableAsyncContext(asyncTraceContext, binder, traceRoot, asyncState);
86+
return newDisableAsyncContext(traceRoot, asyncState);
8787
}
8888

8989
}
@@ -93,4 +93,9 @@ public AsyncContext newDisableAsyncContext(LocalTraceRoot traceRoot) {
9393
return new DisableAsyncContext(asyncTraceContext, binder, traceRoot);
9494
}
9595

96+
@Override
97+
public AsyncContext newDisableAsyncContext(LocalTraceRoot traceRoot, AsyncState asyncState) {
98+
return new StatefulDisableAsyncContext(asyncTraceContext, binder, traceRoot, asyncState);
99+
}
100+
96101
}

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DefaultBaseTraceFactory.java

+36-15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.navercorp.pinpoint.profiler.context;
1818

1919
import com.navercorp.pinpoint.bootstrap.context.AsyncState;
20+
import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder;
2021
import com.navercorp.pinpoint.bootstrap.context.SpanRecorder;
2122
import com.navercorp.pinpoint.bootstrap.context.Trace;
2223
import com.navercorp.pinpoint.bootstrap.context.TraceId;
@@ -116,24 +117,26 @@ public Trace newTraceObject(String urlPath) {
116117
}
117118
}
118119

120+
119121
// internal async trace.
120122
@Override
121123
public Trace continueAsyncContextTraceObject(TraceRoot traceRoot, LocalAsyncId localAsyncId) {
122124
final SpanChunkFactory spanChunkFactory = new AsyncSpanChunkFactory(traceRoot, localAsyncId);
123125
final Storage storage = storageFactory.createStorage(spanChunkFactory);
124-
125126
final CallStack<SpanEvent> callStack = callStackFactory.newCallStack();
126127

127128
final SpanRecorder spanRecorder = recorderFactory.newTraceRootSpanRecorder(traceRoot);
128-
129129
final WrappedSpanEventRecorder wrappedSpanEventRecorder = recorderFactory.newWrappedSpanEventRecorder(traceRoot);
130130

131131
return new AsyncChildTrace(traceRoot, callStack, storage, spanRecorder, wrappedSpanEventRecorder, localAsyncId);
132132
}
133133

134134
@Override
135135
public Trace continueDisableAsyncContextTraceObject(LocalTraceRoot traceRoot) {
136-
return new DisableAsyncChildTrace(traceRoot);
136+
final AsyncState asyncState = new DisableAsyncState();
137+
SpanRecorder spanRecorder = recorderFactory.newDisableSpanRecorder(traceRoot);
138+
SpanEventRecorder spanEventRecorder = recorderFactory.newDisableSpanEventRecorder(traceRoot, asyncState);
139+
return new DisableAsyncChildTrace(traceRoot, spanRecorder, spanEventRecorder);
137140
}
138141

139142
// entry point async trace.
@@ -145,7 +148,7 @@ public Trace continueAsyncTraceObject(final TraceId traceId) {
145148
final TraceRoot traceRoot = traceRootFactory.continueTraceRoot(traceId, state.nextId());
146149
return newAsyncDefaultTrace(traceRoot);
147150
} else {
148-
return newLocalTrace(state.nextId());
151+
return newAsyncLocalTrace(state.nextId());
149152
}
150153
}
151154

@@ -154,21 +157,22 @@ public Trace continueAsyncTraceObject(final TraceId traceId) {
154157
@Override
155158
public Trace newAsyncTraceObject() {
156159
final TraceSampler.State state = traceSampler.isNewSampled();
157-
return newAsyncTraceObject(state);
160+
if (state.isSampled()) {
161+
final TraceRoot traceRoot = traceRootFactory.newTraceRoot(state.nextId());
162+
return newAsyncDefaultTrace(traceRoot);
163+
} else {
164+
return newAsyncLocalTrace(state.nextId());
165+
}
158166
}
159167

160168
@Override
161169
public Trace newAsyncTraceObject(String urlPath) {
162170
final TraceSampler.State state = traceSampler.isNewSampled(urlPath);
163-
return newAsyncTraceObject(state);
164-
}
165-
166-
Trace newAsyncTraceObject(TraceSampler.State state) {
167171
if (state.isSampled()) {
168172
final TraceRoot traceRoot = traceRootFactory.newTraceRoot(state.nextId());
169173
return newAsyncDefaultTrace(traceRoot);
170174
} else {
171-
return newLocalTrace(state.nextId());
175+
return newAsyncLocalTrace(state.nextId());
172176
}
173177
}
174178

@@ -185,12 +189,11 @@ private DefaultTrace newDefaultTrace(TraceRoot traceRoot) {
185189
final Storage storage = storageFactory.createStorage(spanChunkFactory);
186190
final CallStack<SpanEvent> callStack = callStackFactory.newCallStack();
187191

188-
final ActiveTraceHandle handle = registerActiveTrace(traceRoot);
189-
final CloseListener closeListener = new DefaultCloseListener(handle, uriStatStorage);
190-
191192
final SpanRecorder spanRecorder = recorderFactory.newSpanRecorder(span);
192193
final WrappedSpanEventRecorder wrappedSpanEventRecorder = recorderFactory.newWrappedSpanEventRecorder(traceRoot);
193194

195+
final ActiveTraceHandle handle = registerActiveTrace(traceRoot);
196+
final CloseListener closeListener = new DefaultCloseListener(traceRoot, handle, uriStatStorage);
194197
return new DefaultTrace(span, callStack, storage, spanRecorder, wrappedSpanEventRecorder, closeListener);
195198
}
196199

@@ -210,11 +213,29 @@ private AsyncDefaultTrace newAsyncDefaultTrace(TraceRoot traceRoot) {
210213
return new AsyncDefaultTrace(span, callStack, storage, spanRecorder, wrappedSpanEventRecorder, asyncState);
211214
}
212215

216+
213217
private Trace newLocalTrace(long nextDisabledId) {
214218
final LocalTraceRoot traceRoot = traceRootFactory.newDisableTraceRoot(nextDisabledId);
215219
final SpanRecorder spanRecorder = recorderFactory.newDisableSpanRecorder(traceRoot);
216-
final ActiveTraceHandle activeTraceHandle = registerActiveTrace(traceRoot);
217-
return new DisableTrace(traceRoot, spanRecorder, activeTraceHandle, uriStatStorage);
220+
221+
final ActiveTraceHandle handle = registerActiveTrace(traceRoot);
222+
final CloseListener closeListener = new DefaultCloseListener(traceRoot, handle, uriStatStorage);
223+
224+
final SpanEventRecorder spanEventRecorder = recorderFactory.newDisableSpanEventRecorder(traceRoot);
225+
return new DisableTrace(traceRoot, spanRecorder, spanEventRecorder, closeListener);
226+
}
227+
228+
private Trace newAsyncLocalTrace(long nextDisabledId) {
229+
final LocalTraceRoot traceRoot = traceRootFactory.newDisableTraceRoot(nextDisabledId);
230+
final SpanRecorder spanRecorder = recorderFactory.newDisableSpanRecorder(traceRoot);
231+
232+
final ActiveTraceHandle handle = registerActiveTrace(traceRoot);
233+
AsyncState asyncState = new ListenableAsyncState(traceRoot,
234+
ListenableAsyncState.AsyncStateListener.EMPTY,
235+
handle, uriStatStorage);
236+
237+
final SpanEventRecorder spanEventRecorder = recorderFactory.newDisableSpanEventRecorder(traceRoot, asyncState);
238+
return new AsyncDisableTrace(traceRoot, spanRecorder, spanEventRecorder, asyncState);
218239
}
219240

220241
private ActiveTraceHandle registerActiveTrace(TraceRoot traceRoot) {

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DefaultCloseListener.java

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,46 @@
11
package com.navercorp.pinpoint.profiler.context;
22

33
import com.navercorp.pinpoint.profiler.context.active.ActiveTraceHandle;
4+
import com.navercorp.pinpoint.profiler.context.id.LocalTraceRoot;
45
import com.navercorp.pinpoint.profiler.context.id.Shared;
5-
import com.navercorp.pinpoint.profiler.context.id.TraceRoot;
66
import com.navercorp.pinpoint.profiler.context.storage.UriStatStorage;
77

88
import javax.annotation.Nullable;
9+
import java.util.Objects;
910

1011
public class DefaultCloseListener implements CloseListener {
1112

13+
private final LocalTraceRoot traceRoot;
1214
@Nullable
1315
private final ActiveTraceHandle activeTraceHandle;
1416
@Nullable
1517
private final UriStatStorage uriStatStorage;
1618

17-
public DefaultCloseListener(ActiveTraceHandle activeTraceHandle, UriStatStorage uriStatStorage) {
19+
public DefaultCloseListener(LocalTraceRoot traceRoot, ActiveTraceHandle activeTraceHandle, UriStatStorage uriStatStorage) {
20+
this.traceRoot = Objects.requireNonNull(traceRoot, "traceRoot");
1821
this.activeTraceHandle = activeTraceHandle;
1922
this.uriStatStorage = uriStatStorage;
2023
}
2124

2225
@Override
23-
public void close(Span span) {
24-
final long end = span.getStartTime() + span.getElapsedTime();
25-
recordUriTemplate(span, end);
26-
purgeActiveTrace(end);
26+
public void close(long endTime) {
27+
recordUriTemplate(endTime);
28+
purgeActiveTrace(endTime);
2729
}
2830

2931

30-
private void recordUriTemplate(Span span, long afterTime) {
31-
if (uriStatStorage == null) {
32+
private void recordUriTemplate(long afterTime) {
33+
final UriStatStorage copy = uriStatStorage;
34+
if (copy == null) {
3235
return;
3336
}
3437

35-
TraceRoot traceRoot = span.getTraceRoot();
3638
Shared shared = traceRoot.getShared();
3739
String uriTemplate = shared.getUriTemplate();
3840
long traceStartTime = traceRoot.getTraceStartTime();
3941

4042
boolean status = getStatus(shared.getErrorCode());
41-
uriStatStorage.store(uriTemplate, status, traceStartTime, afterTime);
43+
copy.store(uriTemplate, status, traceStartTime, afterTime);
4244
}
4345

4446
private boolean getStatus(int errorCode) {

profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DefaultTrace.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
*/
4040
public class DefaultTrace implements Trace {
4141

42-
static final Logger logger = LogManager.getLogger(DefaultTrace.class.getName());
42+
static final Logger logger = LogManager.getLogger(DefaultTrace.class);
4343
static final boolean isDebug = logger.isDebugEnabled();
4444

4545
private final CallStack<SpanEvent> callStack;
@@ -195,7 +195,7 @@ public void close() {
195195
}
196196

197197
this.storage.close();
198-
this.closeListener.close(span);
198+
this.closeListener.close(afterTime);
199199
}
200200

201201

0 commit comments

Comments
 (0)