教程:使用 Application Insights 监视和诊断 Service Fabric 应用程序
本教程是一个教程系列中的第五部分。 本教程详细介绍了使用 Application Insights 针对 Azure Service Fabric 群集上运行的 ASP.NET Core 应用程序配置监视和诊断的步骤。 可从本教程系列第一部分中开发的应用程序收集遥测。
本教程介绍如何执行下列操作:
- 设置 Application Insights 资源
- 将 Application Insights 添加到应用程序的服务
- 在 Application Insights 中查看遥测和应用程序映射
- 将自定义检测添加到应用程序
本教程系列介绍如何:
- 构建 .NET Service Fabric 应用程序
- 向 ASP.NET Core 前端服务添加 HTTPS 终结点
- 使用 Azure Pipelines 配置 CI/CD
- 设置应用程序的监视和诊断(本教程)
先决条件
在开始学习本教程之前:
- 如果没有 Azure 订阅,请创建一个试用版版订阅。
- 安装 Visual Studio 2019,包括 Azure 开发工作负载以及 ASP.NET 和 Web 开发工作负载。
- 安装 Service Fabric SDK。
下载投票示例应用程序
如果未生成本教程系列的第一部分中的 Voting 示例应用程序,可以下载它。 在命令窗口或终端中运行以下命令,将示例应用存储库克隆到本地计算机:
git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart
设置 Application Insights 资源
Application Insights 是 Azure 应用程序性能管理平台。 建议使用 Application Insights 在 Service Fabric 中进行应用程序监视和诊断。
要创建 Application Insights 资源,请转到 Azure 门户。 选择“创建资源”。 在门户菜单上,选择“监视 + 诊断”。 在“常用 Azure 服务”列中的“Application Insights”下,选择“创建”。
输入或选择“订阅”、“资源组”和“名称”的值。 对于“区域”,请选择将来部署 Service Fabric 群集的位置。 在本教程中,将应用部署到本地群集,因此 Azure 区域无关紧要。 将“应用程序类型”保留为“ASP.NET web 应用程序”。
输入或选择所需信息以后,请选择“创建”以对资源进行预配。 部署资源大约需要一分钟。
将 Application Insights 添加到应用程序的服务
使用“以管理员身份运行”选项打开 Visual Studio 2019(右键单击“开始”菜单中的 Visual Studio 图标)。 选择“文件”>“打开”>“项目/解决方案”,转到 Voting 应用程序(在本教程第一部分创建或从 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 服务远程处理 V2 来开发应用,还需在代码中的同一位置添加以下行:
ConfigureServices(services => services
...
.AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
.AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)
此时可以部署应用程序了。 选择“开始”(或选择 F5)。 Visual Studio 随即生成应用程序并将其打包,设置本地群集,然后将应用程序部署到群集。
注意
如果未安装 .NET Core SDK 的最新版本,可能会出现生成错误。
部署应用程序后,请转到 localhost:8080
,其中正在运行 Voting 示例单页应用程序。 投票选择一些不同的项,以便创建一些示例数据和遥测。 例如,投票选择甜点!
添加完一些投票选项后,也可以移除部分投票选项。
在 Application Insights 中查看遥测和应用程序映射
在 Azure 门户中,转到你的 Application Insights 资源。
选择“概述”,回到资源的概述窗格。 选择“搜索”,查看传入的跟踪。 跟踪显示在 Application Insights 中需要数分钟。 如果没有看到任何跟踪,请等待一会儿,然后选择“刷新”按钮。
在搜索窗口中向下滚动,查看 Application Insights 附带的所有传入遥测。 在 Voting 应用程序中每执行一个操作,就会有一个来自 VotingWeb 的传出 PUT 请求(PUT 投票/Put [名称])、一个来自 VotingData 的传入 PUT 请求(PUT VoteData/Put [名称]),后跟一对用于刷新所显示数据的 GET 请求。 在 localhost
上还会有一个针对 HTTP 的依赖项跟踪,因为这些请求是 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;
。在创建
IReliableStateManager
时,在类的开头声明新的TelemetryClient
值:private TelemetryClient telemetry = new TelemetryClient();
。在
Put()
函数中添加一个事件,确认添加了投票。 在事务完成后将telemetry.TrackEvent($"Added a vote for {name}");
直接添加到 returnOkResult
语句前面。在
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 中)。 对于添加和删除的所有投票,你此时都应可看到一个“自定义事件”条目,以及关联的响应遥测。