Проблема с AWS XRAY SDK: не удалось начать подсегмент с именем «Amazon S3»: сегмент не найден - PullRequest
0 голосов
/ 19 декабря 2018

Мы добавляем XRAY в наше приложение Spring Boot, и я не могу устранить следующую ошибку:

Failed to begin subsegment named 'Amazon S3': segment cannot be found.

Вот соответствующие части нашего кода:

pom.xml:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-core</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-aws-sdk</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-aws-sdk-instrumentor</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-apache-http</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-spring</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-xray-recorder-sdk-sql-postgres</artifactId>
    <version>1.2.1</version>
</dependency> 

SpringApplication.java

@Bean
public Filter TracingFilter() {
    return new AWSXRayServletFilter("myService");
}

Класс, вызывающий S3

@PostConstruct
public void runOnStartup(){
    String fileName = "myFileName";
    String bucketName = "myBucketName";

    amazonS3Client = AmazonS3ClientBuilder.standard()
        .withCredentials(new ProfileCredentialsProvider("MyCredentials"))
        .withClientConfiguration(getClientConfiguration())
        .withRegion(region)
        .build();

    Segment segment = AWSXRay.beginSegment("do-startup-operation");
    S3Object s3Object = amazonS3Client.getObject(bucketName, fileName);
    AWSXRay.endSegment();

    //Do stuff with S3Object
}

Что я пробовал до сих пор:

1) Я пытался использовать импорт sdk-aws-sdk-instrumentor и без него, добавляя при этом конфигурацию TracingHandler, как описано в этом вопросе и этой документации.

.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))

2) Я нашел эту ветку , которая, кажется, предлагает использовать AWSXRAY.createSegment (), но я не уверен, что будет в лямбда-выражении или если это имеет отношение к моему сценарию

Прочая документация / код, который я прочитал и нашел соответствующим: https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-startup.html

https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-sdkclients.html

https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-multithreading.html

https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-workerthreads.html

https://github.com/aws/aws-xray-sdk-java/blob/master/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/ThreadLocalSegmentContext.java#L23

PS Я упростил свой код и пропустил некоторую обработку ошибок, чтобы тем, кто просматривает этот вопрос, было легче читать

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Теперь это работает после замены

AWSXRay.getGlobalRecorder()

на

Entity mySegment = AWSXRay.beginSegment("do-startup-operation");
AWSXRay.getGlobalRecorder().setTraceEntity(mySegment);
S3Object s3Object = amazonS3Client.getObject(bucketName, fileName);
AWSXRay.endSegment();
0 голосов
/ 20 декабря 2018

Рентгеновский сервлет-фильтр откроет сегмент, когда он получит запрос, и закроет его перед возвратом ответа.Сегмент, который он создает, представляет собой полный жизненный цикл запросов / ответов.Все, что фиксируется как часть обслуживания этого запроса (в данном случае это могут быть некоторые вызовы службы AWS), называется подсегментом.Как вы можете видеть, подсегменты нуждаются в контексте трассировки (для какого сегмента это).

Проблема в том, что при запуске сервера прибор пытается перехватить вызов S3, но не может найти контекст, так как нет запросавходить еще.Один из вариантов - установить для переменной среды AWS_XRAY_CONTEXT_MISSING значение LOG_ERROR, чтобы не было исключения, а была только запись в журнале.Подробнее см. На https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-envvars.

. Для запуска на лямбде-контейнерах лямбда будет создавать сегмент для каждого вызова.Он устанавливает контекст трассировки как переменную среды.Поэтому, пока захваченный код находится в классе обработчика, контекст всегда должен присутствовать.

...