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.
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.
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.
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.
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.
À 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.
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.
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