Trong các ứng dụng nguyên khối lớn, việc theo dõi và giám sát lỗi thường trở nên không hiệu quả do thiếu quyền sở hữu rõ ràng. Hướng dẫn này giải quyết vấn đề bằng cách đề xuất một cách tiếp cận có cấu trúc để phân công trách nhiệm giải trình thông qua chú thích tên miền.
Việc thiết lập giám sát hiệu quả cho khối lớn với nhiều nhóm có thể là một thách thức. Nếu không có quyền sở hữu rõ ràng, việc theo dõi lỗi sẽ trở nên chung chung và thường bị bỏ qua. Một giải pháp là yêu cầu các kỹ sư trực trực xác định nhóm nào sẽ phản hồi khi có cảnh báo giám sát. Tuy nhiên, cách tiếp cận hiệu quả hơn là đưa thông tin tên miền và nhóm vào mỗi nhật ký và khoảng Datadog.
Để theo dõi nhóm nào chịu trách nhiệm về các phần khác nhau trong ứng dụng của chúng tôi, chúng tôi sử dụng một hệ thống có tên là Chú thích tên miền. Chú thích tên miền gắn nhãn cho mọi phần mã ứng dụng của bạn, cho biết rõ ai chịu trách nhiệm về việc gì. Điều này cung cấp tổ chức rõ ràng và trách nhiệm giải trình trong việc quản lý trách nhiệm.
Chú thích tên miền cung cấp một phương pháp rõ ràng và có tổ chức để theo dõi trách nhiệm của nhóm trong một ứng dụng nguyên khối. Bằng cách gắn thẻ các phần mã của bạn bằng chú thích tên miền, bạn có thể:
Để đảm bảo giám sát và truy xuất nguồn gốc hiệu quả, mỗi yêu cầu web đều được gắn thẻ thông tin miền thích hợp. Điều này đạt được thông qua sự cộng tác của một số thành phần: DomainProvider
, DomainSpanService
, DomainMdcProvider
và DomainHandlerInterceptor
.
Dưới đây là thông tin tổng quan cấp cao về quy trình được mô tả trong sơ đồ sau:
Việc triển khai chi tiết các thành phần này sẽ được gói gọn trong thư viện dùng chung, cung cấp giải pháp có thể tái sử dụng để gắn thẻ và giám sát các yêu cầu web trong các ứng dụng nguyên khối lớn.
Việc xác định quyền sở hữu ở cấp lớp rất đơn giản bằng chú thích tên miền. Bằng cách áp dụng các chú thích cấp cao nhất cho các lớp chính, quyền sở hữu sẽ được truyền xuống tất cả các tài nguyên chi tiết trong các lớp đó. Mỗi nhóm có thể gắn nhãn các lớp mà họ sở hữu bằng các chú thích tên miền thích hợp, đảm bảo tính rõ ràng và trách nhiệm giải trình mà không cần phải đánh dấu từng phương pháp riêng lẻ.
Trong trường hợp nhiều nhóm sở hữu mã trong một lớp và việc tái cấu trúc ngay lập tức là không phù hợp, bạn có thể đánh dấu các phương thức riêng lẻ bằng các chú thích tên miền khác nhau, được ưu tiên hơn các chú thích cấp lớp. Điều này cho phép chỉ định các phương pháp cụ thể cho các nhóm khác nhau, mang lại sự linh hoạt mà không làm phức tạp cấu trúc tổng thể.
Mặc dù chú thích tên miền cực kỳ hữu ích nhưng hiếm có trường hợp nào chúng không thể sử dụng được. Ví dụ: chúng tôi đã gặp phải sự cố với tính năng tạo việc làm của Quartz, tính năng này không hoạt động liền mạch với chú thích tên miền do xung đột giữa logic AOP của Quartz và logic AOP được sử dụng cho chú thích tên miền.
Đối với các công việc và quy trình không thể chú thích trực tiếp, chúng tôi đã sử dụng DomainTagsService trực tiếp trong quá trình triển khai công việc. Cách tiếp cận này cho phép chúng tôi thêm các thẻ miền theo cách thủ công trong logic thực thi của công việc.
Dưới đây là ví dụ về cách chúng tôi tích hợp DomainTagsService vào công việc Quartz:
final override fun execute(context: JobExecutionContext) { domainTagsService.invoke(domain) { withLoggedExecutionDetails(context, ::doExecute) } }
Mặc dù việc có các dịch vụ riêng biệt cho mỗi nhóm mang lại những lợi thế đáng kể trong việc giám sát và quyền sở hữu, nhưng điều này đi kèm với chi phí và nỗ lực cao để phân chia khối nguyên khối, cùng với các chi phí phát triển bổ sung tiềm ẩn. Xem xét khả năng cải thiện thời gian xây dựng với Gradle khi khối nguyên khối được chia thành các mô-đun, việc duy trì monorepo có thể là giải pháp hiệu quả nhất trong nhiều trường hợp.
Để đơn giản hóa việc giám sát hoạt động của từng nhóm trong Datadog, bạn có thể chỉ định tên dịch vụ nhân tạo cho các nhóm khác nhau. Cách tiếp cận này đảm bảo rằng mỗi nhóm đều có phần dành riêng trong các công cụ giám sát của Datadog. Mặc dù việc sử dụng tên dịch vụ nhân tạo có thể gây nhầm lẫn nếu bạn có nhiều dịch vụ cần quản lý nhưng việc này sẽ dễ quản lý hơn với một số dịch vụ phụ trợ hạn chế. Việc thêm tiền tố vào các tên dịch vụ nhân tạo này giúp duy trì tính tổ chức và rõ ràng trong quá trình thiết lập Datadog của bạn, giúp bạn dễ dàng phân biệt giữa các nhóm khác nhau và trách nhiệm của họ.
sử dụng sơ đồ thay vì ảnh chụp màn hình ?? có công nhân/ứng dụng web không có ý nghĩa gì ở đây
Việc sử dụng tên dịch vụ giả tạo cho nhật ký có thể gây nhầm lẫn vì cùng một mục nhật ký có thể xuất hiện trong các dịch vụ khác nhau.
Ví dụ: hãy xem xét hai điểm cuối sử dụng cùng một dịch vụ xác thực. Nếu các điểm cuối này được chú thích bằng các miền khác nhau, logic xác thực sẽ tạo ra nhật ký trong các dịch vụ nhân tạo khác nhau. Điều này có thể gây nhầm lẫn khi người ta khám phá nhật ký vì chúng xuất hiện dưới nhiều tên dịch vụ. Để tránh vấn đề này, tốt hơn hết bạn chỉ nên áp dụng tên dịch vụ giả cho các khoảng được tổng hợp với nhau theo dấu vết để ít nhầm lẫn hơn
Liệu no co y nghia gi? Tôi không nghĩ đó là
Đây là một đại diện trực quan của vấn đề này:
Việc sử dụng các dịch vụ nhân tạo cho phép bạn không chỉ làm việc với dấu vết APM mà còn lọc theo dịch vụ trong Datadog Metrics, được lưu trữ trong thời gian dài, cho phép theo dõi các thay đổi trong thời gian dài.
Dưới đây là ảnh chụp màn hình của một màn hình trong Datadog sử dụng tên dịch vụ nhân tạo konsus-assets
trong truy vấn:
Dưới đây là ảnh chụp màn hình trang tổng quan trong Datadog sử dụng tên dịch vụ nhân tạo konsus-assets
trong bộ lọc:
Bằng cách sử dụng các dịch vụ giả mạo trong chiến lược giám sát của mình, bạn có thể nâng cao khả năng hiển thị và trách nhiệm giải trình về hoạt động của từng nhóm trong một ứng dụng nguyên khối. Cách tiếp cận này đơn giản hóa quá trình tạo và duy trì các màn hình và bảng thông tin dành riêng cho nhóm, dẫn đến việc giám sát có tổ chức và hiệu quả hơn trong Datadog.
Chú thích tên miền cung cấp một cách tiếp cận đơn giản để đơn giản hóa việc giám sát các ứng dụng nguyên khối trong Datadog. Bằng cách triển khai chiến lược này, bạn có thể nâng cao khả năng quản lý nhật ký, nhịp và số liệu, chuyển thiết lập giám sát của mình thành một công cụ được điều chỉnh cho các nhóm cụ thể. Điều này cải thiện trách nhiệm giải trình và tổ chức, đồng thời tạo điều kiện khắc phục sự cố và phân tích hiệu suất hiệu quả và hiệu quả hơn trên ứng dụng của bạn.
DomainTagsService
trực tiếp trong quá trình triển khai công việc sẽ đảm bảo rằng vẫn có thể duy trì giám sát theo miền cụ thể.Xác định miền và nhóm
Điều đó sẽ thay đổi với lib!!!
Tạo các enum đại diện cho các miền và nhóm khác nhau trong ứng dụng của bạn:
@Domain
là một chú thích có thể được áp dụng cho các lớp hoặc hàm, đánh dấu chúng bằng một giá trị miền cụ thể.DomainValue
là một enum đại diện cho các miền khác nhau, mỗi miền được liên kết với một nhóm.Team
là một enum đại diện cho các nhóm khác nhau làm việc trên ứng dụng. @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class Domain(val value: DomainValue) enum class DomainValue(val team: Team) { USER_MANAGEMENT(Team.TEAM_A), PAYMENT_PROCESSING(Team.TEAM_B), NOTIFICATIONS(Team.TEAM_C) } enum class Team { TEAM_A, TEAM_B, TEAM_C }
Chú thích các lớp (và phương thức nếu cần)
@Domain(DomainValue.USER_MANAGEMENT) class UserService { @Domain(DomainValue.PAYMENT_PROCESSING) fun processPayment() { ... } }
Xử lý các trường hợp không được hỗ trợ
Đối với các trường hợp không thể chú thích trực tiếp, hãy sử dụng trực tiếp DomainTagsService
để bao bọc logic
fun executeNotSupportedByAnnotationsLogic() { domainTagsService.invoke(domain) { executeLogic() } }
Giám sát bằng Datadog
Sử dụng bộ lọc dịch vụ nhân tạo cho màn hình, bảng thông tin và lọc dấu vết APM
Bằng cách làm theo các bước này, bạn có thể triển khai hiệu quả chú thích tên miền trong ứng dụng nguyên khối của mình, đảm bảo cải thiện khả năng giám sát, trách nhiệm giải trình và hiệu quả tổng thể.