教學課程:使用 Application Insights 監視和診斷 Service Fabric 應用程式
本教學課程是一個系列中的第五部分。 其中會逐步說明設定步驟,以使用 Application Insights 來監視和診斷 Azure Service Fabric 叢集上執行的 ASP.NET Core 應用程式。 您會從本教學課程系列的第一部分中開發的應用程式收集遙測資料。
在本教學課程中,您會了解如何:
- 設定 Application Insights 資源
- 將 Application Insights 新增至應用程式的服務
- 在 Application Insights 中檢視遙測資料和應用程式對應
- 將自訂檢測新增至應用程式
本教學課程系列說明如何:
- 建置 .NET Service Fabric 應用程式
- 將應用程式部署到遠端叢集
- 將 HTTPS 端點新增至 ASP.NET Core 前端服務
- 使用 Azure Pipelines 設定 CI/CD
- 設定應用程式的監視和診斷 (此教學課程)
必要條件
開始進行本教學課程之前:
- 如果您沒有 Azure 訂閱,請建立免費帳戶。
- 安裝 Visual Studio 2019,包括 Azure 開發工作負載和 ASP.NET 和 Web 開發工作負載。
- 安裝 Service Fabric SDK。
下載投票應用程式範例
如果您未在本教學課程系列的第一部分中建置投票範例應用程式,可以下載該範例應用程式。 在命令視窗或終端機中,執行下列命令,將範例應用程式存放庫複製到本機電腦:
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] 下方,選取 [建立]。
輸入或選取 [訂用帳戶]、[資源群組] 和 [名稱] 的值。 針對 [區域],選擇未來要部署 Service Fabric 叢集的位置。 在本教學課程中,我們會將應用程式部署到本機叢集,因此 Azure 區域無關緊要。 針對 [應用程式類型],保留 [ASP.NET Web 應用程式]。
當您輸入或選取必要的資訊時,請選取 [建立] 以佈建資源。 資源部署需時約一分鐘。
將 Application Insights 新增至應用程式的服務
使用 [以系統管理員身分執行] 選項開啟 Visual Studio 2019 (以滑鼠右鍵按一下 [開始] 功能表中的 Visual Studio 圖示)。 選取 [檔案]>[開啟]>[專案/解決方案],並前往投票應用程式 (在教學課程的第一部分中建立,或從 GitHub 複製)。 開啟 Voting.sln。 如果系統提示您還原應用程式的 NuGet 套件,請選取 [是]。
若要設定 VotingWeb 和 VotingData 服務的 Application Insights:
以滑鼠右鍵按一下服務名稱,然後選取 [新增]>[已連線的服務]>[使用 Application Insights 監視]。
注意
視專案類型而定,當您以滑鼠右鍵按一下服務名稱時,可能需要選取 [新增],然後選取 [Application Insights 遙測]。
選取開始使用。
登入用於 Azure 訂用帳戶的帳戶,並選取建立 Application Insights 資源的訂用帳戶。 若要尋找資源,請在 [資源] 中,移至 [現有的 Application Insights 資源]。 選取 [註冊] 將 Application Insights 新增至您的服務。
選取 [完成]。
注意
務必對應用程式中的兩個服務都執行這些步驟,以完成設定應用程式的 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 套件:
在 [方案總管] 中,以滑鼠右鍵按一下 [解決方案 Voting],然後選取 [管理解決方案的 NuGet 套件]。
在 [NuGet - 解決方案] 對話方塊中,選取 [瀏覽]。 選取 [包括發行前版本] 核取方塊。
注意
如果在安裝 Application Insights 套件之前未預先安裝 Microsoft.ServiceFabric.Diagnostics.Internal 套件,您可能必須以相同的方式安裝該套件。
搜尋 Microsoft.ApplicationInsights.ServiceFabric.Native,然後選取 NuGet 套件。
在右窗格中,選取 VotingWeb 核取方塊和 VotingData 核取方塊。 選取 [安裝]。
在 [預覽變更] 對話方塊中,選取 [確定] 以接受授權。 即會將 NuGet 套件新增至服務。
接下來,請在兩個服務中設定遙測初始設定式。 開啟 VotingWeb.cs 和 VotingData.cs。 在這兩個程式碼檔案中完成下列步驟:
在每個檔案頂端的現有
using
陳述式之後,新增下列兩個using
陳述式:using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.ServiceFabric;
在這兩個檔案的
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.cs 和 VotingData.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 含有一些有關要求的實用資訊,包括 [回應時間] 和 [要求 URL]。 因為您已新增 Service Fabric 特定的 NuGet,因此在 [自訂資料] 區段中,您也會看到應用程式在 Service Fabric 叢集環境中的相關資料。 這些資料包括服務內容,讓您可以查看要求來源的 PartitionID 和 ReplicaId 值,以便在診斷應用程式的錯誤時可以更準確地找出問題。
若要移至 [應用程式對應],請在 [概觀] 窗格的資源功能表上選取 [應用程式對應],或選取 [應用程式對應] 圖示。 對應會顯示兩個服務已連線。
應用程式對應可協助您進一步了解應用程式拓撲,特別是當您開始新增一起運作的服務時。 另外也提供要求成功率的基本資料,還可協助您診斷失敗的要求,以查明錯誤原因。 若要深入了解,請參閱 Application Insights 中的應用程式對應。
將自訂檢測新增至應用程式
雖然 Application Insights 提供立即可用的遙測資料,但您可能想要新增自訂檢測。 您可能有自訂檢測的商務需求,或想要在應用程式發生問題時改善診斷。 您可以使用 Application Insights API 內嵌自訂事件和計量。
接下來,將一些自訂事件新增至 VoteDataController.cs (在 VotingData
>Controllers
中) 以追蹤在基礎 votesDictionary
中新增和刪除選票時的資料:
在其他
using
陳述式的結尾新增using Microsoft.ApplicationInsights;
。在類別開頭宣告
TelemetryClient
的新值,位於IReliableStateManager
建立之下:private TelemetryClient telemetry = new TelemetryClient();
。在
Put()
函式中,新增事件來確認已新增選票。 在交易完成之後,在傳回的telemetry.TrackEvent($"Added a vote for {name}");
陳述式前面新增OkResult
。在
Delete()
中,根據votesDictionary
針對特定投票選項所含的選票條件,使用 "if/else"。- 在
if
陳述式的await tx.CommitAsync()
後面,新增確認刪除選票的事件:telemetry.TrackEvent($"Deleted votes for {name}");
- 在
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 中)。 針對您新增和刪除的所有選票,您現在應該會看到 [自訂事件] 項目及所有相關聯的回應遙測資料。