AWS XRay - Не удалось начать подсегмент с именем 'AWSSecurityTokenService': сегмент не может быть найден во время запроса - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь настроить AWS XRay в новом (i sh) приложении Spring Boot.

Я хотел бы проверить его локально, прежде чем запускать в производство. Локально это приложение работает с клиентом DynamoDB и STS, чтобы взять на себя роль вызова Dynamo.

Служба запускается нормально, загружает все компоненты, но когда я выполняю вызов службы, она завершается с

Failed to begin subsegment named 'AWSSecurityTokenService': segment cannot be found

Когда он пытается вызвать DynamoDB, чтобы сохранить элемент. Я думал, что если вы добавите зависимости aws -xray-Recorder-sdk- aws -sdy, то такие пакеты, как AWSSecurityTokenService, автоматически получат подсегмент контекста во время запроса? Чего мне не хватает?

Я добавил следующее в pom. xml:

    <!-- AWS XRay -->
      <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-bom</artifactId>
        <version>1.3.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-core</artifactId>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-aws-sdk</artifactId>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-aws-sdk-instrumentor</artifactId>
      <version>2.4.0</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-aws-sdk-v2</artifactId>
      <version>2.4.0</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-aws-sdk-v2-instrumentor</artifactId>
      <version>2.4.0</version>
    </dependency>

И следующий аспект:

import java.util.HashMap;
import java.util.Map;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.entities.Subsegment;

@Aspect
@Component
@Profile("!test")
public class XRayInspector {

    private static final Logger LOG = LoggerFactory.getLogger(XRayInspector.class);

    @Around("!execution(* com.things.service.config..*(..)) && " +
            "execution(* com.things.service.controller..*(..)) && " +
            "execution(* com.things.service.factory..*(..)) && " +
            "execution(* com.things.service.exceptions..*(..)) && " +
            "execution(* com.things.service.security..*(..)) && " +
            "execution(* com.things.service.model..*(..)) && " +
            "execution(* com.things.service.service..*(..))")
    public Object logExecutionTime(final ProceedingJoinPoint joinPoint) throws Throwable {
        return this.processXRayTrace(joinPoint);
    }

    protected Object processXRayTrace(final ProceedingJoinPoint pjp) throws Throwable {
        try {
            final Subsegment subsegment = AWSXRay.beginSubsegment(pjp.getSignature().getName());
            subsegment.setMetadata(generateMetadata(pjp, subsegment));
            return conditionalProceed(pjp);
        } catch (final Exception e) {
            AWSXRay.getCurrentSegment().addException(e);
            throw e;
        } finally {
            LOG.trace("Ending Subsegment");
            AWSXRay.endSubsegment();
        }
    }

    public static Object conditionalProceed(final ProceedingJoinPoint pjp) throws Throwable {
        if (pjp.getArgs().length == 0) {
            return pjp.proceed();
        } else {
            return pjp.proceed(pjp.getArgs());
        }
    }

    public static Map<String, Map<String, Object>> generateMetadata(final ProceedingJoinPoint pjp, final Subsegment subsegment) {
        final Map<String, Map<String, Object>> metadata = new HashMap<>();
        final Map<String, Object> classInfo = new HashMap<>();
        classInfo.put("Class", pjp.getTarget().getClass().getSimpleName());
        metadata.put("ClassInfo", classInfo);
        return metadata;
    }

}

1 Ответ

0 голосов
/ 30 марта 2020

Есть ли у вас код инициализации? Если вызов STS выполняется до того, как запрос фактически поступит в службу, поддерживающую рентгеновские лучи (или вне запроса), это приведет к отсутствию исключения контекста. Мы рекомендуем либо опускать любые вызовы, которые не находятся отдельно от пути запроса (используя неотслеживаемый клиент AWS), либо установить для переменной env переменной AWS_XRAY_CONTEXT_MISSING значение LOG_ERROR:

https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray -sdk- java -конфигурация-envvars

...