Analyse von verteilten Anwendungen Microservice-Debugging unter AWS

Autor / Redakteur: Sascha Möllering * / Stephan Augsten

„Wir haben eine komplexe Microservices-Architektur in AWS aufgebaut und möchten diese gerne debuggen. Welche Empfehlungen und Services existieren für die Analyse von komplexen verteilten Systemen?“

Anbieter zum Thema

Schematische Darstellung von AWS X-Ray.
Schematische Darstellung von AWS X-Ray.
(Bild: AWS Germany GmbH)

Jede nicht-triviale Microservices-Architektur wird ab einem bestimmten Zeitpunkt zu einem gewissen Maße unübersichtlich, da die Applikationslogik durch die korrekte Reihenfolge von Serviceaufrufen implementiert wird. Dabei hat jeder Service ganz eigene Eigenschaften in Bezug auf Antwortverhalten, was immer wieder zu Fällen führen kann, bei denen eine bestimmte Anfrage zu einer Antwortzeit führt, die vom Erwartungswert erheblich abweicht.

In solchen Fällen ist es oft nicht einfach zu ermitteln, wo konkret die hohe Antwortzeit in der verteilten Architektur entsteht. Eines der Entwurfsmuster, mit dem eine Analyse einer solchen Situation signifikant einfacher ist, ist das sogenannte „Distributed Tracing“. Der Service AWS X-Ray hilft Entwicklern und Architekten dabei, verteilte Anwendungen zu analysieren und zu debuggen.

X-Ray hilft dabei zu verstehen, wie die Anwendung und die ihr zugrundeliegenden Services Prozesse ausführen, um die Ursachen von Leistungsproblemen und Fehlern identifizieren und beheben zu können. Darüber hinaus bietet X-Ray eine End-to-End-Ansicht der Requests auf ihrem Weg durch die Anwendungen und zeigt eine Übersicht der Komponenten, die dieser spezifischen Anwendung zugrunde liegen. Mit X-Ray können sowohl Anwendungen in der Entwicklung und als auch in Produktion analysiert werden.

Integration von AWS X-Ray

AWS X-Ray unterstützt aktuell Amazon EC2, Amazon EC2 Container Service (Amazon ECS), AWS Lambda und AWS Elastic Beanstalk. Die Anwendungen in diesen Services müssen dabei entweder in Java, Node.js oder .NET implementiert worden sein.

Schematische Darstellung von AWS X-Ray.
Schematische Darstellung von AWS X-Ray.
(Bild: AWS Germany GmbH)

Das Software Development Kit (SDK) von AWS X-Ray bietet sogenannte Interceptors, die zum eigenen Quelltext hinzugefügt werden können, um eingehende HTTP-Anfragen nachverfolgen zu können. Darüber hinaus existieren noch Client Handler, um AWS SDK Clients zu instrumentieren, die die eigene Applikation nutzt, um andere AWS Services aufzurufen. Ein weiterer Bestandteil ist ein HTTP Client, mit dessen Hilfe Aufrufe an interne und externe HTTP Web Services instrumentiert werden können.

Beispielhafter Service Graph.
Beispielhafter Service Graph.
(Bild: AWS Germany GmbH)

Das X-Ray SDK sendet die einzelnen Datenpunkte nicht direkt zum X-Ray-Service, vielmehr werden JSON-Segmente an einen Daemon-Prozess geschickt. Dieser Daemon puffert die einzelnen Segmente in einer Queue und lädt diese zum X-Ray Service in Batches. Aus diesen Daten generiert X-Ray einen detaillierten Service Graphen, der den Client und alle instrumentierten Services zeigt. Dieser Service Graph kann genutzt werden, um Engpässe und Latenzausreißer zu identifizieren.

Instrumentierung einer Java-Anwendung

Die Instrumentierung einer Java-Anwendung, die in die Tomcat-Servlet Engine – was beispielsweise mit AWS Elastic Beanstalk sehr einfach ist – deployt wird, ist mit sehr geringem Aufwand möglich. Als Dependency ist dabei lediglich aws-xray-recorder-sdk-core notwendig:

...
<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>
<dependencies>
   <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-core</artifactId>
   </dependency>
   <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-apache-http</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>
   </dependency>
   <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-sql-postgres</artifactId>
   </dependency>
   <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-xray-recorder-sdk-sql-mysql</artifactId>
   </dependency>
</dependencies>
...

In der web.xml-Datei muss zusätzlich noch ein ServletFilter registriert werden, durch den alle HTTP-Anfragen geleitet werden. Der Parameter fixedName kann verwendet werden, um einen Service-Namen für den X-Ray-Service zu definieren.

...
<filter>
   <filter-name>AWSXRayServletFilter</filter-name>
   <filter-class>com.amazonaws.xray.javax.servlet.AWSXRayServletFilter</filter-class>
   <init-param>
      <param-name>fixedName</param-name>
      <param-value>MyApp</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>AWSXRayServletFilter</filter-name>
   <url-pattern>*</url-pattern>
</filter-mapping>
...

Mit Hilfe dieser Konfigurationen kann AWS X-Ray in einer eigenen Anwendung integriert werden, die in einem Tomcat-Container läuft. Natürlich können innerhalb der Anwendung auch zusätzliche X-Ray-Funktionalitäten wie die Definition eigener Subsegmente genutzt werden.

Fazit

Sascha Möllering
Sascha Möllering
(Bild: AWS Germany GmbH)

AWS X-Ray ist ein mächtiges Werkzeug zur Analyse und Optimierung von verteilten Anwendungen. Dieser Service bietet eine große Anzahl von Integrationen in AWS Services und unterstützten Sprachen bzw. AWS SDKs. Mit Hilfe von AWS X-Ray kann sehr einfach ein hohes Maß an Transparenz in verteilte Architekturen gebracht werden.

* Sascha Möllering arbeitet als Solutions Architect bei der Amazon Web Services Germany GmbH. Seine Interessen liegen in den Bereichen Automation, Infrastructure as Code, Distributed Computing, Container und JVM.

(ID:45354751)