2016-05-12 18 views
8

Ngay bây giờ cụm ASF chúng tôi đang chạy:Diễn viên vải dịch vụ Azure - ngoại lệ chưa được xử lý?

  • dự án API Web - stateless và công chúng phải đối mặt với
  • dự án diễn viên - hầu hết là không ổn định, giữ dữ liệu trong bộ nhớ, được sử dụng bởi các API nhất định

Chúng tôi đang dùng Thông tin chi tiết về ứng dụng và tôi có thể thiết lập theo dõi lỗi không theo dõi như tài liệu của họ here có cho dự án API Web của chúng tôi.

Vấn đề là, tôi cũng muốn điều này cho dự án Diễn viên của chúng tôi.

Có một địa điểm toàn cầu để bắt các lỗi không được giải quyết trong một diễn viên không? Tôi biết nó mới, và có lẽ đó là lý do tại sao tôi không thể tìm thấy tài liệu về điều này.

Ngay bây giờ tôi đang làm điều này trong mọi phương pháp diễn viên, nhưng dường như không giống như một giải pháp tuyệt vời:

public async Task DoStuff() 
{ 
    try 
    { 
     //Do all my stuff 
    } 
    catch (Exception exc) 
    { 
     //Send to Windows Event Source 
     ActorEventSource.Current.ActorMessage(this, "Unhandled error in {0}: {1}", nameof(DoStuff), exc); 

     //Send to Application Insights 
     new TelemetryClient().TrackException(exc); 

     throw exc; 
    } 
} 

Trả lời

3

Bạn có một vài lựa chọn:

  • diễn viên không có một built-in cung cấp ETW (Microsoft-ServiceFabric-Actors) có một sự kiện ActorMethodThrewException. Bạn có thể:

    • Sử dụng một quá trình bên ngoài để thu thập ETW sự kiện và chuyển cho ứng dụng Insights (ví dụ sử dụng tấm hoặc Azure Diagnostics)
    • Sử dụng lớp EventListener để lắng nghe những sự kiện trong quá trình và chuyển tiếp nó App Insights (hơi ít đáng tin cậy, nhưng đơn giản hơn)
  • Sử dụng một tùy chỉnh ActorServiceRemotingDispatcher, đó là lớp chịu trách nhiệm trong việc tiêu diệt các hoạt động để các diễn viên

    class CustomActorServiceRemotingDispatcher : ActorServiceRemotingDispatcher 
    { 
        public CustomActorServiceRemotingDispatcher(ActorService actorService) : base(actorService) 
        { 
        } 
    
        public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders, 
         byte[] requestBodyBytes) 
        { 
          try 
          { 
           LogServiceMethodStart(...); 
    
           result = await base.RequestResponseAsync(requestContext, messageHeaders, requestBodyBytes).ConfigureAwait(false); 
    
           LogServiceMethodStop(...); 
    
           return result; 
          } 
          catch (Exception exception) 
          { 
           LogServiceMethodException(...); 
    
           throw; 
          } 
        } 
    } 
    

    Để sử dụng lớp học này, bạn sẽ cần phải tạo lớp tùy chỉnh ActorService và ghi đè phương thức CreateServiceReplicaListeners. Lưu ý rằng điều này sẽ ghi đè bất kỳ số ActorRemotingProviderAttribute nào bạn có thể đang sử dụng.

    ghi chú Side:

    • Bạn cũng có thể sử dụng phương pháp này để đọc tiêu đề của riêng bạn (bạn cũng sẽ cần một client-side tùy chỉnh IServiceRemotingClientFactory để thêm chúng)
    • Kỹ thuật tương tự có thể được áp dụng cho Dịch vụ đáng tin cậy (bằng cách sử dụng lớp ServiceRemotingDispatcher)
+0

tôi nghĩ 'ActorServiceRemotingDispatcher' trông giống như lựa chọn tốt nhất đối với tôi, tôi sẽ cho nó một shot. – jonathanpeppers

1

Không, không có nơi nào trên toàn cầu để có được ngoại lệ ném từ một diễn viên trong các diễn viên khuôn khổ ngày hôm nay. Bản thân khung công tác bắt ngoại lệ được ném từ các phương thức được quản lý bởi thời gian chạy tác nhân - đây là các phương thức giao diện diễn viên của bạn (các đối tượng có thể gọi từ ActorProxy), gọi lại theo thời gian, lời nhắc nhở và ghi đè tác nhân cơ sở như OnActivateAsync - nhưng chúng không được hiển thị thông qua API diễn viên.

Các vấn đề liên quan