Blog chia sẻ về công nghệ ...
Published on

Tích hợp OpenTelemetry vào ứng dụng backend (hướng dẫn chi tiết cho người mới)

Authors

🎯 Mục tiêu

Bạn sẽ học cách:

  • Tích hợp OpenTelemetry vào backend Node.js
  • Gửi trace tới Collector hoặc Jaeger
  • Hiểu auto-instrumentation là gì
  • Khi nào cần ghi trace thủ công

📦 Bước 1: Cài đặt thư viện cần thiết

Chạy lệnh sau trong thư mục dự án Node.js:

npm install @opentelemetry/api             
    @opentelemetry/sdk-node             
    @opentelemetry/auto-instrumentations-node             
    @opentelemetry/exporter-trace-otlp-http

📁 Bước 2: Tạo file tracing.js

// tracing.js
'use strict';

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces',
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start()
  .then(() => console.log('✅ OpenTelemetry đã khởi động'))
  .catch((error) => console.log('❌ OpenTelemetry lỗi:', error));

🧬 Bước 3: Import tracing sớm nhất trong index.js

require('./tracing');

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Xin chào OpenTelemetry + Node.js!');
});

app.listen(3000, () => {
  console.log('Server chạy ở http://localhost:3000');
});

🚀 Bước 4: Dùng Jaeger để xem trace

Chạy Jaeger bằng Docker:

docker run -d --name jaeger   -e COLLECTOR_OTLP_ENABLED=true   -p 16686:16686 -p 4318:4318   jaegertracing/all-in-one:latest

Truy cập http://localhost:16686 để xem trace.


🤖 Auto-Instrumentation là gì?

  • Khi bạn dùng getNodeAutoInstrumentations(), OTel sẽ tự động tạo trace cho:
    • HTTP request
    • Express route
    • Một số DB client như MySQL, PG, MongoDB
  • Bạn không cần viết gì thêm – trace vẫn sẽ được tạo tự động.

✍️ Khi nào cần ghi trace thủ công?

Khi bạn muốn theo dõi chi tiết bên trong một route, hoặc một đoạn xử lý phức tạp:

const { trace } = require('@opentelemetry/api');

app.get('/checkout', async (req, res) => {
  const tracer = trace.getTracer('app-tracer');
  const span = tracer.startSpan('xuly-thanh-toan');
  try {
    await doPayment();
    span.setStatus({ code: 1 });
    res.send('Thanh toán xong!');
  } catch (err) {
    span.recordException(err);
    span.setStatus({ code: 2 });
    res.status(500).send('Lỗi!');
  } finally {
    span.end();
  }
});

❓ Có ảnh hưởng đến logic code không?

Điều gì xảy ra?Ảnh hưởng đến logic app không?
Tạo trace auto❌ Không
Ghi trace thủ công❌ Không
Collector bị tắt❌ App vẫn chạy, chỉ mất trace
Quá nhiều trace⚠️ Có thể ảnh hưởng hiệu năng nếu không sampling

✅ Tổng kết

ViệcLàm như nào
Cài thư việnnpm install ...
Gắn tracing vào appImport tracing.js sớm
Gửi traceDùng OTLP HTTP hoặc Jaeger
Theo dõi traceTự động hoặc thủ công
Xem traceJaeger UI tại localhost:16686

Nếu bạn kết hợp với OpenTelemetry Collector thì trace có thể đi qua Collector → Jaeger/Tempo/Elastic v.v. để lưu trữ & phân tích.