Architektura referencyjna: Wdrożenie Langfuse w OVHcloud MKS na potrzeby obserwowalności LLM i monitorowania kosztów AI

Kontekst
OVHcloud AI Endpoints udostępnia interfejs API zgodny z OpenAI, który zapewnia aplikacjom dostęp do szerokiego katalogu modeli o otwartych wagach, w tym modeli Qwen, Llama, Mistral i gpt-oss oraz modeli embeddingowych, guard i speech, bez konieczności zarządzania przez zespoły infrastrukturą do inferencji. Jest to warstwa inferencji rozliczana według zużycia, monitorowana w ramach tej architektury.
OVHcloud Managed Kubernetes Service (MKS) eliminuje obciążenia operacyjne związane z obsługą warstwy control plane narzędzia Kubernetes: OVHcloud zajmuje się pulami węzłów, aktualizacjami i wysoką dostępnością, a Ty zachowujesz pełną kontrolę nad tym, co działa na węzłach roboczych. Jest to naturalne środowisko do uruchamiania aplikacji bezstanowej, takiej jak procesy webowe i procesy worker Langfuse, podczas gdy komponenty stanowe (bazy danych, Object Storage) działają w sąsiadujących z nią usługach zarządzanych OVHcloud.
Langfuse zapewnia warstwę obserwowalności dla aplikacji korzystających z AI Endpoints. Ponieważ integracja Langfuse z OpenAI SDK działa jako bezpośredni zamiennik (from langfuse.openai import openai zamiast import openai), przekierowanie istniejącej bazy kodu zgodnej z OpenAI do AI Endpoints i uzyskanie pełnego śledzenia wymaga zmiany zaledwie dwóch wierszy kodu, a nie jego przepisywania.
Razem te trzy elementy tworzą samodzielnie hostowany stos obserwowalności z przypisywaniem kosztów dla dowolnej aplikacji wywołującej AI Endpoints, bez przesyłania ani jednego tokena danych promptów ani odpowiedzi poza kontrolowaną przez Ciebie infrastrukturę.

Langfuse w OVHcloud MKS na potrzeby obserwowalności LLM i monitorowania zużycia tokenów
Prezentacja architektury
Aplikacje webowa i worker Langfuse są wdrażane w klastrze MKS. Ingress i zarządzanie certyfikatami działają obok nich jako oddzielne dodatki do klastra, które można wykorzystywać wielokrotnie. Każda zależność stanowa – PostgreSQL, Valkey, ClickHouse i Object Storage – działa jako usługa zarządzana OVHcloud poza klastrem, z którą połączenie jest nawiązywane przez TLS.
1. Przepływ danych
Po złożeniu wszystkich elementów w całość pojedyncze śledzone żądanie przebiega następująco:

Przepływ danych
1. Aplikacja wywołuje AI Endpoints bezpośrednio
Klient openai.OpenAI() używany jako bezpośredni zamiennik wysyła żądanie bezpośrednio do API inferencji – Langfuse pozostaje całkowicie poza tym wywołaniem, dzięki czemu awaria Langfuse nie wpływa na możliwość uzyskania odpowiedzi przez aplikację.
2. AI Endpoints przesyła strumieniowo odpowiedź z powrotem
Końcowy fragment zawiera dane dotyczące wykorzystania tokenów.
3. SDK eksportuje zarejestrowane przed chwilą dane jako partię spanów OpenTelemetry
Odbywa się to asynchronicznie, za pośrednictwem protokołu HTTPS, do punktu końcowego /api/public/otel/v1/traces w instancji Langfuse.
Proces ten działa w tle i nie zwiększa opóźnienia odpowiedzi, którą aplikacja otrzymała już w kroku 2.
4. Komponent webowy Langfuse odbiera partię spanów
Sprawdza klucz API żądania względem projektu w Postgres (wyszukiwanie jest buforowane w Valkey, więc nie jest wykonywane jako nowe zapytanie przy każdym wywołaniu), zapisuje nieprzetworzoną partię danych w niezmienionej postaci w Object Storage i umieszcza w kolejce Valkey jedynie odwołanie do niej.
5. Worker opróżnia tę kolejkę zgodnie z własnym harmonogramem, niezależnie od konkretnego żądania
Pobiera odwołanie z Valkey, pobiera pełną partię danych z Object Storage, za pośrednictwem Postgres identyfikuje powiązany z nią wpis Prompt Management (jeśli istnieje), a następnie zapisuje rekordy śledzenia i generowania w ClickHouse (model, liczba tokenów, opóźnienie, ceny).
6. Worker obsługuje również wszystkie zadania zaplanowane lub wykonywane zbiorczo
Eksporty wsadowe i przesyłane pliki multimedialne trafiają do S3 niezależnie od tego, kiedy nastąpiło pierwotne żądanie.
⚠️ Uwaga: Od kroku 3 żaden z tych procesów nie może zwiększyć opóźnienia żądania aplikacji z kroków 1-2. To właśnie asynchroniczne przekazanie danych oraz fakt, że komponent webowy nie czeka na odpowiedź Postgres ani ClickHouse przed potwierdzeniem przyjęcia partii danych, sprawiają, że śledzenie nie powoduje żadnego dodatkowego narzutu na ścieżce krytycznej.
2. Interfejsy API AI Endpoints
Wszystkie poniższe elementy wywołują jeden z dwóch odrębnych interfejsów API OVHcloud AI Endpoints:
- API inferencji: https://oai.endpoints.kepler.ai.cloud.ovh.net/v1
Jest to interfejs API, z którym faktycznie komunikuje się Twoja aplikacja. Implementuje interfejs zgodny z API OpenAI, dzięki czemu można z niego korzystać za pomocą dowolnego SDK zgodnego z OpenAI, zmieniając jedynie base_url i klucz API:
import openai
client = openai.OpenAI(
api_key="<your-ai-endpoints-token>",
base_url="https://oai.endpoints.kepler.ai.cloud.ovh.net/v1",
)
response = client.chat.completions.create(
model="Qwen3.5-397B-A17B",
messages=[{"role": "user", "content": "hello"}],
)Jeśli pobierzesz schemat OpenAPI bezpośrednio z bramy (GET /openapi.json), zobaczysz, że dostępny interfejs wykracza daleko poza generowanie odpowiedzi na czacie.
Warto przynajmniej raz wywołać bezpośrednio interfejs GET /v1/models: zwraca on listę wszystkich modeli, do których Twój token zapewnia dostęp.
Poniższa sekcja koncentruje się na interfejsie API katalogu, który umożliwia uzyskanie dodatkowych informacji o modelach, w tym danych dotyczących cen, niezbędnych do monitorowania kosztów.
- API katalogu: https://catalog.endpoints.ai.ovh.net/rest/v1/models_v2
Jest to interfejs API wykorzystywany przez stronę internetowego katalogu „AI Endpoints”. Jest to proste żądanie GET, które nie wymaga uwierzytelniania i zwraca pełną listę modeli wraz z metadanymi wyświetlanymi w interfejsie użytkownika katalogu: opisem, wynikami benchmarków, wydawcą, licencją, rozmiarem kontekstu, linkami do playgroundu i dokumentacji, a także blokiem usage_information.pricing:
curl -s https://catalog.endpoints.ai.ovh.net/rest/v1/models_v2 | jq '.[0]'Zwraca:
{
"id": "qwen-3-5-397b",
"name": "Qwen3.5-397B-A17B",
"category": "Visual LLM",
"metadata": {
"aliases": ["Qwen/Qwen3.5-397B-A17B", "qwen3.5-397b-a17b"],
"context": "262k",
"usage_information": {
"pricing": [
{"price": 0.6, "price_unit": "million_input_tokens"},
{"price": 3.6, "price_unit": "million_output_tokens"}
]
}
}
}Te dwa interfejsy API wzajemnie się uzupełniają:
- interfejs API katalogu jest pobierany jednorazowo lub okresowo w celu tworzenia lokalnych tabel cen i metadanych
- interfejs API inferencji jest wywoływany przez działającą aplikację przy każdym żądaniu
Te dwa interfejsy API wzajemnie się uzupełniają:
- interfejs API katalogu jest pobierany jednorazowo lub okresowo w celu tworzenia lokalnych tabel cen i metadanych
- interfejs API inferencji jest wywoływany przez działającą aplikację przy każdym żądaniu

Interfejsy API inferencji i katalogu AI Endpoints
⚠️ Uwaga: Pamiętaj, że ceny AI Endpoints są podawane w euro.
Wymagania
Przed rozpoczęciem upewnij się, że masz:
- Konto OVHcloud Public Cloud
- Użytkownika OpenStack z rolą Administrator
- Klucz API AI Endpoints
- Nazwę domeny, którą możesz skierować do modułu Load Balancer
- Zainstalowane narzędzia kubectl oraz helm
(co najmniej w wersji 3.x)
Teraz, gdy masz już wszystkie potrzebne elementy, czas wdrożyć Langfuse przy użyciu OVHcloud MKS i innych usług zarządzanych!
Przewodnik po architekturze: Wdrożenie Langfuse w usługach zarządzanych OVHcloud Public Cloud
Krok 1 – Tworzenie klastra Kubernetes i usług zarządzanych OVHcloudProcesy web i worker
Langfuse są same w sobie lekkie. Dlatego wybór zasobów zależy niemal całkowicie od otaczających je usług zarządzanych. Poniżej opisano praktyczne kroki wymagane do skonfigurowania każdej z tych usług.
Wszystkie poniższe zasoby są tworzone w Panelu klienta OVHcloud, w sekcji Public Cloud danego projektu.
1. Utwórz klaster MKS i pule węzłów
1.1. Skonfiguruj klasterW Panelu klienta OVHcloud, utwórz klaster Kubernetes przy użyciu usługi MKS
- :Nazwa:
- langfuse-clusterLokalizacja: Region 1-AZ – Gravelines (GRA11
- )Plan:
- Free (lub Standard)Sieć: podłącz sieć prywatną (np. 0000 - AI Private Network
- )Wersja: Najnowsza stabilna (np. 1.35
)
1.2. Utwórz pule węzłów
Podczas tworzenia klastra skonfiguruj 2 pule węzłów.Pierwsza z nich to np-system
- . Uruchamiane są w niej komponenty na poziomie klastra, w tym Traefik (Ingress) i cert-manager (certyfikaty TLS), a także domyślne systemowe zestawy DaemonSet Kubernetes.Nazwa puli węzłów:
- np-systemTyp instancji:
- B3-8Liczba węzłów:
- 3Autoskalowanie:
Wyłączone (OFF)Druga z nich to np-workload
- , przeznaczona dla podów aplikacji Langfuse (web + worker).Nazwa puli węzłów:
- np-workloadTyp instancji:
- B3-16Liczba węzłów:
- 1Autoskalowanie:
Wyłączone (OFF)
1.3. Skonfiguruj dostęp do KubernetesPo utworzeniu węzłów możesz pobrać plik Kubeconfig
# configure kubectl with your MKS cluster
export KUBECONFIG=/path/to/your/kubeconfig-xxxxxx.yml
# verify cluster connectivity
kubectl cluster-info
kubectl get nodes
Returns:
NAME STATUS ROLES AGE VERSION
np-system-node-388e55 Ready <none> 12d v1.35.2
np-system-node-4c5326 Ready <none> 12d v1.35.2
np-system-node-93bc1c Ready <none> 12d v1.35.2
np-workload-node-3a76f7 Ready <none> 12d v1.35.22. Skonfiguruj bazy danych
2.1. Baza danych Postgre dla danych transakcyjnych Langfuse
W sekcji Databases usługi OVHcloud Public Cloud kliknij Create a service i skonfiguruj ją w następujący sposób:
- Silnik: PostgreSQL
- Wersja: 17
- Lokalizacja: GRA
- Plan usługi: Business
- Instancja: Db1-4
- Przestrzeń dyskowa: 80 GB (domyślnie)
- Sieć: Sieć publiczna (internet)
Przed przejściem do kolejnego kroku zachowaj poniższe informacje w bezpiecznym miejscu:
- host
- port
- nazwa bazy danych
- nazwa użytkownika
- hasło
- URI
2.2. Baza danych Valkey do buforowania zadań i obsługi kolejek
W sekcji Databases usługi OVHcloud Public Cloud kliknij Create a service i skonfiguruj ją w następujący sposób:
- Silnik: Valkey
- Wersja: 8.1
- Lokalizacja: GRA
- Plan usługi: Business
- Instancja: Db1-4
- Przestrzeń dyskowa: 80 GB (domyślnie)
- Sieć: Sieć publiczna (internet)
Przed przejściem do kolejnego kroku zachowaj poniższe informacje w bezpiecznym miejscu:
- host
- port
- nazwa bazy danych
- nazwa użytkownika
- hasło
- URI
2.3. ClickHouse, serce systemu obserwowalności
W sekcji Analytics usługi OVHcloud Public Cloud kliknij Create a service i skonfiguruj ją w następujący sposób:
- Silnik: ClickHouse
- Wersja: 25.8
- Lokalizacja: EU-WEST-PAR
- Plan usługi: Production
- Instancja: B3-16
- Przestrzeń dyskowa: 100 GB (domyślnie)
- Sieć: Sieć publiczna (internet)
Przed przejściem do kolejnego kroku zachowaj poniższe informacje w bezpiecznym miejscu:
- host
- port
- nazwa bazy danych
- nazwa użytkownika
- hasło
- URI
⚠ Uwaga: Zarządzane bazy danych OVHcloud (Postgres, Valkey i ClickHouse) domyślnie odrzucają wszystkie połączenia, dopóki na stronie „Ograniczenia IP” każdej instancji w Panelu klienta OVHcloud nie dodasz dozwolonych źródłowych adresów IP. Pamiętaj, że przed wdrożeniem Langfuse musisz dodać publiczne adresy IP pul węzłów MKS do listy dozwolonych adresów IP we wszystkich trzech bazach danych. W przeciwnym razie każda próba połączenia z klastra zakończy się przekroczeniem limitu czasu.
Na karcie Configuration każdej bazy danych skonfiguruj listę dozwolonych adresów IP, jak pokazano w poniższym przykładzie:

Dodawanie publicznych adresów IP puli węzłów MKS do listy dozwolonych adresów IP
3. Utwórz bucket zgodny z S3 jako zaplecze pamięci masowej
W sekcji Object Storage usługi OVHcloud Public Cloud utwórz kontener obiektów:
- Typ kontenera: API kompatybilne z S3
- Lokalizacja: GRA
Przed przejściem do kolejnego kroku zachowaj poniższe informacje w bezpiecznym miejscu:
- nazwa bucketu