[英]X-Ray configuration for Spring Batch Job
X-Ray 已集成到我的服务中,当其他服务触发某些端点时一切正常。
Spring 批处理作业用于处理一些数据并将其中的一部分推送到 SNS 主题。 这个工作是通过SimpleJobLauncher
启动的。
问题是在从我的 Spring 批次推送到 SNS 期间抛出以下异常: SegmentNotFoundException: No segment in progress
。
根据文档,我似乎需要将跟踪 ID 传递给作业: https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-multithreading.html
有谁知道将 X-Ray 与 Spring Batch 集成的最佳方法是什么? 什么是最干净的解决方案?
我通过以下方式解决了这个问题:
我在启动作业时通过作业参数将名称、跟踪 ID 和父 ID 传递给了我的作业:
Entity segment = AWSXRay.getGlobalRecorder().getTraceEntity();
asyncJobLauncher.run(
myJob,
new JobParametersBuilder()
.addLong(JOB_UNIQUENESS_KEY, System.nanoTime())
.addString(X_RAY_NAME_ID_KEY, segment.getName())
.addString(X_RAY_TRACE_ID_KEY, segment.getTraceId().toString())
.addString(X_RAY_PARENT_ID_KEY, segment.getParentId())
.toJobParameters()
);
我已经实现了作业侦听器以在开始作业时创建一个新的 X-Ray 片段:
@Slf4j
@Component
@RequiredArgsConstructor
public class XRayJobListener implements JobExecutionListener {
@Value("${spring.application.name}")
private String appName;
@Override
public void beforeJob(@NonNull JobExecution jobExecution) {
AWSXRayRecorder recorder = AWSXRay.getGlobalRecorder();
String name = Objects.requireNonNullElse(
jobExecution.getJobParameters().getString(X_RAY_NAME_ID_KEY),
appName
);
Optional<String> traceIdOpt =
Optional.ofNullable(jobExecution.getJobParameters().getString(X_RAY_TRACE_ID_KEY));
TraceID traceID =
traceIdOpt
.map(TraceID::fromString)
.orElseGet(TraceID::create);
String parentId = jobExecution.getJobParameters().getString(X_RAY_PARENT_ID_KEY);
recorder.beginSegment(name, traceID, parentId);
}
@Override
public void afterJob(@NonNull JobExecution jobExecution) {
AWSXRay.getGlobalRecorder().endSegment();
}
}
这个监听器被添加到我的工作配置中:
@Bean
public Job myJob(
JobBuilderFactory jobBuilderFactory,
Step myStep1,
Step myStep2,
XRayJobListener xRayJobListener
) {
return
jobBuilderFactory
.get("myJob")
.incrementer(new RunIdIncrementer())
.listener(xRayJobListener)
.start(myStep1)
.next(myStep2)
.build();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.