Korrelieren Sie Spuren für parallel gesendete Spannen für das Springboot-MikrometerJava

Java-Forum
Guest
 Korrelieren Sie Spuren für parallel gesendete Spannen für das Springboot-Mikrometer

Post by Guest »

Ich habe einen Springboot 3.4-Webdienst mit Mikrometer
Der Endpunkt ist unkompliziert, der Controller akzeptiert eine Liste von Nachrichten, die an eine externe Rest-API gesendet werden, über die ich keine Kontrolle habe. Die Verarbeitung auf ihrer Seite dauert sehr lange.
Die Nutzlast sieht so aus, dies ist nur ein Beispiel, stellen Sie sich bitte viele, viele innere Nachrichten vor.

Code: Select all

[
"somefirst message",
"some second message",
"etc"
]
Um dies zu bewältigen, habe ich den folgenden Federruhe-Controller geschrieben:

Code: Select all

    @PostMapping("/question2")
public String question2(@RequestBody List messages) {
Observation parent = Observation.createNotStarted("parent", registry);
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (String message : messages) {
parent.observe(() -> {
ContextExecutorService.wrap(executor,
() -> ContextSnapshotFactory.builder().build().captureAll())
.submit(() -> {
Observation.createNotStarted("child" + message, registry).observe(() -> {
messageProducer.sendRequest("topic-loom-micrometer",
message + Thread.currentThread().getName());
});
});
});
}
executor.shutdown();
}
return "it seems everything went fine";
}
Ich habe auch eine andere Version mit dem neuen Stream + Gatherers Map Concurrent-Konstrukt geschrieben.

Code: Select all

@PostMapping("/question3")
public List question3(@RequestBody List messages) {
Observation parent = Observation.createNotStarted("parent", registry);
return messages.stream()
.gather(Gatherers.mapConcurrent(messages.size() + 1, oneMessage -> sendRequestInParallel(oneMessage, parent)))
.toList();
}

private String sendRequestInParallel(String oneMessage, Observation parent) {
return parent.observe(() -> {
return Observation.createNotStarted("child" + oneMessage, registry).observe(() -> {
return restClient.post()
.uri("http://localhost:8081/justString?name=" + oneMessage)
.retrieve()
.body(String.class);
});
});
}
Es scheint jedoch ein Problem bei der Ablaufverfolgung zu geben.
In einer einfachen alten for-Schleife würden wir so etwas sehen, eine Art Kaskade

Code: Select all

        for (String message : messages) {
messageProducer.sendMessage("topic-loom", message);
}
Image

Bei Project Loom, dem virtuellen Thread (erstes Konstrukt) oder dem Gatherers MapConcurent (zweiter Ansatz) hätte ich erwartet, so etwas zu sehen (bitte korrigieren Sie mich, wenn ich falsch liege). Etwas wie „keine Kaskade, sondern paralleler“.
Image

Bei beiden Ansätzen scheint es jedoch ein Problem mit den Spuren zu geben. Es zeigt etwas sehr Seltsames mit dem übergeordneten Element.
Image
< /p>
Frage:
Wie man etwas Ähnliches wie die Schleife (erstes Bild) richtig anzeigt, wo es nur zwei Ebenen, die Hauptaufgabe und alles gibt die Parallelläufe?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post