Different traceId in single request with use StreamingResponseBody
in pom:
<dependency>
<groupId>net.ttddyy.observation</groupId>
<artifactId>datasource-micrometer-spring-boot</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
<version>${micrometer-registry-prometheus.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
<version>${micrometer-tracing.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
I am trying to call an endpoint controller
Example 1:
@RequiredArgsConstructor
@RestController
@Slf4j
public class MyController implements MyApi {
private final MyRepository repository;
@Override
public ResponseEntity<StreamingResponseBody> getData(String id, String date) {
StreamingResponseBody responseBody = outputStream -> {
repository.getFile(id, date, outputStream);
};
return ResponseEntity
.status(HttpStatus.OK)
.body(responseBody);
}
}
I got different traceId for call controller and call repository.
But if it looks like this:
Example 2:
@RequiredArgsConstructor
@RestController
@Slf4j
public class MyController implements MyApi {
private final MyRepository repository;
@Override
public ResponseEntity<StreamingResponseBody> getData(String id, String date) {
repository.getFile(id, date, OutputStream.nullOutputStream());
return ResponseEntity
.status(HttpStatus.OK)
.body(responseBody);
}
}
Here the trace is the same
StreamingResponseBody creates a new traceId, but I need the same traceId for this one request, and I need example 1
Example method in repository:
@SneakyThrows
public void getFile(String id, String data, OutputStream outputStream) {
try (Connection connection = dataSource.getConnection();
CallableStatement cs = connection.prepareCall(CALL_PROCEDURE)) {
cs.setDate(1, Date.valueOf(data));
cs.registerOutParameter(2, Types.LONGVARCHAR);
cs.execute();
try (Reader reader = cs.getCharacterStream(2);
OutputStreamWriter os = new OutputStreamWriter(outputStream)) {
reader.transferTo(os);
}
} catch (Exception e) {
log.error("get error", e);
}
}
1