使用 Application Insights 对 Web 应用和服务进行深度诊断

本文介绍 Application Insights 如何适应 DevOps 周期。

为什么需要 Application Insights?

Application Insights 可以监视正在运行的 Web 应用。 它可以告知故障和性能方面的问题,帮助分析客户如何使用应用。 它适用于在 ASP.NET、Java EE 和 Node.js 等平台上运行的应用。 它托管在云中或本地。

显示交付 Web 应用的复杂性方面的图像。

监视正在运行的现代应用程序至关重要。 我们需要在客户检测到故障之前,先行检测到这些故障。 此外,我们还需要发现并修复性能问题,这些问题会使某些任务的速度变慢,或对用户带来不便。 如果你对系统的性能感到满意,可能还想要知道用户正使用它执行哪些操作。 例如,他们在使用最新功能吗? 是否已成功使用?

新式 Web 应用程序是在持续交付周期中开发的:

  • 发布新功能或改进。
  • 观察它为用户提供的性能如何。
  • 根据这些知识规划下一个开发增量。

此周期的关键部分是观察阶段。 Application Insights 提供用于监视 Web 应用程序性能和使用情况的工具。

此过程的最重要方面是诊断。 如果应用程序失败,将造成业务损失。 监视框架的主要作用是:

  • 可靠地检测故障。
  • 即时通知。
  • 提供诊断问题所需的信息。

Application Insights 执行这些任务。

Bug 来自何处?

Web 系统中的故障通常由配置问题或系统中许多组件之间的交互不当所造成。 处理实时站点事件的第一个任务是确定问题的位置。 哪个组件或关系是造成问题的原因?

在以前更简单的时代,计算机程序在一台计算机中运行。 开发人员在交付之前对其进行彻底的测试,发布后很少再会关注或考虑它。 用户不得不忍受残留的 bug 多年。

这个过程现在大不相同。 应用需要在许多不同的设备上运行,很难保证应用在每台设备上都有完全相同的行为。 在云中托管应用意味着可以快速修复 bug。 但这也意味着持续的竞争和对新功能的频繁期望。

在这种情况下,严格控制 bug 计数的唯一方法是将单元测试自动化。 无法在每次交付时手动重新测试所有功能。 单元测试现已成功构建过程的常见组成部分。 Xamarin Test Cloud 等工具可通过在多个浏览器版本中提供自动化 UI 测试来提供帮助。 这些测试方案使我们有望将应用中的 Bug 比率降到最低。

典型的 Web 应用程序有许多实时组件。 除了客户端(在浏览器或设备应用程序中)和 Web 服务器以外,还可能是实质的后端处理。 后端相当于组件的管道,或者松散的协作项目集合。 其中许多不会由你控制。 它们是你依赖的外部服务。

在此类配置中,除非在实时系统本身内部,否则很难以经济节省的方式测试或预见每种可能的故障模式。

问题

下面是开发 Web 系统时要问的一些问题:

  • 应用是否有故障?
  • 到底发生了什么情况? 如果请求失败,你需要知道问题出在哪里。 你需要跟踪事件。
  • 应用速度够快吗? 响应典型的请求需要多长时间?
  • 服务器可以处理负载吗? 当请求速率增加时,可以保持稳定的响应时间吗?
  • 依赖项(如 REST API、数据库以及应用调用的其他组件)的响应能力如何? 具体而言,系统变慢是组件造成的,还是因为其他人的响应速度较慢?
  • 应用是否正常运行? 全世界都可以看到它吗? 你需要知道它是否停止。
  • 根本原因是什么? 故障源自组件还是依赖项? 是通信问题造成的吗?
  • 有多少用户受到影响? 如果有多个问题要解决,哪个问题最重要?

什么是 Application Insights?

显示 Application Insights 的基本工作流的图像。

  1. Application Insights 可检测应用,并在应用运行时发送相关遥测数据。 可以在应用中构建 Application Insights SDK,或者在运行时应用检测。 前一种方法更具有弹性,因为可以将自己的遥测数据添加到普通模块。
  2. 遥测数据将发送到 Application Insights 门户,并在其中存储和处理。 尽管 Application Insights 托管在 Azure 中,但它可以监视任何 Web 应用,而不只是 Azure 应用。
  3. 遥测数据以事件图表和表格的形式呈现。

有两种主要类型的遥测数据:聚合实例和原始实例。

  • 实例数据可能包含 Web 应用收到的请求报告。 可以使用 Application Insights 门户中的搜索工具查找和检查请求的详细信息。 实例可能包含的数据有:应用响应请求所花费的时间,以及请求的 URL 和客户端的大致位置等数据。
  • 聚合数据包含每个单位时间的事件计数,因此可将请求速率与响应时间进行比较。 它还包含请求响应时间等指标平均值。

数据的主要类别如下:

  • 对应用的请求(通常是 HTTP 请求),其中包含有关 URL、响应时间以及成功或失败结果的数据。
  • 依赖项,如应用执行的 REST 和 SQL 调用,也包含 URI、响应时间和成功结果。
  • 异常,包括堆栈跟踪。
  • 来自用户浏览器的页面视图数据。
  • 性能计数器这样的指标和你自己编写的指标。
  • 可用于跟踪业务事件的自定义事件。
  • 用于调试的日志跟踪。

案例研究:皇家马德里足球俱乐部。

皇家马德里足球俱乐部的 Web 服务为全球各地大约 4.5 亿球迷提供服务。 球迷可通过 Web 浏览器和俱乐部的移动应用来访问此服务。 球迷可以预订门票,还能查看有关比赛结果、球员以及即将举行的比赛的信息和视频剪辑。 他们可以使用进球数等筛选条件进行搜索。 另外,该服务还提供社交媒体链接。 用户体验已高度个性化,旨在增进球迷的双向沟通。

该解决方案是 Azure 上的一个服务与应用程序系统。 可伸缩性是一项关键要求。 流量变化无常,可能在比赛期间和接近比赛时达到高峰。

对于皇家马德里而言,监视系统性能非常重要。 Application Insights 提供整个系统的完整视图,确保提供可靠的高级服务。

俱乐部还能对球迷进行详细了解:如他们的所在位置(只有 3% 在西班牙)、他们对球员、历史结果和即将举行的比赛的兴趣程度,以及对比赛结果的反应。

其中的大多数遥测数据是自动收集的,无需添加任何代码,因而简化了解决方案,降低了操作复杂性。 对于皇家马德里而言,Application Insights 每个月可处理 38 亿个遥测点。

皇家马德里使用 Power BI 模块查看其遥测数据。

显示 Application Insights 遥测数据的 Power BI 视图的屏幕截图。

智能检测

主动诊断是一项最新功能。 无需提供任何特殊配置,Application Insights 就能自动检测并提醒应用中出现异常的故障率提高情况。 它的智能程度高到可以忽略偶发故障的背景,以及根据请求数的增加按比率增加的故障。

例如,你依赖的某个服务中可能存在故障。 或者,你部署的新版本可能运行不正常。 只要查看电子邮件,你就会清楚。 还提供 Webhook 以便触发其他应用。

此功能的另一个方面是针对遥测数据执行每日深入分析,以便找到很难发现的异常性能模式。 例如,它会查找与特定地理区域或特定浏览器版本相关的性能变慢问题。

在这两种情况下,警报会告知你它发现的症状。 它还提供帮助诊断问题所需的数据,例如相关的异常报告。

显示来自主动诊断的电子邮件的屏幕截图。

客户 Samtec 说:“在最近的功能过渡期间,我们发现一个小型数据库已到达它的资源限制并导致超时。 当我们分类问题时,主动检测警报立即显现,其速度就像宣传的那样接近实时。 这种与 Azure 平台结合的警报几乎帮助我们瞬间解决了问题。 总停机时间不到 10 分钟。”

实时指标流

部署最新版本是令人焦虑的体验。 如果出现任何问题,我们希望立即了解情况,以便在必要时取消部署。 实时指标流以大约 1 秒的延迟提供关键指标。

显示实时指标的屏幕截图。

它可让你立即检查任何故障或异常的样本。

显示实时故障事件的屏幕截图。

应用程序地图

应用程序映射会自动发现应用程序拓扑。 它在地图上呈现性能信息,让你在整个分布式环境中轻松识别性能瓶颈和有问题的流程。 使用应用程序映射,可以发现 Azure 服务上的应用程序依赖项。

可以通过了解问题是否与代码相关或与依赖项相关来对问题进行会审。 可以从单个位置了解相关诊断体验。 例如,应用程序可能由于 SQL 层的性能降低而发生故障。 使用应用程序映射可以立即看到这种故障,并深入到 SQL 索引顾问或 Query Insights 体验。

显示应用程序映射的屏幕截图。

Application Insights 日志分析

借助 Log Analytics 可以使用类似于 SQL 的强大语言编写任意查询。 当各种透视连接时,整个应用堆栈中的诊断变得很容易。 然后,可以提出正确的问题,将服务性能与业务指标和客户体验相关联。

可以查询门户中存储的所有遥测实例和指标原始数据。 语言包括筛选、联接、聚合与其他操作。 可以计算字段并执行统计分析。 提供表格式和图形可视化效果。

显示分析查询和结果图表的屏幕截图。

例如,可以轻松执行以下操作:

  • 按客户层将应用程序的请求性能数据分段,以了解客户的体验。
  • 在实时站点调查期间,搜索特定的错误代码或自定义的事件名称。
  • 深入到特定客户的应用使用情况,了解功能的获取与采用情况。
  • 跟踪特定用户的会话与响应时间,使支持与运营团队能够即时提供客户支持。
  • 确定常用的应用功能,以便能够解答功能优先问题。

客户 DNN 说:“Application Insights 为我们提供了方程式中遗漏的部分,使我们能够根据需要合并、排序、查询及筛选数据。” 我们的团队可以使用自己的创意和体验,通过功能强大的查询语言来查找数据,得到相关见解,解决我们甚至都不知道发生了的问题。 很多有意思的回答都是针对开头为‘我想知道,如果...’这样的问题。”

开发工具集成

Application Insights 与开发工具集成。

配置 Application Insights

Visual Studio 和 Eclipse 提供相应的工具来为开发中的项目配置正确的 SDK 包。 有一个菜单命令可以添加 Application Insights。

如果正在使用 Log4N、NLog 或 System.Diagnostics.Trace 等跟踪日志记录框架,可以选择将日志发送到 Application Insights 以及另一个遥测系统,轻松地将跟踪与请求、依赖项调用和异常相关联。

在 Visual Studio 中搜索遥测数据

开发和调试功能时,可以直接在 Visual Studio 中查看和搜索遥测数据。 可以使用与 Web 门户中相同的搜索工具。

当 Application Insights 记录异常时,可以在 Visual Studio 中查看数据点,并直接跳转到相关代码。

显示 Visual Studio 搜索的屏幕截图。

在调试期间,可以在开发计算机中保留遥测数据。 可以在 Visual Studio 中查看,而无需将其发送到门户。 这个本地选项可避免将调试遥测数据与生产遥测数据混合使用。

工作项

引发警报后,Application Insights 可以在工作跟踪系统中自动创建工作项。