Aller au contenu

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

Fenêtre de terminal
npm install @pionne/node
index.ts
import { Pionne } from '@pionne/node';
Pionne.init({
token: 'pio_live_…',
release: '1.0.0',
environment: 'production',
});
  • process.on('uncaughtException') — exceptions sync non capturées
  • process.on('unhandledRejection') — promises rejetées sans .catch()
  • process.version — version Node
  • os.platform(), os.release() — OS et release
  • os.hostname() — nom de la machine
  • process.pid — PID
  • process.memoryUsage() — RSS, heap used, heap total
  • console.log / console.warn / console.error
  • Requêtes HTTP sortantes via http/https (instrumentation de request)
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' });
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 dernier
app.use(Pionne.expressErrorHandler());
app.listen(3000);

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 } },
});
});

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.

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.