簡體   English   中英

Spring 批處理作業的 X 射線配置

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM