Skip to content

Commit 26e5948

Browse files
fix: jdk8 send jfr data error (#725)
1 parent 54a3372 commit 26e5948

File tree

2 files changed

+65
-70
lines changed

2 files changed

+65
-70
lines changed

apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/asyncprofiler/AsyncProfilerDataSender.java

Lines changed: 59 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@
3939
import org.apache.skywalking.apm.network.language.asyncprofiler.v10.AsyncProfilerTaskGrpc;
4040
import org.apache.skywalking.apm.network.language.asyncprofiler.v10.AsyncProfilingStatus;
4141

42+
import java.io.File;
43+
import java.io.FileInputStream;
4244
import java.io.IOException;
43-
import java.nio.ByteBuffer;
44-
import java.nio.channels.FileChannel;
45-
import java.util.Objects;
45+
import java.nio.file.Files;
4646
import java.util.concurrent.TimeUnit;
4747

4848
import static org.apache.skywalking.apm.agent.core.conf.Config.AsyncProfiler.DATA_CHUNK_SIZE;
@@ -87,69 +87,71 @@ public void statusChanged(GRPCChannelStatus status) {
8787
this.status = status;
8888
}
8989

90-
public void sendData(AsyncProfilerTask task, FileChannel channel) throws IOException, InterruptedException {
91-
if (status != GRPCChannelStatus.CONNECTED || Objects.isNull(channel) || !channel.isOpen()) {
90+
public void sendData(AsyncProfilerTask task, File dumpFile) throws IOException, InterruptedException {
91+
if (status != GRPCChannelStatus.CONNECTED) {
9292
return;
9393
}
9494

95-
int size = Math.toIntExact(channel.size());
96-
final GRPCStreamServiceStatus status = new GRPCStreamServiceStatus(false);
97-
StreamObserver<AsyncProfilerData> dataStreamObserver = asyncProfilerTaskStub.withDeadlineAfter(
98-
GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
99-
).collect(new ClientResponseObserver<AsyncProfilerData, AsyncProfilerCollectionResponse>() {
100-
ClientCallStreamObserver<AsyncProfilerData> requestStream;
101-
102-
@Override
103-
public void beforeStart(ClientCallStreamObserver<AsyncProfilerData> requestStream) {
104-
this.requestStream = requestStream;
105-
}
95+
try (FileInputStream fileInputStream = new FileInputStream(dumpFile)) {
96+
long fileSize = Files.size(dumpFile.toPath());
97+
int size = Math.toIntExact(fileSize);
98+
final GRPCStreamServiceStatus status = new GRPCStreamServiceStatus(false);
99+
StreamObserver<AsyncProfilerData> dataStreamObserver = asyncProfilerTaskStub.withDeadlineAfter(
100+
GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
101+
).collect(new ClientResponseObserver<AsyncProfilerData, AsyncProfilerCollectionResponse>() {
102+
ClientCallStreamObserver<AsyncProfilerData> requestStream;
103+
104+
@Override
105+
public void beforeStart(ClientCallStreamObserver<AsyncProfilerData> requestStream) {
106+
this.requestStream = requestStream;
107+
}
106108

107-
@Override
108-
public void onNext(AsyncProfilerCollectionResponse value) {
109-
if (AsyncProfilingStatus.TERMINATED_BY_OVERSIZE.equals(value.getType())) {
110-
LOGGER.warn("JFR is too large to be received by the oap server");
111-
} else {
112-
ByteBuffer buf = ByteBuffer.allocateDirect(DATA_CHUNK_SIZE);
113-
try {
114-
while (channel.read(buf) > 0) {
115-
buf.flip();
116-
AsyncProfilerData asyncProfilerData = AsyncProfilerData.newBuilder()
117-
.setContent(ByteString.copyFrom(buf))
118-
.build();
119-
requestStream.onNext(asyncProfilerData);
120-
buf.clear();
109+
@Override
110+
public void onNext(AsyncProfilerCollectionResponse value) {
111+
if (AsyncProfilingStatus.TERMINATED_BY_OVERSIZE.equals(value.getType())) {
112+
LOGGER.warn("JFR is too large to be received by the oap server");
113+
} else {
114+
byte[] buf = new byte[DATA_CHUNK_SIZE];
115+
try {
116+
int bytesRead;
117+
while ((bytesRead = fileInputStream.read(buf)) != -1) {
118+
AsyncProfilerData asyncProfilerData = AsyncProfilerData.newBuilder()
119+
.setContent(ByteString.copyFrom(buf, 0, bytesRead))
120+
.build();
121+
requestStream.onNext(asyncProfilerData);
122+
}
123+
} catch (IOException e) {
124+
LOGGER.error("Failed to read JFR file and failed to upload to oap", e);
121125
}
122-
} catch (IOException e) {
123-
LOGGER.error("Failed to read JFR file and failed to upload to oap", e);
124126
}
125-
}
126-
127-
requestStream.onCompleted();
128-
}
129127

130-
@Override
131-
public void onError(Throwable t) {
132-
status.finished();
133-
LOGGER.error(t, "Send async profiler task data to collector fail with a grpc internal exception.");
134-
ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t);
135-
}
128+
requestStream.onCompleted();
129+
}
136130

137-
@Override
138-
public void onCompleted() {
139-
status.finished();
140-
}
141-
});
142-
AsyncProfilerMetaData metaData = AsyncProfilerMetaData.newBuilder()
143-
.setService(Config.Agent.SERVICE_NAME)
144-
.setServiceInstance(Config.Agent.INSTANCE_NAME)
145-
.setType(AsyncProfilingStatus.PROFILING_SUCCESS)
146-
.setContentSize(size)
147-
.setTaskId(task.getTaskId())
148-
.build();
149-
AsyncProfilerData asyncProfilerData = AsyncProfilerData.newBuilder().setMetaData(metaData).build();
150-
dataStreamObserver.onNext(asyncProfilerData);
131+
@Override
132+
public void onError(Throwable t) {
133+
status.finished();
134+
LOGGER.error(t, "Send async profiler task data to collector fail with a grpc internal exception.");
135+
ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t);
136+
}
151137

152-
status.wait4Finish();
138+
@Override
139+
public void onCompleted() {
140+
status.finished();
141+
}
142+
});
143+
AsyncProfilerMetaData metaData = AsyncProfilerMetaData.newBuilder()
144+
.setService(Config.Agent.SERVICE_NAME)
145+
.setServiceInstance(Config.Agent.INSTANCE_NAME)
146+
.setType(AsyncProfilingStatus.PROFILING_SUCCESS)
147+
.setContentSize(size)
148+
.setTaskId(task.getTaskId())
149+
.build();
150+
AsyncProfilerData asyncProfilerData = AsyncProfilerData.newBuilder().setMetaData(metaData).build();
151+
dataStreamObserver.onNext(asyncProfilerData);
152+
153+
status.wait4Finish();
154+
}
153155
}
154156

155157
public void sendError(AsyncProfilerTask task, String errorMessage) {

apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/asyncprofiler/AsyncProfilerTaskExecutionService.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
2828

2929
import java.io.File;
30-
import java.io.FileInputStream;
3130
import java.io.IOException;
32-
import java.nio.channels.FileChannel;
3331
import java.util.Objects;
3432
import java.util.concurrent.Executors;
3533
import java.util.concurrent.ScheduledExecutorService;
@@ -90,20 +88,15 @@ private void stopWhenError(AsyncProfilerTask task, String errorMessage) {
9088
}
9189

9290
private void stopWhenSuccess(AsyncProfilerTask task) {
93-
91+
// stop task and send data
9492
try {
9593
File dumpFile = task.stop(getAsyncProfiler());
96-
// stop task
97-
try (FileInputStream fileInputStream = new FileInputStream(dumpFile)) {
98-
// upload file
99-
FileChannel channel = fileInputStream.getChannel();
100-
94+
if (dumpFile != null && dumpFile.exists()) {
10195
AsyncProfilerDataSender dataSender = ServiceManager.INSTANCE.findService(AsyncProfilerDataSender.class);
102-
dataSender.sendData(task, channel);
103-
}
104-
105-
if (!dumpFile.delete()) {
106-
LOGGER.warn("Fail to delete the dump file of async profiler.");
96+
dataSender.sendData(task, dumpFile);
97+
if (!dumpFile.delete()) {
98+
LOGGER.warn("Fail to delete the dump file of async profiler.");
99+
}
107100
}
108101
} catch (Exception e) {
109102
LOGGER.error("stop async profiler task error", e);

0 commit comments

Comments
 (0)