繁体   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