- 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
- Name
- Bạch Đăng Tuấn
- Occupation
- Kỹ sư công nghệ thông tin
- Zalo: 0934.01.07.04
🎯 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
tracing.js
📁 Bước 2: Tạo file // 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));
index.js
🧬 Bước 3: Import tracing sớm nhất trong 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ệc | Làm như nào |
---|---|
Cài thư viện | npm install ... |
Gắn tracing vào app | Import tracing.js sớm |
Gửi trace | Dùng OTLP HTTP hoặc Jaeger |
Theo dõi trace | Tự động hoặc thủ công |
Xem trace | Jaeger 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.