6 điểm bởi 0546530408 2023-08-17 | 1 bình luận | Chia sẻ qua WhatsApp

Xin chào. Chúng tôi là Eden và Ari, đồng sáng lập của Odigos (https://github.com/keyval-dev/odigos). Odigos là một dự án mã nguồn mở giúp tạo distributed trace cho ứng dụng ngay lập tức để người dùng có thể dễ dàng tận dụng. Odigos tương thích với các công cụ giám sát hiện có và cũng không yêu cầu thay đổi mã nguồn.

Trải nghiệm của chúng tôi với các công cụ giám sát trước đây thực sự rất đáng tiếc. Trong quá trình giám sát một hệ thống phân tán gồm nhiều microservice, chúng tôi nhận ra rằng mình đang tốn quá nhiều thời gian để xác định microservice nào là gốc rễ của sự cố. Ví dụ, đã có lần chúng tôi nghi ngờ một ứng dụng cụ thể gây ra độ trễ và dành hàng giờ để debug, rồi cuối cùng mới phát hiện nguyên nhân thực sự lại nằm ở một ứng dụng liên quan khác.

Sau đó, chúng tôi đã nghiên cứu distributed tracing như một cách phù hợp để giải quyết vấn đề này. Khác với metric hoặc log chỉ ghi lại dữ liệu tại một thời điểm của một ứng dụng đơn lẻ, distributed tracing gắn thẻ từng request bằng một ID duy nhất để có thể theo dõi request được lan truyền trong môi trường phân tán. Nhờ vậy, nhà phát triển có thể hiểu được context của từng request cũng như cách các ứng dụng phân tán hoạt động.

Tuy nhiên, nhược điểm của cách này là rất khó triển khai. Không giống metric hay log cho một ứng dụng đơn lẻ, distributed tracing phải được triển khai trên nhiều ứng dụng mới có thể đạt được hiệu quả. Chỉ cần có dù chỉ một ứng dụng không tạo distributed trace thì việc truyền context sẽ bị gián đoạn và giá trị của trace đó sẽ giảm đi đáng kể.

Theo kinh nghiệm tự tay triển khai distributed tracing cho nhiều công ty, việc điều phối tất cả các nhóm phát triển để instrument từng ứng dụng nhằm đạt được distributed tracing hoàn chỉnh là điều vô cùng khó khăn. Khi triển khai hoàn tất, giá trị mang lại rất lớn vì có thể giải quyết sự cố production nhanh hơn nhiều. Tuy nhiên, triển khai một phần thì không mang lại nhiều giá trị.

Chúng tôi bắt đầu tự động hóa quy trình này. Chúng tôi đã biết cách xử lý phần lớn quy trình, nhưng phần khó nhất là làm sao để tự động instrument các chương trình được viết bằng ngôn ngữ biên dịch như Go. Chúng tôi nghĩ rằng nếu tự động hóa được phần đó thì có thể tự động hóa toàn bộ quá trình tạo distributed trace. Trong quá trình nghiên cứu, chúng tôi nhận ra rằng với eBPF (một công nghệ cho phép Linux kernel nạp chương trình bên ngoài và thực thi chúng trong kernel), việc tự động instrument cho ngôn ngữ biên dịch là khả thi. Đó chính là mảnh ghép cuối cùng, và nhờ nó chúng tôi có thể phát triển Odigos.

Odigos trước tiên quét tất cả các ứng dụng đang chạy, sau đó dùng eBPF và OpenTelemetry để nhận diện ngôn ngữ lập trình của từng ứng dụng và tự động instrument tương ứng. Ngoài ra, hệ thống còn triển khai các collector để đệm dữ liệu, lọc dữ liệu và chuyển tiếp tới công cụ giám sát mà bạn chọn, đồng thời auto scale theo lưu lượng. Nhờ sự tự động hóa này, nhà phát triển có thể sử dụng distributed tracing chỉ trong vài phút, thay vì phải làm thủ công trong nhiều tháng.

Tự động instrument trên nhiều ngôn ngữ lập trình không phải là việc đơn giản, đặc biệt nếu xét đến các static binary (ví dụ: binary được tạo bởi trình biên dịch Go). Chúng tôi đã đưa vào nhiều cơ chế để có thể chèn các header liên quan một cách an toàn và ổn định, đồng thời phát triển một hệ thống theo dõi chức năng và struct của các thư viện mã nguồn mở qua nhiều phiên bản khác nhau. Chúng tôi cũng phát triển một hệ thống quản lý bộ nhớ userspace trong eBPF. Kết quả là Odigos đã trở thành giải pháp duy nhất có thể tự động tạo distributed trace cho các ngôn ngữ biên dịch như Go và Rust. Trong khi các giải pháp khác yêu cầu người dùng phải là chuyên gia về OpenTelemetry hoặc eBPF, giải pháp của chúng tôi không đòi hỏi kiến thức trước về công nghệ observability.

Giải pháp của chúng tôi có thể được cài đặt lên cụm Kubernetes chỉ với một lệnh duy nhất. Sau khi cài đặt, nó sẽ phát hiện ngôn ngữ lập trình của tất cả các ứng dụng đang chạy và áp dụng instrument phù hợp. Với các ngôn ngữ JIT (Java và .NET) hoặc ngôn ngữ thông dịch (JavaScript và Python), hệ thống triển khai OpenTelemetry instrument. Với các ngôn ngữ biên dịch (Go, Rust, C), hệ thống triển khai instrument dựa trên eBPF. Tất cả đều được trừu tượng hóa khỏi người dùng, nên người dùng chỉ cần (1) chọn một phần hoặc toàn bộ ứng dụng mục tiêu, và (2) chọn backend sẽ nhận dữ liệu giám sát.

Vào tháng 5 năm 2022, chúng tôi đã phát hành dự án mã nguồn mở đầu tiên: một công cụ tự động instrument cho ứng dụng Go dựa trên eBPF. Sau đó, chúng tôi đã đóng góp dự án này cho cộng đồng OpenTelemetry, và hiện nó đang được phát triển như một phần của Go Automatic Instrumentation SIG.

Chúng tôi tin tưởng mạnh mẽ vào các tiêu chuẩn mở, vì vậy toàn bộ instrument và collector được Odigos sử dụng đều dựa trên các dự án mã nguồn mở do cộng đồng OpenTelemetry phát triển. Nhờ đó, người dùng không bị phụ thuộc vào một vendor cụ thể nào.

Hiện tại, chúng tôi đang tập trung xây dựng dự án mã nguồn mở. Chưa có mức giá hay tính năng trả phí nào được công bố, nhưng trong tương lai chúng tôi cũng có kế hoạch cung cấp phiên bản managed của Odigos với các tính năng enterprise.

Bạn có thể xem thêm thông tin bên dưới.

Chúng tôi rất muốn lắng nghe và cùng chia sẻ về trải nghiệm của các bạn trong việc truy vết và giám sát ứng dụng phân tán!

1 bình luận

 
0546530408 2023-08-17

Xin chào, đây là lần đầu tiên tôi đăng bài ở đây. Chúng tôi muốn nhận phản hồi từ cộng đồng. Hãy thoải mái tham gia kênh Slack.
https://join.slack.com/t/odigos/…
Cảm ơn!