全部产品
Search
文档中心

:Impor data jejak dari aplikasi Node.js ke Layanan Log Sederhana menggunakan OpenTelemetry SDK untuk JavaScript

更新时间:Jul 06, 2025

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.

  1. 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-node
  2. Inisialisasi 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

  3. 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.

  1. Instal dependensi.

    npm install --save @opentelemetry/api
    npm install --save @opentelemetry/node
    npm install --save @opentelemetry/tracing
    npm install --save @opentelemetry/exporter-collector-grpc
  2. Inisialisasi 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);
    });
  3. Akses layanan untuk memicu pembuatan data jejak dan kirim data jejak ke Layanan Log Sederhana.

    127.0.0.1:8079/hello

Apa yang harus dilakukan selanjutnya