Phạm Văn Thư
Hạ tầng và vận hành · AI-assisted content

OpenTelemetry Collector: cổng chung cho dữ liệu giám sát nhiều hệ thống

Đăng ngày 12/10/2026

Mục lục bài nghiên cứu
Hình đại diện OpenTelemetry Collector — hạ tầng và DevOps mã nguồn mở

Collector nằm ở đâu trong chuỗi giám sát, và vì sao ban quản lý tòa nhà nên biết nó

OpenTelemetry Collector là một tiến trình trung gian nhận dữ liệu quan sát (telemetry) như trace, metric và log, xử lý rồi chuyển tới một hoặc nhiều hệ thống lưu trữ và phân tích. README mô tả nó là cách triển khai không gắn với nhà cung cấp nào, giúp khỏi phải chạy nhiều agent riêng cho từng định dạng mã nguồn mở. [1] Nó không phải nơi lưu dữ liệu, cũng không phải bảng điều khiển.

Với đơn vị quản lý nhiều tòa nhà, giá trị nằm ở chỗ có một điểm thu gom thống nhất trước khi chọn hay đổi nơi lưu trữ. Dữ liệu từ ứng dụng cư dân, cổng thu phí dịch vụ hay hệ thống tiếp nhận yêu cầu sửa chữa có thể đi qua cùng một cổng, được giới hạn bộ nhớ và gom lô trước khi gửi đi. [1][6][7] Bài này đề xuất ý tưởng đó như một tình huống giả định, chưa phải việc đã triển khai.

Khuyến nghị: chỉ cân nhắc khi công ty đã có ít nhất vài hệ thống phần mềm tự phát triển hoặc thuê ngoài có khả năng phát dữ liệu theo chuẩn OTLP, và có người đủ kỹ năng vận hành một dịch vụ chạy liên tục. Nếu chỉ cần xem tình trạng vài máy chủ, một công cụ giám sát đóng gói sẵn có thể rẻ công hơn.

Mỗi hệ thống nói một giọng: khi dữ liệu giám sát không cùng định dạng

Một công ty quản lý chung cư thường dùng phần mềm từ nhiều nguồn: ứng dụng cư dân, phần mềm kế toán phí quản lý, hệ thống kiểm soát ra vào, bộ điều khiển thang máy hoặc bơm. Mỗi nơi ghi nhật ký một kiểu và chỉ có người từng cài mới đọc được. Khi sự cố xảy ra, đội kỹ thuật phải mở từng hệ thống để ghép bức tranh.

Collector giải quyết một lát cắt hẹp của vấn đề: nhận dữ liệu theo nhiều giao thức, đưa về mô hình dữ liệu chung bên trong, xử lý và xuất theo giao thức phía lưu trữ cần. README nêu mục tiêu là giảm nhu cầu chạy nhiều agent để hỗ trợ các định dạng như Jaeger hay Prometheus cho nhiều backend khác nhau. [1] README cũng ghi mã nguồn hiện được xây theo giao thức OTLP phiên bản v1.10.0, mà họ xếp vào mức Stable. [1]

Điều Collector không làm là sửa phần mềm nguồn. Nếu một hệ thống cũ không có cách nào phát dữ liệu ra ngoài, cần dựng cầu nối riêng hoặc dùng receiver phù hợp. Receiver cho các nguồn như cảm biến công nghiệp không nằm trong kho lõi này theo danh sách tệp tài liệu đã xem, nên đó là điểm phải kiểm chứng riêng.

Receiver, processor, exporter, connector: bốn loại linh kiện lắp thành pipeline

Tài liệu kiến trúc nội bộ nói về hai việc: luồng khởi động và cách tải lại cấu hình. Từ đó có thể thấy cấu trúc cốt lõi. Mỗi loại thành phần có một Factory và một hàm NewFactory để đăng ký với Collector, và receiver được trao một nextConsumer cho biết dữ liệu sẽ đi đâu tiếp theo. [3]

Khi khởi động, Service dựng pipeline thành một đồ thị. Hàm Graph.Build tạo các nút từ cấu hình pipeline, kiểm tra connector, tạo các cạnh giữa thành phần, sắp xếp topo rồi tạo từng thành phần theo thứ tự ngược. Sau đó Service khởi động extension trước, rồi pipeline, và Graph.StartAll gọi Start theo thứ tự topo ngược. [3] Thứ tự ngược có nghĩa nơi nhận cuối được khởi động trước nơi nhận đầu, để dữ liệu không đến khi đích chưa sẵn sàng. Đây là cách giải thích của bài, tài liệu chỉ nêu thứ tự.

Danh sách tệp tài liệu của kho cho thấy phần lõi cung cấp các thành phần nền như otlpreceiver, otlpexporter, otlphttpexporter, debugexporter, batchprocessor, memorylimiterprocessor và forwardconnector. Phần còn lại của hệ sinh thái nằm ở kho contrib, và README bộ xử lý cho thấy các bản phân phối core, contrib và k8s là những gói khác nhau. [6] Việc chọn bản phân phối quyết định có sẵn những receiver nào, nên phải làm trước khi viết cấu hình.

Vòng đời một gói dữ liệu, từ lúc đến cổng đến khi rời Collector

Hãy hình dung một bản ghi trace từ ứng dụng cư dân gửi tới. Receiver nhận qua giao thức mà nó hỗ trợ, đổi sang dạng dữ liệu nội bộ rồi gọi consumer kế tiếp. Chuỗi processor biến đổi hoặc bỏ dữ liệu, cuối cùng exporter gửi đến đích. Mô hình receiver, processor, exporter này là kiến thức nền của dự án, và tài liệu kiến trúc nội bộ xác nhận phần đồ thị nối chúng. [3]

Thứ tự processor có ý nghĩa thật sự. README bộ xử lý batch nói rằng batch nên đặt sau memory_limiter và sau mọi processor lấy mẫu, vì gom lô phải diễn ra sau các bước làm rơi dữ liệu. [6] README memory_limiter khuyên đặt nó làm processor đầu tiên trong pipeline để áp lực ngược có thể truyền về receiver và giảm xác suất mất dữ liệu. [7]

Khi bộ nhớ vượt ngưỡng mềm, memory_limiter trả lỗi không vĩnh viễn cho thành phần đứng trước, và receiver được kỳ vọng thử gửi lại, thậm chí làm chậm nguồn của chính nó. Nếu thành phần phía trước không thử lại đúng cách, dữ liệu sẽ mất vĩnh viễn. [7] Hệ quả thiết kế: nguồn dữ liệu của tòa nhà nên có hàng đợi hoặc cơ chế thử lại, không giả định Collector luôn nhận được.

Đổi cấu hình khi đang chạy: nạp lại toàn phần và nạp lại một phần

Collector hỗ trợ nạp lại cấu hình lúc chạy, kích hoạt bởi thay đổi tệp từ config provider hoặc tín hiệu SIGHUP. Mặc định đây là nạp lại toàn phần: dừng toàn bộ Service gồm extension, pipeline và telemetry rồi dựng lại từ đầu. Tài liệu thừa nhận cách này đơn giản và đúng nhưng làm gián đoạn mọi thành phần, processor mất dữ liệu đang xử lý và hàng đợi exporter bị xả. [3]

Một đường nạp lại một phần được mô tả, nhưng chỉ khi bật feature gate service.partialReload ở mức Alpha cùng service.partialReloadReceivers. Nó chỉ áp dụng nếu thay đổi giới hạn ở receiver, với thuật toán chín bước từ thu thập đến khởi động receiver mới. Mọi thay đổi ngoài receiver đều quay về nạp toàn phần. [3]

Với người vận hành tòa nhà, ý nghĩa thực tế là chuẩn bị cho việc đổi cấu hình giờ thấp điểm, hoặc đặt nhiều Collector và đổi từng cái. Đừng dựa vào cơ chế một phần cho môi trường quan trọng khi nó còn ở mức Alpha. [3][5]

Điều đã được tài liệu nêu rõ, tách khỏi điều còn là kỳ vọng

Có thể trích trực tiếp các điểm sau. README nêu năm mục tiêu: dễ dùng, hiệu năng, khả năng tự quan sát, mở rộng, và hợp nhất mã cho cả agent lẫn collector. [1] Dự án hỗ trợ cấu hình nạp lại, sắp xếp thành phần thành đồ thị và khởi động theo thứ tự. [3] Batch có mặc định send_batch_size 8192 và timeout 200 ms, cùng tùy chọn send_batch_max_size để chặn lô quá lớn. [6]

Batch còn có metadata_keys để tạo bộ gom lô riêng cho từng tổ hợp giá trị metadata, hữu ích cho đa khách hàng. Mỗi tổ hợp mới tạo một tác vụ nền và giữ một lô chờ, nên làm bộ nhớ tăng đáng kể; mặc định giới hạn 1000 tổ hợp. [6] Memory limiter có giới hạn mềm và cứng, ép dọn bộ nhớ khi vượt ngưỡng cứng, và một trong limit_mib hoặc limit_percentage phải được đặt. [7]

Mức độ ổn định khác nhau theo từng thành phần và từng loại tín hiệu. Tài liệu định nghĩa các mức development, alpha, beta, stable, deprecated và unmaintained. [5] README batch ghi beta cho trace, metric và log. README memory_limiter ghi beta cho ba loại đó và alpha cho profiles. [6][7] Vì vậy câu chung chung rằng Collector ổn định là không đủ, cần kiểm tra từng thành phần định dùng.

Ai nên dùng, và ai chưa cần

Đối tượng phù hợp nhất là đội kỹ thuật có từ vài dịch vụ phần mềm trở lên, cần một điểm thu gom chung và muốn tách việc phát dữ liệu khỏi việc chọn nơi lưu. README nhấn mạnh việc gửi đến nhiều backend mã nguồn mở hoặc thương mại. [1]

Ngành phù hợp là những nơi có nhiều hệ thống nhỏ cần giám sát liên tục: dịch vụ số cho khu dân cư, thương mại điện tử, logistics, bệnh viện. Điều kiện chung là có người chịu trách nhiệm cảnh báo và quy trình xử lý. Công cụ chỉ chuyển dữ liệu, không biết đâu là sự cố đáng đánh thức người trực.

Chưa cần Collector nếu chỉ có một ứng dụng và một nhà cung cấp giám sát, hoặc nếu tổ chức không có kỹ sư nào đủ thời gian xem xét cấu hình và nâng cấp. Dự án này cũng là phần mềm hạ tầng cho nhà phát triển; ban quản lý tòa nhà không có đội kỹ thuật nên thuê đơn vị có năng lực vận hành thay vì tự làm.

Tình huống giả định: một công ty quản lý nhiều chung cư tại Đà Nẵng

Giả sử một công ty vận hành khoảng bốn tòa chung cư, với ứng dụng cư dân do đối tác phát triển, cổng thanh toán phí dịch vụ, hệ thống tiếp nhận yêu cầu sửa chữa và vài phần mềm quản lý bãi xe. Khi cư dân báo ứng dụng chậm vào ngày thu phí, đội kỹ thuật chỉ có nhật ký rời rạc để đoán nguyên nhân. Đây là tình huống giả định để minh họa, không phải mô tả một doanh nghiệp thật.

Đề xuất: đặt một Collector làm cổng ở trung tâm dữ liệu hoặc máy chủ đám mây của công ty, nhận OTLP từ ba hệ thống phần mềm có thể sửa hoặc cấu hình được. Pipeline bắt đầu bằng memory_limiter, tiếp theo là batch, rồi xuất tới một hệ thống lưu trữ đã chọn riêng. [1][6][7] Thứ tự trên đúng với khuyến nghị trong README của hai processor.

Dữ liệu cư dân cần cẩn trọng: log và trace có thể chứa số căn hộ, số điện thoại hay biển số xe. Cần quy định trường nào được phát ra và cân nhắc processor lọc hoặc che dữ liệu nhạy cảm. Các processor đó không nằm trong tài liệu lõi đã đọc, nên bài không khẳng định tên hay chất lượng của chúng. Nếu muốn nối thang máy hay bơm, cần kiểm tra receiver tương ứng ở kho contrib hoặc dựng cầu nối phát OTLP. Cả hai việc nằm ngoài phạm vi nguồn đã đọc.

Vận hành hằng ngày: bản phân phối, tài nguyên và cách nâng cấp

Bước đầu là chọn bản phân phối. README bộ xử lý nhắc ba lựa chọn core, contrib và k8s, và README gốc nói image otel/opentelemetry-collector cùng otel/opentelemetry-collector-contrib được ký bằng cosign từ bản v0.95.0. [1][6] Nên kiểm tra chữ ký ảnh trước khi đưa vào môi trường thật, theo lệnh cosign verify mà README minh họa. [1]

Về tài nguyên, tài liệu memory_limiter đưa các điểm khởi đầu cụ thể: đặt GOMEMLIMIT khoảng 80 phần trăm giới hạn cứng, và spike_limit_mib khoảng 20 phần trăm giới hạn cứng. Trong container nên dùng limit_percentage, còn trên máy thường dùng limit_mib nếu biết lưu lượng. [7] Đây là gợi ý của chính tài liệu, không phải số đo của bài. Cần thử với lưu lượng thật của công ty trước khi chốt.

Về nâng cấp, mỗi thành phần là một Go module theo semantic versioning, và cam kết ổn định API Go nằm trong tài liệu VERSIONING riêng. [5] Metadata thu thập ghi bản phát hành mới nhất là v0.162.0 ngày 2026-09-28, và số phiên bản dạng 0.x nghĩa là cần đọc changelog trước mỗi lần nâng cấp, nhất là với thành phần ở mức alpha hoặc beta. Cấu hình alpha có thể đổi với thông báo tối thiểu. [5]

Cổng nhận dữ liệu cũng là bề mặt tấn công

Tài liệu bảo mật dành cho nhà phát triển thành phần nêu một số nguyên tắc: Collector không có cấu hình mặc định nhúng sẵn và không được khởi động nếu không có tệp cấu hình, cấu hình phải được kiểm tra hợp lệ và nếu sai thì phải thất bại khi khởi động. [4] Trường nhạy cảm nên dùng kiểu configopaque để bị che khi serialize. [4]

Về quyền, Collector hỗ trợ chạy bằng người dùng tùy chỉnh và không nên chạy bằng root hay admin; thành phần cần đặc quyền phải ghi rõ lý do. Receiver và exporter phải mặc định dùng kết nối mã hóa, tức insecure: false, và extension không nên công bố dữ liệu sức khỏe hay telemetry ra ngoài theo mặc định. [4] Tài liệu chuyển hướng người đọc sang tài liệu trên website để biết cách chống tấn công từ chối dịch vụ, và bài chưa đọc các trang đó. [4]

Từ đây suy ra checklist cho tòa nhà: đặt Collector sau tường lửa, bật TLS và xác thực cho receiver, không để cổng nhận dữ liệu mở ra Internet, tách mạng quản trị khỏi mạng cư dân, và xem xét kỹ dữ liệu cá nhân trước khi xuất sang dịch vụ bên ngoài. Memory limiter không thay cho việc chống quá tải, vì README cảnh báo dữ liệu đến có thể chiếm thêm bộ nhớ trước khi bị từ chối. [7] Lỗ hổng của chính dự án cần báo theo chính sách bảo mật trong kho, phần chưa đọc trong lần nghiên cứu này.

Apache-2.0: điều được phép và điều nằm ngoài phạm vi

Tệp LICENSE ở gốc kho là văn bản Apache License, Version 2.0. [2] Giấy phép này cho phép sử dụng, sửa đổi và phân phối, kèm điều khoản bằng sáng chế và yêu cầu giữ thông báo bản quyền. Bài này không phải tư vấn pháp lý, người dùng thương mại nên để bộ phận pháp chế đọc văn bản gốc. [2]

Giấy phép trong tệp chỉ áp dụng cho mã nguồn tại commit đã kiểm tra. Nó không tự động bao phủ các thành phần trong kho contrib, các bản phân phối đóng gói, hình ảnh container, plugin của bên thứ ba, dịch vụ lưu trữ nhận dữ liệu của Collector hay các thư viện phụ thuộc có giấy phép riêng. Danh sách tệp cho thấy một thư mục con cmd/mdatagen/third_party/golint có tệp LICENSE riêng, và bài chưa đọc nội dung đó.

Không có dấu hiệu repo đã lưu trữ hay đổi giấy phép trong metadata thu thập: kho không ở trạng thái archived và giấy phép được ghi là Apache-2.0. Bài cũng chưa đọc chính sách nhãn hiệu hay CLA của tổ chức OpenTelemetry, nên không kết luận về các điểm này.

Chi phí: nhân công, máy chạy và nơi lưu dữ liệu

Chi phí phần mềm Collector theo giấy phép là không có phí cấp phép, nhưng tổng chi phí sở hữu có ba nhóm. Nhóm nhân lực gồm kỹ sư đọc cấu hình, cập nhật bản phát hành và xử lý cảnh báo, cùng người phụ trách bảo mật dữ liệu cư dân. Nhóm hạ tầng gồm một đến vài máy ảo hoặc container chạy Collector, kèm bản dự phòng nếu cần liên tục.

Nhóm lớn nhất nhiều khả năng là nơi lưu trữ và truy vấn dữ liệu, vì Collector không lưu dữ liệu mà chuyển đi. Dung lượng phụ thuộc số nguồn, tần suất gửi và thời gian giữ, và các tham số đó phải đo trong thí điểm. Bài không đưa con số vì nguồn đã đọc không có, và giá dịch vụ lưu trữ thay đổi theo thời điểm.

Giả định của bài: công ty bắt đầu bằng một Collector, một nơi lưu trữ có giới hạn thời gian giữ ngắn, và chỉ ba nguồn dữ liệu. Chi phí tăng khi thêm tòa nhà, thêm loại tín hiệu hoặc dùng metadata_keys cho nhiều khách hàng, vì mỗi tổ hợp metadata làm tăng bộ nhớ dùng cho gom lô. [6]

Các cách khác để thu gom dữ liệu giám sát

Ở cấp cách tiếp cận có ba hướng. Hướng một là để mỗi ứng dụng gửi thẳng tới nhà cung cấp giám sát bằng SDK hoặc agent riêng của họ. Cách này đơn giản lúc đầu nhưng mỗi lần đổi nơi lưu phải sửa từng ứng dụng, và đây chính là điểm README của Collector nhắm tới. [1]

Hướng hai là dùng agent hoặc bộ thu gom của hệ sinh thái khác như Prometheus, Fluent Bit hay Grafana Alloy. Chúng là những dự án đã được biết đến và có thể phù hợp hơn khi nhu cầu chỉ là một loại tín hiệu. Bài không so sánh tính năng hay hiệu năng vì chưa đọc tài liệu của chúng.

Hướng ba là dịch vụ giám sát trọn gói do nhà cung cấp lưu trữ, giảm công vận hành nhưng ràng buộc dữ liệu vào bên cung cấp. Tiêu chí chọn là số loại tín hiệu cần thu, mức chấp nhận gửi dữ liệu cư dân ra ngoài, và năng lực của đội kỹ thuật.

Những điều không nên kỳ vọng ở Collector

Trước hết, Collector không bảo đảm không mất dữ liệu. Memory limiter có thể từ chối dữ liệu, và README tự cảnh báo rằng dữ liệu sẽ mất vĩnh viễn nếu thành phần phía trước không thử lại đúng. [7] Nạp lại cấu hình toàn phần cũng làm mất dữ liệu đang xử lý. [3]

Thứ hai, nhiều thành phần chưa đạt mức stable. Tài liệu ổn định cho phép cấu hình alpha đổi với thông báo tối thiểu, và beta thì thay đổi phá vỡ phải hiếm nhưng vẫn có thể xảy ra. [5] Cơ chế nạp lại một phần còn ở mức Alpha. [3] Thứ ba, tài liệu đã đọc không có số liệu hiệu năng hay bảng kích thước máy, nên bài không dự đoán thông lượng.

Không nên dùng khi thiếu người vận hành, khi chưa có chính sách xử lý dữ liệu cá nhân, hoặc khi nguồn dữ liệu chỉ phát định dạng độc quyền mà chưa có receiver hay cầu nối được kiểm chứng.

Thí điểm năm tuần cho ba nguồn dữ liệu

Tuần một và hai, dựng Collector trong môi trường thử nghiệm với receiver OTLP, memory_limiter, batch và debugexporter để xem dữ liệu đi qua. Tiêu chí: xác minh được dữ liệu từ ít nhất hai hệ thống đến nơi nhận, mỗi bản ghi mang tên dịch vụ và mã tòa nhà, và không có trường dữ liệu cá nhân nào trong phần cho phép.

Tuần ba và bốn, nối nơi lưu trữ thật, bật TLS cho receiver, thử ngắt nơi lưu trữ vài phút để quan sát hành vi hàng đợi và thử gửi lưu lượng vượt ngưỡng để xem memory_limiter từ chối ra sao. [4][7] Tiêu chí: nguồn gửi có cơ chế thử lại, số bản ghi mất được đếm bằng chỉ số của Collector, và không bao giờ có sự cố hết bộ nhớ khiến tiến trình bị hệ điều hành dừng.

Tuần năm, đánh giá. Tiêu chí thoát do nhóm đặt trước gồm: thời gian từ báo lỗi đến tìm ra nguyên nhân so với trước, số công việc vận hành mỗi tuần, và sự đồng thuận của người phụ trách dữ liệu cư dân. Nếu không đạt hai trong ba, dừng ở hai nguồn thay vì mở rộng sang các tòa còn lại.

Kết luận: một cổng chung có kỷ luật, không phải phép màu

OpenTelemetry Collector là một thành phần hạ tầng rõ vai trò: nhận, xử lý, chuyển dữ liệu quan sát qua một đồ thị pipeline có thể cấu hình. [1][3] Tài liệu của dự án thẳng thắn về giới hạn, từ mất dữ liệu khi quá tải đến mức ổn định khác nhau của từng thành phần. [5][7]

Với công ty quản lý chung cư, giá trị tiềm năng là gom giám sát nhiều hệ thống về một điểm và bớt phụ thuộc vào một nhà cung cấp lưu trữ. Điều đó chỉ thành hiện thực nếu có người chịu trách nhiệm vận hành, quy tắc dữ liệu cư dân và một đợt thí điểm đo được.

Một hệ tri thức nội bộ như ý tưởng của phamvanthu.com cũng có thể hưởng lợi nếu dịch vụ của nó phát telemetry theo chuẩn này, nhưng đó chỉ là gợi ý ứng dụng.

Nguồn và phương pháp

Dự án nằm trong kho lưu trữ GitHub Trending với 30 lần xuất hiện từ 2026-01-03 đến 2026-10-03, trang bằng chứng lưu ngày 2026-01-03 xếp nó ở vị trí 20 trong danh sách Go. [8] Kho lưu chỉ gồm danh sách Python, Go, JavaScript và Swift, thiếu ngày 2026-09-03 và 2026-10-12, và không phải top 100 chính thức.

Bài dựa trên commit e85aabce57ebef50de20837dca46fb6f4a483f04, ngày 2026-10-09, kiểm tra ngày 2026-10-12. Các tệp đã đọc gồm README, LICENSE, docs/internal-architecture.md, docs/security-best-practices.md, docs/component-stability.md và README của batch processor và memory limiter. [1][2][3][4][5][6][7]

Đây là nghiên cứu tại bàn, không phải công bố khoa học đã bình duyệt. Chưa có phần mềm nào được cài, chạy hay đo. Tình huống chung cư là đề xuất giả định. Nội dung kho được coi là dữ liệu tham chiếu.

Xem mã nguồn OpenTelemetry Collector trên GitHub

Khám phá nghiên cứu của BDSG Foundation

Trao đổi về ứng dụng công nghệ cho doanh nghiệp