Guide complet : tracer une API NestJS avec OpenTelemetry et Lescopr

C OpenGL Code Sample
Découvrez, étape par étape, comment configurer OpenTelemetry dans une API NestJS et exporter les traces vers Lescopr pour un monitoring fiable.

Introduction

Dans les environnements micro‑services, la visibilité sur les appels HTTP et les opérations de base de données est cruciale pour réduire le MTTR. NestJS, framework Node.js très répandu, offre une architecture modulaire idéale pour intégrer OpenTelemetry. Ce guide vous montre comment, en cinq étapes, instrumenter votre API NestJS et exporter les traces vers Lescopr, la solution B2B SaaS d’observabilité qui combine APM, suivi des SLA et conformité RGPD.


1. Initialiser le projet NestJS

1.1 Créer la base du projet

npm i -g @nestjs/cli
nest new my‑api
cd my‑api

Cette commande génère une structure de dossiers standard (src, test, etc.) et configure TypeScript. Le choix de TypeScript garantit la typabilité des métriques et facilite le mapping des spans.

1.2 Installer les dépendances d’observabilité

npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http

Ces paquets permettent d’instrumenter automatiquement les modules HTTP, Express, et les clients DB courants.


2. Configurer OpenTelemetry dans NestJS

2.1 Créer le fichier de configuration otel‑config.ts

import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';

const exporter = new OTLPTraceExporter({
  url: 'https://otel.lescopr.com/v1/traces', // Endpoint Lescopr
});

export const otelSDK = new NodeSDK({
  traceExporter: exporter,
  instrumentations: [getNodeAutoInstrumentations()],
});

otelSDK.start();

Cette configuration initialise le SDK, active l’instrumentation automatique et définit l’exportateur HTTP vers Lescopr.

2.2 Lancer le SDK avant le serveur NestJS

Modifiez main.ts :

import { otelSDK } from './otel-config'; // <-- import du SDK
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

Le SDK démarre dès le lancement du processus, garantissant que chaque requête est tracée.


3. Enrichir les traces avec des attributs métier

3.1 Utiliser les décorateurs NestJS

import { Span, trace } from '@opentelemetry/api';

@Injectable()
export class UsersService {
  async findOne(id: string) {
    const span = trace.getSpan(trace.getActiveSpan());
    span?.setAttribute('user.id', id);
    // logique métier …
  }
}

En ajoutant des attributs comme user.id ou transaction.type, vous rendez les traces exploitable dans les dashboards Lescopr.

3.2 Propagation du contexte HTTP

NestJS utilise express sous‑couche. OpenTelemetry capture automatiquement les en‑têtes traceparent. Aucun code supplémentaire n’est requis, mais il est recommandé de vérifier la propagation dans les middlewares personnalisés.


4. Exporter les traces vers Lescopr

4.1 Configurer les variables d’environnement

export OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.lescopr.com/v1/traces
export OTEL_RESOURCE_ATTRIBUTES=service.name=my‑api,service.version=1.0.0

Ces variables permettent à l’exportateur d’inclure les métadonnées du service, utiles pour le filtrage dans les tableaux de bord.

4.2 Vérifier la réception des traces

Après le premier appel GET /users, ouvrez le tableau de bord Lescopr → Traces et recherchez le service.name=my‑api. Vous devez voir un span racine HTTP GET /users avec des sous‑spans pour la base de données et les middlewares.


5. Optimiser la collecte et le coût

5.1 Batch et compression

OpenTelemetry regroupe les spans en paquets de 10 000 ms par défaut. Ajustez le batchTimeout si votre volume de requêtes est élevé :

import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
otelSDK.addSpanProcessor(new BatchSpanProcessor(exporter, {
  scheduleDelayMillis: 5000,
}));

5.2 Filtrage des spans non critiques

Utilisez le Sampler pour ignorer les requêtes de santé (/health) :

import { ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/core';
otelSDK.configureTracerProvider({
  sampler: new ParentBasedSampler({
    root: new TraceIdRatioBasedSampler(0.5), // 50 % des requêtes
  }),
});

5.3 Monitoring du coût d’exportation

Lescopr propose un tableau de bord Export Cost qui indique le nombre de spans exportés par minute et le volume de données. Configurez des alertes si le coût dépasse le budget prévu.


Conclusion

En suivant ces cinq étapes – création du projet, configuration du SDK, enrichissement des spans, exportation vers Lescopr et optimisation du flux – vous obtenez une visibilité complète sur votre API NestJS. Les traces collectées permettent d’identifier rapidement les goulots d’étranglement, de mesurer le respect des SLA et de garantir la conformité RGPD grâce aux métadonnées enrichies.

Pour aller plus loin, la documentation Lescopr détaille la mise en place pas à pas.