Topik ini menjelaskan cara mengimpor data jejak dari aplikasi Node.js ke Layanan Log Sederhana menggunakan OpenTelemetry SDK untuk JavaScript.
Prasyarat
Sebuah instance jejak telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instance Jejak.
Lingkungan pengembangan Node.js telah disiapkan dengan versi 8.5.0 atau yang lebih baru.
Metode 1: (Direkomendasikan) Impor data dalam mode semi-otomatis
Anda dapat menginstal dependensi Node.js di beberapa framework untuk secara otomatis mengunggah data jejak ke Layanan Log Sederhana. Framework tersebut mencakup HTTP, HTTPS, gRPC, Express, MySQL, MongoDB, dan Redis. Untuk informasi lebih lanjut tentang framework, lihat opentelemetry-node-js-contrib. Dalam contoh ini, Express digunakan untuk menjelaskan cara mengimpor data dalam mode semi-otomatis. Untuk informasi lebih lanjut, lihat Contoh.
Instal dependensi.
npm install --save @opentelemetry/api npm install --save @opentelemetry/node npm install --save @opentelemetry/tracing npm install --save @opentelemetry/exporter-collector-grpc npm install --save @opentelemetry/instrumentation npm install --save @opentelemetry/instrumentation-express npm install --save @opentelemetry/instrumentation-http npm install --save @grpc/grpc-js npm install --save @opentelemetry/sdk-trace-nodeInisialisasi tracer dan jalankan Express.
Ganti variabel dalam kode berikut dengan nilai sebenarnya. Untuk informasi lebih lanjut tentang variabel, lihat Variabel.
const opentelemetry = require("@opentelemetry/api"); const { registerInstrumentations } = require("@opentelemetry/instrumentation"); const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); const { Resource } = require("@opentelemetry/resources"); const { SemanticResourceAttributes, } = require("@opentelemetry/semantic-conventions"); const { SimpleSpanProcessor, ConsoleSpanExporter, } = require("@opentelemetry/tracing"); const grpc = require("@grpc/grpc-js"); const { CollectorTraceExporter, } = require("@opentelemetry/exporter-collector-grpc"); const { ExpressInstrumentation, } = require("@opentelemetry/instrumentation-express"); const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http"); var os = require("os"); var hostname = os.hostname(); const provider = new NodeTracerProvider({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: "${service}", [SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: "${environment}", [SemanticResourceAttributes.SERVICE_VERSION]: "${version}", [SemanticResourceAttributes.SERVICE_NAMESPACE]: "${service.namespace}", [SemanticResourceAttributes.HOST_NAME]: hostname, }), }); provider.register(); registerInstrumentations({ instrumentations: [ new HttpInstrumentation(), new ExpressInstrumentation({ ignoreLayersType: [new RegExp("middleware.*")], }), ], tracerProvider: provider, }); var url = "${endpoint}"; var logStdout = false; if (url == "stdout") { logStdout = true; } var meta = new grpc.Metadata(); meta.add("x-sls-otel-project", "${project}"); meta.add("x-sls-otel-instance-id", "${instance}"); meta.add("x-sls-otel-ak-id", "${access-key-id}"); meta.add("x-sls-otel-ak-secret", "${access-key-secret}"); const collectorOptions = { url: url, credentials: grpc.credentials.createSsl(), metadata: meta, }; const exporter = new CollectorTraceExporter(collectorOptions); if (!logStdout) { provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); } else { var stdexporter = new ConsoleSpanExporter(); provider.addSpanProcessor(new SimpleSpanProcessor(stdexporter)); } provider.register(); var tracer = opentelemetry.trace.getTracer("${service}"); var express = require("express"); var app = express(); app.get("/hello", function (req, res, next) { res.send("success"); }); var server = app.listen(8079, function () { var port = server.address().port; console.log("App sekarang berjalan dalam mode %s pada port %d", app.get("env"), port); });Tabel 1. Variabel
Variabel
Deskripsi
Contoh
${endpoint}
Titik akhir proyek Layanan Log Sederhana. Format: ${project}.${region-endpoint}:Port.
${project}: nama proyek Layanan Log Sederhana.
${region-endpoint}: Titik akhir Layanan Log Sederhana untuk wilayah tempat proyek berada. Anda dapat mengakses Layanan Log Sederhana menggunakan titik akhir internal atau publik. Titik akhir internal dapat diakses melalui jaringan klasik atau virtual private cloud (VPC). Titik akhir publik dapat diakses melalui Internet. Untuk informasi lebih lanjut, lihat Titik Akhir.
Port: nomor port. Nilainya tetap sebagai 10010.
test-project.cn-hangzhou.log.aliyuncs.com:10010
${project}
Nama proyek Layanan Log Sederhana.
test-project
${instance}
ID instance jejak. Untuk informasi lebih lanjut, lihat Buat instance jejak.
test-traces
${access-key-id}
ID AccessKey akun Alibaba Cloud Anda.
Kami merekomendasikan agar Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana. Pasangan AccessKey terdiri dari ID AccessKey dan Rahasia AccessKey. Untuk informasi lebih lanjut tentang cara memberikan izin tulis pada proyek tertentu kepada pengguna RAM, lihat Gunakan kebijakan kustom untuk memberikan izin kepada pengguna RAM. Untuk informasi lebih lanjut tentang cara mendapatkan pasangan AccessKey, lihat Pasangan AccessKey.
Tidak ada
${access-key-secret}
Rahasia AccessKey akun Alibaba Cloud Anda.
Kami merekomendasikan agar Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana.
Tidak ada
${service}
Nama layanan. Tentukan nilai berdasarkan kebutuhan bisnis Anda.
payment
${version}
Versi layanan. Kami merekomendasikan agar Anda menentukan versi dalam format va.b.c.
v0.1.2
${service.namespace}
Namespace tempat layanan berada.
order
${environment}
Lingkungan penyebaran layanan. Contoh: lingkungan pengujian, lingkungan staging, atau lingkungan produksi.
pre
Akses layanan untuk memicu pembuatan data jejak dan kirim data jejak ke Layanan Log Sederhana.
127.0.0.1:8079/hello
Metode 2: Secara manual buat dan kirim data jejak
Jika Anda menggunakan framework yang dikelola sendiri atau memiliki persyaratan khusus, Anda dapat secara manual membuat data jejak dan mengirim data tersebut ke Layanan Log Sederhana. Untuk informasi lebih lanjut, lihat opentelemetry-js.
Instal dependensi.
npm install --save @opentelemetry/api npm install --save @opentelemetry/node npm install --save @opentelemetry/tracing npm install --save @opentelemetry/exporter-collector-grpcInisialisasi tracer dan jalankan Express.
Ganti variabel dalam kode berikut dengan nilai sebenarnya. Untuk informasi lebih lanjut, lihat Variabel.
const opentelemetry = require("@opentelemetry/api"); const { registerInstrumentations } = require("@opentelemetry/instrumentation"); const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); const { Resource } = require("@opentelemetry/resources"); const { SemanticResourceAttributes, } = require("@opentelemetry/semantic-conventions"); const { SimpleSpanProcessor, ConsoleSpanExporter, } = require("@opentelemetry/tracing"); const grpc = require("@grpc/grpc-js"); const { CollectorTraceExporter, } = require("@opentelemetry/exporter-collector-grpc"); const { ExpressInstrumentation, } = require("@opentelemetry/instrumentation-express"); const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http"); var os = require("os"); var hostname = os.hostname(); const provider = new NodeTracerProvider({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: "${service}", [SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: "${environment}", [SemanticResourceAttributes.SERVICE_VERSION]: "${version}", [SemanticResourceAttributes.SERVICE_NAMESPACE]: "${service.namespace}", [SemanticResourceAttributes.HOST_NAME]: hostname, }), }); provider.register(); registerInstrumentations({ instrumentations: [ new HttpInstrumentation(), new ExpressInstrumentation({ ignoreLayersType: [new RegExp("middleware.*")], }), ], tracerProvider: provider, }); var url = "${endpoint}"; var logStdout = false; if (url == "stdout") { logStdout = true; } var meta = new grpc.Metadata(); meta.add("x-sls-otel-project", "${project}"); meta.add("x-sls-otel-instance-id", "${instance}"); meta.add("x-sls-otel-ak-id", "${access-key-id}"); meta.add("x-sls-otel-ak-secret", "${access-key-secret}"); const collectorOptions = { url: url, credentials: grpc.credentials.createSsl(), metadata: meta, }; const exporter = new CollectorTraceExporter(collectorOptions); if (!logStdout) { provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); } else { var stdexporter = new ConsoleSpanExporter(); provider.addSpanProcessor(new SimpleSpanProcessor(stdexporter)); } provider.register(); var tracer = opentelemetry.trace.getTracer("${service}"); var express = require('express'); var app = express() app.get('/hello', function (req, res, next) { const span = tracer.startSpan('hello'); span.setAttribute('name', 'toma'); span.setAttribute('age', '26'); span.addEvent('invoking doWork'); res.send("success"); span.end(); }); var server = app.listen(8079, function () { var port = server.address().port; console.log("App sekarang berjalan dalam mode %s pada port %d", app.get("env"), port); });Akses layanan untuk memicu pembuatan data jejak dan kirim data jejak ke Layanan Log Sederhana.
127.0.0.1:8079/hello