Korrelieren Sie Spuren für Spannen, die parallel für Springboot-Mikrometer gesendet werdenJava

Java-Forum
Guest
 Korrelieren Sie Spuren für Spannen, die parallel für Springboot-Mikrometer gesendet werden

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

Kurz gesagt, das ist es, was ich erwarte:
[img]https:/ /i.sstatic.net/oTtpxpyA.png[/img]

Bei beiden Ansätzen scheint es jedoch ein Problem mit den Spuren zu geben. Es zeigt etwas sehr Seltsames mit dem übergeordneten Element.
Dies ist das tatsächliche Ergebnis:
Image

Frage:
Wie zeige ich etwas Ähnliches wie die Schleife richtig an ( erstes Bild), wo es nur zwei Ebenen gibt, die Hauptaufgabe und alle Parallelen läuft?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post