Referentiearchitectuur: Langfuse implementeren op OVHcloud MKS voor LLM-observability en het monitoren van AI-kosten

Context
OVHcloud AI Endpoints biedt een OpenAI-compatibele API die applicaties toegang geeft tot een uitgebreide catalogus met open-weight modellen, waaronder Qwen, Llama, Mistral, gpt-oss, embedding, guard en spraakmodellen, zonder dat teams inferentie-infrastructuur hoeven te managen. Het is de op gebruik gebaseerde inferentielaag die door deze architectuur wordt gemonitord.
OVHcloud Managed Kubernetes Service (MKS) neemt de operationele last van het draaien van het Kubernetes-control plane weg: nodepools, upgrades en high availability worden afgehandeld door OVHcloud. Bovendien behoudt u de volledige controle over wat er op de workernodes draait. Het is de natuurlijke plek om een stateless applicatie zoals de web- en worker-processen van Langfuse te draaien, terwijl de stateful onderdelen (databases, Object Storage) zich in de gemanagede services van OVHcloud ernaast bevinden.
Langfuse levert de observability-laag voor applicaties die AI Endpoints gebruiken. Omdat de OpenAI SDK-integratie een drop-in vervanging is (van langfuse.openai import openai in plaats van import openai), is het verwijzen van een bestaande OpenAI-compatibele codebase naar AI Endpoints en het verkrijgen van volledige tracering een wijziging van twee regels, niet een hele rewrite.
Samen vormen deze drie onderdelen een self-hosted observability-stack die kosten toekent voor elke applicatie die AI Endpoints aanroept, zonder dat er ook maar één token aan prompt- of completion-data wordt verzonden buiten de infrastructuur die u beheert.

Langfuse op OVHcloud MKS voor LLM-observability en het bijhouden van tokengebruik
Architectuuroverzicht
De web- en worker-implementaties van Langfuse draaien binnen het MKS-cluster. Ingress en certificaatbeheer draaien ernaast als afzonderlijke, herbruikbare cluster-add-ons. Elke stateful afhankelijkheid – Postgres, Valkey, ClickHouse, Object Storage – is een gemanagede OVHcloud-service buiten het cluster, benaderd via TLS.
1. Datastroom
Alle onderdelen bij elkaar genomen verloopt een enkel getraceerd verzoek als volgt:

Datastroom
1. De applicatie roept AI Endpoints rechtstreeks aan
De drop-in openai.OpenAI() client stuurt het verzoek rechtstreeks naar de inferentie-API – Langfuse staat volledig buiten deze call, dus een Langfuse-storing beïnvloedt nooit of de applicatie een compleet antwoord kan krijgen.
2. AI Endpoints streamt het antwoord terug
De laatste chunk bevat de gegevens over het tokengebruik.
3. De SDK exporteert wat het zojuist heeft gezien als een OpenTelemetry span-batch
Dit gebeurt asynchroon, via HTTPS, naar /api/public/otel/v1/traces op de Langfuse-instance.
Dit proces draait op de achtergrond en voegt geen latency toe aan het antwoord dat de applicatie al heeft ontvangen in stap 2.
4. Langfuse web verwerkt de batch
Het controleert of de API-sleutel van het verzoek met het project in Postgres overeenkomt (de zoekactie wordt in Valkey gecachet, geen nieuwe query bij elke call), schrijft de onbewerkte batch onveranderd naar Object Storage en pusht alleen een verwijzing ernaar naar een Valkey-wachtrij.
5. De worker leegt die wachtrij volgens zijn eigen planning, losgekoppeld van alle verzoeken
Het haalt de verwijzing uit Valkey, haalt de volledige batch op uit Object Storage, lost het Prompt Management-item op waaraan deze is gekoppeld (indien van toepassing) via Postgres, en slaat de trace- en generatierecords op in ClickHouse (model, tokenaantallen, latency, prijzen)
6. De worker handelt ook alles af wat gepland of bulk is
Batch-exports en media-uploads komen in S3 terecht, onafhankelijk van wanneer het oorspronkelijke verzoek plaatsvond.
⚠️ Let op: Niets vanaf stap 3 kan latency toevoegen aan het applicatieverzoek in stappen 1-2; die asynchrone overdracht en het feit dat web nooit blokkeert op Postgres of ClickHouse om een batch te bevestigen, verklaren volledig waarom tracing niets kost op het kritieke pad.
2. AI Endpoints API's
Alles hieronder roept een van de twee afzonderlijke OVHcloud AI Endpoints API's aan:
- Inferentie API: https://oai.endpoints.kepler.ai.cloud.ovh.net/v1
Dit is de API waarmee uw applicatie daadwerkelijk communiceert. Het implementeert het OpenAI API-oppervlak, dus elke OpenAI-compatibele SDK werkt ermee door de base_url en de API-sleutel te wijzigen:
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"}],
)Als u het OpenAPI-schema rechtstreeks van de gateway ophaalt (GET /openapi.json), zult u zien dat de beschikbare interface veel verder gaat dan chatsuggesties.
Het is nuttig om de GET /v1/models API ten minste één keer rechtstreeks aan te roepen: deze retourneert alle modellen waartoe uw token toegang verleent.
De volgende sectie richt zich op de catalogus-API, waarmee u verdere informatie over de modellen kunt verkrijgen, inclusief details over prijzen, die nodig zijn voor het bijhouden van kosten.
- Catalogus API: https://catalog.endpoints.ai.ovh.net/rest/v1/models_v2
Dit is de API die de webcataloguspagina "AI Endpoints" aanstuurt. Het is een eenvoudig GET-verzoek waarvoor geen authenticatie vereist is. Het retourneert de volledige lijst met modellen, samen met de metadata die in de gebruikersinterface van de catalogus wordt weergegeven: beschrijving, benchmarkscores, producent, licentie, contextgrootte, links naar de playground en documentatie, evenals een usage_information.pricing blok:
curl -s https://catalog.endpoints.ai.ovh.net/rest/v1/models_v2 | jq '.[0]'Retourneert:
{
"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"}
]
}
}
}De twee API's zijn complementair:
- de catalogus API is een eenmalige of periodieke pull die gebruikt wordt om lokale prijstabellen en metadata op te bouwen
- de inferentie API is wat een draaiende applicatie aanroept bij elk verzoek
De twee API's zijn complementair:
- de catalogus API is een eenmalige of periodieke pull die gebruikt wordt om lokale prijstabellen en metadata op te bouwen
- de inferentie API is wat een draaiende applicatie aanroept bij elk verzoek

AI Endpoints inferentie- en catalogus-API's
⚠️ Let op: Houd er rekening mee dat de prijzen van AI Endpoints in euro's zijn.
Vereisten
Zorg voordat u begint dat u beschikt over:
- Een OVHcloud Public Cloud-account
- Een OpenStack-gebruiker met de rol Administrator
- Een AI Endpoints API-sleutel
- Een domeinnaam die u naar een load balancer kunt laten wijzen
- kubectl geïnstalleerd en helm geïnstalleerd (ten minste versie 3.x)
Nu u alle ingrediënten heeft, is het tijd om Langfuse te implementeren met behulp van OVHcloud MKS en andere gemanagede services!
Architectuurgids: Implementatie van Langfuse op gemanagede services van OVHcloud Public Cloud
Stap 1 – Het Kubernetes-cluster en de OVHcloud managed services inrichten
De web- en worker-processen van Langfuse zijn zelf behoorlijk licht. De keuze voor bepaalde resources hangt daarom bijna volledig af van de gemanagede services waarmee ze omringd zijn. Hieronder staat een uitleg met de praktische stappen voor het instellen van elk daarvan.
Alles hieronder wordt aangemaakt in de OVHcloud Manager, onder het gedeelte Public Cloud van uw project.
1. MKS-cluster en Node-pools aanmaken
1.1. Cluster configureren
Maak vanuit het OVHcloud Control Panel een Kubernetes-cluster aan met behulp van MKS:
- Naam: langfuse-cluster
- Locatie: 1-AZ Regio – Gravelines (GRA11)
- Pakket: Gratis (of Standard)
- Netwerk: koppel een Privénetwerk (bijvoorbeeld 0000 - AI Privénetwerk)
- Versie: Recentste stabiele versie (bijvoorbeeld 1.35)
1.2. Node-pools aanmaken
Configureer tijdens het aanmaken van het cluster de 2 Node-pools.
De eerste is np-system. Deze voert componenten uit op clusterniveau, waaronder Traefik (ingress) en cert-manager (TLS-certificaten), evenals de standaard daemonsets van het Kubernetes-systeem.
- Naam van node-pool: np-system
- Flavor: B3-8
- Aantal nodes: 3
- Automatisch schalen: Uitgeschakeld (OFF)
De tweede is np-workload, alleen bedoeld voor de Langfuse-applicatiepods (web + worker).
- Naam van node-pool: np-workload
- Flavor: B3-16
- Aantal nodes: 1
- Automatisch schalen: Uitgeschakeld (OFF)
1.3. Kubernetes-toegang configureren
Zodra uw nodes zijn ingericht, kunt u het Kubeconfig-bestand downloaden en kubectl configureren met uw MKS-cluster.
# 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. Databases configureren
2.1. Postgre-database voor transactionele Langfuse-gegevens
Klik in de sectie Databases van OVHcloud Public Cloud op Een service aanmaken en configureer deze als volgt:
- Engine: PostgreSQL
- Versie: 17
- Locatie: GRA
- Servicepakket: Business
- Instance: Db1-4
- Opslag: 80 GB (standaard)
- Netwerk: Publiek netwerk (internet)
Sla de volgende informatie veilig op voordat u doorgaat naar de volgende stap:
- host
- port
- databasenaam
- gebruikersnaam
- wachtwoord
- URI
2.2. Valkey-database voor jobcaching en wachtrijen
Klik in de sectie Databases van OVHcloud Public Cloud op Een service aanmaken en configureer deze als volgt:
- Engine: Valkey
- Versie: 8.1
- Locatie: GRA
- Servicepakket: Business
- Instance: Db1-4
- Opslag: 80 GB (standaard)
- Netwerk: Publiek netwerk (internet)
Sla de volgende informatie veilig op voordat u doorgaat naar de volgende stap: