使用 Azure) 建置 Real-World Cloud Apps 的監視和遙測 (

作者 :Rick AndersonTom Dykstra

下載修正專案下載電子書

使用 Azure 電子書建置真實世界雲端應用程式是以 Scott Guthrie 開發的簡報為基礎。 其說明 13 種模式和做法,可協助您成功開發雲端的 Web 應用程式。 如需電子書的相關信息,請參閱 第一章

許多人依賴客戶,讓他們知道其應用程式何時關閉。 這不是任何位置的最佳作法,特別是在雲端中。 不保證快速通知,而且當您收到通知時,您通常會取得關於發生狀況的最小或誤導數據。 透過良好的遙測和記錄系統,您可以留意應用程式發生什麼情況,以及發生問題時,您立即發現錯誤,並有實用的疑難解答資訊可供使用。

購買或租用遙測解決方案

注意

本文是在 Application Insights 發行之前撰寫的。 Application Insights 是 Azure 上遙測解決方案的慣用方法。 如需詳細資訊 ,請參閱為 ASP.NET 網站設定 Application Insights

雲端環境的絕佳其中一件事,就是很容易購買或租用您的方式來購買或租用。 遙測是範例。 若不需投入許多心力,您就能啟動並執行良好的遙測系統,非常符合成本效益。 有許多絕佳的合作夥伴與 Azure 整合,其中有些合作夥伴有免費層,因此您可以取得基本遙測。 以下是目前在 Azure 上可用的幾個專案:

Microsoft System Center 也包含監視功能。

我們將快速逐步解說設定 New Relic,以顯示使用遙測系統有多容易。

在 Azure 管理入口網站中,註冊服務。 按兩下 [ 新增],然後按兩下 [ 存放區]。 [ 選擇附加元件 ] 對話框隨即出現。 向下捲動並按兩下 [新增 Relic]。

選擇附加元件

按兩下向右鍵,然後選擇您想要的服務層級。 在此示範中,我們將使用免費層。

個人化附加元件

按兩下向右鍵,確認「購買」,而New Relic現在會顯示為入口網站中的附加元件。

檢閱購買

管理入口網站中的 New Relic 附加元件

按兩下 [ 連線資訊],然後複製授權金鑰。

連線資訊

移至入口網站中 Web 應用程式的 [ 設定 ] 索引標籤,將 [效能監視 ] 設定為 [ 附加元件],然後將 [選擇附加 元件] 下拉式清單設定為 [新增 Relic]。 然後按一下 [儲存]。

[設定] 索引標籤中的 [新增 Relic]

在 Visual Studio 中,在您的應用程式中安裝 New Relic NuGet 套件。

[設定] 索引標籤中的開發人員分析

將應用程式部署至 Azure 並開始使用它。 建立一些修正 It 工作,以提供一些活動供 New Relic 監視。

然後回到入口網站的 [附加元件] 索引標籤中的 [新增 Relic] 頁面,然後按兩下 [管理]。 入口網站會將您傳送至 New Relic 管理入口網站,使用單一登錄進行驗證,因此您不需要再次輸入您的認證。 [概觀] 頁面會顯示各種效能統計數據。 (按兩下影像以查看完整大小的概觀頁面。)

新增 Relic 監視索引標籤

以下是您可以看到的一些統計數據:

  • 一天中不同時間的平均回應時間。

    回應時間

  • 每分鐘要求 (輸送量速率,) 一天的不同時間。

    輸送量

  • 處理不同 HTTP 要求的伺服器 CPU 時間。

    Web 交易時間

  • 在應用程式程式代碼的不同部分花費的 CPU 時間:

    追蹤詳細數據

  • 歷程記錄效能統計數據。

    歷程記錄效能

  • 呼叫外部服務,例如 Blob 服務,以及服務如何可靠且回應的統計數據。

    外部服務

    外部服務2

    外部服務

  • 關於全球何處或美國 Web 應用程式流量的來源資訊。

    [地理位置]

您也可以設定報表和事件。 例如,您可以隨時開始看到錯誤,傳送電子郵件向支援人員發出問題警示。

報告

New Relic 只是遙測系統的一個範例;您也可以從其他服務取得所有這些專案。 雲端的優點是,您不需要撰寫任何程序代碼,而且不需支付任何費用,您就會突然取得應用程式使用方式和客戶實際經歷的更多資訊。

用於深入解析的記錄

遙測套件是不錯的第一個步驟,但您仍然需要檢測自己的程序代碼。 遙測服務會在發生問題時告訴您,並告訴您客戶遇到什麼情況,但可能無法讓您深入瞭解程式代碼中發生什麼事。

您不想要從遠端進入生產伺服器,以查看您的應用程式正在執行什麼動作。 當您有一部伺服器,但當您調整為數百部伺服器,而且您不知道需要從遠端到哪一部伺服器時,這可能十分實用? 您的記錄應該提供足夠的資訊,讓您永遠不需要從遠端進入生產伺服器,才能分析和偵錯問題。 您應該記錄足夠的資訊,以便只透過記錄來隔離問題。

登入生產環境

許多人員只有在發生問題且想要偵錯時,才會在生產環境中開啟追蹤。 這可以在您知道問題的時間和取得其實用疑難解答資訊的時間之間,造成相當延遲。 而您取得的資訊可能不適用於間歇性錯誤。

我們建議在記憶體便宜的雲端環境中,建議您一律在生產環境中保持登入。 如此一來,當錯誤發生時,您已記錄錯誤,而且您有歷程記錄數據,可協助您分析隨時間開發或在不同時間定期發生的問題。 您可以將清除程式自動化以刪除舊記錄,但您可能會發現設定這類程式比保留記錄更昂貴。

相較於疑難解答時間和金錢,記錄的新增費用相當簡單,您可以藉由在發生問題時取得所需的所有信息來節省成本。 然後,當有人告訴您,他們有時會在過去 8:00 左右發生隨機錯誤,但不會記住錯誤時,您可以立即找出問題是什麼。

一個月少於 $4,您可以保留 50 GB 的記錄,而且記錄的效能影響很簡單,只要您記住一件事,若要避免效能瓶頸,請確定您的記錄連結庫是異步的。

區分通知與需要動作之記錄的記錄

記錄是為了通知 (我想要知道某個) 或 ACT (我想要執行) 。 請小心只撰寫 ACT 記錄,以瞭解真正需要人員或自動化程式採取動作的問題。 太多 ACT 記錄會產生雜訊,需要太多工作才能篩選所有專案,以找出真正的問題。 而且,如果您的 ACT 記錄會自動觸發某些動作,例如傳送電子郵件給支持人員,請避免由單一問題觸發數千個這類動作。

在 .NET System.Diagnostics 追蹤中,記錄可以指派錯誤、警告、資訊和偵錯/詳細資訊層級。 您可以保留 ACT 記錄的錯誤層級,並使用較低層級的 INFORM 記錄來區分 ACT 與 INFORM 記錄。

記錄層級

在運行時間設定記錄層級

雖然值得一律在生產環境中記錄,但另一個最佳做法是實作記錄架構,讓您在運行時間調整您要記錄的詳細數據層級,而不需重新部署或重新啟動應用程式。 例如,當您在 中使用 System.Diagnostics 追蹤設施時,可以建立錯誤、警告、資訊和偵錯/詳細信息記錄。 建議您一律在生產環境中記錄錯誤、警告和信息記錄,而且您想要以動態方式新增偵錯/詳細信息記錄,以逐案例進行疑難解答。

Web Apps Azure App 服務 內建支援將記錄寫入System.Diagnostics檔案系統、數據表記憶體或 Blob 記憶體。 您可以為每個記憶體目的地選取不同的記錄層級,而且您可以即時變更記錄層級,而不需重新啟動應用程式。 Blob 記憶體支援可讓您更輕鬆地在應用程式記錄上執行 HDInsight 分析作業,因為 HDInsight 知道如何直接使用 Blob 記憶體。

記錄例外狀況

不要只放置 例外狀況。記錄程序代碼中的 ToString () 。 這會離開內容資訊。 在 SQL 錯誤的情況下,它會離開 SQL 錯誤號碼。 針對所有例外狀況,包括內容資訊、例外狀況本身和內部例外狀況,以確保您提供疑難解答所需的所有專案。 例如,內容資訊可能包含伺服器名稱、交易標識碼和用戶名稱 (,但不包含密碼或任何秘密!) 。

如果您依賴每個開發人員以例外狀況記錄執行正確的動作,其中有些則不會。 為了確保每次都以正確的方式完成,請在記錄器介面中建置例外狀況處理:將例外狀況物件本身傳遞至記錄器類別,並在記錄器類別中正確記錄例外狀況數據。

記錄對服務的呼叫

強烈建議您每次應用程式呼叫服務時寫入記錄,無論是資料庫還是 REST API 或任何外部服務。 包含在您的記錄中,不僅表示成功或失敗,還包含每個要求花費的時間。 在雲端環境中,您通常會看到與慢速相關的問題,而不是完成中斷。 通常需要 10 毫秒的動作可能會突然開始花一秒的時間。 當有人告訴您您的應用程式速度很慢時,您想要查看 New Relic 或任何您擁有的遙測服務並驗證其體驗,然後您想要查看自己的記錄,以深入瞭解為何速度緩慢的詳細數據。

使用 ILogger 介面

當您建立生產應用程式時,建議您執行的動作是建立簡單的 ILogger 介面,並在其中貼上一些方法。 這可讓您稍後輕鬆變更記錄實作,而不需要完成所有程序代碼即可。 我們可以在整個修正 It 應用程式中使用 System.Diagnostics.Trace 類別,但我們會在實作 ILogger 的記錄類別中加以使用,而我們會在整個應用程式中進行 ILogger 方法呼叫。

如此一來,如果您想要讓記錄更豐富,您可以使用您想要的任何記錄機制來取代 System.Diagnostics.Trace 。 例如,隨著應用程式成長,您可能會決定要使用更完整的記錄套件,例如 NLogEnterprise Library 記錄應用程式區塊。 (Log4Net 是另一個熱門的記錄架構,但不會執行異步記錄。)

使用 NLog 這類架構的其中一個可能原因是,有助於將記錄輸出分割成個別的高容量和高價值數據存放區。 這可協助您有效率地儲存大量不需要執行快速查詢的 INFORM 數據,同時維護 ACT 資料的快速存取。

語意記錄

如需可產生更實用診斷資訊之記錄的相對新方式,請參閱 Enterprise Library Semantic Logging Application Block (SLAB) 。 SLAB 使用 適用於 Windows (ETW 的事件追蹤) 和 .NET 4.5 中的 EventSource 支援,讓您能夠建立更結構化且可查詢的記錄。 您可以針對您記錄的每個事件類型定義不同的方法,讓您自定義所寫入的資訊。 例如,若要記錄 SQL Database 錯誤,您可以呼叫 LogSQLDatabaseError 方法。 針對這種例外狀況,您知道資訊的主要部分是錯誤號碼,因此您可以在方法簽章中包含錯誤號碼參數,並將錯誤號碼記錄為您所寫入記錄中的個別欄位。 因為數位位於個別的欄位中,所以您可以更輕鬆地且可靠地根據 SQL 錯誤號碼取得報告,而如果您只是將錯誤號碼串連到訊息字串中,

在 [修正它] 應用程式中記錄

ILogger 介面

以下是修正 It 應用程式中的 ILogger 介面。

public interface ILogger
{
    void Information(string message);
    void Information(string fmt, params object[] vars);
    void Information(Exception exception, string fmt, params object[] vars);

    void Warning(string message);
    void Warning(string fmt, params object[] vars);
    void Warning(Exception exception, string fmt, params object[] vars);

    void Error(string message);
    void Error(string fmt, params object[] vars);
    void Error(Exception exception, string fmt, params object[] vars);

    void TraceApi(string componentName, string method, TimeSpan timespan);
    void TraceApi(string componentName, string method, TimeSpan timespan, string properties);
    void TraceApi(string componentName, string method, TimeSpan timespan, string fmt, params object[] vars);
}

這些方法可讓您以 System.Diagnostics 支援的相同四個層級來寫入記錄。 TraceApi 方法用於記錄外部服務呼叫,其中包含延遲的相關信息。 您也可以新增一組偵錯/詳細資訊層級的方法。

ILogger 介面的記錄器實作

介面的實作非常簡單。 它基本上只是呼叫標準 System.Diagnostics 方法。 下列代碼段顯示所有三個 Information 方法,以及其中一個。

public class Logger : ILogger
{
    public void Information(string message)
    {
        Trace.TraceInformation(message);
    }

    public void Information(string fmt, params object[] vars)
    {
        Trace.TraceInformation(fmt, vars);
    }

    public void Information(Exception exception, string fmt, params object[] vars)
    {
        var msg = String.Format(fmt, vars);
        Trace.TraceInformation(string.Format(fmt, vars) + ";Exception Details={0}", exception.ToString());
    }

    public void Warning(string message)
    {
        Trace.TraceWarning(message);
    }

    public void Error(string message)
    {
        Trace.TraceError(message);
    }

    public void TraceApi(string componentName, string method, TimeSpan timespan, string properties)
    {
        string message = String.Concat("component:", componentName, ";method:", method, ";timespan:", timespan.ToString(), ";properties:", properties);
        Trace.TraceInformation(message);
    }
}

呼叫 ILogger 方法

每次修正 It 應用程式中的程式代碼攔截例外狀況時,都會呼叫 ILogger 方法來記錄例外狀況詳細數據。 而且每次呼叫資料庫、Blob 服務或 REST API 時,它會在呼叫之前啟動停止監看式、在服務傳回時停止停止監看式,以及記錄經過的時間以及成功或失敗的相關信息。

請注意,記錄訊息包含類別名稱和方法名稱。 請務必確定記錄訊息可識別應用程式程式代碼撰寫的哪個部分。

public class FixItTaskRepository : IFixItTaskRepository
{
    private MyFixItContext db = new MyFixItContext();
    private ILogger log = null;

    public FixItTaskRepository(ILogger logger)
    {
        log = logger;
    }

    public async Task<FixItTask> FindTaskByIdAsync(int id)
    {
        FixItTask fixItTask = null;
        Stopwatch timespan = Stopwatch.StartNew();

        try
        {
            fixItTask = await db.FixItTasks.FindAsync(id);
            
            timespan.Stop();
            log.TraceApi("SQL Database", "FixItTaskRepository.FindTaskByIdAsync", timespan.Elapsed, "id={0}", id);
        }
        catch(Exception e)
        {
            log.Error(e, "Error in FixItTaskRepository.FindTaskByIdAsynx(id={0})", id);
        }

        return fixItTask;
    }

因此,每當修正 It 應用程式進行 SQL Database 呼叫時,您可以看到呼叫、呼叫方法,以及確切花費多少時間。

記錄中的 SQL Database 查詢

顯示 [編輯實體屬性] 的螢幕快照,以及每個屬性看起來應該像什麼,以成功更新所需的時間。

如果您瀏覽記錄,您可以看到資料庫呼叫所花費的時間是可變的。 這項資訊可能很有用:因為應用程式會記錄這一切,因此您可以分析資料庫服務在一段時間內執行方式的歷史趨勢。 例如,服務在大部分時間可能很快,但要求可能會失敗,或回應可能會在一天的特定時間變慢。

您可以對 Blob 服務執行相同的動作 – 每次應用程式上傳新檔案時,都有記錄,而且您可以看到上傳每個檔案所需的時間。

Blob 上傳記錄

每次呼叫服務時,只要撰寫幾行額外的程式代碼,每當有人說他們遇到問題時,您就知道問題是什麼、問題是否為錯誤,或即使只是執行緩慢也一樣。 您可以找出問題的來源,而不需要從遠端連線到伺服器,或在發生錯誤后開啟記錄,並希望重新建立問題。

修正應用程式中的相依性插入

您可能會想知道上述範例中的存放庫建構函式如何取得記錄器介面實作:

public class FixItTaskRepository : IFixItTaskRepository
{
    private MyFixItContext db = new MyFixItContext();
    private ILogger log = null;

    public FixItTaskRepository(ILogger logger)
    {
        log = logger;
    }

若要將介面連線至實作,應用程式會使用相 依性插入 (DI) 與 AutoFac。 DI 可讓您根據整個程式碼中許多位置的介面來使用 物件,而且只需要在具現化介面時使用的實作指定一個位置。 這可讓您更輕鬆地變更實作:例如,您可能想要將 System.Diagnostics 記錄器取代為 NLog 記錄器。 或者,針對自動化測試,您可能想要替代模擬版本的記錄器。

Fix It 應用程式會在所有存放庫和所有控制器中使用 DI。 控制器類別的建構函式會取得 ITaskRepository 介面,就像存放庫取得記錄器介面一樣:

public class DashboardController : Controller
{
    private IFixItTaskRepository fixItRepository = null;

    public DashboardController(IFixItTaskRepository repository)
    {
        fixItRepository = repository;
    }

應用程式會使用 AutoFac DI 連結庫來自動提供這些建構函式的 TaskRepositoryLogger 實例。

public class DependenciesConfig
{
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterType<Logger>().As<ILogger>().SingleInstance();

        builder.RegisterType<FixItTaskRepository>().As<IFixItTaskRepository>();
        builder.RegisterType<PhotoService>().As<IPhotoService>().SingleInstance();
        builder.RegisterType<FixItQueueManager>().As<IFixItQueueManager>();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

此程式代碼基本上表示建構函式在任何位置都需要 ILogger 介面、傳入 Logger 類別的實例,以及每當需要 IFixItTaskRepository 介面時,都會傳入 FixItTaskRepository 類別的 實例。

AutoFac 是您可以使用的許多相依性插入架構之一。 另一個熱門的 Unity 是 Microsoft 模式和實務所建議和支援的 Unity。

Azure 中的內建記錄支援

Azure 支援 Azure App 服務 中 Web Apps 的下列記錄類型:

  • System.Diagnostics 追蹤 (您可以開啟和關閉並即時設定層級,而不需重新啟動月臺) 。
  • Windows 事件。
  • IIS 記錄 (HTTP/FREB) 。

Azure 支援下列類型的記錄 雲端服務

  • System.Diagnostics 追蹤。
  • 效能計數器。
  • Windows 事件。
  • IIS 記錄 (HTTP/FREB) 。
  • 自訂目錄監視。

修正應用程式使用 System.Diagnostics 追蹤。 您只需要在 Web 應用程式中啟用 System.Diagnostics 記錄,都會在入口網站中翻轉切換,或呼叫 REST API。 在入口網站中,按兩下月臺的 [ 組態 ] 索引標籤,然後向下捲動以查看 [應用程式診斷] 區 段。 您可以開啟或關閉記錄,然後選取您想要的記錄層級。 您可以將記錄寫入檔案系統或記憶體帳戶。

[設定] 索引標籤中的應用程式診斷和月臺診斷

在 Azure 中啟用記錄之後,您可以在建立記錄時,在 Visual Studio [輸出] 視窗中看到記錄。

串流記錄功能表

串流記錄功能表2

您也可以將記錄寫入記憶體帳戶,並使用任何可存取 Azure 記憶體數據表服務的工具加以檢視,例如 Visual Studio 中的伺服器總管或 Azure 儲存體總管

伺服器總管中的記錄

摘要

實作現成的遙測系統、檢測您自己的程式代碼記錄,以及在 Azure 中設定記錄,其實很簡單。 當您遇到生產問題時,遙測系統和自定義記錄的組合將可協助您在客戶成為主要問題之前快速解決問題。

在下 一章 中,我們將探討如何處理暫時性錯誤,使其不會成為您必須調查的生產問題。

資源

如需詳細資訊,請參閱下列資源。

主要關於遙測的檔:

主要關於記錄的檔案:

主要關於疑難解答的檔:

影片:

  • FailSafe:建置可調整、復原 雲端服務。 Ulrich Homann、Marc Mercuri 和 Mark Simms 的九部分系列。 以非常無障礙且有趣的方式呈現高階概念和架構原則,其中包含來自 Microsoft Customer Advisory Team (CAT) 實際客戶經驗的故事。 第 4 和 9 集是關於監視和遙測。 第 9 集包含監視服務 MetricsHub、AppDynamics、New Relic 和 PagerDuty 的概觀。
  • 建置巨量:從 Azure 客戶學到的課程 - 第 II 部分。 Mark Simms 會討論如何設計失敗並檢測所有專案。 類似於 Failsafe 系列,但會深入探討更多操作說明詳細數據。

程式代碼範例: