Node.js hizmetleriniz tek bir işlemin ötesine geçtiğinde, hizmet sınırları arasındaki gecikme sürelerini ve hataları teşhis etmek için dağıtık izlemeden yararlanmanız gerekir. Managed Service for OpenTelemetry, uygulamanızdan izleme verilerini toplar; uygulama topolojisi, iz analizi, anormallik ve yavaş işlem algılama ile SQL analizi olanakları sunar. Bu kılavuz, Express tabanlı uygulamalar için iki enstrümantasyon yaklaşımını ele alır: otomatik (kod gerektirmeyen) ve manuel (SDK düzeyinde).
Önkoşullar
-
Node.js 14 veya üzeri bir sürüm
ÖnemliNode.js sürümünüz 14'ten önceki bir sürümse, izleme verilerini raporlamak için bunun yerine Jaeger kullanın. Daha fazla bilgi için bkz. Node.js uygulama verilerini raporlama.
Managed Service for OpenTelemetry konsolundan alınan uç nokta ve kimlik doğrulama belirteci
Uç noktayı alma
Managed Service for OpenTelemetry konsoluna giriş yapın.
Sol gezinme bölmesinde Cluster Configurations seçeneğine tıklayın. Görüntülenen sayfada Access point information sekmesine tıklayın.
Üst gezinme çubuğunda bir bölge seçin. Cluster Information bölümünde Show Token anahtarını açın.
Client ayarını OpenTelemetry olarak yapılandırın.
-
Related Information sütununda uç noktayı kopyalayın.

Uygulamanız bir Alibaba Cloud üretim ortamında çalışıyorsa Virtual Private Cloud (VPC) uç noktasını kullanın. Diğer tüm ortamlar için genel uç noktayı kullanın.
Örnek kod
Tam örnek projeyi opentelemetry-nodejs-demo adresinden indirin.
Otomatik enstrümantasyon (önerilen)
Otomatik enstrümantasyon, kod değişikliği yapmadan uygulamanıza izleme özelliği ekler. OpenTelemetry otomatik enstrümantasyon paketi, başlatma sırasında desteklenen çerçeveleri algılar ve span'leri otomatik olarak oluşturur.
Kullanım durumu: Çoğu kullanım senaryosu için buradan başlayın. Otomatik enstrümantasyon; Express, Fastify, Koa ve 30'dan fazla diğer çerçeveyi destekler. Yalnızca özel span işleyicilerine, gelişmiş örnekleme yöntemlerine veya SDK başlatması üzerinde ayrıntılı kontrole ihtiyaç duyduğunuzda manuel enstrümantasyona geçiş yapın.
Adım 1: Bağımlılıkları yükleme
cd auto-instrumentation
npm init -y
npm install express axios
Adım 2: OpenTelemetry paketlerini yükleme
npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-node
Adım 3: Uygulamayı oluşturma
Aşağıdaki örnek, iki rotaya sahip temel bir Express sunucusu oluşturur:
"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");
});
Adım 4: Ortam değişkenlerini ayarlama ve uygulamayı başlatma
Aşağıdaki ortam değişkenlerini ayarlayın ve ardından uygulamayı başlatın:
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
Aşağıdaki yer tutucuları gerçek değerlerinizle değiştirin:
| Yer Tutucu | Açıklama | Örnek |
|---|---|---|
<your-endpoint> |
Uç noktayı alma bölümünde alınan HTTP uç noktası | https://tracing-analysis-dc-hz.aliyuncs.com/... |
<your-service-name> |
Konsolda uygulamanızı tanımlayan bir ad | my-express-app |
Aşağıdaki tabloda her bir ortam değişkeni açıklanmıştır:
| Değişken | Açıklama |
|---|---|
OTEL_TRACES_EXPORTER |
Dışa aktarma protokolü. OpenTelemetry Protokolü için otlp olarak ayarlayın. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
İzleme verilerini alan HTTP uç noktası. |
OTEL_NODE_RESOURCE_DETECTORS |
Başlatma sırasında çalıştırılacak kaynak dedektörleri. env,host,os ayarı; ortam, ana bilgisayar ve işletim sistemi meta verilerini toplar. |
OTEL_SERVICE_NAME |
Managed Service for OpenTelemetry konsolunda görüntülenen hizmet adı. |
NODE_OPTIONS |
Uygulama başlamadan önce otomatik enstrümantasyon modülünü yükler. |
Kullanılabilir tüm OpenTelemetry ortam değişkenleriyle ilgili ayrıntılar için bkz. Otomatik Enstrümantasyon Yapılandırması .
Adım 5: İzleme verisi oluşturma
İzlemeler oluşturmak için bir istek gönderin:
curl localhost:7001/hello
İstek tamamlandıktan sonra SDK, izleme verilerini Managed Service for OpenTelemetry hizmetine dışa aktarır.
Manuel enstrümantasyon
Manuel enstrümantasyon; özel span işleyicileri, gelişmiş örnekleme ve uygulamaya özel yapılandırma dahil olmak üzere SDK başlatması üzerinde tam kontrol sağlar. Bu yaklaşım otomatik enstrümantasyonun yerine geçer; ikisini aynı anda kullanmayın.
Manuel enstrümantasyon yolu dışa aktarma protokolü olarak gRPC kullanırken, otomatik yol HTTP kullanır. Güvenlik duvarı ilkeleriniz gRPC'yi desteklemiyorsa HTTP ile otomatik enstrümantasyon kullanın veya bunun yerine HTTP dışa aktarıcısını (@opentelemetry/exporter-trace-otlp-http) yapılandırın.
Adım 1: OpenTelemetry bağımlılıklarını ekleme
Aşağıdaki bağımlılıkları package.json dosyanıza ekleyin:
"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"
}
Adım 2: İzleyici sağlayıcısını oluşturma
İzleyici sağlayıcısını diğer tüm uygulama içe aktarmalarından önce giriş dosyanızın en üstünde içe aktarın ve başlatın. OpenTelemetry, çerçeve kitaplıkları yüklenmeden önce bunlara yama uygulamalıdır. Yanlış başlatma sırası, eksik span'lerin en yaygın nedenidir.
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",
}),
});
Adım 3: Çerçeve enstrümantasyonlarını kaydetme
Gelen ve giden istekleri otomatik olarak izlemek için HTTP ve Express enstrümantasyonlarını kaydedin:
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
Diğer Node.js çerçevelerini enstrümante etmek için mevcut eklentiler açısından OpenTelemetry auto-instrumentations-node paketini inceleyin.
Adım 4: Dışa aktarıcıyı yapılandırma
İzleme verilerini Managed Service for OpenTelemetry hizmetine göndermek üzere gRPC üzerinden bir OTLP dışa aktarıcısı yapılandırın:
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();
Aşağıdaki yer tutucuları gerçek değerlerinizle değiştirin:
| Yer Tutucu | Açıklama |
|---|---|
<your-endpoint> |
Uç noktayı alma bölümünde alınan gRPC uç noktası |
<your-token> |
Show Token anahtarını açtığınızda görüntülenen kimlik doğrulama belirteci |
Adım 5 (isteğe bağlı): Özel olaylar ve nitelikler ekleme
Uygulamaya özel bağlam sağlamak için mevcut span'e olaylar ve nitelikler ekleyin:
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");
OpenTelemetry izleme API'si hakkında daha fazla bilgi için bkz. OpenTelemetry JS başlangıç kılavuzu .
ARMS konsolunda izleme verilerini görüntüleme
Managed Service for OpenTelemetry konsoluna giriş yapın.
Sol gezinme bölmesinde Applications seçeneğine tıklayın.
İzlemeleri, topolojiyi ve performans verilerini görüntülemek için uygulama adınıza tıklayın.
Sorun giderme
Uygulama konsolda görünmüyor
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT(otomatik) veyaOTLPTraceExporteriçindekiurlparametresinin (manuel) konsoldaki uç nokta ile eşleştiğini doğrulayın.Uç noktaya ağ bağlantısını onaylayın. Uygulamanız Alibaba Cloud dışında çalışıyorsa VPC uç noktası yerine genel uç noktayı kullanın.
Uygulamanızın en az bir istek aldığını kontrol edin. OpenTelemetry, span'leri dışa aktarmadan önce arabelleğe alır.
Manuel enstrümantasyon için izleyici sağlayıcısının herhangi bir uygulama içe aktarmasından önce başlatıldığını onaylayın. Yanlış başlatma sırası eksik span'lere neden olur.
Hata ayıklama günlüğünü etkinleştirme
SDK davranışını incelemek için OpenTelemetry günlük düzeyini debug olarak ayarlayın:
export OTEL_LOG_LEVEL=debug
Uygulamayı yeniden başlatın ve span dışa aktarma günlüklerini ve hatalarını kontrol etmek için konsol çıktısını inceleyin. Başarılı bir dışa aktarma işlemi, şuna benzer günlük girdileri üretir:
@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]
Herhangi bir span girdisi görünmüyorsa uygulamanızın en az bir isteği işlediğini ve uç noktanın erişilebilir olduğunu doğrulayın.
Desteklenen Node.js çerçeveleri
OpenTelemetry, aşağıdaki çerçeveler için otomatik enstrümantasyon eklentileri sağlar. Tam liste için bkz. OpenTelemetry JS contrib deposu.
Tüm desteklenen çerçeveleri görüntüle
Tam örnek kod
Aşağıdaki kod, tüm manuel enstrümantasyon adımlarını tek bir çalıştırılabilir Express uygulamasında birleştirir. Örnek, izleme verilerini Managed Service for OpenTelemetry hizmetine göndermek için gRPC tabanlı OTLPTraceExporter kullanır.
"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");
});
<your-token> ve <your-endpoint> ifadelerini Uç noktayı alma bölümünde alınan belirteç ve gRPC uç noktasıyla değiştirin.