Skip to content

Observability ​

Ambito: namespaced · Kind: Observability (nome breve obs, plurale observabilities) · Group: core.navique.com/v1alpha1

Osservabilità LLM — trace, valutazioni, gestione dei prompt. Observability è il workload di osservabilità generico: spec.type seleziona l'implementazione del backend. Oggi è implementato solo langfuse (Langfuse v3 tramite il langfuse-operator); gli altri tipi sono predisposti come scaffold per il futuro.

Spec ​

CampoTipoDescrizione
typeenum (obbligatorio)Implementazione del backend. Oggi è implementato solo langfuse
secretsRefLocalRef (opzionale)SecretsManagement nello stesso namespace da attendere. Omettilo per usare semplici Secret Kubernetes gestiti da te — vedi secretsRef
meshobjectInclude il namespace nella ServiceMesh del cluster (auto / enabled / disabled)
imageobjectOverride dell'immagine per il backend selezionato
ingressobjectHost + TLS (TLS ⇒ garantisce cert-manager)
ssoobjectLogin OIDC/SSO (vedi SSO)
langfuseobjectConfigurazione specifica di Langfuse — presente quando type: langfuse (vedi blocco langfuse)

Questi campi di primo livello sono comuni a ogni tipo di backend. La configurazione specifica del backend risiede in un blocco con il nome del tipo (spec.langfuse per il backend Langfuse).

type ​

typeStatoEmette
langfuseImplementatoUna LangfuseInstance (langfuse.palena.ai/v1alpha1) tramite il langfuse-operator

Gli altri tipi di backend sono riservati e non ancora implementati; impostarne uno produce una status condition chiara "not yet implemented".

Il blocco langfuse ​

Quando type: langfuse, spec.langfuse contiene il cablaggio di Langfuse v3. Langfuse v3 richiede Postgres, ClickHouse, Redis e uno storage a oggetti (blob); ogni datastore può fare riferimento a una risorsa datastore oppure puntare a un host esterno.

CampoTipoDescrizione
postgresDatastoreRef (obbligatorio)Riferimento a un PostgresCluster o esterno
clickhouseDatastoreRef (obbligatorio)Riferimento a un ClickHouseCluster o esterno
redisDatastoreRef (obbligatorio)Riferimento a una RedisInstance o esterno
blobobject (obbligatorio)Storage a oggetti (richiesto da Langfuse v3): S3 / Azure / GCS
authobjectnextAuthUrl; secret/salt generati automaticamente dall'operatore
bootstrapobjectSeeding headless di un'organizzazione / progetto / chiave API + utente admin (vedi Bootstrap)
licenseSecretRefSecretKeyRefLicenza Langfuse Enterprise — accesso per persona (vedi Dare accesso alle persone)
defaultAccessobjectAccesso automatico per chiunque effettui il login (vedi Dare accesso alle persone)

DatastoreRef ​

CampoDescrizione
moderef (una risorsa datastore) oppure external
refLa risorsa datastore da usare (modalità ref)
databaseNameDatabase all'interno del datastore condiviso. Postgres: obbligatorio per un PostgresCluster gestito/adottato. ClickHouse: opzionale (predefinito default); deve essere elencato in spec.databases del ClickHouseCluster (uno Stack lo fa) — Langfuse lo attende. Solo lettere, cifre e _
connectionSecretRefSecret di connessione (modalità external)

blob (unione discriminata) ​

provider seleziona il backend; fornisci il blocco corrispondente. Le credenziali vengono lette da un Secret nel namespace con chiavi canoniche; omettere il Secret delle credenziali seleziona le credenziali cloud ambientali (IRSA / Workload Identity).

ProviderBloccoChiavi delle credenziali
s3 (predefinito)s3 (bucket, region, endpoint, forcePathStyle)access-key-id, secret-access-key
azureazure (storageAccountName, containerName, endpoint)account-key
gcsgcs (bucket, projectId)credentials (JSON del SA)

Cosa emette ​

Per type: langfuse, il controller risolve i datastore, garantisce cert-manager se TLS/ingress è abilitato, garantisce il langfuse-operator ed emette una LangfuseInstance (langfuse.palena.ai/v1alpha1) che fa riferimento ai datastore e ai secret risolti. La provenienza managed/adopt/external risiede nelle risorse datastore referenziate — Observability si limita a puntare a esse.

Datastore gestiti dall'operatore di default

Per ClickHouse e Redis, il langfuse-operator può gestirli internamente. A meno che tu non faccia riferimento a un datastore external, il controller usa di default ClickHouse/Redis gestiti dall'operatore — quindi non hai strettamente bisogno di un ClickHouseCluster / RedisInstance dedicato. Postgres è tipicamente condiviso con il Gateway.

Esempio ​

yaml
apiVersion: core.navique.com/v1alpha1
kind: Observability
metadata:
  name: observability
  namespace: forge-langfuse
spec:
  type: langfuse
  secretsRef: { name: langfuse-secrets }
  ingress: { enabled: true, host: langfuse.forge.example.com, tls: true }
  langfuse:
    postgres:   { mode: ref, ref: { name: forge-pg, namespace: forge-data }, databaseName: langfuse }
    clickhouse: { mode: ref, ref: { name: forge-ch, namespace: forge-data } }
    redis:      { mode: ref, ref: { name: forge-redis, namespace: forge-data } }
    blob:
      provider: azure
      azure:
        storageAccountName: forgelangfuse
        containerName: langfuse-events

Login SSO / OIDC ​

spec.sso abilita il single sign-on. Per il backend Langfuse usa il provider custom-OIDC generico di Langfuse v3: l'operatore imposta il blocco nativo spec.auth.oidc della LangfuseInstance, che il langfuse-operator traduce nella configurazione AUTH_CUSTOM_* di Langfuse. Le credenziali del client OAuth provengono da un Secret nello stesso namespace (tramite SecretsManagement).

CampoDescrizione
issuerURLURL di base dell'issuer / discovery OIDC
clientSecretRef.nameSecret che contiene il client OAuth (chiavi predefinite client-id / client-secret)
scopesScope richiesti (predefiniti openid, email, profile)
providerNameEtichetta del pulsante di login (AUTH_CUSTOM_NAME)

I campi provider, tenantID e degli endpoint espliciti del tipo SSO condiviso sono solo per il Gateway e qui vengono ignorati.

L'IdP deve autorizzare la callback custom-OIDC <publicURL>/api/auth/callback/custom, quindi abilita spec.ingress (oppure imposta langfuse.auth.nextAuthUrl) su un URL pubblico.

yaml
spec:
  type: langfuse
  sso:
    issuerURL: https://idp.example.com
    providerName: "Acme SSO"
    clientSecretRef: { name: langfuse-oidc }

TIP

I provider OIDC statici fanno parte della build self-hosted open-source di Langfuse. Solo la configurazione SSO dalla UI, l'imposizione dell'SSO per organizzazione e RBAC/SCIM sono funzionalità di Langfuse Enterprise.

Bootstrap ​

spec.langfuse.bootstrap inizializza in modalità headless un'organizzazione, un progetto, una chiave API iniziale e un utente admin in un Langfuse community appena creato, tramite l'ambiente LANGFUSE_INIT_*. Ciò consente alla piattaforma di avviarsi completamente cablata senza che nessuno debba prima accedere alla UI di Langfuse — ad esempio perché un Gateway possa esportare trace verso una chiave di progetto nota su un Langfuse community che altrimenti non può generare chiavi di progetto.

CampoDescrizione
organizationNome dell'organizzazione iniziale
projectNome del progetto iniziale
apiKeySecretRefSecret da popolare con la chiave pubblica/segreta del progetto inizializzato
adminUtente admin (email + password da un Secret) creato al primo avvio

Le credenziali inizializzate vengono scritte in Secret di proprietà, così i consumer (export delle trace del Gateway, la console di gestione) possono leggerle senza passaggi nella UI.

Dare accesso alle persone ​

In Langfuse si entra in due modi, e ciascuno ha requisiti diversi:

  • Una persona alla volta — una Identity di type: observability (con observabilityRef e un role: viewer, member, admin o owner) rende quella persona membro dell'organizzazione di questo Langfuse: l'organizzazione di bootstrap quando bootstrap è attivo, che contiene i progetti e le trace. La gestione dei membri di Langfuse è una funzionalità Enterprise, quindi richiede licenseSecretRef (la chiave di licenza Langfuse Enterprise). In sua assenza, tale Identity segnala di aver bisogno della licenza.
  • Chiunque effettui il login — defaultAccess aggiunge automaticamente ogni nuovo utente Langfuse (ad esempio al primo login aziendale) all'organizzazione e al progetto di bootstrap. Non serve alcuna licenza. Senza licenza, orgRole è il ruolo che vale su ogni progetto: anche i ruoli a livello di progetto (projectRole) sono una funzionalità Enterprise.

status.peopleAccess indica se l'accesso per singola persona è Available, o perché non lo è (NeedsLicense, NeedsNewerLangfuseOperator), e status.signInAccessRole il ruolo effettivamente concesso dall'accesso automatico. La console di gestione li legge entrambi per proporre l'opzione giusta.

CampoDescrizione
licenseSecretRefSecret che contiene la licenza Langfuse Enterprise (chiave license per impostazione predefinita)
defaultAccess.orgRoleOWNER / ADMIN / MEMBER / VIEWER (predefinito) / NONE
defaultAccess.projectRoleOWNER / ADMIN / MEMBER / VIEWER (predefinito) — solo Enterprise

defaultAccess richiede bootstrap (altrimenti viene rifiutato in fase di ammissione).

Secret ​

nextauth-secret e salt vengono generati automaticamente e ruotati dal langfuse-operator in un Secret <instance>-generated-secrets — non è necessario recuperarli da Key Vault, a meno che tu non voglia sovrascriverli. Le credenziali dei datastore provengono dai Secret materializzati delle risorse datastore referenziate (più Key Vault per i datastore esterni). Vedi Gestione dei secret.

Stato ​

Readiness per datastore, readiness dell'istanza e host dell'ingress, più i consueti conditions e observedGeneration. Un type non implementato espone una condition chiara "not yet implemented".

Nucleo open source sotto AGPL-3.0. I componenti Enterprise sono proprietari e soggetti a licenza.