[DOCKER] Versuchen Sie, AWS X-Ray in Java auszuführen

Voraussetzungen

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 ein Docker-Container-Image für X-Ray.

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.

Röntgenunterstützung für Anwendungen

Erhalten Sie Anforderungsunterstützung

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.

キャプチャ6.PNG

Erhalten Sie detaillierte Informationen

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.

キャプチャ7.PNG

Downstream-Trace-Unterstützung

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.

キャプチャ8.PNG

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

キャプチャ9.PNG

Führen Sie mit ECS auf Fargate aus

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.

キャプチャ10.PNG

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

Versuchen Sie, AWS X-Ray in Java auszuführen
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Versuchen Sie es mit RocksDB mit Java
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Versuchen Sie, Android Hilt in Java zu implementieren
Versuchen Sie, ruby-net-nntp und tmail im Jahr 2020 auszuführen
Versuchen Sie einen If-Ausdruck in Java
Löschen von AWS S3-Objekten in Java
Umbenannte Ordner in AWS S3 (Java)
Versuchen Sie, Yuma in Java zu implementieren
Versuchen Sie, Project Euler in Java zu lösen
Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie es mit der Stream-API in Java
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Versuchen Sie, Kubernetes Job von Java aus auszuführen
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Versuchen Sie, Java-Bibliotheken mit AWS CodeArtifact zu verwalten
Partisierung in Java
Probieren Sie Java 8 Stream aus
Janken in Java
Umfangsrate in Java
Versuchen Sie es mit Java 9
FizzBuzz in Java
[AWS IoT] Implementieren der Autorisierung von Direktaufrufen in Java [Java]
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Es ist spät! Versuchen Sie, Android Notification in Java (Anfänger) zu implementieren.
Azure funktioniert in Java
Versuchen Sie LetCode in Ruby-TwoSum
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek