2016-05-12 14 views
8

अभी हमारे ASF क्लस्टर चल रहा है:Azure सेवा फैब्रिक अभिनेता - अनचाहे अपवाद?

  • वेब एपीआई परियोजना - राज्यविहीन और जनता का सामना करना पड़
  • अभिनेता परियोजना - ज्यादातर अस्थिर, स्मृति में डेटा, कुछ विशेष API

हम द्वारा प्रयोग किया जाता रखने एप्लिकेशन अंतर्दृष्टि का प्रयास कर रहा है, और मैं अपने वेब एपीआई प्रोजेक्ट के लिए अपने दस्तावेज़ here जैसे अनचाहे त्रुटि ट्रैकिंग सेट कर सकता हूं।

समस्या यह है कि, मैं इसे अपने अभिनेता परियोजना के लिए भी चाहता हूं।

क्या एक अभिनेता के भीतर अनचाहे त्रुटियों को पकड़ने के लिए कोई वैश्विक जगह है? मुझे पता है कि यह नया है, और शायद यही कारण है कि मुझे इस पर दस्तावेज़ीकरण नहीं मिल रहा है।

अभी मैं हर अभिनेता विधि के अंदर यह कर रही है, लेकिन एक महान समाधान की तरह प्रतीत नहीं होता:

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

उत्तर

3

आप कुछ ही विकल्प हैं:

  • अभिनेता की क्या ज़रूरत है एक अंतर्निहित ETW प्रदाता (Microsoft-ServiceFabric-Actors) एक ActorMethodThrewException घटना है। आप या तो:

    • आवेदन इनसाइट्स ETW घटनाओं को इकट्ठा करने और उन्हें अग्रेषित करने के लिए एक बाहरी प्रक्रिया का उपयोग करें (उदाहरण के लिए स्लैब या Azure निदान का उपयोग करके)
    • उपयोग EventListener कक्षा में-प्रक्रिया की घटनाओं को सुनने के लिए और इसे अग्रेषित करने के लिए अनुप्रयोग इनसाइट्स (थोड़ा कम विश्वसनीय है, लेकिन सरल) को
  • एक कस्टम ActorServiceRemotingDispatcher, जो कलाकारों के लिए संचालन भेजने के लिए वर्ग जिम्मेदार है का उपयोग करें

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

    इस कक्षा का उपयोग करने के लिए, आपको एक कस्टम ActorService कक्षा बनाने और CreateServiceReplicaListeners विधि को ओवरराइड करने की आवश्यकता होगी। ध्यान दें कि यह आपके द्वारा उपयोग किए जा रहे किसी भी ActorRemotingProviderAttribute एस को ओवरराइड कर देगा।

    साइड नोट्स:

    • तुम भी इस विधि का उपयोग कर सकते हैं अपने खुद के हेडर को पढ़ने के लिए (आप भी एक क्लाइंट-साइड की आवश्यकता होगी कस्टम IServiceRemotingClientFactory उन्हें जोड़ने के लिए)
    • उसी तकनीक को लागू किया जा सकता विश्वसनीय सेवा (ServiceRemotingDispatcher वर्ग का उपयोग कर)
+0

मुझे लगता है कि 'ActorServiceRemotingDispatcher' मेरे लिए सबसे अच्छा विकल्प की तरह दिखता है, मैं इसे एक शॉट दे देंगे। – jonathanpeppers

1

नहीं, वहाँ कोई वैश्विक जगह अभिनेता में एक अभिनेता से फेंका अपवाद प्राप्त करने के लिए है ढांचा आज फ्रेमवर्क स्वयं को अपवाद पकड़ता है जिसे अभिनेता रनटाइम द्वारा प्रबंधित किए जाने वाले तरीकों से फेंक दिया जाता है - ये आपके अभिनेता इंटरफ़ेस विधियां हैं (वे लोग जो अभिनेताप्रॉक्सी से कॉल करने योग्य हैं), टाइमर कॉलबैक, रिमाइंडर कॉलबैक, और बेस एक्टर ओवरराइड जैसे ऑनएक्टिवेटएसिंक - लेकिन वे अभिनेता एपीआई के माध्यम से खुलासा नहीं किया गया है।

संबंधित मुद्दे