23 januari, 2023

Kategoriserat i: ,

Öka övervakningen för din applikation med AWS X-Ray

AWS X-Ray  är ett distribuerat spårningsramverk som ger en vy över hur dina anrop färdas genom applikationen och infrastrukturen. Du kan aktivera det för AWS Lambda men för andra installationer måste du också installera en agent. Ditt program måste också integreras med AWS X-Ray SDK.

Med AWS X-Ray kan du till exempel se svarstid och fördröjning i anropsflödet och identifiera flaskhalsar. Det syftar till att ge en heltäckande vy över anropsflödet som en enda enhet.

Spårningen är baserad på sampling så att använda detta för audit syfte är inte lämpligt. Dessutom så sparas detta inte under nån lång tid heller.

Hur fungera det?

AWS lägger till ett unikt X-Ray-ID på alla inkommande anrop och ser sedan till att ID:t följer med när ditt program anropar andra program och AWS-tjänster. Tjänster som stöder X-Ray är t.ex. API Gateway, AWS Lambda, AWS SQS, AWS SNS och AWS S3, vilket innebär att när din applikation använder AWS SDK-klienterna för AWS SQS kommer X-Ray-ID att följa med i SQS-meddelandet. För utgående HTTP-anrop till andra mikrotjänster måste du använda X-Ray SDK. Java-versionen av SDK:t har en egen HttpClientBuilder som producerar en X-Ray-instrumenterad Apache Http-klient.

Enkel demo med en AWS Lambda-funktion bakom en API Gateway

Installationen i den här demonstrationen är en AWS lambda-funktion som implementerar ett REST API med grundläggande CRUD-funktioner. Lambda-funktionen installeras bakom API Gateway. (Med API Gateway och AWS Lambda kan du skriva serverlösa program på AWS.) Lambdafunktionen är i själva verket en REST-endpoint skriven i Micronaut som är ett ramverk för mikrotjänster och serverlösa applikationer. DB:n är AWS RDS MySQL men det kan vara vilken DB som helst.

Lambdafunktionen måste installeras med ”advanced tracing” aktiverad. AWS lägger sedan till HTTP-headers med ett unikt X-Ray-ID och ett anrops-ID och nedströms X-Ray SDK ser till att X-Ray-ID:t skickas vidare i alla anrop till andra AWS-tjänster som ditt program använder.

Om lambdan är skriven i Java och du använder en  lambda-event till HTTP-anrop proxy för SpringBoot eller Micronaut kan du logga X-Ray-ID:t i loggen eftersom AWS lägger till det i MDC (Mapped Diagnostic Context) för SLF4J/Logback:

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>[%date{yyyy-MM-dd'T'HH:mm:ss.SSSX, UTC}] [${HOSTNAME}] [%thread] %-5level %logger{36} - AWS-XRAY-TRACE-ID=%mdc{AWS-XRAY-TRACE-ID:-N/A} - AWSRequestId=%mdc{AWSRequestId:-N/A} - %msg%n
      </pattern>
    </encoder>
  </appender>

För att kunna spåra anropen till databasen måste du wrappa datakällan med en proxy för X-Ray. Först måste man lägga till X-Ray SDK i build.gradle:

implementation 'com.amazonaws:aws-xray-recorder-sdk-sql:2.13.0'

Sedan måste du skapa en datasource och wrappa den. Här nedan görs det i Micronaut och Hikari connection pool:

import javax.sql.DataSource;
import com.amazonaws.xray.sql.TracingDataSource;
import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration;
import io.micronaut.configuration.jdbc.hikari.DatasourceFactory;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.annotation.*;

@Factory
@Replaces(factory = DatasourceFactory.class)
public class XrayDataSourceFactory extends DatasourceFactory {
  public XrayDataSourceFactory(ApplicationContext applicationContext) {
    super(applicationContext);
  }
  @Override
  @Context
  @EachBean(DatasourceConfiguration.class)
  public DataSource dataSource(DatasourceConfiguration datasourceConfiguration) {
    return new TracingDataSource(super.dataSource(datasourceConfiguration));
  }
}

Analysera X-Ray i CloudWatch

Om du vill undersöka anropsflödet för lambdan går du till CloudWatch och väljer X-Ray på den vänstra menyn. Du får en översikt över aktiviteterna med hjälp av fliken ”Service map”. Kom ihåg att välja en tidsram.

Du kan sedan öka detaljnivån per anrop eller visa genomsnittet. Nedan visas en vy över ett anrop av REST-endpoint som interagerar med databasen.

Så till exempel kan vi se att REST-endpoint:en spenderade 23 ms för att göra sitt men det övergripande anropet tog 38 ms från API Gateways synvinkeln.

X-Ray i applikationsloggen

I CloudWatch kan du också inspektera applikationens/lambdafunktionernas logg och se X-Ray-ID. T.ex.:

START RequestId: 1bca61ca-3a68-490b-9a5b-17ffe90b90f5 Version: $LATEST
[2023-01-19T14:22:54.517Z] [169.254.18.205] [main] DEBUG com.example.book.BookController - AWS-XRAY-TRACE-ID=1-6384c438-0fedb3f04adfce125a0efc80 - AWSRequestId=1bca61ca-3a68-490b-9a5b-17ffe90b90f5 - in add method
END RequestId: 1bca61ca-3a68-490b-9a5b-17ffe90b90f5
REPORT RequestId: 1bca61ca-3a68-490b-9a5b-17ffe90b90f5	Duration: 519.54 ms	Billed Duration: 520 ms	Memory Size: 1024 MB	Max Memory Used: 253 MB	Init Duration: 5606.27 ms	
XRAY TraceId: 1-6384c438-0fedb3f04adfce125a0efc80	SegmentId: 43b04fed75278d89	Sampled: true

(Loggsraden ovan kommer inte från samma anrop som skärmbilderna. Denna begäran var det första anropet till lambdan så den tid som rapporteras här inkluderar starttid för Micronaut-applikationen etc. Det första samtalet är svindlande 5,6 sekunder för s.k. ”kallstart”. Men efter det kommer AWS att hålla lambdafunktionen varm för nästa begäran. Men mer om detta i ett annat inlägg.)

Slutsats

AWS X-Ray är ett bra alternativ för att få en översikt över var din applikation tillbringar sin tid. Det är väldigt enkelt att börja använda det. Kostnaden är cirka 5 dollar per 1 miljon poster som registreras så definitivt överkomligt.

Vi på House of Clouds kan hjälpa dig att få ut det mesta av din molntjänstleverantör. Se våra erbjudanden om kostnadsoptimering, säkerhet, migrering, arkitektur och DevOps för mer information.

Skrivet av Lucas Persson