
OpenTelemetry là gì?
OpenTelemetry là bộ công cụ mã nguồn mở, vendor-neutral để thu thập, export và quản lý tín hiệu quan sát từ hệ thống phân tán. Ba loại tín hiệu chính: traces (truy vết request qua microservices), metrics (CPU, latency, throughput), logs (sự kiện ứng dụng). OpenTelemetry thuộc CNCF — cùng cấp với Kubernetes, Prometheus — và đang trở thành chuẩn mặc định cho observability.
Trước OpenTelemetry, mỗi nhà cung cấp APM (Application Performance Monitoring) tự phát SDK riêng: Datadog, New Relic, Dynatrace, Jaeger. Việc chuyển nhà cung cấp đồng nghĩa thay đổi instrumentation code. OTel trừu tượng hóa layer này: bạn instrument app ONE TIME, sau đó export sang bất kỳ backend nào.

Ba tín hiệu quan sát
1. Distributed Tracing
Tracing theo dõi request xuyên suốt hệ thống microservices. Mỗi request nhận trace ID duy nhất; mỗi bước xử lý là span có metadata (service, operation, duration). Khi có lỗi hoặc latency cao, trace giúp developer xác định bottleneck nhanh.
2. Metrics
Metrics là dữ liệu số theo thời gian: counter (tổng request), gauge (RAM usage), histogram (latency bucket). OTel hỗ trợ Prometheus exposition format — tích hợp native với Prometheus + Grafana để dashboard real-time.
3. Logs
Logs liên kết với trace ID qua trace correlation. Thay vì log lẻ tẻ không ngữ cảnh, OTel cho phép click từ dashboard metric xuống trace, rồi trace xuống log — workflow triage nhanh.

Instrumentation code thực tế
OpenTelemetry cung cấp SDK cho mọi ngôn ngữ phổ biến: Python, Go, Java, Node.js, .NET. Ví dụ Python với Flask:
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# Cấu hình tracer
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="otel-collector:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("myapp")
@app.route("/api/orders")
def create_order():
with tracer.start_as_current_span("create_order"):
# Business logic here
order = db.save_order(request.json)
return jsonify(order)
Code này tự động ghi trace, export về OTLP endpoint. Không cần gọi span.end() thủ công với context manager. Thêm opentelemetry-instrumentation-flask để auto-instrument mà không cần thay đổi business logic.
Deployment với OpenTelemetry Collector
OTel Collector là gateway trung gian — app gửi OTLP tới Collector, Collector xử lý (batch, tail-based sampling, enrichment) rồi export sang backend. Ưu điểm:
- Decoupling: App không cần biết backend là Jaeger, Prometheus, hay Datadog.
- Sampling: Giảm chi phí lưu trữ bằng cách lưu mọi request lỗi + mẫu request thành công.
- Fluentd/BYOC: Dễ thay thế backend mà không restart app.

So sánh với Prometheus + Jaeger + ELK
| Tiêu chí | Prometheus only | Jaeger + Loki | OpenTelemetry |
|---|---|---|---|
| Tracing | Không | Có | Có |
| Metrics | Có | Hạn chế | Có (Prometheus compatible) |
| Logs | Không | Có (Loki) | Có |
| Vendor lock-in | Cloud-native | Jaeger/Loki specific | Không |
| Instrumentation | Push | Push/Pull | Unified |
| Community | CNCF | CNCF | CNCF |
Kết luận
OpenTelemetry không chỉ là thư viện — mà là chiến lược observability. Với OTel, bạn instrument app một lần, quản lý toàn bộ lifecycle tín hiệu từ Collector, và chuyển backend bất cứ lúc nào. Nhà phát triển nên đưa OTel vào CI/CD pipeline từ ngày một: auto-instrument với OpenTelemetry Operator trên Kubernetes, export sang Prometheus + Grafana cho team monitoring, Jaeger cho distributed trace. Đây là nền tảng bền vững cho hệ thống scale lớn.
Nguồn: OpenTelemetry Docs, GitHub OTel, Prometheus
