共用方式為


教學課程:使用 Application Insights 監視和診斷 Service Fabric 應用程式

本教學課程是一個系列中的第五部分。 其中會逐步說明設定步驟,以使用 Application Insights 來監視和診斷 Azure Service Fabric 叢集上執行的 ASP.NET Core 應用程式。 您會從本教學課程系列的第一部分中開發的應用程式收集遙測資料。

在本教學課程中,您會了解如何:

  • 設定 Application Insights 資源
  • 將 Application Insights 新增至應用程式的服務
  • 在 Application Insights 中檢視遙測資料和應用程式對應
  • 將自訂檢測新增至應用程式

本教學課程系列說明如何:

必要條件

開始進行本教學課程之前:

下載投票應用程式範例

如果您未在本教學課程系列的第一部分中建置投票範例應用程式,可以下載該範例應用程式。 在命令視窗或終端機中,執行下列命令,將範例應用程式存放庫複製到本機電腦:

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

設定 Application Insights 資源

Application Insights 是 Azure 應用程式效能管理平台。 建議您在 Service Fabric 中使用 Application Insights 進行應用程式監視和診斷。

若要建立 Application Insights 資源,請前往 Azure 入口網站。 選取 [建立資源]。 在入口網站功能表上,選取 [監視 + 診斷]。 在 [熱門 Azure 服務] 資料行的 [Application Insights] 下方,選取 [建立]

此螢幕擷取畫面顯示如何建立新的 Application Insights 資源。

輸入或選取 [訂用帳戶]、[資源群組] 和 [名稱] 的值。 針對 [區域],選擇未來要部署 Service Fabric 叢集的位置。 在本教學課程中,我們會將應用程式部署到本機叢集,因此 Azure 區域無關緊要。 針對 [應用程式類型],保留 [ASP.NET Web 應用程式]

此螢幕擷取畫面顯示 Application Insights 資源屬性。

當您輸入或選取必要的資訊時,請選取 [建立] 以佈建資源。 資源部署需時約一分鐘。

將 Application Insights 新增至應用程式的服務

使用 [以系統管理員身分執行] 選項開啟 Visual Studio 2019 (以滑鼠右鍵按一下 [開始] 功能表中的 Visual Studio 圖示)。 選取 [檔案]>[開啟]>[專案/解決方案],並前往投票應用程式 (在教學課程的第一部分中建立,或從 GitHub 複製)。 開啟 Voting.sln。 如果系統提示您還原應用程式的 NuGet 套件,請選取 [是]

若要設定 VotingWeb 和 VotingData 服務的 Application Insights:

  1. 以滑鼠右鍵按一下服務名稱,然後選取 [新增]>[已連線的服務]>[使用 Application Insights 監視]

    此螢幕擷取畫面顯示設定 Application Insights 服務。

    注意

    視專案類型而定,當您以滑鼠右鍵按一下服務名稱時,可能需要選取 [新增],然後選取 [Application Insights 遙測]

  2. 選取開始使用

  3. 登入用於 Azure 訂用帳戶的帳戶,並選取建立 Application Insights 資源的訂用帳戶。 若要尋找資源,請在 [資源] 中,移至 [現有的 Application Insights 資源]。 選取 [註冊] 將 Application Insights 新增至您的服務。

    此螢幕擷取畫面顯示如何註冊 Application Insights。

  4. 選取 [完成]

注意

務必對應用程式中的兩個服務都執行這些步驟,以完成設定應用程式的 Application Insights。 兩個服務都使用相同的 Application Insights 資源,以便查看服務之間的傳入和傳出要求和通訊。

將 Microsoft.ApplicationInsights.ServiceFabric.Native NuGet 新增至服務

Application Insights 有兩個 Service Fabric 特定的 NuGet 套件,可視案例使用。 其中一個用於 Service Fabric 原生服務,另一個用於容器和客體可執行檔。 在此案例中,我們使用 Microsoft.ApplicationInsights.ServiceFabric.Native NuGet 套件來了解服務內容。 若要深入了解 Application Insights SDK 及 Service Fabric 特定的 NuGet 套件,請參閱適用於 Service Fabric 的 Microsoft Application Insights

若要設定 NuGet 套件:

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [解決方案 Voting],然後選取 [管理解決方案的 NuGet 套件]

  2. 在 [NuGet - 解決方案] 對話方塊中,選取 [瀏覽]。 選取 [包括發行前版本] 核取方塊。

    注意

    如果在安裝 Application Insights 套件之前未預先安裝 Microsoft.ServiceFabric.Diagnostics.Internal 套件,您可能必須以相同的方式安裝該套件。

  3. 搜尋 Microsoft.ApplicationInsights.ServiceFabric.Native,然後選取 NuGet 套件。

  4. 在右窗格中,選取 VotingWeb 核取方塊和 VotingData 核取方塊。 選取 [安裝]。

    此螢幕擷取畫面顯示 NuGet 中的 Application Insights SDK。

  5. 在 [預覽變更] 對話方塊中,選取 [確定] 以接受授權。 即會將 NuGet 套件新增至服務。

  6. 接下來,請在兩個服務中設定遙測初始設定式。 開啟 VotingWeb.csVotingData.cs。 在這兩個程式碼檔案中完成下列步驟:

    1. 在每個檔案頂端的現有 using 陳述式之後,新增下列兩個 using 陳述式:

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. 在這兩個檔案的 CreateServiceInstanceListeners()CreateServiceReplicaListeners() 的巢狀 return 陳述式中,在 ConfigureServices>services 下方使用宣告的其他單一服務,新增:

      .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
      

      此程式碼會將 Service Context 新增至遙測資料,讓您可以進一步了解 Application Insights 中的遙測來源。 VotingWeb.cs 中的巢狀 return 陳述式現在看起來類似下列範例:

      return new WebHostBuilder()
          .UseKestrel()
          .ConfigureServices(
              services => services
                  .AddSingleton<HttpClient>(new HttpClient())
                  .AddSingleton<FabricClient>(new FabricClient())
                  .AddSingleton<StatelessServiceContext>(serviceContext)
                  .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseStartup<Startup>()
          .UseApplicationInsights()
          .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
          .UseUrls(url)
          .Build();
      

VotingData.cs 中,您的程式碼現在看起來類似下列範例:

return new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<StatefulServiceContext>(serviceContext)
            .AddSingleton<IReliableStateManager>(this.StateManager)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
    .UseUrls(url)
    .Build();

再次確認已在 VotingWeb.csVotingData.cs 中呼叫 UseApplicationInsights() 方法,如範例所示。

注意

此範例應用程式使用 HTTP 進行服務的通訊。 如果您使用 Service Fabric Service Remoting V2 來開發應用程式,也請在程式碼中的相同位置新增下列幾行:

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

此時,您已經準備好要部署應用程式。 選取 [開始] (或選取 F5)。 Visual Studio 會建置和封裝應用程式、設定本機叢集,並將應用程式部署至叢集。

注意

如果您未安裝最新版本的 .NET Core SDK,則可能收到建置錯誤。

部署應用程式時,請移至 localhost:8080,其中正在執行投票範例單頁應用程式。 票選您喜歡的幾個不同項目,以建立一些樣本資料和遙測資料。 例如,甜點!

此螢幕擷取畫面顯示票選甜點類型的範例。

當您完成新增一些投票時,也可以移除一些投票選項。

在 Application Insights 中檢視遙測資料和應用程式對應

在 Azure 入口網站中,移至您的 Application Insights 資源。

選取 [概觀] 以返回資源的概觀窗格。 選取 [搜尋],以查看顯示的追蹤資料。 經過幾分鐘,追蹤就會出現在 Application Insights 中。 如果您沒有看到任何追蹤,請等候一分鐘,然後選取 [重新整理] 按鈕。

在搜尋視窗中向下捲動,以檢視 Application Insights 隨附的所有傳入遙測資料。 針對您在投票應用程式中執行的每個動作,應該會有一個從 VotingWeb 傳出的 PUT 要求 (PUT Votes/Put [name])、一個從 VotingData 傳入的 PUT 要求 (PUT VoteData/Put [name]),後面接著一對 GET 要求來重新整理所顯示的資料。 因為這些是 HTTP 要求,所以 localhost 上也會有 HTTP 的相依性追蹤。 以下是如何新增一張選票的範例畫面:

此螢幕擷取畫面顯示 Application Insights 中的範例要求追蹤。

您可以選取追蹤,以查看更多詳細資料。 Application Insights 含有一些有關要求的實用資訊,包括 [回應時間] 和 [要求 URL]。 因為您已新增 Service Fabric 特定的 NuGet,因此在 [自訂資料] 區段中,您也會看到應用程式在 Service Fabric 叢集環境中的相關資料。 這些資料包括服務內容,讓您可以查看要求來源的 PartitionIDReplicaId 值,以便在診斷應用程式的錯誤時可以更準確地找出問題。

若要移至 [應用程式對應],請在 [概觀] 窗格的資源功能表上選取 [應用程式對應],或選取 [應用程式對應] 圖示。 對應會顯示兩個服務已連線。

此螢幕擷取畫面醒目提示資源功能表上的 [應用程式對應]。

應用程式對應可協助您進一步了解應用程式拓撲,特別是當您開始新增一起運作的服務時。 另外也提供要求成功率的基本資料,還可協助您診斷失敗的要求,以查明錯誤原因。 若要深入了解,請參閱 Application Insights 中的應用程式對應

將自訂檢測新增至應用程式

雖然 Application Insights 提供立即可用的遙測資料,但您可能想要新增自訂檢測。 您可能有自訂檢測的商務需求,或想要在應用程式發生問題時改善診斷。 您可以使用 Application Insights API 內嵌自訂事件和計量。

接下來,將一些自訂事件新增至 VoteDataController.cs (在 VotingData>Controllers 中) 以追蹤在基礎 votesDictionary 中新增和刪除選票時的資料:

  1. 在其他 using 陳述式的結尾新增 using Microsoft.ApplicationInsights;

  2. 在類別開頭宣告 TelemetryClient 的新值,位於 IReliableStateManager 建立之下:private TelemetryClient telemetry = new TelemetryClient();

  3. Put() 函式中,新增事件來確認已新增選票。 在交易完成之後,在傳回的 telemetry.TrackEvent($"Added a vote for {name}"); 陳述式前面新增 OkResult

  4. Delete() 中,根據 votesDictionary 針對特定投票選項所含的選票條件,使用 "if/else"。

    1. if 陳述式的 await tx.CommitAsync() 後面,新增確認刪除選票的事件:telemetry.TrackEvent($"Deleted votes for {name}");
    2. else 陳述式中的 return 陳述式前面新增事件,指出沒有發生刪除:telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

以下是新增事件之後,您的 Put()Delete() 函式可能的樣子範例:

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

完成這些變更時,請在應用程式中選取 [啟動],以建置和部署最新版本。 應用程式完成部署時,請移至 localhost:8080。 新增和刪除一些投票選項。 然後,回到 Application Insights 資源,以查看最後一次執行的追蹤 (追蹤需要 1 到 2 分鐘,才會出現在 Application Insights 中)。 針對您新增和刪除的所有選票,您現在應該會看到 [自訂事件] 項目及所有相關聯的回應遙測資料。

此螢幕擷取畫面顯示自訂事件。