[英]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.