G-07 Tableaux de bord
Brique G de la plateforme Enterprise AI. Technologie : Navin Manager (machines et services) + écrans du portail (agents, passerelle LLM, FinOps, SLO, sécurité) ; la plateforme ne livre plus de serveur de tableaux de bord (ADR-0169). Version anglaise : ../../en/bricks/G-07-dashboards.md.
Rôle et responsabilités
- Fournir des tableaux de bord plateforme, gateway, GPU, coûts, qualité et sécurité par tenant et global.
Position et interactions
- Chemin d'exécution : chemin de lecture.
- Machines et services : l'onglet de surveillance des services du Navin Manager (historique en base de données), les métriques des hôtes et l'export de télémétrie vers ClickHouse.
- Agents, passerelle LLM, FinOps, SLO et sécurité : les écrans du portail, alimentés par l'API (
/v1/telemetry/*,/v1/finops/*). - Journaux : OpenSearch Dashboards. Traces : Jaeger et Opik. Métriques et alertes : Prometheus et Alertmanager (les règles d'alerte et d'enregistrement restent livrées).
Part open source et part développée
- Open source réutilisé : Prometheus, Alertmanager, OpenSearch Dashboards, Jaeger, Opik, ClickHouse.
- Développé dans la plateforme : écrans de surveillance du Navin Manager et écrans d'observabilité du portail, filtrés par tenant.
Modèle de données
Tables du Control Plane (schéma eai) : eai.usage_events, eai.telemetry_spans.
Chaque table de tenant a tenant_id uuid NOT NULL et une politique de sécurité au niveau des lignes sur current_setting('app.tenant_id', true)::uuid. ClickHouse usage_events est la réplique analytique de eai.usage_events (ReplacingMergeTree par event_id).
Contrat : contracts/v1/usage-event.schema.json (schema_version 1.0). L'usage est toujours remonté avec contracts/v1/usage-event.schema.json, l'audit avec contracts/v1/audit-event.schema.json.
Endpoints d'API
| Méthode | Chemin |
|---|---|
| GET | /v1/telemetry/overview |
| GET | /v1/finops/summary |
GET /v1/telemetry/overview
Réponse :
{
"window": "24h",
"requests": 18234,
"error_rate": 0.012,
"p95_latency_ms": 2140,
"tokens": {
"input": 9120044,
"output": 1203400
},
"top_models": [
{
"model_id": "gpt-4o-mini",
"share": 0.61
}
]
}
GET /v1/finops/summary
Réponse :
{
"group_by": "agent",
"currency": "EUR",
"items": [
{
"key": "agt_ap",
"estimated": "41.20",
"measured": "38.75",
"billed": "39.02"
}
]
}
Exemples SDK
Python
from enterprise_ai import EnterpriseAI
client = EnterpriseAI(base_url="<control-plane-url>", api_key="eai_live_xxx", tenant="acme", locale="fr")
client.telemetry.overview(days=1)
client.finops.summary(group_by="agent")
TypeScript
import { EnterpriseAI } from "@enterprise-ai/sdk";
const client = new EnterpriseAI({ baseUrl: "<control-plane-url>", apiKey: process.env.EAI_API_KEY, tenant: "acme", locale: "fr" });
await client.telemetry.overview({ days: 1 });
await client.finops.summary({ group_by: "agent" });
Java
EnterpriseAIClient client = EnterpriseAIClient.builder()
.baseUrl("<control-plane-url>")
.apiKey(System.getenv("EAI_API_KEY"))
.tenant("acme")
.locale(Locale.FRENCH)
.build();
client.telemetry().overview(Map.of("days", 1));
client.finops().summary(Map.of("group_by", "agent"));
Go
client, err := eai.NewClient(eai.WithBaseURL("<control-plane-url>"), eai.WithAPIKey(os.Getenv("EAI_API_KEY")), eai.WithTenant("acme"), eai.WithLocale("fr"))
if err != nil { log.Fatal(err) }
ctx := context.Background()
_, err = client.Telemetry.Overview(ctx, eai.WithQuery(map[string]string{"days": "1"}))
_, err = client.FinOps.Summary(ctx, eai.WithQuery(map[string]string{"group_by": "agent"}))
Configuration
Variables d'environnement : EAI_CLICKHOUSE_URL, EAI_OPIK_URL.
Clés de valeurs Helm (deploy/helm/enterprise-ai/values.yaml) : global.monitoring.serviceMonitor, global.monitoring.prometheusRules. Un Grafana déjà exploité par le client peut être relié comme console avec EAI_GRAFANA_URL (apporté par le client, jamais déployé par la plateforme à cause de sa licence AGPL, ADR-0101).
Sécurité
- SSO avec Keycloak, les utilisateurs d'un tenant ne voient que leur organisation.
- Tenant déduit de l'identifiant d'accès, jamais du corps ; sécurité au niveau des lignes PostgreSQL sur chaque table de tenant.
- Chaque mutation et décision de politique écrit un événement d'audit chaîné par hachage (G-11).
- Les erreurs utilisent l'enveloppe standard avec message_i18n en et fr.
Observabilité
- Temps de chargement et erreurs de requêtes des tableaux de bord.
- traceparent W3C propagé, X-Request-Id renvoyé, les spans portent eai.tenant_id, eai.project, eai.agent_id, eai.run_id.
Unités FinOps
- Le tableau de bord des coûts affiche côte à côte estimé, mesuré et facturé.
Modes de défaillance et résilience
- Une source indisponible affiche un panneau sans données explicite, jamais des zéros.
Adoption autonome
Les règles Prometheus livrées peuvent être chargées dans le Prometheus du client, et un Grafana du client peut être relié comme console (EAI_GRAFANA_URL).
Tests d'acceptation
- Les écrans d'observabilité du portail et l'onglet de surveillance du Navin Manager se chargent sans erreur de requête ; une source indisponible affiche un état sans données explicite.