Sharepoint學習筆記—Debug&TroubleShooting–Developer Dashboard的使用(2.與SPMonitoredScope的結合)

來源:互聯網
上載者:User

    上一篇我們總結了開啟Developer Dashboard的方法,有了Developer Dashboard,我們可以擷取到許多資訊,這些資訊對我們Sharepoint管理員和開發人員很有協助,如:
            •哪些控制項被載入
            •載入每個控制項的時間
            •資料庫查詢以及執行時間
            •載入頁面所觸發的事件
            •載入頁面各個階段的時間

 一、何時使用 SPMonitoredScope
    開發人員可以在以下情形中使用 SPMonitoredScope : 
           • 確定資源過度使用方式。
           •確定效能瓶頸。
           •確定某些組件與其他組件的互動方式。

二、SPMonitoredScop使用的局限性
   應注意,在使用 SPMonitoredScope 時存在一些限制: 
         •僅捕獲對 SharePoint 資料庫的調用。
         •只有用 SPMonitoredScope 封裝且位於前端網頁伺服器上的代碼會出現在開發人員儀表板上。在應用程式伺服器上執行的代碼僅在運行該代碼的電腦上的 ULS 日誌中顯示 SPMonitoredScope 資訊。 
         •對SandSolution中的Code無效,你只能在Full trust的Solution中使用SPMonitorScope。

三、如何使用 SPMonitorScope
  1、通常的用法
    SPMonitoredScope 類駐留在 Microsoft.SharePoint.Utilities 命名空間中。
    SPMonitoredScope 使用起來很簡單。開發人員只需“封裝”要監視的程式碼片段即可。然後,在執行代碼時,系統會將測量的統計資訊寫入 ULS 日誌及Developer Dashboard中。這樣,開發人員和系統管理員便可立即使用有關組件以及組件所在頁面的資訊。當然,這種"封裝"是可以嵌套的。
   下面我們就建立了一個WebPart,在它的PageLoad事件中使用了SPMonitoredScope來嵌套了兩個方法FastMethod與SlowMethod(這兩個方法又各自使用了SPMonitoredScope),這裡所謂通常的用法就是:我們使用了SPMonitorScope類的第一種Constructor,此Constructor只傳入一個String類型的參數(即你給Scope取的名字),如:

using (new SPMonitoredScope(“My Scope Name”))
{
   doSomeWork(); 
}

 WebPart中的執行代碼如下:

       protected void Page_Load(object sender, EventArgs e)
        {

            using (SPMonitoredScope scope = new SPMonitoredScope("CallTwoMethods"))
            {
                SlowMethod();
                FastMethod();
            }
        }

        private void SlowMethod()
        {
            using (SPMonitoredScope scope =new SPMonitoredScope("SlowMethod"))
            {
                System.Threading.Thread.Sleep(1200);
            }
        }
        private void FastMethod()
        {
            using (SPMonitoredScope scope = new SPMonitoredScope("FastMethod"))
            {
                System.Threading.Thread.SpinWait(10);
            }
        }

 

 執行效果如

 

 2、其他使用方法(監視其他資源使用方式,使用效能閾值)
  此用法我們需要SPMonitoredScope類的第二種Constructor來實現,此Constructor有三個參數

SPMonitoredScope(String, UInt32, ISPScopedPerformanceMonitor[])
public SPMonitoredScope(
 string name,
 uint maximumExecutionTime,
 params ISPScopedPerformanceMonitor[] monitors
)

  第一個參數同上(我們為Scope取的名字)

  第二個參數是我們為監控的操作設定的最大效能閾值(毫秒級)

  第三個參數是一組實現了ISPScopedPerformanceMonitor介面的數組對象,下面這張表列舉了幾個實現了這個介面的類 

 

  當然有了這個介面,我們不但能使用上表中列舉的相關類來添加到SPMonitoredScope Constructor的第三個參數數組中,我們還可以建立若干個我們使用者自訂的Monitors(讓它繼承並實現這此介面),用它來監控我們感興趣的相關資源,並把這此Customer Monitor添加到當前的SPMonitoredScope中來。所以第三個參數在這個層面上,也可以是我們使用者自訂Monitor對象的列表。
下面這段代碼使用了我們上表列舉的類來構造我們的SPMonitoredScope對象

using(
 SPMonitoredScope("My Scope Name",1000,
 new SPRequestUsageCounter(3),
 new SPSqlQueryCounter()))
{
 Thread.Sleep(5000);
}

當我們的監控Code的執行時間超過了我們設定的閾值(1000)時,Developer Dashboard的邊框會變紅,並提高trace的Level。如 3

  

      有時候你需要做的不僅僅是把監控的Scope記錄到Developer Dashboard,你還想知道你所Monitor的Scope Code到底被執行了多少次。例如你的系統使用到了第三方公司提供的Web service服務,此服務按訪問的次數收費,你可以記錄你使用此Webservice的次數,一旦訪問次數超過了你設定的閥值,你就可以設定相關的傳回值(ValueIsExcessive)。在每一個Scope結束,SPMonitoredScope對象釋放(disposed)前,它會檢查所有的Monitors(即:第三個參數中的Monitor列表中的每個Monitor對象),看它們的ValueIsExcessive值,如果此值為true,則會log到ULS中去。
      這裡,就需要我們編寫使用者自訂的Monitor對象了,它繼承自介面ISPScopedPerformanceMonitor,其代碼如下:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint.Utilities;

namespace CopyListContent
{
    public class CustomerMonitor : ISPScopedPerformanceMonitor
    {
        static int s_times; //定義一個靜態變數來存放使用次數
        static CustomerMonitor()
        {
            s_times = 0;
        }
        public CustomerMonitor()
        {
            s_times++; //累積使用次數,每次調用此建構函式時就加一
        }
        public void Dispose() { }
       //出於thread-safe的原因,Description與RenderValueForWeb只能被Sharepoint managed monitors使用,它們不能被custom application代碼使用。
        public string Description
        {
            get { return "The Monitor"; }
        }

     //Name屬性在logging into到Trace Log的時候使用
        public string Name
        {
            get { return "TheMonitor"; }
        }
   
        public string RenderValueForWeb()
        {
            return string.Format("MONITOR: {0}", s_times);
        }
    //Value用於返回當前的s_times記錄值
        public object Value
        {
            get { return s_times; } //返回實際使用的次數
        }
   //ValueIsExcessive用於反映s_times 是否已經超過規定的限度
        public bool ValueIsExcessive
        {
            get { return s_times > 5; } //檢查是否超過設定的使用次數
        }
    }
}

   調用它的代碼如下:

using (SPMonitoredScope scope =
new SPMonitoredScope("Custom scope", 100, new CustomMonitor())) {
// ...
}

如果你運行上述方法,當你的使用者自訂Monitor監控到訪問次數超過5次時,它就會立即啟動log記錄,把日誌記錄寫入ULS logs中,你就可以到ULS中找到關於它的日誌記錄了。否則,它不會記錄到ULS日誌中,也即:你無需關心它,因為它沒有超過你設定的限度。
     這裡還需要注意的是,如果你在SharePoint Foundation > Monitoring category 項設定為Verbose,那麼即使你的使用者自訂Monitor監控到訪問次數"沒有"超過5次時,系統還是會啟動Log記錄,也就是說,系統會記錄所有的Monitor內的所有行為,不論此行為是否超出你設定的限度值。
     在 Developer Dashboard的configuration中,還包含一個屬性叫AutoLaunch. 如果你設定dashboard 模式為On Demand並且 Auto Launch為 true, 那麼Developer Dashboard會在任何關鍵性事件(在Shaerpoint中定義)被寫入ULS日誌時都會自動顯示出來。
    還有一個有意思的地方是在網上有人發現,SPMonitorScope按微軟的說法是不能用於sandboxed solutions的,但是根據MSDN的說明,ISPScopedPerformanceMonitor 介面卻可以在sandboxed solutions 中使用,這種情況不知道誰能給個說明。

四、最佳操作建議
 根據微軟的建議,我們應使用 SPMonitoredScope 來封裝對外部組件(如自訂資料庫、外部 Web 服務等)進行的所有調用。這使得管理員能夠輕鬆將這些組件識別為故障點,並快速找出問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.