paint-brush
Giám sát Monolith bằng Datadog: Cách tránh hiệu ứng người ngoài cuộctừ tác giả@feddena
415 lượt đọc
415 lượt đọc

Giám sát Monolith bằng Datadog: Cách tránh hiệu ứng người ngoài cuộc

từ tác giả Fedor Denisov7m2024/07/08
Read on Terminal Reader

dài quá đọc không nổi

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 các chú thích miền được giới thiệu trong thư viện bộ chia miền nguyên khối
featured image - Giám sát Monolith bằng Datadog: Cách tránh hiệu ứng người ngoài cuộc
Fedor Denisov HackerNoon profile picture
0-item

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.


Hiểu chú thích tên miền

Để 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.

Lợi ích của việc sử dụng chú thích tên miền

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ể:

  • Đơn giản hóa việc quản lý nhật ký và dấu vết : Lọc nhật ký và dấu vết dựa trên các tiêu chí cụ thể, chẳng hạn như trách nhiệm của nhóm, cho phép xác định và giải quyết vấn đề nhanh chóng.
  • Duy trì theo dõi chính xác : Thích ứng liền mạch với những thay đổi trong trách nhiệm của nhóm vì các chú thích được gắn với miền thay vì tên nhóm.
  • Nâng cao trách nhiệm giải trình : Xác định rõ ràng nhóm nào chịu trách nhiệm cho từng lĩnh vực, cải thiện tổ chức và giám sát có mục tiêu.
  • Cải thiện hiệu quả giám sát : Tạo điều kiện thực hành giám sát tốt hơn bằng cách cung cấp trách nhiệm giải trình chính xác và nâng cao hiệu quả tổng thể.

Xử lý chú thích tên miền

Để đả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 , DomainMdcProviderDomainHandlerInterceptor .

Dưới đây là thông tin tổng quan cấp cao về quy trình được mô tả trong sơ đồ sau:

Sơ đồ xử lý chú thích tên miền

Giải thích các thành phần chính

  • DomainProvider : Xác định miền được liên kết với các phương thức xử lý hoặc đậu cụ thể. Nó giúp tìm các chú thích tên miền trong các lệnh gọi AOP (Lập trình hướng theo khía cạnh) và MVC (Model-View-Controller).
  • DomainSpanService : Thêm thẻ miền vào các nhịp, là đơn vị công việc trong hệ thống theo dõi. Dịch vụ này đảm bảo rằng mỗi khoảng được gắn thẻ với thông tin tên miền thích hợp.
  • DomainMdcProvider : Quản lý thẻ miền trong MDC (Bối cảnh chẩn đoán được ánh xạ), một tính năng của khung ghi nhật ký cho phép gắn thẻ các mục nhật ký với thông tin theo ngữ cảnh.
  • DomainHandlerInterceptor : Chặn các yêu cầu web, đảm bảo rằng mỗi yêu cầu được gắn thẻ thông tin miền thích hợp để theo dõi và truy xuất nguồn gốc tốt hơn.

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.

Sắp xếp ai sở hữu mã nào

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ể.

Khắc phục các trường hợp không được hỗ trợ bởi chú thích

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) } }

Cải thiện khả năng giám sát và hiển thị bằng các dịch vụ nhân tạo

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.

Giới thiệu dịch vụ nhân tạo

Để đơ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

Các dịch vụ nhân tạo trong Datadog APM trên thực tế là một ứng dụng

Tại sao không sử dụng dịch vụ nhân tạo cho nhật ký?

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:

Lý do đằng sau việc không sử dụng dịch vụ nhân tạo cho nhật ký

Sử dụng dịch vụ nhân tạo trong giám sát và bảng điều khiển

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.

Ví dụ về màn hình

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:

Giám sát sử dụng dịch vụ nhân tạo 'tài sản konsus' trong truy vấn

Ví dụ về Trang tổng quan

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:

Trang tổng quan sử dụng dịch vụ giả mạo 'tài sản konsus' 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.


Kết thúc

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.

Bài học chính

  1. Nâng cao quyền sở hữu và trách nhiệm giải trình : Bằng cách chú thích các phần mã của bạn bằng chú thích tên miền, bạn có thể xác định rõ ràng nhóm nào chịu trách nhiệm cho từng tên miền. Điều này tạo điều kiện cho việc tổ chức tốt hơn và giám sát có mục tiêu.
  2. Quản lý nhật ký và dấu vết được cải thiện : Chú thích tên miền cho phép bạn lọc cả nhật ký và dấu vết dựa trên các tiêu chí cụ thể, chẳng hạn như trách nhiệm của nhóm, cho phép xác định và giải quyết vấn đề nhanh chóng.
  3. Tính linh hoạt với Dịch vụ nhân tạo : Sử dụng tên dịch vụ nhân tạo cho các nhịp (không phải nhật ký) đảm bảo rằng nhật ký vẫn rõ ràng và có thể truy nguyên nguồn gốc thực sự của chúng, tránh nhầm lẫn.
  4. Vượt qua các thách thức tích hợp : Đối với các trường hợp không thể áp dụng trực tiếp các chú thích, chẳng hạn như với một số khung thực thi công việc nhất định như Quartz, việc sử dụng các dịch vụ như 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ể.

Cách tiếp cận từng bước để sử dụng chú thích tên miền:

  1. 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 }
  2. 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() { ... } }
  3. 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() } }
  4. 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ể.


Cảm ơn đã đọc bài viết!