[DOCKER] Essayez d'exécuter AWS X-Ray en Java

Conditions préalables

Pour les débutants en rayons X. Je sais en quelque sorte, mais c'est un article que j'ai confirmé en essayant diverses choses, en particulier ce qui peut être fait et comment le mettre en œuvre.

En tant qu'environnement, une application Web est implémentée avec Spring Boot + Maven. Gradle doit être le même, sauf pour la résolution des dépendances.

Créez une image de conteneur Docker pour X-Ray.

Tout d'abord, créez une image de conteneur avec un EC2 approprié. Cette fois, faisons-le sur la base de l'exemple AWS.

$ git clone https://github.com/aws-samples/aws-xray-fargate

Essayez d'exécuter la commande écrite dans buildspec.yml.

$ aws ecr get-login --no-include-email --region ap-northeast-1

Après avoir obtenu les informations de connexion avec, exécutez. Ap-nord-est-1 spécifie la région que vous utilisez.

$ docker build -t xray:latest .

Vérifions la normalité de l'image du conteneur créée. Reportez-vous à ce qui suit. La signification de chaque option d'exécution du docker est également décrite, veuillez donc la lire.

[Officiel] Exécutez le démon X-Ray localement

$ docker run \
  --attach STDOUT \
  -v ~/.aws/:/root/.aws/:ro \
  --net=host \
  -e AWS_REGION=ap-northeast-1 \
  --name xray \
  -p 2000:2000/udp \
  xray -o

Ajoutez également la stratégie IAM de AWSXRayDaemonWriteAccess au rôle EC2.

Prise en charge des rayons X pour les applications

Recevoir une demande d'assistance

Reportez-vous au guide du développeur ci-dessous et envoyez le journal X-Ray au démon côté application.

[Officiel] AWS X-Ray SDK for Java

Il semble facile de simplement répondre aux demandes entrantes. Implémentez une classe qui est `` WebConfig.java '' comme suit. ApigwTest est le nom de l'application Web créée dans l'exemple.

WebConfig.java


package com.example;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import javax.servlet.Filter;
import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter;

@Configuration
public class WebConfig {

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

Étant donné que X-Ray doit utiliser le kit AWS SDK, écrivez ce qui suit dans pom.xml pour résoudre la dépendance.

pom.xml


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

	<dependencies>
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-xray-recorder-sdk-core</artifactId>
		</dependency>
	</dependencies>

En passant, lorsque vous démarrez cette application et y accédez, vous pourrez tracer comme ça.

キャプチャ6.PNG

Obtenez des informations détaillées

De plus, mettez le code suivant dans la classe `` WebConfig '' créée dans ↑ afin de pouvoir obtenir les informations du nœud qui a reçu la demande de réception.

import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.AWSXRayRecorderBuilder;
import com.amazonaws.xray.plugins.EC2Plugin;
import com.amazonaws.xray.plugins.ECSPlugin;

  static {
	  AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().withPlugin(new EC2Plugin()).withPlugin(new ECSPlugin());
	  
	  AWSXRay.setGlobalRecorder(builder.build());
  }

Si vous faites cela sur EC2, la carte de service indiquera qu'il s'agit d'une instance EC2, comme indiqué ci-dessous.

キャプチャ7.PNG

Prise en charge de la trace en aval

De plus, si vous souhaitez obtenir des informations sur les services Web en aval en tant que client HTTP, essayez de mettre quelque chose comme ça dans le contrôleur.

import com.amazonaws.xray.proxies.apache.http.HttpClientBuilder;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import java.io.IOException;
(Omission)
	public int HttpClient(String URL) throws IOException {
		int statusCode = 500;
		
		CloseableHttpClient httpclient = HttpClientBuilder.create().build();
		HttpGet httpGet = new HttpGet(URL);
		CloseableHttpResponse clientResponse = httpclient.execute(httpGet);

		try {
			statusCode = clientResponse.getStatusLine().getStatusCode();
		} finally {
			clientResponse.close();
		}
		
		return statusCode;
	}

De plus, pour importer `` com.amazonaws.xray.proxies.apache.http.HttpClientBuilder '', ajoutez la dépendance suivante à pom.xml.

pom.xml


	<dependencies>
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-xray-recorder-sdk-apache-http</artifactId>
		</dependency>
	</dependencies>

Ensuite, vous pouvez également obtenir des informations en aval comme indiqué ci-dessous.

キャプチャ8.PNG

À propos, ce service en aval a été implémenté par la fonction Lambda, donc quand je me suis soudainement intéressé et que j'ai activé le paramètre X-Ray du côté de la fonction Lambda, ↓ Je n'ai pas eu d'éléments en double comme celui-ci. intelligent.

キャプチャ9.PNG

Courir avec ECS sur Fargate

Tout d'abord, poussez le conteneur de rayons X qui a été confirmé pour fonctionner jusqu'à ce point vers ECR. N'oubliez pas de créer un référentiel xray à l'avance.

$ docker tag xray:latest [ID de compte AWS].dkr.ecr.[Région].amazonaws.com/xray:latest
$ docker push [ID de compte AWS].dkr.ecr.[Région].amazonaws.com/xray:latest

Ici aussi, AWSXRayDaemonWriteAccess est affecté au rôle de tâche ECS et au rôle d'exécution de tâche.

Mettez l'image de xray PUSHed dans ↑ dans la définition de tâche du conteneur. En parlant de modèle CloudFormation, dans `` ContainerDefinitions '', écrivez la définition suivante à côté de la définition de conteneur existante. Dans le cas d'ECS sur EC2 qui n'utilise pas awsvpc, d'autres paramètres sont nécessaires, mais dans le cas de Fargate, cela fonctionne avec awsvpc, il semble donc facile à ajouter.

    - Name: X-Ray-Daemon
      Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/xray:latest
      Cpu: 32
      MemoryReservation: 256
      PortMappings:
        - ContainerPort: 2000
          Protocol: udp

Lorsque la trace active côté Lambda était activée, elle pouvait être acquise de la même manière que EC2.

キャプチャ10.PNG

Toutefois, lorsque la trace active du côté Lambda était désactivée, la trace de la demande pouvait être obtenue, mais la trace en aval ne pouvait pas être obtenue. Certains paramètres peuvent encore manquer.

Recommended Posts

Essayez d'exécuter AWS X-Ray en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
Essayez d'utiliser RocksDB avec Java
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
Essayez le type fonctionnel en Java! ①
Essayez d'implémenter Android Hilt en Java
Essayez d'exécuter ruby-net-nntp et tmail en 2020
Essayez une expression If en Java
Suppression d'objets AWS S3 dans Java
Dossiers renommés dans AWS S3 (Java)
Essayez d'implémenter Yuma en Java
Essayez de résoudre Project Euler en Java
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
Essayez d'utiliser l'API au format JSON en Java
Essayez d'appeler le service CORBA sur Java 11+
Essayez d'exécuter Kubernetes Job à partir de Java
Créons une application de calcul avec Java
Essayez de gérer les bibliothèques Java avec AWS CodeArtifact
Partition en Java
Essayez Java 8 Stream
Janken à Java
Taux circonférentiel à Java
Essayez grossièrement Java 9
FizzBuzz en Java
[AWS IoT] Implémentation de l'autorisation d'appels directs en Java [Java]
Essayez de gratter environ 30 lignes en Java (sortie CSV)
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Il est tard! Essayez d'implémenter la notification Android en Java (débutant)
Fonctions Azure en Java
Essayez LetCode dans Ruby-TwoSum
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Hello World en Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook