Architecture & transparence

Comment LogPulse est construit

La confiance commence par savoir ce qu'il y a sous le capot. Voici la stack qui fait tourner tes logs, les choix qu'on a faits, et où on va. On préfère trop partager que trop promettre.

La stack en un coup d'œil

Des composants ennuyeux et bien compris. Pas de magie.

Ingest

Fastify sur Node 22

Scaleway · Amsterdam (NL)

OTLP HTTP plus un endpoint JSON générique. Bearer-auth avec des clés API hashées en bcrypt. Rate-limited par clé.

Buffer d'ingestion

Buffer d'ingestion durable

Scaleway · Amsterdam (NL)

Répliqué sur plusieurs brokers ; l'API ne répond qu'une fois les logs présents sur chaque réplique. Conserve les logs originaux pour 60 minutes de raw replay. Les logs Critical ont leur propre voie.

Stockage de logs

ClickHouse

Scaleway · Amsterdam (NL)

Colonnaire, partitionné par tenant_id et date. Order key (tenant_id, index, timestamp, log_id) fait que les requêtes scopées tenant tapent les bonnes partitions en premier. Compression 8–12× typique sur logs texte.

Métadonnées

PostgreSQL via Drizzle ORM

Scaleway · Amsterdam (NL)

Utilisateurs, organisations, clés API, dashboards, alertes, pipelines. Aucun contenu de log stocké ici.

Frontend

React 19 + Vite

Cloudflare Pages

TanStack Query pour l'état serveur, Zustand pour l'état UI, Tailwind + shadcn/ui. TypeScript strict partout.

IA

Claude via Amazon Bedrock

UE (Stockholm) · fournisseur US

Alimente la traduction langage naturel → LPQL et l'AI Investigator. Listé dans nos sous-traitants. Les logs ne vont à la LLM que quand tu déclenches une requête IA.

Comment les données circulent

De tes apps à ClickHouse et retour.

  Your apps  ──OTLP HTTP──▶  Fastify ingest  ──▶  Durable ingest buffer
                                  │                       │
                              auth + quota          workers: parse + batch
                                  │                       ▼
                                  │             ClickHouse (Scaleway · Amsterdam)
                                  │                       │
                                  ▼                       │
                              PostgreSQL                  │
                              (metadata)                  │
                                                          ▼
  Web UI  ◀── LPQL / AI ──  Fastify query  ──▶  ClickHouse (tenant-scoped)

Ingest push : agents et SDK envoient les logs via OTLP HTTP. L'API authentifie et met en queue ; un worker batche et écrit dans ClickHouse. Les requêtes vont dans l'autre sens : l'UI tape l'API, l'API exécute LPQL sur ClickHouse avec le scoping tenant imposé à la frontière.

Multi-tenancy & isolation

Séparation imposée dans la base, pas seulement dans l'app.

  • Les tenants Free, Pro et Business partagent une table ClickHouse partitionnée par tenant_id + date. Les clients Enterprise obtiennent un stack entièrement dédié : ingestion, compute et stockage isolés.
  • Chaque requête porte WHERE tenant_id = '…', imposé à la frontière API, paramétrisé, jamais concaténé. Le partition pruning fait que les données cross-tenant ne sont pas scannées.
  • Les clés API sont hashées en bcrypt dans PostgreSQL ; les clés brutes sont montrées une fois à la création et jamais loggées.
  • Le RBAC par namespace scope l'accès aux logs par équipe : les équipes Platform Engineering peuvent donner du self-service aux devs sans exposer d'autres namespaces.

Rétention & coût

Tarif forfaitaire = tu ne paies pas plus quand tu logues plus que prévu.

  • Rétention par plan : Free 7 jours, Starter 14 jours, Pro 60 jours, Business 90 jours, Enterprise jusqu'à 365 jours. Les données expirées sont supprimées par partition, pas ligne par ligne.
  • Tarif forfaitaire : l'ingest quotidien est inclus jusqu'à ton quota. Pas de tarification au Go, pas de factures de dépassement surprise.
  • La compression colonnaire de ClickHouse atteint typiquement 8–12× sur les logs texte : c'est pour ça qu'on peut offrir un tarif forfaitaire sans saigner sur la marge.
  • Tu reçois un mail à 80 % de ton quota journalier. Les logs sont encore acceptés jusqu'à 125 % ; au-delà, l'ingestion renvoie un 429 jusqu'à minuit UTC. On préfère que tu upgrades en connaissance de cause plutôt que facturer du dépassement en silence.

L'IA : un raccourci, pas une boîte noire

Chaque requête que l'IA exécute est montrée. Tu peux vérifier, éditer et sauvegarder.

  • Les questions en langage naturel sont traduites en LPQL par une LLM (Anthropic Claude). La LLM est listée dans nos sous-traitants et ne voit les données que quand tu déclenches une requête IA.
  • L'AI Investigator enchaîne les requêtes : chercher, corréler aux déploiements, comparer à la baseline. Chaque étape est montrée dans le chat avec la LPQL exécutée et les lignes de logs renvoyées.
  • Les hypothèses sont formulées comme 'cause racine probable' avec preuves, pas comme des déclarations. Tu vérifies avant d'agir.
  • L'inférence s'exécute sur Claude via Amazon Bedrock en eu-north-1 : le traitement IA reste donc dans l'UE. Les fonctionnalités IA peuvent aussi être désactivées par organisation.
Honnête, pas hors d'haleine

Où on en est vs où on va

On préfère être honnête sur ce qui est en place et ce qui est encore en chantier.

RGPD

Conforme par défaut

DPA + SCC disponibles sur les plans payants. Chemin de données UE-only. Chiffrement au repos et en transit.

SOC 2 Type II

En préparation

Contrôles Trust Services Criteria en place. L'audit externe suivra.

ISO 27001

En préparation

Contrôles alignés ; pas encore certifiés.

Page d'uptime publique

En ligne

status.logpulse.io : vérifié chaque minute depuis l'extérieur de notre plateforme, avec 30 jours d'historique par composant.

Benchmarks publics

Prévu

Posts reproductibles sur le throughput d'ingest et la latence des requêtes.

Repéré un trou ou envie d'aller plus loin ?

On préfère trop partager que trop promettre. Écris à [email protected] avec tes questions sur la stack, l'isolation, ou tout ce qu'on n'a pas couvert ici.