Wie verfolgt verteiltes Tracing eine KI-Anfrage über selbst gehostete Dienste hinweg?

Eva Wong ist die Technische Redakteurin und und leidenschaftliche Tüftlerin bei ZimaSpace. Eine lebenslange Geek mit einer Leidenschaft für Homelabs und Open-Source-Software, sie spezialisiert sich darauf, komplexe technische Konzepte in zugängliche, praktische Anleitungenzu übersetzen. Eva ist der Meinung, dass Self-Hosting Spaß machen und nicht einschüchternd sein sollte. Durch ihre Tutorials befähigt sie die Community, Hardware-Setups zu entmystifizieren, vom Bau ihres ersten NAS bis hin zur Beherrschung von Docker-Containern.

Distributed Tracing verfolgt eine einzelne KI-Anfrage, indem es eine gemeinsame Trace-Identität über Service-Grenzen hinweg weitergibt und jede beteiligte Operation als kausal verknüpften Span aufzeichnet.

Eine selbst gehostete KI-Anfrage kann einen Reverse-Proxy, einen Agent-Service, einen Vektorspeicher, eine Laufzeitumgebung für Modelle, eine Arbeitswarteschlange, einen Speicherdienst und einen Tool-Endpunkt durchlaufen, bevor der Nutzer eine Antwort sieht. Diese Komponenten können in unterschiedlichen Containern oder auf verschiedenen Maschinen laufen und unabhängige Logs schreiben. Die zeitliche Nähe allein kann daher nicht beweisen, welche Vorgänge zu einer Anfrage gehören. Distributed Tracing sorgt dafür, dass die Anfrageidentität zusammen mit der Arbeit weitergegeben wird, statt sie später nur vermutungsweise zu rekonstruieren.

Ein Trace gibt einer Anfrage von Anfang bis Ende eine gemeinsame Identität

Ein Trace stellt den vollständigen Anfragepfad dar, während jeder Span eine begrenzte Operation wie Retrieval, Reranking, Modellinferenz, einen Tool-Aufruf oder die Serialisierung der Antwort erfasst. Wenn diese Spans dieselbe Trace-ID tragen, kann ein Backend die Arbeit verschiedener Services zusammenfassen, ohne anzunehmen, dass zeitnah auftretende Ereignisse kausal miteinander verbunden sind.

Die nützliche Einheit ist daher keine flache Liste von Zeitangaben, sondern ein verbundener Anfragebaum. Wenn sich eine Trace-ID über Service-Grenzen hinweg erstreckt, können zeitlich erfasste Operationen aus vielen Prozessen als eine Anfrage rekonstruiert werden, statt als voneinander getrennte Log-Einträge zu erscheinen.

In einem privaten KI-Stack kann der Root-Span an der nutzerseitigen API beginnen und sich in Retrieval, Berechtigungsprüfungen, Modellverarbeitung und Tools aufteilen. Der Trace beantwortet, welche Operationen zu dieser Anfrage gehörten, bevor überhaupt jemand fragt, warum sie langsam war.

Der Kontext muss an jeder Service-Grenze injiziert und extrahiert werden

Die Kontinuität eines Traces hängt davon ab, dass jeder Aufrufer den aktuellen Kontext in den ausgehenden Übertragungsträger injiziert und jeder Empfänger diesen Kontext extrahiert, bevor er seinen eigenen Span erstellt. Wenn ein Proxy, eine Client-Bibliothek oder ein Service stattdessen einen neuen Trace startet, bricht der End-to-End-Pfad ab, obwohl die zugrunde liegende Anfrage weiterhin erfolgreich abgeschlossen wird.

Der Mechanismus zur Kontextweitergabe überträgt Kennungen und den Sampling-Status, nicht die Nutzdaten der geschäftlichen Anfrage. Der Inject-/Extract-Zyklus ermöglicht es heterogenen Services, dieselbe Anfrageidentität zu bewahren, während die Arbeit Prozess- und Netzwerkgrenzen überschreitet.

Das ist in einem gemischten selbst gehosteten Stack wichtig, weil Reverse-Proxy, Python-Agent, Vektordatenbank sowie Rust- oder Go-Tool-Service nicht dieselbe Tracing-Bibliothek benötigen, solange ihr Weitergabeformat interoperabel bleibt.

Fehlende Kontextweitergabe ist daher ein Datenqualitätsfehler und kein Beweis dafür, dass der nachgelagerte Service unabhängig ausgeführt wurde. Fehlerhafte Traces sollten an der Grenze diagnostiziert werden, an der die Identität verloren ging.

Parent-Child-Beziehungen und Span-Links bewahren unterschiedliche kausale Strukturen

Direkte synchrone Arbeit bildet normalerweise eine Parent-Child-Kette, weil eine Operation die nächste startet und auf deren Abschluss wartet. Bei parallelen und asynchronen Abläufen kann die Beziehung jedoch komplexer sein. Ein Trace-Modell muss die Kausalität bewahren, ohne jede nachgelagerte Operation in einen künstlichen Aufrufstapel zu zwingen.

Parent-Child-Kanten sind nützlich, wenn ein Service-Aufruf direkt verschachtelt ist. Span-Links für nicht hierarchische Beziehungen können dagegen Arbeit verbinden, die durch eine frühere Aktivität ausgelöst wurde, aber nicht sauber unter einem einzigen aktiven Parent verschachtelt ist.

Eine private KI-Anfrage kann Retrieval und Berechtigungsprüfungen parallel starten und anschließend auf beide warten, bevor die Modellgenerierung beginnt. Der Trace sollte diese parallele Struktur bewahren, statt den Eindruck zu erwecken, dass der zuerst gestartete Span den anderen verursacht hat.

-15% OFF

Warteschlangen halten den Anfrage-Trace nur dann nachverfolgbar, wenn der Kontext zusammen mit der Nachricht weitergegeben wird

Eine asynchrone Warteschlange unterbricht den direkten In-Process-Aufrufstapel. Die eingereihten Arbeiten können jedoch weiterhin der ursprünglichen Anfrage zugeordnet bleiben, wenn der Trace-Kontext in den Nachrichtenmetadaten abgelegt wird. Der Consumer verwendet diesen Kontext anschließend, um bei Beginn der Verarbeitung den nächsten Span oder einen expliziten Link zu erstellen.

Das ist wichtig für OCR-, Embedding-, Kameraanalyse- oder Benachrichtigungsaufgaben, die ein Heimserver bewusst aus dem interaktiven Anfragepfad herausnimmt. Bei einer Übergabe über einen Nachrichtenbus bewahrt die explizite Kontextweitergabe die Trace-Identität, obwohl Thread-lokaler Zustand und der direkte Aufrufstapel nicht erhalten bleiben.

Die bestehende ZimaSpace-Erklärung zu separaten Arbeitswarteschlangen für Heim-KI erläutert, warum asynchrone Arbeit betrieblich isoliert wird. Distributed Tracing liefert die Identität, die diese isolierte Arbeit weiterhin mit der Anfrage verknüpft, durch die sie ausgelöst wurde.

Ohne diese Identität kann eine langsame Hintergrundphase wie ein unabhängiger Auftrag wirken, und der Betreiber übersieht möglicherweise die tatsächliche Fortsetzung der Nutzeranfrage.

Der rekonstruierte Trace macht den kritischen Pfad und seine Lücken sichtbar

Nachdem die Spans bei einem Tracing-Backend eingegangen sind, können ihre Kennungen, Zeitstempel, Parent-Beziehungen, Statusangaben und Servicemetadaten zu einer Ansicht der Anfrage von Anfang bis Ende zusammengesetzt werden. Der längste Span ist nicht automatisch die Ursache für die für den Nutzer sichtbare Verzögerung, da parallele Arbeiten sich überschneiden können. Die entscheidende Frage ist daher, welche Abhängigkeitskette den Abschluss bestimmt.

Wenn die Kontextweitergabe fehlt, werden Traces voneinander getrennt. Ein übersichtliches Wasserfalldiagramm ist daher nur so vollständig wie die Instrumentierung, durch die es erzeugt wurde.

Sampling bildet eine weitere Grenze: Eine nicht gesampelte Anfrage kann später keine vollständigen Span-Nachweise liefern, und ein nur teilweise instrumentierter Service kann in einem ansonsten gültigen Trace blinde Bereiche hinterlassen. Distributed Tracing verbessert daher die Sichtbarkeit von Kausalzusammenhängen, erzeugt aber keine Telemetriedaten für Operationen, die nie aufgezeichnet wurden.

Der Mechanismus ist erfolgreich, wenn sich eine einzelne Nutzeranfrage über den tatsächlichen selbst gehosteten Pfad verfolgen lässt, ohne die Logs jedes Services in dieselbe Datenbank zu zwingen oder vorzugeben, dass zeitliche Abläufe allein Kausalität beweisen.

Tech- & KI-Zentrum

Mehr zum Lesen

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.