SDK Node.js
Le SDK Pionne pour Node.js. Auto-capture les uncaughtException et unhandledRejection, enrichit chaque event avec le contexte runtime (Node version, OS, hostname, PID, mémoire).
Version actuelle : 0.3.6
Installation
Section intitulée « Installation »npm install @pionne/nodeQuickstart
Section intitulée « Quickstart »import { Pionne } from '@pionne/node';
Pionne.init({ token: 'pio_live_…', release: '1.0.0', environment: 'production',});const { Pionne } = require('@pionne/node');
Pionne.init({ token: 'pio_live_…', release: '1.0.0', environment: 'production',});Auto-capture
Section intitulée « Auto-capture »process.on('uncaughtException')— exceptions sync non capturéesprocess.on('unhandledRejection')— promises rejetées sans.catch()
Auto-context
Section intitulée « Auto-context »process.version— version Nodeos.platform(),os.release()— OS et releaseos.hostname()— nom de la machineprocess.pid— PIDprocess.memoryUsage()— RSS, heap used, heap total
Auto-breadcrumbs
Section intitulée « Auto-breadcrumbs »console.log/console.warn/console.error- Requêtes HTTP sortantes via
http/https(instrumentation derequest)
Pionne.init(options);Pionne.captureException(error, { tags, contexts });Pionne.captureMessage('Cache miss', { level: 'info' });Pionne.setUser({ id: 'user_42' });Pionne.setTags({ region: 'eu-west-1' });Pionne.setEnabled(false);Pionne.addBreadcrumb({ category: 'db', message: 'SELECT * FROM users' });Frameworks
Section intitulée « Frameworks »import express from 'express';import { Pionne } from '@pionne/node';
Pionne.init({ token: 'pio_live_…' });
const app = express();
// ... tes routes ...
// Le middleware d'erreur DOIT être enregistré en dernierapp.use(Pionne.expressErrorHandler());
app.listen(3000);import Fastify from 'fastify';import { Pionne } from '@pionne/node';
Pionne.init({ token: 'pio_live_…' });
const fastify = Fastify();
fastify.setErrorHandler((error, request, reply) => { Pionne.captureException(error, { contexts: { request: { url: request.url, method: request.method } }, }); reply.status(500).send({ error: 'Internal Server Error' });});
fastify.listen({ port: 3000 });import { NestFactory } from '@nestjs/core';import { Pionne } from '@pionne/node';import { AppModule } from './app.module';import { PionneExceptionFilter } from './pionne.filter';
Pionne.init({ token: 'pio_live_…' });
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalFilters(new PionneExceptionFilter()); await app.listen(3000);}bootstrap();import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';import { Pionne } from '@pionne/node';
@Catch()export class PionneExceptionFilter implements ExceptionFilter { catch(exception: unknown, host: ArgumentsHost) { Pionne.captureException(exception as Error); throw exception; // re-throw pour que Nest gère la réponse }}import { Pionne } from '@pionne/node';
Pionne.init({ token: 'pio_live_…' });
async function main() { try { await doSomething(); } catch (err) { Pionne.captureException(err as Error); }}
main();Background jobs
Section intitulée « Background jobs »Pour BullMQ, Bee-Queue, Agenda, Worker Threads ou tout job runner, wrap chaque handler dans un try/catch :
worker.on('failed', (job, err) => { Pionne.captureException(err, { tags: { job: job.name }, contexts: { job: { id: job.id, data: job.data } }, });});Géographie (opt-in)
Section intitulée « Géographie (opt-in) »Sur un backend Node, l’IP utilisée pour le lookup est celle du serveur, pas du client final. C’est utile pour repérer un crash localisé à une région cloud (ex. eu-west-3 vs us-east-1) sans toucher aux logs d’infra.
Pionne.init({ token: 'pio_live_…', sendGeography: true, // ← opt-in});Au boot, un seul appel HTTP vers https://ipapi.co/json/ (timeout 4 s) attache contexts.geo = { city, region, country, country_code } à tous les events suivants. Si le lookup échoue (firewall sortant, rate-limit), le SDK continue silencieusement sans géo.
Tu utilises un cluster auto-scalé ? Pense à mettre la région du pod dans tags directement (tags: { region: process.env.AWS_REGION }) — c’est plus fiable qu’un lookup IP côté SDK.
Performance monitoring
Section intitulée « Performance monitoring »Anti-token-theft
Section intitulée « Anti-token-theft »Le pinning de Bundle ID est mobile uniquement (iOS/Android/RN/Flutter) — il protège contre la décompilation d’un APK/IPA. Sur Node, ton token vit côté serveur (.env, secrets manager, EAS env vars…) et n’est jamais shippé à un client : la menace n’existe pas.
Le champ “Bundle ID” est masqué dans l’app mobile pour les projets Node — le remplir manuellement causerait un 403 sur 100 % des events (le SDK n’envoie pas de app_id). Pour distinguer plusieurs déploiements, utilise les tags :
Pionne.init({ token: process.env.PIONNE_TOKEN, tags: { deployment: process.env.APP_DEPLOYMENT ?? 'prod', region: process.env.AWS_REGION },});Plus de détails : Bundle ID Pinning → Backends sans bundle_id.
Voir aussi
Section intitulée « Voir aussi »- SDK Web — frontend browser
- API Ingest — protocole HTTP brut
- Source maps — symbolication