Für Röntgenanfänger. Ich weiß es irgendwie, aber dies ist ein Artikel, den ich bestätigt habe, als ich verschiedene Dinge ausprobiert habe, insbesondere was getan werden kann und wie man es implementiert.
Als Umgebung wird eine Webanwendung mit Spring Boot + Maven implementiert. Gradle sollte bis auf die Abhängigkeitsauflösung gleich sein.
Erstellen Sie zunächst ein Container-Image mit einem geeigneten EC2. Dieses Mal machen wir es basierend auf dem AWS-Beispiel.
$ git clone https://github.com/aws-samples/aws-xray-fargate
Versuchen Sie, den in buildspec.yml geschriebenen Befehl auszuführen.
$ aws ecr get-login --no-include-email --region ap-northeast-1
Nachdem Sie die Anmeldeinformationen mit erhalten haben, führen Sie aus. `` `ap-northeast-1``` gibt die Region an, die Sie verwenden.
$ docker build -t xray:latest .
Lassen Sie uns die Normalität des erstellten Container-Images überprüfen. Beachten Sie Folgendes. Die Bedeutung jeder Docker-Ausführungsoption wird ebenfalls beschrieben. Bitte lesen Sie sie.
[Offiziell] Führen Sie den X-Ray-Daemon lokal aus
$ 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
Fügen Sie der EC2-Rolle außerdem die IAM-Richtlinie "AWSXRayDaemonWriteAccess" hinzu.
Lesen Sie das Entwicklerhandbuch unten und senden Sie das Röntgenprotokoll an den Dämon auf der Anwendungsseite.
[Offiziell] AWS X-Ray SDK für Java
Es scheint einfach zu sein, nur auf eingehende Anfragen zu antworten. Implementieren Sie eine Klasse mit dem Namen "WebConfig.java" wie folgt. `` `ApigwTest``` ist der Name der im Beispiel erstellten Web-App.
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");
}
}
Da X-Ray das AWS SDK verwenden muss, schreiben Sie Folgendes in pom.xml, um die Abhängigkeit aufzulösen.
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>
Übrigens, wenn Sie diese App starten und darauf zugreifen, können Sie dies nachverfolgen.
Fügen Sie außerdem den folgenden Code in die in ↑ erstellte `` `WebConfig```-Klasse ein, damit Sie die Informationen des Knotens abrufen können, der die Empfangsanforderung empfangen hat.
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());
}
Wenn Sie dies auf EC2 tun, zeigt die Service Map, dass es sich um eine EC2-Instanz handelt, wie unten gezeigt.
Wenn Sie als HTTP-Client Informationen zu nachgeschalteten Webdiensten abrufen möchten, versuchen Sie außerdem, so etwas in den Controller zu integrieren.
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;
(Unterlassung)
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;
}
Fügen Sie außerdem pom.xml die folgende Abhängigkeit hinzu, um `` `com.amazonaws.xray.proxies.apache.http.HttpClientBuilder``` zu importieren.
pom.xml
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-xray-recorder-sdk-apache-http</artifactId>
</dependency>
</dependencies>
Anschließend können Sie auch nachgeschaltete Informationen abrufen, wie unten gezeigt.
Übrigens wurde dieser Downstream-Service von der Lambda-Funktion implementiert. Als ich plötzlich interessiert wurde und die Röntgeneinstellung auf der Lambda-Funktionsseite aktivierte, ↓ habe ich keine doppelten Elemente wie diese erhalten. Clever.
Schieben Sie zuerst den Röntgenbehälter, von dem bestätigt wurde, dass er bis zu diesem Punkt funktioniert, auf ECR. Vergessen Sie nicht, im Voraus ein Röntgen-Repository zu erstellen.
$ docker tag xray:latest [AWS-Konto-ID].dkr.ecr.[Region].amazonaws.com/xray:latest
$ docker push [AWS-Konto-ID].dkr.ecr.[Region].amazonaws.com/xray:latest
Auch hier wird `` `AWSXRayDaemonWriteAccess``` der ECS-Aufgabenrolle und der Aufgabenausführungsrolle zugewiesen.
Fügen Sie das Bild von xray PUSHed in ↑ in die Aufgabendefinition des Containers ein. Wenn Sie von der CloudFormation-Vorlage sprechen, schreiben Sie in `` `ContainerDefinitions``` die folgende Definition neben die vorhandene Containerdefinition. Im Fall von ECS auf EC2, das awsvpc nicht verwendet, sind andere Einstellungen erforderlich. Im Fall von Fargate funktioniert es jedoch mit awsvpc, sodass das Hinzufügen einfach zu sein scheint.
- 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
Wenn der aktive Trace auf der Lambda-Seite aktiviert war, konnte er auf die gleiche Weise wie EC2 erfasst werden.
Wenn jedoch die aktive Ablaufverfolgung auf der Lambda-Seite deaktiviert war, konnte die Ablaufverfolgung für die Anforderung abgerufen werden, die nachgeschaltete Ablaufverfolgung konnte jedoch nicht abgerufen werden. Möglicherweise fehlen noch einige Einstellungen.
Recommended Posts