All Products
Search
Document Center

Managed Service for OpenTelemetry:Kirim data jejak dari aplikasi Node.js

Last Updated:Mar 11, 2026

Saat layanan Node.js Anda berkembang melebihi satu proses, mendiagnosis latensi dan kegagalan di batas layanan memerlukan pelacakan terdistribusi. Managed Service for OpenTelemetry mengumpulkan data jejak dari aplikasi Anda dan menyediakan topologi aplikasi, analisis jejak, deteksi anomali dan transaksi lambat, serta analisis SQL. Panduan ini mencakup dua pendekatan instrumentasi untuk aplikasi berbasis Express: otomatis (tanpa kode) dan manual (tingkat SDK).

Prasyarat

  • Node.js 14 atau yang lebih baru

    Penting

    Jika versi Node.js Anda lebih lama dari 14, gunakan Jaeger untuk melaporkan data jejak. Untuk informasi selengkapnya, lihat Laporkan data aplikasi Node.js.

  • Titik akhir dan token otentikasi dari konsol Managed Service for OpenTelemetry

Dapatkan titik akhir

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Pada panel navigasi sebelah kiri, klik Cluster Configurations. Pada halaman yang muncul, klik tab Access point information.

  3. Pada bilah navigasi atas, pilih Wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur Client ke OpenTelemetry.

  5. Pada kolom Related Information, salin titik akhir tersebut.

    Endpoint information

Jika aplikasi Anda berjalan di lingkungan produksi Alibaba Cloud, gunakan titik akhir Virtual Private Cloud (VPC). Gunakan titik akhir publik untuk semua lingkungan lainnya.

Kode contoh

Unduh proyek contoh lengkap dari opentelemetry-nodejs-demo.

Instrumentasi otomatis (disarankan)

Instrumentasi otomatis menambahkan pelacakan ke aplikasi Anda tanpa perubahan kode. Paket auto-instrumentasi OpenTelemetry mendeteksi framework yang didukung saat startup dan membuat rentang secara otomatis.

Kapan digunakan: Mulai dari sini untuk sebagian besar kasus penggunaan. Instrumentasi otomatis mendukung Express, Fastify, Koa, dan 30+ framework lainnya. Beralihlah ke instrumentasi manual hanya jika Anda memerlukan prosesor rentang kustom, pengambilan sampel lanjutan, atau kontrol detail halus atas inisialisasi SDK.

Langkah 1: Instal dependensi

cd auto-instrumentation
npm init -y
npm install express axios

Langkah 2: Instal paket OpenTelemetry

npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-node

Langkah 3: Buat aplikasi

Contoh berikut membuat server Express dasar dengan dua entri rute:

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

Langkah 4: Atur variabel lingkungan dan jalankan aplikasi

Atur variabel lingkungan berikut, lalu jalankan aplikasi:

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

Ganti placeholder berikut dengan nilai aktual Anda:

PlaceholderDeskripsiContoh
<your-endpoint>Titik akhir HTTP yang diperoleh di Dapatkan titik akhirhttps://tracing-analysis-dc-hz.aliyuncs.com/...
<your-service-name>Nama yang mengidentifikasi aplikasi Anda di konsolmy-express-app

Tabel berikut menjelaskan setiap variabel lingkungan:

VariabelDeskripsi
OTEL_TRACES_EXPORTERProtokol ekspor. Atur ke otlp untuk OpenTelemetry Protocol.
OTEL_EXPORTER_OTLP_TRACES_ENDPOINTTitik akhir HTTP yang menerima data jejak.
OTEL_NODE_RESOURCE_DETECTORSDetektor sumber daya yang dijalankan saat startup. env,host,os mengumpulkan metadata lingkungan, host, dan OS.
OTEL_SERVICE_NAMENama layanan yang ditampilkan di konsol Managed Service for OpenTelemetry.
NODE_OPTIONSMemuat modul auto-instrumentasi sebelum aplikasi dimulai.
Untuk detail semua variabel lingkungan OpenTelemetry yang tersedia, lihat Konfigurasi Instrumentasi Otomatis.

Langkah 5: Hasilkan data jejak

Kirim permintaan untuk menghasilkan jejak:

curl localhost:7001/hello

Setelah permintaan selesai, SDK mengekspor data jejak ke Managed Service for OpenTelemetry.

Instrumentasi manual

Instrumentasi manual memberikan kontrol penuh atas inisialisasi SDK, termasuk prosesor rentang kustom, pengambilan sampel lanjutan, dan konfigurasi spesifik aplikasi. Pendekatan ini menggantikan instrumentasi otomatis — jangan gunakan keduanya secara bersamaan.

Penting

Jalur instrumentasi manual menggunakan gRPC sebagai protokol ekspor, sedangkan jalur otomatis menggunakan HTTP. Jika kebijakan firewall Anda tidak mendukung gRPC, gunakan instrumentasi otomatis dengan HTTP atau konfigurasikan exporter HTTP (@opentelemetry/exporter-trace-otlp-http) sebagai gantinya.

Langkah 1: Tambahkan dependensi OpenTelemetry

Tambahkan dependensi berikut ke file package.json Anda:

"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"
}

Langkah 2: Buat penyedia tracer

Penting

Impor dan inisialisasi penyedia tracer di bagian atas file entri Anda, sebelum impor aplikasi lainnya. OpenTelemetry harus melakukan patch library framework sebelum dimuat. Urutan inisialisasi yang salah adalah penyebab paling umum hilangnya rentang.

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(),
    // Ganti "opentelemetry-express" dengan nama layanan Anda
    [SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
  }),
});

Langkah 3: Daftarkan instrumentasi framework

Daftarkan instrumentasi HTTP dan Express untuk melacak permintaan masuk dan keluar secara otomatis:

const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
  ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");

registerInstrumentations({
  tracerProvider: provider,
  instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
Untuk menginstrumen framework Node.js lainnya, lihat paket OpenTelemetry auto-instrumentations-node untuk plugin yang tersedia.

Langkah 4: Konfigurasikan exporter

Konfigurasikan exporter OTLP melalui gRPC untuk mengirim data jejak ke 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();

Ganti placeholder berikut dengan nilai aktual Anda:

PlaceholderDeskripsi
<your-endpoint>Titik akhir gRPC yang diperoleh di Dapatkan titik akhir
<your-token>Token otentikasi yang ditampilkan setelah Anda mengaktifkan Show Token

Langkah 5 (opsional): Tambahkan event dan atribut kustom

Lampirkan event dan atribut ke rentang saat ini untuk konteks spesifik aplikasi:

const api = require("@opentelemetry/api");
const currentSpan = api.trace.getSpan(api.context.active());

// Tambahkan event berstempel waktu
currentSpan.addEvent("timestamp", { value: Date.now() });

// Tambahkan atribut kustom
currentSpan.setAttribute("tagKey-01", "tagValue-01");
Untuk informasi lebih lanjut tentang API pelacakan OpenTelemetry, lihat Panduan mulai cepat OpenTelemetry JS.

Lihat data jejak di konsol ARMS

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Pada panel navigasi sebelah kiri, klik Applications.

  3. Klik nama aplikasi Anda untuk melihat jejak, topologi, dan data performa.

Pemecahan masalah

Aplikasi tidak muncul di konsol

  • Verifikasi bahwa OTEL_EXPORTER_OTLP_TRACES_ENDPOINT (otomatis) atau parameter url dalam OTLPTraceExporter (manual) sesuai dengan titik akhir dari konsol.

  • Konfirmasi konektivitas jaringan ke titik akhir tersebut. Jika aplikasi Anda berjalan di luar Alibaba Cloud, gunakan titik akhir publik, bukan titik akhir VPC.

  • Pastikan aplikasi Anda telah menerima setidaknya satu permintaan. OpenTelemetry menyimpan buffer rentang sebelum mengekspornya.

  • Untuk instrumentasi manual, pastikan penyedia tracer diinisialisasi sebelum impor aplikasi apa pun. Urutan inisialisasi yang salah menyebabkan rentang tidak muncul.

Aktifkan logging debug

Atur tingkat log OpenTelemetry ke debug untuk memeriksa perilaku SDK:

export OTEL_LOG_LEVEL=debug

Jalankan ulang aplikasi dan periksa output konsol untuk log ekspor rentang dan error. Ekspor yang berhasil menghasilkan entri log seperti berikut:

@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]

Jika tidak ada entri rentang yang muncul, verifikasi bahwa aplikasi Anda telah memproses setidaknya satu permintaan dan titik akhir tersebut dapat dijangkau.

Framework Node.js yang didukung

OpenTelemetry menyediakan plugin auto-instrumentasi untuk framework berikut. Untuk daftar lengkapnya, lihat repositori OpenTelemetry JS contrib.

Lihat semua framework yang didukung

FrameworkPaket instrumentasi
amqplib@opentelemetry/instrumentation-amqplib
aws-lambda@opentelemetry/instrumentation-aws-lambda
aws-sdk@opentelemetry/instrumentation-aws-sdk
bunyan@opentelemetry/instrumentation-bunyan
cassandra-driver@opentelemetry/instrumentation-cassandra-driver
connect@opentelemetry/instrumentation-connect
cucumber@opentelemetry/instrumentation-cucumber
dataloader@opentelemetry/instrumentation-dataloader
dns@opentelemetry/instrumentation-dns
express@opentelemetry/instrumentation-express
fastify@opentelemetry/instrumentation-fastify
generic-pool@opentelemetry/instrumentation-generic-pool
graphql@opentelemetry/instrumentation-graphql
grpc@opentelemetry/instrumentation-grpc
hapi@opentelemetry/instrumentation-hapi
http@opentelemetry/instrumentation-http
ioredis@opentelemetry/instrumentation-ioredis
knex@opentelemetry/instrumentation-knex
koa@opentelemetry/instrumentation-koa
lru-memoizer@opentelemetry/instrumentation-lru-memoizer
memcached@opentelemetry/instrumentation-memcached
mongodb@opentelemetry/instrumentation-mongodb
mongoose@opentelemetry/instrumentation-mongoose
mysql@opentelemetry/instrumentation-mysql
mysql2@opentelemetry/instrumentation-mysql2
nestjs-core@opentelemetry/instrumentation-nestjs-core
net@opentelemetry/instrumentation-net
pg@opentelemetry/instrumentation-pg
pino@opentelemetry/instrumentation-pino
redis@opentelemetry/instrumentation-redis
restify@opentelemetry/instrumentation-restify
socket.io@opentelemetry/instrumentation-socket.io
winston@opentelemetry/instrumentation-winston

Kode contoh lengkap

Kode berikut menggabungkan semua langkah instrumentasi manual menjadi satu aplikasi Express yang dapat dijalankan. Contoh ini menggunakan OTLPTraceExporter berbasis gRPC untuk mengirim data jejak ke 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. Buat penyedia tracer dengan metadata layanan
const provider = new NodeTracerProvider({
  resource: new Resource({
    [SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
    [SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
  }),
});

// 2. Daftarkan instrumentasi HTTP dan Express
registerInstrumentations({
  tracerProvider: provider,
  instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});

// 3. Konfigurasikan exporter gRPC dengan otentikasi
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. Kode aplikasi (harus ditempatkan setelah registrasi penyedia)
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");
});

Ganti <your-token> dan <your-endpoint> dengan token dan titik akhir gRPC yang diperoleh di Dapatkan titik akhir.