Lorsque vos services Node.js s'étendent au-delà d'un seul processus, le diagnostic des latences et des défaillances aux frontières des services nécessite une traçabilité distribuée. Managed Service for OpenTelemetry collecte les données de trace de votre application et fournit la topologie applicative, l'analyse des traces, la détection des anomalies et des transactions lentes, ainsi que l'analyse SQL. Ce guide couvre deux approches d'instrumentation pour les applications basées sur Express : automatique (sans code) et manuelle (au niveau du SDK).
Prérequis
-
Node.js 14 ou version ultérieure
ImportantSi votre version de Node.js est antérieure à 14, utilisez Jaeger pour rapporter les données de trace. Pour plus d'informations, consultez Rapporter les données d'application Node.js.
L'endpoint et le jeton d'authentification obtenus depuis la console Managed Service for OpenTelemetry
Obtenir l'endpoint
Connectez-vous à la console Managed Service for OpenTelemetry.
Dans le volet de navigation de gauche, cliquez sur Cluster ConfigurationsCluster Configurations. Sur la page qui s'affiche, cliquez sur l'onglet Access point informationAccess point information.
Dans la barre de navigation supérieure, sélectionnez une région. Dans la section Cluster InformationCluster Information, activez l'option Show TokenShow Token.
Définissez ClientClient sur OpenTelemetryOpenTelemetry.
-
Dans la colonne Related InformationRelated Information, copiez l'endpoint.

Si votre application s'exécute dans un environnement de production Alibaba Cloud, utilisez l'endpoint VPC (Virtual Private Cloud). Utilisez l'endpoint public pour tous les autres environnements.
Exemple de code
Téléchargez le projet d'exemple complet depuis opentelemetry-nodejs-demo.
Instrumentation automatique (recommandée)
L'instrumentation automatique ajoute la traçabilité à votre application sans modification du code. Le package d'auto-instrumentation OpenTelemetry détecte les frameworks pris en charge au démarrage et crée automatiquement les spans.
Quand l'utiliser : Commencez par cette méthode pour la plupart des cas d'utilisation. L'instrumentation automatique prend en charge Express, Fastify, Koa et plus de 30 autres frameworks. Passez à l'instrumentation manuelle uniquement si vous avez besoin de processeurs de span personnalisés, d'un échantillonnage avancé ou d'un contrôle précis de l'initialisation du SDK.
Étape 1 : Installer les dépendances
cd auto-instrumentation
npm init -y
npm install express axios
Étape 2 : Installer les packages OpenTelemetry
npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-node
Étape 3 : Créer l'application
L'exemple suivant crée un serveur Express de base avec deux routes :
"use strict";
const axios = require("axios").default;
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
const result = await axios.get("http://localhost:7001/hello");
return res.status(201).send(result.data);
});
app.get("/hello", async (req, res) => {
console.log("hello world!")
res.json({ code: 200, msg: "success" });
});
app.use(express.json());
app.listen(7001, () => {
console.log("Listening on http://localhost:7001");
});
Étape 4 : Définir les variables d'environnement et démarrer l'application
Définissez les variables d'environnement suivantes, puis démarrez l'application :
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="<your-endpoint>"
export OTEL_NODE_RESOURCE_DETECTORS="env,host,os"
export OTEL_SERVICE_NAME="<your-service-name>"
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"
node main.js
Remplacez les espaces réservés suivants par vos valeurs réelles :
| Espace réservé | Description | Exemple |
|---|---|---|
<your-endpoint> |
L'endpoint HTTP obtenu dans Obtenir l'endpoint | https://tracing-analysis-dc-hz.aliyuncs.com/... |
<your-service-name> |
Un nom identifiant votre application dans la console | my-express-app |
Le tableau suivant décrit chaque variable d'environnement :
| Variable | Description |
|---|---|
OTEL_TRACES_EXPORTER |
Protocole d'exportation. Définissez sur otlp pour le protocole OpenTelemetry. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
L'endpoint HTTP qui reçoit les données de trace. |
OTEL_NODE_RESOURCE_DETECTORS |
Détecteurs de ressources à exécuter au démarrage. env,host,os collecte les métadonnées de l'environnement, de l'hôte et du système d'exploitation. |
OTEL_SERVICE_NAME |
Le nom du service affiché dans la console Managed Service for OpenTelemetry. |
NODE_OPTIONS |
Charge le module d'auto-instrumentation avant le démarrage de l'application. |
Pour plus de détails sur toutes les variables d'environnement OpenTelemetry disponibles, consultez Configuration de l'instrumentation automatique .
Étape 5 : Générer des données de trace
Envoyez une requête pour générer des traces :
curl localhost:7001/hello
Une fois la requête terminée, le SDK exporte les données de trace vers Managed Service for OpenTelemetry.
Instrumentation manuelle
L'instrumentation manuelle vous offre un contrôle total sur l'initialisation du SDK, y compris les processeurs de span personnalisés, l'échantillonnage avancé et la configuration spécifique à l'application. Cette approche remplace l'instrumentation automatique ; n'utilisez pas les deux simultanément.
Le chemin d'instrumentation manuelle utilise gRPC comme protocole d'exportation, tandis que le chemin automatique utilise HTTP. Si vos politiques de pare-feu ne prennent pas en charge gRPC, utilisez l'instrumentation automatique avec HTTP ou configurez l'exportateur HTTP (@opentelemetry/exporter-trace-otlp-http) à la place.
Étape 1 : Ajouter les dépendances OpenTelemetry
Ajoutez les dépendances suivantes à votre fichier package.json :
"dependencies": {
"@opentelemetry/api": "^1.0.4",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0",
"@opentelemetry/instrumentation": "^0.27.0",
"@opentelemetry/instrumentation-express": "^0.27.0",
"@opentelemetry/instrumentation-http": "^0.27.0",
"@opentelemetry/resources": "^1.0.1",
"@opentelemetry/sdk-trace-base": "^1.0.1",
"@opentelemetry/sdk-trace-node": "^1.0.1"
}
Étape 2 : Créer le fournisseur de traceur
Importez et initialisez le fournisseur de traceur en haut de votre fichier d'entrée, avant tout autre import d'application. OpenTelemetry doit patcher les bibliothèques du framework avant qu'elles ne soient chargées. Un ordre d'initialisation incorrect est la cause la plus fréquente de spans manquantes.
const { Resource } = require("@opentelemetry/resources");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
// Replace "opentelemetry-express" with your service name
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});
Étape 3 : Enregistrer les instrumentations de framework
Enregistrez les instrumentations HTTP et Express pour tracer automatiquement les requêtes entrantes et sortantes :
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
Pour instrumenter d'autres frameworks Node.js, consultez le package OpenTelemetry auto-instrumentations-node pour voir les plugins disponibles.
Étape 4 : Configurer l'exportateur
Configurez un exportateur OTLP via gRPC pour envoyer les données de trace à Managed Service for OpenTelemetry :
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();
Remplacez les espaces réservés suivants par vos valeurs réelles :
| Espace réservé | Description |
|---|---|
<your-endpoint> |
L'endpoint gRPC obtenu dans Obtenir l'endpoint |
<your-token> |
Le jeton d'authentification affiché après avoir activé Show TokenShow Token |
Étape 5 (facultative) : Ajouter des événements et attributs personnalisés
Attachez des événements et des attributs à la span actuelle pour ajouter un contexte spécifique à l'application :
const api = require("@opentelemetry/api");
const currentSpan = api.trace.getSpan(api.context.active());
// Add a timestamped event
currentSpan.addEvent("timestamp", { value: Date.now() });
// Add a custom attribute
currentSpan.setAttribute("tagKey-01", "tagValue-01");
Pour en savoir plus sur l'API de traçage OpenTelemetry, consultez le Guide de démarrage OpenTelemetry JS .
Afficher les données de trace dans la console ARMS
Connectez-vous à la console Managed Service for OpenTelemetry.
Dans le volet de navigation de gauche, cliquez sur ApplicationsApplications.
Cliquez sur le nom de votre application pour afficher les traces, la topologie et les données de performance.
Dépannage
L'application n'apparaît pas dans la console
Vérifiez que
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT(automatique) ou le paramètreurldansOTLPTraceExporter(manuel) correspond à l'endpoint de la console.Confirmez la connectivité réseau vers l'endpoint. Si votre application s'exécute en dehors d'Alibaba Cloud, utilisez l'endpoint public au lieu de l'endpoint VPC.
Assurez-vous que votre application a reçu au moins une requête. OpenTelemetry met en buffer les spans avant de les exporter.
Pour l'instrumentation manuelle, confirmez que le fournisseur de traceur est initialisé avant tout import d'application. Un ordre d'initialisation incorrect entraîne l'absence de spans.
Activer la journalisation de débogage
Définissez le niveau de journalisation OpenTelemetry sur debug pour inspecter le comportement du SDK :
export OTEL_LOG_LEVEL=debug
Redémarrez l'application et vérifiez la sortie de la console pour les journaux d'exportation de span et les erreurs. Une exportation réussie produit des entrées de journal similaires à :
@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]
Si aucune entrée de span n'apparaît, vérifiez que votre application a traité au moins une requête et que l'endpoint est accessible.
Frameworks Node.js pris en charge
OpenTelemetry fournit des plugins d'auto-instrumentation pour les frameworks suivants. Pour la liste complète, consultez le référentiel OpenTelemetry JS contrib.
Afficher tous les frameworks pris en charge
Exemple de code complet
Le code suivant combine toutes les étapes d'instrumentation manuelle en une seule application Express exécutable. L'exemple utilise l'exportateur OTLPTraceExporter basé sur gRPC pour soumettre les données de trace à Managed Service for OpenTelemetry.
"use strict";
const { Resource } = require("@opentelemetry/resources");
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-grpc");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const { SimpleSpanProcessor } = require("@opentelemetry/sdk-trace-base");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const grpc = require("@grpc/grpc-js");
// 1. Create a tracer provider with service metadata
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});
// 2. Register HTTP and Express instrumentations
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
// 3. Configure the gRPC exporter with authentication
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();
// 4. Application code (must come after provider registration)
const api = require("@opentelemetry/api");
const axios = require("axios").default;
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
const result = await axios.get("http://localhost:7001/api");
return res.status(201).send(result.data);
});
app.get("/api", async (req, res) => {
const currentSpan = api.trace.getSpan(api.context.active());
currentSpan.addEvent("timestamp", { value: Date.now() });
currentSpan.setAttribute("tagKey-01", "tagValue-01");
res.json({ code: 200, msg: "success" });
});
app.use(express.json());
app.listen(7001, () => {
console.log("Listening on http://localhost:7001");
});
Remplacez <your-token> et <your-endpoint> par le jeton et l'endpoint gRPC obtenus dans Obtenir l'endpoint.