Śledzenie rozproszone śledzi jedno żądanie AI, przenosząc wspólną tożsamość śladu przez granice usług i rejestrując każdą uczestniczącą operację jako przyczynowo powiązany odcinek.
Żądanie AI obsługiwane na własnej infrastrukturze może przejść przez odwrotny serwer proxy, usługę agenta, magazyn wektorów, środowisko uruchomieniowe modelu, kolejkę zadań, usługę pamięci masowej i punkt końcowy narzędzia, zanim użytkownik zobaczy odpowiedź. Komponenty te mogą działać w różnych kontenerach lub na różnych maszynach i zapisywać niezależne logi, dlatego sama bliskość czasowa nie dowodzi, które operacje należą do jednego żądania. Śledzenie rozproszone sprawia, że tożsamość żądania towarzyszy wykonywanej pracy, zamiast być później odtwarzana na podstawie domysłów.
Ślad nadaje jednemu żądaniu kompleksowemu wspólną tożsamość
Ślad przedstawia pełną ścieżkę żądania, a każdy odcinek rejestruje ograniczoną operację, taką jak pobieranie danych, ponowne rangowanie, wnioskowanie modelu, wywołanie narzędzia lub serializacja odpowiedzi. Gdy odcinki te mają jeden identyfikator śladu, system backendowy może grupować pracę z oddzielnych usług bez zakładania, że zdarzenia występujące blisko siebie w czasie są ze sobą przyczynowo powiązane.
Użyteczną jednostką nie jest więc płaska lista czasów, lecz połączone drzewo żądania. Gdy jeden identyfikator śladu obejmuje granice usług, operacje mierzone w wielu procesach można odtworzyć jako jedno żądanie, a nie jako niepowiązane rekordy logów.
W przypadku domowego stosu AI główny odcinek może zaczynać się w interfejsie API widocznym dla użytkownika i rozgałęziać się na pobieranie danych, sprawdzanie uprawnień, pracę modelu oraz narzędzia. Ślad wskazuje, które operacje należały do tego żądania, zanim ktokolwiek zacznie pytać, dlaczego trwało ono tak długo.
Kontekst trzeba wstrzykiwać i pobierać na każdej granicy usług
Ciągłość śladu zależy od tego, czy każdy wywołujący wstrzykuje bieżący kontekst do nośnika wychodzącego, a każdy odbiorca pobiera ten kontekst, zanim utworzy własny odcinek. Jeśli jeden serwer proxy, biblioteka kliencka lub usługa zamiast tego rozpocznie nowy ślad, ścieżka kompleksowa zostanie przerwana, nawet jeśli bazowe żądanie nadal zakończy się powodzeniem.
Mechanizm propagacji przenosi identyfikatory i stan próbkowania, a nie dane biznesowe użytkownika. Cykl wstrzykiwania i pobierania pozwala heterogenicznym usługom zachować tę samą tożsamość żądania, gdy praca przekracza granice procesów i sieci.
Ma to znaczenie w mieszanym stosie obsługiwanym na własnej infrastrukturze, ponieważ odwrotny serwer proxy, agent w Pythonie, baza wektorowa oraz usługa narzędziowa w Rust lub Go nie muszą korzystać z jednej biblioteki do śledzenia, o ile ich format propagacji pozostaje interoperacyjny.
Brak propagacji jest więc problemem jakości danych, a nie dowodem na to, że usługa downstream działała niezależnie. Zerwane ślady należy diagnozować na granicy, na której utracono tożsamość.
Relacje nadrzędny–podrzędny i odsyłacze odcinków zachowują różne kształty przyczynowości
Bezpośrednia praca synchroniczna zwykle tworzy łańcuch nadrzędny–podrzędny, ponieważ jedna operacja uruchamia następną i czeka na jej zakończenie, natomiast rozgałęzienia i przepływy asynchroniczne mogą mieć bardziej złożoną strukturę. Model śladu musi zachowywać przyczynowość bez wymuszania na każdej operacji downstream sztucznego odwzorowania jednego stosu wywołań.
Krawędzie nadrzędny–podrzędny są przydatne, gdy wywołanie usługi jest bezpośrednio zagnieżdżone, natomiast odsyłacze odcinków dla relacji niehierarchicznych mogą łączyć pracę wywołaną przez wcześniejszą aktywność, ale niezagnieżdżoną w sposób jednoznaczny pod jednym aktywnym elementem nadrzędnym.
Żądanie domowego AI może równolegle rozpocząć pobieranie danych i sprawdzanie uprawnień, a następnie zaczekać na oba wyniki przed wygenerowaniem odpowiedzi przez model. Ślad powinien zachować tę równoległą strukturę, zamiast sugerować, że odcinek rozpoczęty jako pierwszy spowodował wykonanie drugiego.
Kolejki zachowują możliwość śledzenia żądania tylko wtedy, gdy kontekst podróżuje wraz z komunikatem
Asynchroniczna kolejka przerywa bezpośredni stos wywołań w procesie, ale przetwarzane w niej zadanie nadal może być powiązane z żądaniem źródłowym, jeśli kontekst śladu zostanie umieszczony w metadanych komunikatu. Konsument używa następnie tego kontekstu do utworzenia kolejnego odcinka lub jawnego odsyłacza po rozpoczęciu późniejszego przetwarzania.
To rozróżnienie ma znaczenie w przypadku zadań OCR, generowania embeddingów, analizy obrazu z kamery lub wysyłania powiadomień, które domowy serwer celowo przenosi poza interaktywną ścieżkę żądania. Podczas przekazania przez magistralę komunikatów jawna propagacja zachowuje tożsamość śladu, mimo że stan lokalny dla wątku i bezpośredni stos wywołań nie są już dostępne.
Istniejące wyjaśnienie ZimaSpace dotyczące oddzielnych kolejek zadań domowego AI opisuje, dlaczego praca asynchroniczna jest odseparowana pod względem operacyjnym; śledzenie rozproszone dostarcza tożsamości, która nadal wiąże tę odizolowaną pracę z żądaniem, które ją wywołało.
Bez tej tożsamości wolny etap wykonywany w tle może wyglądać jak niezależne zadanie, a operator może nie zauważyć rzeczywistej kontynuacji żądania użytkownika.
Odtworzony ślad ujawnia ścieżkę krytyczną i jej luki
Po dotarciu odcinków do backendu śledzenia ich identyfikatory, znaczniki czasu, relacje nadrzędne, status i metadane usług można połączyć w widok żądania kompleksowego. Najdłuższy odcinek nie jest automatycznie przyczyną opóźnienia widocznego dla użytkownika, ponieważ praca równoległa może się nakładać, dlatego istotne pytanie brzmi: który łańcuch zależności decyduje o zakończeniu.
Gdy brakuje propagacji kontekstu, ślady stają się niepołączone, więc przejrzysty wykres przebiegu jest kompletny tylko w takim stopniu, w jakim kompletna była instrumentacja, która go utworzyła.
Próbkowanie wyznacza kolejną granicę: żądanie nieobjęte próbkowaniem nie dostarczy później pełnych danych o odcinkach, a częściowo instrumentowana usługa może pozostawić ślepe obszary w skądinąd prawidłowym śladzie. Śledzenie rozproszone poprawia zatem widoczność zależności przyczynowych, ale nie tworzy telemetrii dla operacji, które nigdy nie zostały zarejestrowane.
Mechanizm działa skutecznie, gdy jedno żądanie użytkownika można prześledzić przez rzeczywistą ścieżkę obsługiwaną na własnej infrastrukturze, bez zapisywania logów każdej usługi w tej samej bazie danych i bez udawania, że sama chronologia dowodzi przyczynowości.
Centrum Technologii i Sztucznej Inteligencji
Więcej do przeczytania

Stan bieżący a stan trwały w Home Assistant: co musi przetrwać ponowne uruchomienie?
Home Assistant nie zachowuje trwale każdej bieżącej wartości; konfiguracja, rejestry, wybrane przywracane stany, historia i dane wdrożeniowe pełnią różne funkcje podczas ponownego uruchamiania.

Jak Home Assistant uwierzytelnia sesje lokalne i zdalne?
Lokalne i zdalne sesje Home Assistant korzystają z tego samego modelu tożsamości po stronie serwera; zdalny dostęp zmienia trasę i granicę TLS, ale nie...

Dlaczego zapytania do historii Home Assistant mogą zwalniać w miarę przyrostu danych rejestratora?
Wzrost liczby rekordów może zwiększyć koszt zapytań do historii, gdy żądany zakres obejmuje więcej wierszy, rośnie liczba chybień pamięci podręcznej lub operacje na pamięci...

